From 9e0630ab54cbf6b6e3ec525f1088aa54e163c938 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 9 Oct 2011 22:15:00 +0300 Subject: [PATCH] add caanoo frontend files, move pandora files --- Makefile | 6 +- Makefile.caanoo | 22 + frontend/320240/caanoo.gpe | 8 + frontend/320240/pcsx26.png | Bin 0 -> 4763 bytes frontend/320240/pcsx_rearmed.ini | 5 + frontend/320240/pollux_set.c | 389 ++++++++++++++++++ frontend/320240/skin/background.png | Bin 0 -> 36069 bytes frontend/320240/skin/font.png | Bin 0 -> 3185 bytes {pandora => frontend/320240}/skin/readme.txt | 0 frontend/320240/skin/selector.png | Bin 0 -> 261 bytes {pandora => frontend/320240}/skin/skin.txt | 0 {pandora => frontend/pandora}/pcsx.png | Bin {pandora => frontend/pandora}/pcsx.pxml.templ | 0 {pandora => frontend/pandora}/pcsx.sh | 0 {pandora => frontend/pandora}/picorestore.c | 0 .../pandora}/skin/background.png | Bin {pandora => frontend/pandora}/skin/font.png | Bin frontend/pandora/skin/readme.txt | 8 + .../pandora}/skin/selector.png | Bin frontend/pandora/skin/skin.txt | 4 + pandora/readme.txt => readme.txt | 0 21 files changed, 439 insertions(+), 3 deletions(-) create mode 100755 frontend/320240/caanoo.gpe create mode 100644 frontend/320240/pcsx26.png create mode 100644 frontend/320240/pcsx_rearmed.ini create mode 100644 frontend/320240/pollux_set.c create mode 100644 frontend/320240/skin/background.png create mode 100644 frontend/320240/skin/font.png rename {pandora => frontend/320240}/skin/readme.txt (100%) create mode 100644 frontend/320240/skin/selector.png rename {pandora => frontend/320240}/skin/skin.txt (100%) rename {pandora => frontend/pandora}/pcsx.png (100%) rename {pandora => frontend/pandora}/pcsx.pxml.templ (100%) rename {pandora => frontend/pandora}/pcsx.sh (100%) rename {pandora => frontend/pandora}/picorestore.c (100%) rename {pandora => frontend/pandora}/skin/background.png (100%) rename {pandora => frontend/pandora}/skin/font.png (100%) create mode 100644 frontend/pandora/skin/readme.txt rename {pandora => frontend/pandora}/skin/selector.png (100%) create mode 100644 frontend/pandora/skin/skin.txt rename pandora/readme.txt => readme.txt (100%) diff --git a/Makefile b/Makefile index fdf3724c..4fc970d1 100644 --- a/Makefile +++ b/Makefile @@ -192,8 +192,8 @@ PND_MAKE ?= $(HOME)/dev/pnd/src/pandora-libraries/testdata/scripts/pnd_make.sh VER ?= $(shell git describe master) rel: pcsx $(PLUGINS) \ - pandora/pcsx.sh pandora/pcsx.pxml.templ pandora/pcsx.png \ - pandora/picorestore pandora/readme.txt pandora/skin COPYING + frontend/pandora/pcsx.sh frontend/pandora/pcsx.pxml.templ frontend/pandora/pcsx.png \ + frontend/pandora/picorestore frontend/pandora/skin readme.txt COPYING rm -rf out mkdir -p out/plugins cp -r $^ out/ @@ -201,4 +201,4 @@ rel: pcsx $(PLUGINS) \ rm out/pcsx.pxml.templ mv out/*.so out/plugins/ mv out/plugins/gpu_neon.so out/plugins/gpuPEOPS2.so - $(PND_MAKE) -p pcsx_rearmed_$(VER).pnd -d out -x out/pcsx.pxml -i pandora/pcsx.png -c + $(PND_MAKE) -p pcsx_rearmed_$(VER).pnd -d out -x out/pcsx.pxml -i frontend/pandora/pcsx.png -c diff --git a/Makefile.caanoo b/Makefile.caanoo index 54e478c5..e9228f51 100644 --- a/Makefile.caanoo +++ b/Makefile.caanoo @@ -3,3 +3,25 @@ export ARM_CORTEXA8=0 PLATFORM=caanoo include Makefile + +PLUGINS = plugins/spunull/spunull.so plugins/gpu_unai/gpuPCSX4ALL.so \ + plugins/gpu_neon/gpu_neon.so + +# ----------- release ----------- + +rel_caanoo: pcsx $(PLUGINS) \ + frontend/320240/caanoo.gpe frontend/320240/pcsx26.png \ + frontend/320240/skin \ + frontend/warm/bin/warm_2.6.24.ko frontend/320240/pollux_set \ + frontend/320240/pcsx_rearmed.ini readme.txt COPYING + rm -rf out + mkdir -p out/pcsx_rearmed/plugins + cp -r $^ out/pcsx_rearmed/ + mv out/pcsx_rearmed/*.so out/pcsx_rearmed/plugins/ + mv out/pcsx_rearmed/plugins/gpu_neon.so out/pcsx_rearmed/plugins/gpuPEOPS2.so + mv out/pcsx_rearmed/caanoo.gpe out/pcsx_rearmed/pcsx.gpe + mv out/pcsx_rearmed/pcsx_rearmed.ini out/ + mkdir out/pcsx_rearmed/lib/ + cp ./lib/libbz2.so.1 out/pcsx_rearmed/lib/ + cd out && zip -9 -r ../pcsx_rearmed_$(VER)_caanoo.zip * + diff --git a/frontend/320240/caanoo.gpe b/frontend/320240/caanoo.gpe new file mode 100755 index 00000000..f6e72e5a --- /dev/null +++ b/frontend/320240/caanoo.gpe @@ -0,0 +1,8 @@ +#!/bin/sh + +./pollux_set "ram_timings=3,9,4,1,1,1,1" + +./pcsx "$@" + +cd /usr/gp2x +exec ./gp2xmenu diff --git a/frontend/320240/pcsx26.png b/frontend/320240/pcsx26.png new file mode 100644 index 0000000000000000000000000000000000000000..ed220a0f8b22a72bf2ce1c2b76106d74f8398ae6 GIT binary patch literal 4763 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 literal 0 HcmV?d00001 diff --git a/frontend/320240/pcsx_rearmed.ini b/frontend/320240/pcsx_rearmed.ini new file mode 100644 index 00000000..aeba53dc --- /dev/null +++ b/frontend/320240/pcsx_rearmed.ini @@ -0,0 +1,5 @@ +[info] +name="PCSX ReARMed" +icon="/pcsx_rearmed/pcsx26.png" +path="/pcsx_rearmed/pcsx.gpe" +group="GAMES" diff --git a/frontend/320240/pollux_set.c b/frontend/320240/pollux_set.c new file mode 100644 index 00000000..f49e7775 --- /dev/null +++ b/frontend/320240/pollux_set.c @@ -0,0 +1,389 @@ +/* + * quick tool to set various timings for Wiz + * + * Copyright (c) Gražvydas "notaz" Ignotas, 2009 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the organization nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * HTOTAL: X VTOTAL: 341 + * HSWIDTH: 1 VSWIDTH: 0 + * HASTART: 37 VASTART: 17 + * HAEND: 277 VAEND: 337 + * + * 120Hz + * pcd 8, 447: + 594us + * pcd 9, 397: + 36us + * pcd 10, 357: - 523us + * pcd 11, 325: +1153us + * + * 'lcd_timings=397,1,37,277,341,0,17,337;dpc_clkdiv0=9' + * 'ram_timings=2,9,4,1,1,1,1' + */ + +#include +#include +#include +//#include "pollux_set.h" +#define BINARY + +/* parse stuff */ +static int parse_lcd_timings(const char *str, void *data) +{ + int *lcd_timings = data; + const char *p = str; + int ret, c; + ret = sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d", + &lcd_timings[0], &lcd_timings[1], &lcd_timings[2], &lcd_timings[3], + &lcd_timings[4], &lcd_timings[5], &lcd_timings[6], &lcd_timings[7]); + if (ret != 8) + return -1; + /* skip seven commas */ + for (c = 0; c < 7 && *p != 0; p++) + if (*p == ',') + c++; + if (c != 7) + return -1; + /* skip last number */ + while ('0' <= *p && *p <= '9') + p++; + + return p - str; +} + +static int parse_ram_timings(const char *str, void *data) +{ + int *ram_timings = data; + const char *p = str; + int ret, c; + float cas; + + ret = sscanf(p, "%f,%d,%d,%d,%d,%d,%d", + &cas, &ram_timings[1], &ram_timings[2], &ram_timings[3], + &ram_timings[4], &ram_timings[5], &ram_timings[6]); + if (ret != 7) + return -1; + if (cas == 2) + ram_timings[0] = 1; + else if (cas == 2.5) + ram_timings[0] = 2; + else if (cas == 3) + ram_timings[0] = 3; + else + return -1; + for (c = 0; c < 6 && *p != 0; p++) + if (*p == ',') + c++; + if (c != 6) + return -1; + while ('0' <= *p && *p <= '9') + p++; + + return p - str; +} + +static int parse_decimal(const char *str, void *data) +{ + char *ep; + + *(int *)data = strtoul(str, &ep, 10); + if (ep == str) + return -1; + + return ep - str; +} + +/* validate and apply stuff */ +static int apply_lcd_timings(volatile unsigned short *memregs, void *data) +{ + int *lcd_timings = data; + int i; + + for (i = 0; i < 8; i++) { + if (lcd_timings[i] & ~0xffff) { + fprintf(stderr, "pollux_set: invalid lcd timing %d: %d\n", i, lcd_timings[i]); + return -1; + } + } + + for (i = 0; i < 8; i++) + memregs[(0x307c>>1) + i] = lcd_timings[i]; + + return 0; +} + +static const struct { + signed char adj; /* how to adjust value passed by user */ + signed short min; /* range of */ + signed short max; /* allowed values (inclusive) */ +} +ram_ranges[] = { + { 0, 1, 3 }, /* cas (cl) */ + { -2, 0, 15 }, /* trc */ + { -2, 0, 15 }, /* tras */ + { 0, 0, 15 }, /* twr */ + { 0, 0, 15 }, /* tmrd */ + { 0, 0, 15 }, /* trp */ + { 0, 0, 15 }, /* trcd */ +}; + +static int apply_ram_timings(volatile unsigned short *memregs, void *data) +{ + int *ram_timings = data; + int i, val; + + for (i = 0; i < 7; i++) + { + ram_timings[i] += ram_ranges[i].adj; + if (ram_timings[i] < ram_ranges[i].min || ram_timings[i] > ram_ranges[i].max) { + fprintf(stderr, "pollux_set: invalid RAM timing %d\n", i); + return -1; + } + } + + val = memregs[0x14802>>1] & 0x0f00; + val |= (ram_timings[4] << 12) | (ram_timings[5] << 4) | ram_timings[6]; + memregs[0x14802>>1] = val; + + val = memregs[0x14804>>1] & 0x4000; + val |= (ram_timings[0] << 12) | (ram_timings[1] << 8) | + (ram_timings[2] << 4) | ram_timings[3]; + val |= 0x8000; + memregs[0x14804>>1] = val; + + for (i = 0; i < 0x100000 && (memregs[0x14804>>1] & 0x8000); i++) + ; + + return 0; +} + +static int apply_dpc_clkdiv0(volatile unsigned short *memregs, void *data) +{ + int pcd = *(int *)data; + int tmp; + + if ((pcd - 1) & ~0x3f) { + fprintf(stderr, "pollux_set: invalid lcd clkdiv0: %d\n", pcd); + return -1; + } + + pcd = (pcd - 1) & 0x3f; + tmp = memregs[0x31c4>>1]; + memregs[0x31c4>>1] = (tmp & ~0x3f0) | (pcd << 4); + + return 0; +} + +static int apply_cpuclk(volatile unsigned short *memregs, void *data) +{ + volatile unsigned int *memregl = (volatile void *)memregs; + int mhz = *(int *)data; + int adiv, mdiv, pdiv, sdiv = 0; + int i, vf000, vf004; + + // m = MDIV, p = PDIV, s = SDIV + #define SYS_CLK_FREQ 27 + pdiv = 9; + mdiv = (mhz * pdiv) / SYS_CLK_FREQ; + if (mdiv & ~0x3ff) + return -1; + vf004 = (pdiv<<18) | (mdiv<<8) | sdiv; + + // attempt to keep AHB the divider close to 250, but not higher + for (adiv = 1; mhz / adiv > 250; adiv++) + ; + + vf000 = memregl[0xf000>>2]; + vf000 = (vf000 & ~0x3c0) | ((adiv - 1) << 6); + memregl[0xf000>>2] = vf000; + memregl[0xf004>>2] = vf004; + memregl[0xf07c>>2] |= 0x8000; + for (i = 0; (memregl[0xf07c>>2] & 0x8000) && i < 0x100000; i++) + ; + + printf("clock set to %dMHz, AHB set to %dMHz\n", mhz, mhz / adiv); + return 0; +} + +static int lcd_timings[8]; +static int ram_timings[7]; +static int dpc_clkdiv0; +static int cpuclk; + +static const char lcd_t_help[] = "htotal,hswidth,hastart,haend,vtotal,vswidth,vastart,vaend"; +static const char ram_t_help[] = "CAS,tRC,tRAS,tWR,tMRD,tRP,tRCD"; + +static const struct { + const char *name; + const char *help; + int (*parse)(const char *str, void *data); + int (*apply)(volatile unsigned short *memregs, void *data); + void *data; +} +all_params[] = { + { "lcd_timings", lcd_t_help, parse_lcd_timings, apply_lcd_timings, lcd_timings }, + { "ram_timings", ram_t_help, parse_ram_timings, apply_ram_timings, ram_timings }, + { "dpc_clkdiv0", "divider", parse_decimal, apply_dpc_clkdiv0, &dpc_clkdiv0 }, + { "clkdiv0", "divider", parse_decimal, apply_dpc_clkdiv0, &dpc_clkdiv0 }, /* alias */ + { "cpuclk", "MHZ", parse_decimal, apply_cpuclk, &cpuclk }, +}; +#define ALL_PARAM_COUNT (sizeof(all_params) / sizeof(all_params[0])) + +/* + * set timings based on preformated string + * returns 0 on success. + */ +int pollux_set(volatile unsigned short *memregs, const char *str) +{ + int parsed_params[ALL_PARAM_COUNT]; + int applied_params[ALL_PARAM_COUNT]; + int applied_something = 0; + const char *p, *po; + int i, ret; + + if (str == NULL) + return -1; + + memset(parsed_params, 0, sizeof(parsed_params)); + memset(applied_params, 0, sizeof(applied_params)); + + p = str; + while (1) + { +again: + while (*p == ';' || *p == ' ') + p++; + if (*p == 0) + break; + + for (i = 0; i < ALL_PARAM_COUNT; i++) + { + int param_len = strlen(all_params[i].name); + if (strncmp(p, all_params[i].name, param_len) == 0 && p[param_len] == '=') + { + p += param_len + 1; + ret = all_params[i].parse(p, all_params[i].data); + if (ret < 0) { + fprintf(stderr, "pollux_set parser: error at %-10s\n", p); + fprintf(stderr, " valid format is: <%s>\n", all_params[i].help); + return -1; + } + parsed_params[i] = 1; + p += ret; + goto again; + } + } + + /* Unknown param. Attempt to be forward compatible and ignore it. */ + for (po = p; *p != 0 && *p != ';'; p++) + ; + + fprintf(stderr, "unhandled param: "); + fwrite(po, 1, p - po, stderr); + fprintf(stderr, "\n"); + } + + /* validate and apply */ + for (i = 0; i < ALL_PARAM_COUNT; i++) + { + if (!parsed_params[i]) + continue; + + ret = all_params[i].apply(memregs, all_params[i].data); + if (ret < 0) { + fprintf(stderr, "pollux_set: failed to apply %s (bad value?)\n", + all_params[i].name); + continue; + } + + applied_something = 1; + applied_params[i] = 1; + } + + if (applied_something) + { + int c; + printf("applied: "); + for (i = c = 0; i < ALL_PARAM_COUNT; i++) + { + if (!applied_params[i]) + continue; + if (c != 0) + printf(", "); + printf("%s", all_params[i].name); + c++; + } + printf("\n"); + } + + return 0; +} + +#ifdef BINARY +#include +#include +#include +#include +#include + +static void usage(const char *binary) +{ + int i; + printf("usage:\n%s \n" + "set_str:\n", binary); + for (i = 0; i < ALL_PARAM_COUNT; i++) + printf(" %s=<%s>\n", all_params[i].name, all_params[i].help); +} + +int main(int argc, char *argv[]) +{ + volatile unsigned short *memregs; + int ret, memdev; + + if (argc != 2) { + usage(argv[0]); + return 1; + } + + memdev = open("/dev/mem", O_RDWR); + if (memdev == -1) + { + perror("open(/dev/mem) failed"); + return 1; + } + + memregs = mmap(0, 0x20000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0xc0000000); + if (memregs == MAP_FAILED) + { + perror("mmap(memregs) failed"); + close(memdev); + return 1; + } + + ret = pollux_set(memregs, argv[1]); + + munmap((void *)memregs, 0x20000); + close(memdev); + + return ret; +} +#endif diff --git a/frontend/320240/skin/background.png b/frontend/320240/skin/background.png new file mode 100644 index 0000000000000000000000000000000000000000..0efdd183e85e85e96994d1324686ecc8f3777c61 GIT binary patch literal 36069 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 Zqi8+fAM6*%8krnmm>OCd)MMOY{{_{+-G%@F literal 0 HcmV?d00001 diff --git a/frontend/320240/skin/font.png b/frontend/320240/skin/font.png new file mode 100644 index 0000000000000000000000000000000000000000..c526a086ddb3e2ac97f4966004884071552bbc41 GIT binary patch literal 3185 zcmV-%436`OP)eI8sy%nY+Do`I3>Qw?ry!>=K!SB0$!Uup403QH80DJ)W0Pq3e1HcD>p9p}nq8was zX|KQB^n$ze^>KLs03PG@!|etDvTU#dZ5arpr#_2_)MvDeQQCu;A%R6iyzFn;FO9Sf zdVNv>R6I;1A|hJU7c5PXhzNTi4L9Z+@f?7D4nhKnNB~$wBuCH7bJNGlQ6$JI0FXTZ z5>m)|z1(1`?PCvsmmEbh0HEy!APz4WUz)pSQJ+u%K6{7=glGc*ZHZ=E0Bt1>!+nT| zFi-|z4#Wk3bVIj!?HmC2A8zkafi_JA%m6e{LkJ>5fcI^i!z@^Bevm{kf$ocmiI1jH zZLu_!!~AxnogNUkWt=_$eEt!tP!e?BYR@JeydI1#JHebxBs|QThI^8HWV=HPsuPVEafkgvOr=iw!|35F;?e!lgYPsLv zP4~DsWqF0mIpjA} z5Xv%4lZ9nZ0+>hu3jp8OPtsC4?FN+-uNwr{LB`JjphdI$IIr(p2?!C$78uG!q)|0t zP!VU-<}KGGpaT%0iy=Z4MOvO4cP{O^k9Yy#oV%-LQ;m1I0k}Hnt^i(~bEds?f4QSO zcMkx!tDZYoRcbYXoAVVZ6^!eA(@(=PjX_aCM53=IM)Zr-JE3q@KMd@A3jnWeC=`aH z)s)79vRWGG7F<0`p$EX^^9lg<08$yHW(M~Fl3%zK8tN#ld>~I$WphM4TEr-}%Sz)( zUglGGzkCxiihiiX!@ivR7gI0FC=$5`fHY`4N)rQixv%RNrNU{dNYR=x3xMqR%w@EL zg_|+JX%m34^l}s3@>-F&$IKu=%YzTa@=_QFv=ZF+*ZKfozp5gJE^ zIwZ~RuO(GyQ9HPj8LL!?Ohz?GY}&Mpgh3!gNzs@0Bm%Nb9BwupQLM8?_w!;acH}i} zal+(R9JNfDb}d2UOQMy-p?#5G+k`kEr7{H|8vxoHGy#Bt5uE_QZv|joz&x=N+A(ls z7w|IxLK$RvJqXL-O90VibsGUJwA?K5IRG7mZ&yUGU*?vrlcy}+w{yaOyGxo~_s;pJ z{Dg)qloU9tHn-0Tt4nsSYlm;VCh-lni z$t(BD)pi@XSyUHszz6^n03x1d00hPLNGU*Bap*K(^b3S0H>o&yIWd6ZDjPv z05GqBtiy1a1m&7{Ryw{88zJtpDC-Je+_6-sUFh3mLLW+5#fzc-z=;lKIRSt;CJimu ztGxKT!7IULztshDF7Q|#f31YT7@X0?E~a%mXg>@Qz*f9(9)zk7bPZ=)da6~Of{dJ_ zQ&itAflaGQt?J4~hA%{K1;p)W+f!YTgD3XrN5@P8JPXiv2y3K6H6C*mk;suFZ%Y6| zM2yy|HYPv3F&|As`wZ<=Q1L59#G&ue_W*^^Th%oVx|)W0SIipg^>uC82>!m$_A@yu zEeqya2+j3gF1YJ;m*HI8)!c)ZhXXFR+hw=@>*bEduh>|<=;kTB8Xht4t`RITE$ga? z_|Sv}w{lmiUlHrkpST_U679laN(wSigX=Y1m{zGIH6;Y!xd3i_;4(3SO>~+~L;Ut7%7d~Hg|r-CjiWxOj9VzC97pPm_J?g{y6~QM6HHPTA~6r(g~ggaBf?; zWTOhlLD+D{kBCVFpej6P=kC@9!(VE2*&-k>rMx@!2NsXxb>B9;sSUa|&n?9Yi~BsN zYn@{o5vhy5nqrb|nJ@Fs@_~4!3^UaUxN_6w$`Dd#ps3~I`$$CYCk1f;7z;a0VewLr zmJnmQ9QQHjHb_khr6phBfnJl8sC1@O*aW4*EIT=4P>tIFyw0A+3DuLiG~~OGMD=7w z5dr7Xo2A};Aj+-;7^O34kif{2J4p&SP2OV3pagKamJ!hP$;&{07D}i|rJ^mI|{I2Tz6Yi$L7Lr#q z+1)hSz0+)Whh9Zi*QvATTTXaY&)U_M6zsdR>>Aa)%{23-kA}fOD_VeEi%D%At}!>C zwKOi6+f=TVw>#BjGe6jV{s{oyFKI!lPfEgfw9IWwW}|4P$Pn|5j9G-y9|7RvSMWg- zD3k_Uq?r*@Pe@Wt39ZSZD*8MPab~P@lFM}!aZw`-P7v`Z`N$r~2_j4ub4~}T-Frb^ zoMA?+n%c8PT8e8VmVBb|EAlqUd=r4G2XpX16!BTDYeZWW!c&|ORq>1fn2*#}$Kn%Otr2tge+^NKI8eQWU5{;!6^V{T?6FJn(P4ZQ&Uoy%wY59Bw+c5HHU*N zDJRY{o{s@odrYV5w>fW`3KB8Kj&V->LLv;celcWZ?f~c`EtXHRk@0-AgKZE-IV*vc zA|&;gP?A-~^I_Tg{aBWK!>w`+z$1M434u>|RNMIaqSo!JCPLq@jUN!Vjpeg?rO&JrKBOglxlW=31R3DCPOYk<7|01S^amswf3m3r=&GSyiA~fxy z<`JGPgR)^pxo|XCEzfYHgq-K)%P=-?r-sM7AHj{~AtA9m!lN=Ozwp%lKyJx1+$s+M zII-lj^Q8l%$&b=SeXHEgsB-eAX-GiPJ`dpa3@tk%B$`KfSo*~xtAh_sp5az`*adIb zAufIWens>Xa6_rOc{Gwm<(t?2aoH~9kK`kVaa*4DrB zZ@rtLT$faSury{oAC~5KOdCIBn(UOD<=ZF8)N{i5FR3^7sOk9~liJ<6Pa9?u;#oT1 zSyt49O7fZdmT%bnei74z#`6G{6!LR+!4mc;Iz4)M7YU&0mYq@-#|AfqLANgdT%r`Wjy#8au`)5!b1^;WNN;&u+ XqVG$syRXKc00000NkvXXu0mjfg_gw( literal 0 HcmV?d00001 diff --git a/pandora/skin/readme.txt b/frontend/320240/skin/readme.txt similarity index 100% rename from pandora/skin/readme.txt rename to frontend/320240/skin/readme.txt diff --git a/frontend/320240/skin/selector.png b/frontend/320240/skin/selector.png new file mode 100644 index 0000000000000000000000000000000000000000..5062cc23b08bd35ebbe7c5dca0c10ae479103c56 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^96-zkA{f@Jafks@+9j?LCC){ui6xo&c?uz!xv31^ zB??By3PI@w3PuJ7<_d-;Rt6SUMrI1y20;F2g|&S^ZR{nUzOL-oImEd+jkE=q{{RYc z7I;J!Gca%qfiUBxyLEqnf-LEdzK#qG8~eHcB(ehev7RoDAr-fh{~RxP%DLW-pZWCr zo!jgFC7ivOXlD2K_3`iDpYNF=YFG3B+uQT$vD5tH>;L@w{QSMX+Eab|`oF)G{8J%^uZPiw_?7(a*>