From c01e58aa796a9c6376e4b464fec9f5f5ef59f8d4 Mon Sep 17 00:00:00 2001 From: Zarh Date: Thu, 25 Oct 2018 17:42:48 +0200 Subject: [PATCH] v1.34 --- .gitignore | 1 + Changelog.txt | 17 +- MGZ/data/mamba_483C.lz.bin | Bin 0 -> 30702 bytes MGZ/data/mamba_loader_483C.bin | Bin 0 -> 904 bytes MGZ/data/payload_sky_483C.bin | Bin 0 -> 824 bytes MGZ/data/umount_483C.bin | Bin 0 -> 160 bytes MGZ/source/common.h | 18 + MGZ/source/iso.c | 8 - MGZ/source/main.c | 1445 +++++++++------ Makefile | 2 +- OffsetFinder/main.c | 89 +- payloads/MAMBA/Makefile | 2 +- payloads/MAMBA/Makefile_loader | 2 +- payloads/MAMBA/lv2/include/lv2/symbols.h | 204 +++ .../SRC/ps2emu/include/ps2emu/symbols.h | 70 + .../PS2_EMU/SRC/ps2emu_stage1_file/Makefile | 2 +- .../PS2_EMU/SRC/ps2emu_stage2/gxemu/Makefile | 2 +- .../SRC/ps2emu_stage2/gxemu/ldscript_483.ld | 64 + .../PS2_EMU/SRC/ps2emu_stage2/hwemu/Makefile | 2 +- .../PS2_EMU/SRC/ps2emu_stage2/netemu/Makefile | 2 +- payloads/SKY/Makefile | 4 +- payloads/SKY/firmware_symbols.h | 7 + pkgfiles/USRDIR/GUI/common/PS1_STR.PNG | Bin 1991 -> 0 bytes pkgfiles/USRDIR/GUI/common/PS2_STR.PNG | Bin 2548 -> 0 bytes pkgfiles/USRDIR/GUI/common/PS3_STR.PNG | Bin 2673 -> 0 bytes pkgfiles/USRDIR/GUI/common/PSP_STR.PNG | Bin 2509 -> 0 bytes pkgfiles/USRDIR/GUI/common/TAG.PNG | Bin 0 -> 548 bytes pkgfiles/USRDIR/sys/RCO/animattribdef-ps3.ini | 73 +- pkgfiles/USRDIR/sys/RCO/animattribdef-psp.ini | 70 +- pkgfiles/USRDIR/sys/RCO/miscmap.ini | 45 +- pkgfiles/USRDIR/sys/RCO/objattribdef-ps3.ini | 1571 +++++++++-------- pkgfiles/USRDIR/sys/RCO/objattribdef-psp.ini | 992 ++++++----- pkgfiles/USRDIR/sys/RCO/tagmap.ini | 8 +- pkgfiles/USRDIR/sys/data/keys | 150 ++ 34 files changed, 2900 insertions(+), 1950 deletions(-) create mode 100644 MGZ/data/mamba_483C.lz.bin create mode 100644 MGZ/data/mamba_loader_483C.bin create mode 100644 MGZ/data/payload_sky_483C.bin create mode 100644 MGZ/data/umount_483C.bin create mode 100644 payloads/PS2_EMU/SRC/ps2emu_stage2/gxemu/ldscript_483.ld delete mode 100644 pkgfiles/USRDIR/GUI/common/PS1_STR.PNG delete mode 100644 pkgfiles/USRDIR/GUI/common/PS2_STR.PNG delete mode 100644 pkgfiles/USRDIR/GUI/common/PS3_STR.PNG delete mode 100644 pkgfiles/USRDIR/GUI/common/PSP_STR.PNG create mode 100644 pkgfiles/USRDIR/GUI/common/TAG.PNG diff --git a/.gitignore b/.gitignore index f2d9c542..6e12a95b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.d *.bin *.map +/NotForGithub /build /pkgfiles2/USRDIR/sys/* /pkgfiles2/USRDIR/GUI/common/* diff --git a/Changelog.txt b/Changelog.txt index b1b39099..a01d732c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,19 +14,34 @@ _ create backup from disk _ Fan control plugin standalone? _ game list supports / shows installed PKG games (PS3, PS2, PS1, PSP) _ PS2 guitar hero EUR not in real xmb : e51e79bf3ca4b49be51656e0fdc912e1 -_ font sizes _ setting : install mamba autoloader _ toggle _ timestamps and permissions : Inside the window, at right of the "size" can be added a new column for timestamps and another for permissions _ Controller setting _ global setting tabs _ copy/convert/extract : ETA/timer +_ verifier si il y a de la place avant de faire un copie de fichier _ update_mgz _ double click _ load only displayed pic ... _ rebuild DB _ goto recovery _ MAX_GAME = infinite +_ whitelist.cfg & blacklist.cfg files in /dev_hdd0/tmp +_ font sizes / Y / shadow ? +_ text viewer = fix scroll +_ GameList SCAN in Background thread +_ New Filemanager Root interface +_ real BDVD dump : lv1 ? read_storage ? + + +v1.34 +Add : New loading icon. +Add : Scan to /dev_sd, /dev_ms/ and /dev_cd. +Fix : Apply pnatch (bug introduced in previous update) +Add offsetfinder : IDPSet & ERK_dumper offsets. +Add : Definitions files from RCOmageMOD +Add : Game TAGS v1.33 diff --git a/MGZ/data/mamba_483C.lz.bin b/MGZ/data/mamba_483C.lz.bin new file mode 100644 index 0000000000000000000000000000000000000000..684d7731954d5f73884357c6f5e5c10a0b10ac66 GIT binary patch literal 30702 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 literal 0 HcmV?d00001 diff --git a/MGZ/data/mamba_loader_483C.bin b/MGZ/data/mamba_loader_483C.bin new file mode 100644 index 0000000000000000000000000000000000000000..c8d646052313cb13394f01b4e54ef77f6a8b3ad7 GIT binary patch literal 904 zcmaJ;F-s#s7=5!FG=fDA8$pX~PEg?>7FUcQxJec9kZT0X6|c}vuW#Aub~lHs=roV_&G+Ve^S!`|PQqKXg9?t_ywMLB z&bbXHs=?HUDx_0w*)_1=KJ|FiUNVYQGY@AaRu-mj`=m=5LgHBvKAg`=UY8|BkgkPCpXc^&(mL@%sgADSDLsaT~U7V zh5Sx)2N2#qK2CIxHPoxUzSvW~0xDg+q29IhFU!xpR|D4M585-p(tYu80M(&A{$`c zy+UbNtta?4yiEA%VT}K|xXAL8#SEXSEoJ#TC&Q<4k>L_{%w@|)dJ@ip1RvMUc2YNf WrFfp=FvaT>6aUf}$9&>nnz#qi4=GRp literal 0 HcmV?d00001 diff --git a/MGZ/data/payload_sky_483C.bin b/MGZ/data/payload_sky_483C.bin new file mode 100644 index 0000000000000000000000000000000000000000..55ea8a9cc79ae4bbed542ead88da71cbd037ec1f GIT binary patch literal 824 zcmZ9KziSg=7{|Zo9qEZhGGqvJXxcH zAb2e|a~X6jU;|LkdcwfMK@aq*R)8rDr_C~As}(5XzE}>q;e;W3IO5LkLMetka=QyS z#RWgO38c>hi)G|X>w)X9k)7(qIth?oO4#hhM9hBxU1*UVW6ng((w_dJ ze1>OlAf5}u4?@Sv81ZunDEBiwvYY`58FSk^O4@)z`AoIPJ)P-C8oBTfw<&Lr9^gV% za#ixNWL@&PWK*)$=X_1tZzaD9WsfTnm^FNG~A0fb;^=3rNo=J!1?n znXWd(Eaz-bu^p(?vmL_@L*n<+miVS6=)P~*sxIQJp{=^5J=tM*)W+aHBF2j7t`!+> z^=D~r*NT8)_xFS?jktpu`{d`(q+ix6YU3-g{R(t{9Z~-i;{F~IZ58Qu64~}e7;Oip z?*Ny8@pb_=ze_rgpz}9~@^6Uq0Ex~qq&t(yc5*Nd*Jo@(bvK8W(kFl`W!m9w>eGI9 zn(fU@8(*NYlWEf|hX*}>B+>lG_nSd$_Wh^+^XF-$MNc^GIYYcD;uuDo1OH&Ie*ybZ B09XJ3 literal 0 HcmV?d00001 diff --git a/MGZ/data/umount_483C.bin b/MGZ/data/umount_483C.bin new file mode 100644 index 0000000000000000000000000000000000000000..6e3f221803db4d7f5e981ef9429ee9f5c4bcd8a8 GIT binary patch literal 160 zcmeyt$SCk5k>SFRMur?}rROtRFBiR{#IOmi~l+A)&=dCH*f$UGm-! z3>FI*IO|_9E%RWRwp2rzfx)4P!Qe$L0|SWd*u!N9=qLzaQz#asrChP?~|6P7SA zSj=Tm0J23q*q0mDzhGYW0%+$8pq(#(cD?}G`5I{FYoMJq3@mH>8Wusrdata; + int i = xaio->usrdata; - if(error != 0 || size != xaio->size) - { - fi->read = -1; return; - } - else fi->read += (s64) size; + char tmp[128]; + if(error != 0) { + reading_statut[i] = FAILED; + sprintf(tmp, "Error : reading error %X", (unsigned int) error); print_copy_log(tmp); + } else + if(size != xaio->size) { + reading_statut[i] = FAILED; + sprintf(tmp, "Error : reading size %X / %X", (unsigned int) size, (unsigned int) xaio->size); print_copy_log(tmp); + } else { + buffer_statut[buffer_to_read] = DATA_FULL; + buffer_to_read++; + if(buffer_to_read==BUFFNUMBER) buffer_to_read=0; + reading_statut[i] = READY; + } } -static void fast_func_write(sysFSAio *xaio, s32 error, s32 xid, u64 size) +static void writing_callback(sysFSAio *xaio, s32 error, s32 xid, u64 size) { - t_async* fi = (t_async *) xaio->usrdata; - if(error != 0 || size != xaio->size) - { - fi->writed = -1; return; - } - else fi->writed += (s64) size; + int i = xaio->usrdata; + + char tmp[128]; + if(error != 0) { + writing_statut[i] = FAILED; + sprintf(tmp, "Error : writing error %X", (unsigned int) error); print_copy_log(tmp); + } else + if(size != xaio->size) { + writing_statut[i] = FAILED; + sprintf(tmp, "Error : writing size %X / %X", (unsigned int) size, (unsigned int) xaio->size); print_copy_log(tmp); + } else { + buffer_statut[buffer_to_write] = DATA_EMPTY; + buffer_to_write++; + if(buffer_to_write==BUFFNUMBER) buffer_to_write=0; + writing_statut[i] = READY; + copy_current_size+=size; + writed+=size; + } } -#define BUFFSIZE 0x20000ULL - // Asynchronous Copy - include // sysFsAioInit - sysFsOpen - sysFsAioRead - sysFsAioWrite - sysFsAioFinish - sysFsAioCancel int CopyFile_async(char *src, char *dst) { - t_read.fd = -1; - t_write.fd = -1; + int fdr, fdw; - static int id_r = -1, id_w = -1; + static int id_r[2] = {-1, -1}; + static int id_w[2] = {-1, -1}; + int i; - u64 pos = 0ULL; - u64 pos2 = 0ULL; - struct stat s; if(stat(src, &s) != 0) return FAILED; if(S_ISDIR(s.st_mode)) return FAILED; u64 size = s.st_size; - - int alternate = 0; - char *mem = malloc(BUFFSIZE*2); - if(!mem) { - print_load("Error : failed to copy_async / malloc"); - return FAILED; - } - - if(sysFsAioInit(src)!= 0) { - free(mem); + +/* if(sysFsAioInit(src)!= 0) { print_load("Error : failed to copy_async / sysFsAioInit(src)"); return FAILED; } - +*/ if(sysFsOpen(src, SYS_O_RDONLY, &fdr, 0,0) != 0) { - free(mem); - sysFsAioFinish(src); - print_load("Error : failed to copy_async / sysFsOpen(src)"); + //sysFsAioFinish(src); + print_copy_log("Error : failed to copy_async / sysFsOpen(src)"); return FAILED; } - +/* if(sysFsAioInit(dst)!= 0) { - free(mem); sysFsAioFinish(src); sysFsClose(fdr); print_load("Error : failed to copy_async / sysFsAioInit(dst)"); return FAILED; } - +*/ if(sysFsOpen(dst, SYS_O_CREAT | SYS_O_TRUNC | SYS_O_WRONLY, &fdw, 0, 0) != 0) { - free(mem); - sysFsAioFinish(src); - sysFsAioFinish(dst); + //sysFsAioFinish(src); + //sysFsAioFinish(dst); sysFsClose(fdr); - print_load("Error : failed to copy_async / sysFsOpen(src)"); + print_copy_log("Error : failed to copy_async / sysFsOpen(src)"); return FAILED; } - async_data.read = -666; - async_data.writed = -666; - - while(pos2 < size) { + char *mem = (char *) malloc(BUFFNUMBER * BUFFSIZE); + if(mem == NULL) { + print_copy_log("Error : failed to copy_async / malloc"); + return FAILED; + } + + for(i=0; i BUFFSIZE) aio_read[i].size = BUFFSIZE; + aio_read[i].usrdata = i; + + reading_statut[i] = BUSY; + + reading_pos+=aio_read[i].size; + + if(sysFsAioRead(&aio_read[i], &id_r[i], reading_callback) != 0) { + print_copy_log("Error : failed to copy_async / sysFsAioRead"); + goto error; + } + } + } + } - if(async_data.read == -666) { - async_data.read = -555; - t_read.fd = fdr; - t_read.offset = pos; - t_read.buffer_addr = (u32) (u64) &mem[alternate*BUFFSIZE]; - t_read.size = size - pos; - if(t_read.size > BUFFSIZE) t_read.size = BUFFSIZE; - t_read.usrdata = (u64 ) &async_data; - - if(sysFsAioRead(&t_read, &id_r, fast_func_read) != 0) { - print_load("Error : failed to copy_async / sysFsAioRead"); + + if(reading_statut[i] == FAILED) { + print_copy_log("Error : failed to copy_async / reading_statut = FAILED !"); goto error; } - - } if(async_data.read == -1) { - print_load("Error : failed to copy_async / async_data.read = -1"); - goto error; - } else if(async_data.read >= 0 && async_data.writed == -666) { - async_data.writed = -555; - t_write.fd = fdw; - t_write.offset = t_read.offset; - t_write.buffer_addr = t_read.buffer_addr; - t_write.size = t_read.size; - t_write.usrdata = (u64 ) &async_data; - pos+= t_read.size; - alternate^=1; - async_data.read = -666; - - if(sysFsAioWrite(&t_write, &id_w, fast_func_write) != 0) { - print_load("Error : failed to copy_async / sysFsAioWrite"); + + if(writing_statut[i] == READY) { + + if(buffer_statut[buffer_to_write] == DATA_FULL) { + if( writing_pos < size) { + aio_write[i].fd = fdw; + aio_write[i].offset = writing_pos; + aio_write[i].buffer_addr = (u32) (u64) &mem[buffer_to_write * BUFFSIZE]; + aio_write[i].size = size - writing_pos; + if(aio_write[i].size > BUFFSIZE) aio_write[i].size = BUFFSIZE; + aio_write[i].usrdata = i; + + writing_statut[i] = BUSY; + + writing_pos += aio_write[i].size; + + if(sysFsAioWrite(&aio_write[i], &id_w[i], writing_callback) != 0) { + print_copy_log("Error : failed to copy_async / sysFsAioWrite"); + goto error; + } + } + } + } + + if(writing_statut[i] == FAILED) { + print_copy_log("Error : failed to copy_async / writing_statut = FAILED !"); goto error; - } - - } - - if(async_data.writed == -1) { - print_load("Error : failed to copy_async / async_data.read = -1"); - goto error; - } else if(async_data.writed >=0) { - - if(pos >= size) async_data.read = -555; else async_data.writed = -666; - pos2 = t_write.offset + t_write.size; + } - file_copy_prog_bar=pos2*100/size; + file_copy_prog_bar=writed*100/size; - copy_current_size+=t_write.size; - } - - - //usleep(4000); - + } } - - sysFsClose(t_read.fd); - sysFsClose(t_write.fd); - sysFsAioFinish(src); - sysFsAioFinish(dst); + + for(i=0; i=0) { ps3ntfs_close(f1); @@ -10747,23 +10853,25 @@ void TestCopy(char *src, char *dst, int i) { if(i==0) CopyFile_stdio(src, dst); else if(i==1) CopyFile_fcntl(src, dst); else - if(i==2) CopyFile_ps3ntfs(src, dst); else + if(i==2) CopyFile_sysFs(src, dst); else if(i==3) CopyFile_sysFsLv2(src, dst); else - if(i==4) CopyFile_sysFs(src, dst); else + if(i==4) CopyFile_ps3ntfs(src, dst); else if(i==5) CopyFile_async(src, dst); } #define CopyFile CopyFile_ps3ntfs +void end_checking(); void SpeedTest() { - char *TestFile = "/dev_hdd0/SPEEDTEST.BIN"; + char *TestFile = "/dev_hdd0/TEST.BIN"; char dst[128]; char dst2[128]; char dst3[128]; char tmp[128]; + time_t time_start; u64 previous_size=0; @@ -10780,27 +10888,49 @@ void SpeedTest() gathering_cancel=YES; int i,j; - for(j=0; j<6; j++) { + copy_speed = get_unit(BUFFSIZE); + sprintf(tmp, "BUFFSIZE = %s\n", copy_speed); fputs(tmp,f); + if(copy_speed) free(copy_speed); + + for(j=4; j<6; j++) { + if(j==0) {strcpy(tmp, "*** CopyFile_stdio ***\n"); fputs(tmp,f);} else if(j==1) {strcpy(tmp, "\n*** CopyFile_fcntl ***\n"); fputs(tmp,f);} else - if(j==2) {strcpy(tmp, "\n*** CopyFile_ps3_ntfs ***\n"); fputs(tmp,f);} else + if(j==2) {strcpy(tmp, "\n*** CopyFile_sysFs ***\n"); fputs(tmp,f);} else if(j==3) {strcpy(tmp, "\n*** CopyFile_sysFsLv2 ***\n"); fputs(tmp,f);} else - if(j==4) {strcpy(tmp, "\n*** CopyFile_sysFs ***\n"); fputs(tmp,f);} else + if(j==4) {strcpy(tmp, "\n*** CopyFile_ps3_ntfs ***\n"); fputs(tmp,f);} else if(j==5) {strcpy(tmp, "\n*** CopyFile_async ***\n"); fputs(tmp,f);} strcpy(tmp, "HDD0 to HDD0"); fputs(tmp,f); - strcpy(dst, "/dev_hdd0/DST.BIN"); + strcpy(dst, "/dev_hdd0/tmp/DST.BIN"); start_timer(3); + time_start = time(NULL); TestCopy(TestFile, dst, j); copy_speed = get_unit((copy_current_size-previous_size)*1000/get_time(3)); sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, "temps : %ds\n", (int)(time(NULL)-time_start)); fputs(tmp,f); if(copy_speed) free(copy_speed); previous_size=copy_current_size; Delete(dst); - + + strcpy(tmp, "HDD0 to HDD1"); fputs(tmp,f); + + strcpy(dst, "/dev_hdd1/DST.BIN"); + + start_timer(3); + time_start = time(NULL); + TestCopy(TestFile, dst, j); + copy_speed = get_unit((copy_current_size-previous_size)*1000/get_time(3)); + sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, "temps : %ds\n", (int)(time(NULL)-time_start)); fputs(tmp,f); + if(copy_speed) free(copy_speed); + previous_size=copy_current_size; + + Delete(dst); + for(i=0; i<=device_number; i++) { if(strstr(list_device[i], "dev_hdd0") != NULL) continue; @@ -10809,20 +10939,24 @@ void SpeedTest() sprintf(dst, "/%s/DST.BIN", list_device[i]); start_timer(3); + time_start = time(NULL); TestCopy(TestFile, dst, j); copy_speed = get_unit((copy_current_size-previous_size)*1000/get_time(3)); - sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, "temps : %ds\n", (int)(time(NULL)-time_start)); fputs(tmp,f); if(copy_speed) free(copy_speed); previous_size=copy_current_size; sprintf(tmp, "%s to HDD0", list_device[i]); fputs(tmp,f); - strcpy(dst2, "/dev_hdd0/DST.BIN"); + strcpy(dst2, "/dev_hdd0/tmp/DST.BIN"); start_timer(3); + time_start = time(NULL); TestCopy(dst, dst2, j); copy_speed = get_unit((copy_current_size-previous_size)*1000/get_time(3)); - sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, "temps : %ds\n", (int)(time(NULL)-time_start)); fputs(tmp,f); if(copy_speed) free(copy_speed); previous_size=copy_current_size; @@ -10831,9 +10965,11 @@ void SpeedTest() sprintf(dst3, "/%s/DST2.BIN", list_device[i]); start_timer(3); + time_start = time(NULL); TestCopy(dst, dst3, j); copy_speed = get_unit((copy_current_size-previous_size)*1000/get_time(3)); - sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, " = %s/s\n", copy_speed); fputs(tmp,f); + sprintf(tmp, "temps : %ds\n", (int)(time(NULL)-time_start)); fputs(tmp,f); if(copy_speed) free(copy_speed); previous_size=copy_current_size; @@ -10842,7 +10978,6 @@ void SpeedTest() Delete(dst3); } } - if(f) {fclose(f); f=NULL;} } @@ -10947,7 +11082,6 @@ u8 CopyJoin(char *src, char *dst) } - u8 Move(char *src, char *dst) { char dev_src[30]; @@ -10971,10 +11105,29 @@ u8 Move(char *src, char *dst) return SUCCESS; } -u8 RefreshList() +//********************************************* +// GAME LIST TODOOOOO +//********************************************* + +void free_GAMELIST() +{ + s64 i; + for(i=0; i<=game_number; i++) { + FREE(list_game_path[i]); + FREE(list_game_title[i]); + } + + FREE(list_game_path); + FREE(list_game_title); + FREE(list_game_platform); +} + +void sort_GAMELIST() { + print_load("Sorting the game list"); + int min; - char ta[128], tb[128]; + char ta[512], tb[512]; u8 t; int i, j; for (i = 0; i=97 && ta[0]<=123) ta[0]-=32; if(tb[0]>=97 && tb[0]<=123) tb[0]-=32; - if (strcmp(ta, tb) < 0) { - min = j; - } + + if (strcmp(ta, tb) < 0) min = j; } if(min==i) continue; + strcpy(ta , list_game_title[min]); - strcpy(list_game_title[min], list_game_title[i]); - strcpy(list_game_title[i], ta); + + FREE(list_game_title[min]); + list_game_title[min] = strcpy_malloc(list_game_title[i]); + + FREE(list_game_title[i]); + list_game_title[i] = strcpy_malloc(ta); + strcpy(tb, list_game_path[min]); - strcpy(list_game_path[min], list_game_path[i]); - strcpy(list_game_path[i], tb); + + FREE(list_game_path[min]); + list_game_path[min] = strcpy_malloc(list_game_path[i]); + + FREE(list_game_path[i]); + list_game_path[i] = strcpy_malloc(tb); + t = list_game_platform[min]; list_game_platform[min] = list_game_platform[i]; list_game_platform[i] = t; } - //Extract_IconParam(); - - read_fav(); - start_Load_GamePIC(); - - return SUCCESS; } -u8 AddGame(char *path) +void add_GAMELIST(char *path) { - if(path_info(path) == _NOT_EXIST) return FAILED; + u8 ext = get_ext(path); - game_number++; - strcpy(list_game_path[game_number], path); - - strcpy(list_game_title[game_number], list_game_path[game_number]); - strcpy(list_game_title[game_number], &strrchr(list_game_title[game_number], '/')[1]); - RemoveExtention(list_game_title[game_number]); + if(ext != _ISO_PS3 && ext != _JB_PS3 + && ext != _ISO_PSP && ext != _JB_PSP + && ext != _ISO_PS2 && ext != _JB_PS2 + && ext != _ISO_PS1 && ext != _JB_PS1) return; - u8 ext = get_ext(list_game_path[game_number]); + game_number++; + list_game_path = (char **) realloc( list_game_path, (game_number+1) * sizeof(char *)); + list_game_title = (char **) realloc(list_game_title, (game_number+1) * sizeof(char *)); + list_game_platform = (u8 *) realloc(list_game_platform, (game_number+1) * sizeof(u8) ); + list_game_path[game_number] = strcpy_malloc(path); list_game_platform[game_number] = ext; + char title[512]; + strcpy(title, &strrchr(path, '/')[1]); + RemoveExtention(title); + if(ext == _ISO_PS3 || ext == _JB_PS3 || ext == _ISO_PSP || ext == _JB_PSP) { - GetParamSFO("TITLE", list_game_title[game_number], game_number, NULL); + GetParamSFO("TITLE", title, game_number, NULL); } - RefreshList(); + list_game_title[game_number] = strcpy_malloc(title); - return SUCCESS; +} + +void remove_GAMELIST(s64 pos) +{ + if(pos>game_number) return; + + s64 i; + for(i=pos; id_name, ".") || !strcmp(dir->d_name, "..")) continue; + + print_head("[%03d] %s", game_number+1, dir->d_name); + + if(game_number+2==MAX_GAME) { + print_load("Warning : too many games !"); + break; + } + + char temp[512]; + sprintf(temp, "%s/%s" , scan_path, dir->d_name); + + add_GAMELIST(temp); + } + closedir(d); } void Copy_Game(char *src, char *dst) @@ -11099,7 +11310,14 @@ void Copy_Game(char *src, char *dst) if( (total_size <= copy_current_size && copy_current_size != 0) || (gathering_cancel == YES && copy_cancel==NO && copy_current_size > 0) ) { - AddGame(copy_dst); + //AddGame(copy_dst); + + add_GAMELIST(copy_dst); + + sort_GAMELIST(); + + read_fav(); + start_Load_GamePIC(); show_msg(STR_DONE); } else { @@ -11133,7 +11351,8 @@ void Draw_GameProperties() strcpy(Game_id, STR_UNKNOWN); } - while(1) { + u8 LoopBreak=1; + while(LoopBreak) { cls(); @@ -11255,11 +11474,11 @@ void Draw_GameProperties() } - y=485; - x1=25; + x1=INPUT_X; + y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); - + SetFontZ(0); + x1=DrawButton(x1, y, STR_BACK , BUTTON_CIRCLE); tiny3d_Flip(); @@ -11268,6 +11487,7 @@ void Draw_GameProperties() ps3pad_read(); if(new_pad & BUTTON_CIRCLE) { + LoopBreak = 0; return; } } @@ -12141,7 +12361,8 @@ void get_game_update(int position) end_loading(); - while(1) + u8 LoopBreak=1; + while(LoopBreak) { cls(); ps3pad_read(); @@ -12174,13 +12395,8 @@ void get_game_update(int position) y+=new_line(1); } - FontColor(COLOR_1); - FontSize(15); - x=25; - - x=25; - y=485; - FontSize(15); + x=INPUT_X; + y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -12213,7 +12429,8 @@ void get_game_update(int position) if(d_positiond_name, ".") || !strcmp(dir->d_name, "..")) continue; - if(strstr(dir->d_name, "dev_usb") || strstr(dir->d_name, "dev_hdd0")) { + + if( strstr(dir->d_name, "dev_usb") + || strstr(dir->d_name, "dev_hdd0") + || strstr(dir->d_name, "dev_sd") + || strstr(dir->d_name, "dev_ms") + || strstr(dir->d_name, "dev_cd") + ) + { device_number++; strcpy(list_device[device_number], dir->d_name); } @@ -12421,41 +12645,27 @@ void check_device() sysFsAioFinish(mount_point); } - char new_title_list[MAX_GAME][255]={{0}}; - char new_path_list[MAX_GAME][255]={{0}}; - char new_platform_list[MAX_GAME]={0}; + s64 old_game_number = game_number; - int new_PS3_game_number=-1; - for(i=0;i<=game_number; i++) { + for(i=0; i<=game_number; i++) { + if(strstr(list_game_path[i], path_unplug) == NULL) { - new_PS3_game_number++; - strcpy(new_path_list[new_PS3_game_number], list_game_path[i]); - strcpy(new_title_list[new_PS3_game_number], list_game_title[i]); - new_platform_list[new_PS3_game_number] = list_game_platform[i]; + remove_GAMELIST(i); + i--; } } - if(game_number == new_PS3_game_number) { + if(game_number == old_game_number) { device_plug = 0; start_checking(); end_loading(); return; } - - game_number = new_PS3_game_number; - memset(list_game_path, 0, sizeof(list_game_path)); - memset(list_game_title, 0, sizeof(list_game_title)); - memset(list_game_platform, 0, sizeof(list_game_platform)); - for(i=0;i<=game_number; i++) { - strcpy(list_game_path[i], new_path_list[i]); - strcpy(list_game_title[i], new_title_list[i]); - list_game_platform[i] = new_platform_list[i]; - } } } else if(device_number > device_number_OLD) { // *** plug device *** for(k=0; k < device_number - device_number_OLD ; k++) { - int old_PS3_game_number = game_number; + char path_plug[20]; for(i=0;i<=device_number; i++) { for(j=0;j<=device_number_OLD;j++) { @@ -12474,6 +12684,8 @@ void check_device() } + s64 old_game_number = game_number; + print_load( "Get directories names from scan_dir.txt"); //get scan dir if(read_scan_dir()==FAILED) { @@ -12489,74 +12701,18 @@ void check_device() //get game list for(j=0; j<=scan_dir_number; j++) { sprintf(scan_path, "/%s/%s", path_plug, scan_dir[j]); - print_load("Scanning : %s", scan_path); - - DIR *d; - struct dirent *dir; - - d = opendir(scan_path); - if(d==NULL) continue; - - while ((dir = readdir(d))) { - if(!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) continue; - - char temp[255]; - sprintf(temp, "%s/%s" , scan_path, dir->d_name); - u8 ext = get_ext(temp); - - if(ext != _ISO_PS3 && ext != _ISO_PS2 && ext != _ISO_PS1 && ext != _ISO_PSP) - if(ext != _JB_PS3 && ext != _JB_PS2 && ext != _JB_PS1 && ext != _JB_PSP) continue; - - game_number++; - sprintf(list_game_path[game_number], "%s/%s" , scan_path, dir->d_name); - - strcpy(list_game_title[game_number], list_game_path[game_number]); - strcpy(list_game_title[game_number], &strrchr(list_game_title[game_number], '/')[1]); - RemoveExtention(list_game_title[game_number]); - - list_game_platform[game_number] = ext; - - if(ext == _ISO_PS3 || ext == _JB_PS3 || ext == _ISO_PSP || ext == _JB_PSP) { - GetParamSFO("TITLE", list_game_title[game_number], game_number, NULL); - } - - } - closedir(d); + + get_GAMELIST(scan_path); } - if(game_number == old_PS3_game_number) { + if(game_number == old_game_number) { device_plug = 0; start_checking(); end_loading(); return; } - print_load("Sorting the list"); - int min; - char ta[128], tb[128]; - u8 t; - for (i = 0; i=97 && ta[0]<=123) ta[0]-=32; - if(tb[0]>=97 && tb[0]<=123) tb[0]-=32; - if (strcmp(ta, tb) < 0) { - min = j; - } - } - if(min==i) continue; - strcpy(ta , list_game_title[min]); - strcpy(list_game_title[min], list_game_title[i]); - strcpy(list_game_title[i], ta); - strcpy(tb, list_game_path[min]); - strcpy(list_game_path[min], list_game_path[i]); - strcpy(list_game_path[i], tb); - t = list_game_platform[min]; - list_game_platform[min] = list_game_platform[i]; - list_game_platform[i] = t; - } + sort_GAMELIST(); } } @@ -12564,8 +12720,8 @@ void check_device() device_plug = 0; - print_load("GetTheme..."); GetThemes(); + read_fav(); start_Load_GamePIC(); @@ -13667,7 +13823,7 @@ void remove_cfw_syscalls() lv2poke(SYSCALL_TABLE + (8*7), syscall_not_impl); if(lv2peek(0x8000000000003000ULL)==0xFFFFFFFF80010003ULL) { - lv2syscall3(392, 0x1004, 0xa, 0x1b6); + lv2syscall3(392, 0x1004, 0xa, 0x1b6); //buzzer return; } @@ -18213,7 +18369,8 @@ print_load("ASCII"); char ascii_name[60]={0}; int i; int k=0; - for(i=0; i<=strlen(list_game_title[position]); i++) { + int l=strlen(list_game_title[position]); + for(i=0; i<=l; i++) { if(list_game_title[position][i]==32 // space || (48<=list_game_title[position][i] && list_game_title[position][i]<=57) //number || (65<=list_game_title[position][i] && list_game_title[position][i]<=90) // A..Z @@ -19937,7 +20094,10 @@ void Window(char *directory) } #endif - if(path_info("/dev_hdd1")==_NOT_EXIST) sys_fs_mount("CELL_FS_UTILITY:HDD1", "CELL_FS_FAT", "/dev_hdd1", 0); + if(path_info("/dev_hdd1")==_NOT_EXIST) { + sys_fs_mount("CELL_FS_UTILITY:HDD1", "CELL_FS_FAT", "/dev_hdd1", 0); + sysFsAioInit("/dev_hdd1"); + } char temp[512]; @@ -20387,9 +20547,8 @@ void Draw_txt_viewer_input() { if(txt_viewer_activ == NO) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -20653,6 +20812,8 @@ void Option(char *item) start_copy_loading(); SpeedTest(); end_copy_loading(); + open_txt_viewer("/dev_hdd0/speed_test.txt"); + } else if(strcmp(item, STR_PASTE) == 0) { start_copy_loading(); @@ -21272,7 +21433,7 @@ void Open_option() } add_option_item(STR_DUMP_FLASH); - //add_option_item("SpeedTest"); + add_option_item("SpeedTest"); } else { u8 all_is_dir=YES; @@ -22003,9 +22164,8 @@ u8 window_input() void Draw_input() { - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -22067,7 +22227,9 @@ void Draw_FileExplorer() init_FileExplorer(); Window(NULL); end_loading(); - while(1) + + u8 LoopBreak=1; + while(LoopBreak) { cls(); @@ -22100,7 +22262,10 @@ void Draw_FileExplorer() input_MENU(); } else { if( option_input() == OFF) - if( window_input() == BREAK) break; + if( window_input() == BREAK) { + LoopBreak =0; + return; + } cursor_input(); properties_input(); } @@ -22801,9 +22966,8 @@ void Draw_ICON0_creator_input() { if(ICON0_creator == NO) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -23408,7 +23572,8 @@ void CONFIG_check(char *IsoPath) strcpy(CONFIG_STR[config_number], "CUSTOM"); } - while(1) + u8 LoopBreak=1; + while(LoopBreak) { cls(); Draw_BGS(); @@ -23424,11 +23589,16 @@ void CONFIG_check(char *IsoPath) DrawString(x, y, CONFIG_STR[config_position]); FontColor(COLOR_1); - x=25;y=485; + + x=INPUT_X; + y=INPUT_Y; + FontColor(COLOR_1); + SetFontZ(0); + x = DrawButton(x, y, STR_ENTER, BUTTON_CROSS); x = DrawButton(x, y, STR_CANCEL, BUTTON_CIRCLE); - if(config_number>0) DrawButton(x, 485, STR_CHANGE, BUTTON_SQUARE); + if(config_number>0) DrawButton(x, y, STR_CHANGE, BUTTON_SQUARE); tiny3d_Flip(); ScreenShot(); @@ -23443,9 +23613,13 @@ void CONFIG_check(char *IsoPath) char CONFIG_path[128]; sprintf(CONFIG_path, "/dev_hdd0/game/%s/USRDIR/sys/CONFIG/%s/%s.CONFIG", ManaGunZ_id, CONFIG_STR[config_number], PS2_ID); CopyFile(CONFIG_path, CurrentCONFIG); + LoopBreak = 0; + break; + } + if(new_pad & BUTTON_CIRCLE) { + LoopBreak=0; break; } - if(new_pad & BUTTON_CIRCLE) break; } start_loading(); } @@ -24019,9 +24193,14 @@ void load_PS2_CONFIG(char *CONFIG_path) if(f==NULL) return; print_load("Open %s", CONFIG_path); - while(1) + + u8 LoopBreak=1; + while(LoopBreak) { - if( fread(&cmdID, sizeof(u32), 1, f) != 4) goto end; + if( fread(&cmdID, sizeof(u32), 1, f) != 4) { + LoopBreak=0; + goto end; + } cmdID=reverse32(cmdID); sprintf(str, "0x%02X", cmdID); @@ -24074,13 +24253,19 @@ void load_PS2_CONFIG(char *CONFIG_path) char gameID[10]; - if( fread(&gameID, sizeof(char), 10, f) != 10) goto end; + if( fread(&gameID, sizeof(char), 10, f) != 10) { + LoopBreak=0; + goto end; + } sprintf(str, "Game ID : %s", gameID); print_load(str); add_item_value_MENU(str); - goto end; + LoopBreak=0; + goto end; + + break; } case 0x01 : { @@ -24644,9 +24829,9 @@ void input_PS2_CONFIG_EDITOR() void Draw_PS2_CONFIG_EDITOR_input() { - float x=25; - float y=485; - FontSize(15); + + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -25080,11 +25265,11 @@ u8 apply_pnach(char *pnach_file, char *PnachRest) fread(&filesz, 4, 1, fi); if(ProgType==1 && filesz!=0) { - fseek(fi, file_offset + 0x34+4+0x10+i*0x20, SEEK_SET); + fseek(fi, file_offset + 0x38+i*0x20, SEEK_SET); break; } } - + if(ProgType != 1 || filesz==0) { print_load("Error : ProgOffset not found"); fclose(fi); @@ -25095,7 +25280,6 @@ u8 apply_pnach(char *pnach_file, char *PnachRest) } fread(&ProgOffset, 4, 1, fi); - ProgOffset = reverse32(ProgOffset); while(fgets(line, 128, fp) != NULL) { @@ -25126,7 +25310,7 @@ u8 apply_pnach(char *pnach_file, char *PnachRest) offset = offset - (offset >> 28)*0x10000000; if(offset > size) { - print_load("Error : offset > Elf_size"); + print_load("Error : offset %X > Elf_size %X", offset, size); fclose(fr); fclose(fi); fclose(fp); @@ -25419,19 +25603,21 @@ u8 PS2_GAME_MENU_CROSS() end_loading(); } else if(item_is(STR_RENAME)) { - char New_Name[255]; - strcpy(New_Name, list_game_title[position]); + char NewName[255]; + strcpy(NewName, list_game_title[position]); char *extention = GetExtention(list_game_path[position]); - if(Get_OSK_String(STR_RENAME, New_Name, 255) == SUCCESS) { - if(New_Name[0] != 0) { + if(Get_OSK_String(STR_RENAME, NewName, 255) == SUCCESS) { + if(NewName[0] != 0) { char DirPath[255]; char NewPath[255]; strcpy(DirPath, list_game_path[position]); DirPath[strrchr(DirPath, '/') - DirPath] = 0; - sprintf(NewPath, "%s/%s%s", DirPath, New_Name, extention); + sprintf(NewPath, "%s/%s%s", DirPath, NewName, extention); if( rename(list_game_path[position], NewPath) == 0) { - strcpy(list_game_path[position], NewPath); - strcpy(list_game_title[position], New_Name); + FREE(list_game_path[position]); + list_game_path[position] = strcpy_malloc(NewPath); + FREE(list_game_path[position]) + list_game_title[position] = strcpy_malloc(NewName); } } } @@ -25616,9 +25802,8 @@ void Draw_PS2_GAME_MENU_input() if(ICON0_creator == YES) return; if(txt_viewer_activ == YES) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -25754,19 +25939,21 @@ void close_PSP_GAME_MENU() u8 PSP_GAME_MENU_CROSS() { if(item_is(STR_RENAME)) { - char New_Name[255]; - strcpy(New_Name, list_game_title[position]); + char NewName[255]; + strcpy(NewName, list_game_title[position]); char *extention = GetExtention(list_game_path[position]); - if(Get_OSK_String(STR_RENAME, New_Name, 255) == SUCCESS) { - if(New_Name[0] != 0) { + if(Get_OSK_String(STR_RENAME, NewName, 255) == SUCCESS) { + if(NewName[0] != 0) { char DirPath[255]; char NewPath[255]; strcpy(DirPath, list_game_path[position]); DirPath[strrchr(DirPath, '/') - DirPath] = 0; - sprintf(NewPath, "%s/%s%s", DirPath, New_Name, extention); + sprintf(NewPath, "%s/%s%s", DirPath, NewName, extention); if( rename(list_game_path[position], NewPath) == 0) { - strcpy(list_game_path[position], NewPath); - strcpy(list_game_title[position], New_Name); + FREE(list_game_path[position]); + list_game_path[position] = strcpy_malloc(NewPath); + FREE(list_game_path[position]) + list_game_title[position] = strcpy_malloc(NewName); } } } @@ -25802,7 +25989,7 @@ u8 PSP_GAME_MENU_CROSS() } else if(item_is(STR_DELETE)) { char diag_msg[512]; - sprintf(diag_msg, "%s '%s' ?\n%s : %s\n", STR_DL_UPDATE, list_game_title[position], STR_DONE, list_game_path[position]); + sprintf(diag_msg, "%s '%s' ?\n%s : %s\n", STR_ASK_DEL, list_game_title[position], STR_DONE, list_game_path[position]); if( DrawDialogYesNo(diag_msg) == YES) { start_loading(); u8 ret = Delete_Game(NULL, position); @@ -25838,9 +26025,8 @@ void Draw_PSP_GAME_MENU_input() if(ICON0_creator == YES) return; if(txt_viewer_activ == YES) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -25963,19 +26149,21 @@ void close_PS1_GAME_MENU() u8 PS1_GAME_MENU_CROSS() { if(item_is(STR_RENAME)) { - char New_Name[255]; - strcpy(New_Name, list_game_title[position]); + char NewName[255]; + strcpy(NewName, list_game_title[position]); char *extention = GetExtention(list_game_path[position]); - if(Get_OSK_String(STR_RENAME, New_Name, 255) == SUCCESS) { - if(New_Name[0] != 0) { + if(Get_OSK_String(STR_RENAME, NewName, 255) == SUCCESS) { + if(NewName[0] != 0) { char DirPath[255]; char NewPath[255]; strcpy(DirPath, list_game_path[position]); DirPath[strrchr(DirPath, '/') - DirPath] = 0; - sprintf(NewPath, "%s/%s%s", DirPath, New_Name, extention); + sprintf(NewPath, "%s/%s%s", DirPath, NewName, extention); if( rename(list_game_path[position], NewPath) == 0) { - strcpy(list_game_path[position], NewPath); - strcpy(list_game_title[position], New_Name); + FREE(list_game_path[position]); + list_game_path[position] = strcpy_malloc(NewPath); + FREE(list_game_path[position]) + list_game_title[position] = strcpy_malloc(NewName); } } } @@ -26014,7 +26202,7 @@ u8 PS1_GAME_MENU_CROSS() } else if(item_is(STR_DELETE)) { char diag_msg[512]; - sprintf(diag_msg, "%s '%s' ?\n%s : %s\n", STR_DL_UPDATE, list_game_title[position], STR_PATH, list_game_path[position]); + sprintf(diag_msg, "%s '%s' ?\n%s : %s\n", STR_ASK_DEL, list_game_title[position], STR_PATH, list_game_path[position]); if( DrawDialogYesNo(diag_msg) == YES) { start_loading(); u8 ret = Delete_Game(NULL, position); @@ -26050,9 +26238,8 @@ void Draw_PS1_GAME_MENU_input() if(ICON0_creator == YES) return; if(txt_viewer_activ == YES) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -26506,9 +26693,8 @@ u8 input_CHOOSE_IDPS() void Draw_CHOOSE_IDPS_input() { - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -26520,7 +26706,8 @@ void Draw_CHOOSE_IDPS_input() void Draw_CHOOSE_IDPS() { - while(1) + u8 LoopBreak=1; + while(LoopBreak) { cls(); Draw_scene(); @@ -26533,7 +26720,10 @@ void Draw_CHOOSE_IDPS() ps3pad_read(); - if(input_CHOOSE_IDPS() == BREAK) return; + if(input_CHOOSE_IDPS() == BREAK) { + LoopBreak=0; + break; + } } old_pad = 0; new_pad = 0; @@ -26746,7 +26936,8 @@ u8 PS3_GAME_MENU_CROSS() if(Get_OSK_String(STR_RENAME, tmpName, 128) == SUCCESS) { if(tmpName[0]!=0) { if(SetParamSFO("TITLE", tmpName, position, NULL)==SUCCESS) { - strcpy(list_game_title[position], tmpName); + FREE(list_game_title[position]); + list_game_title[position] = strcpy_malloc(tmpName); show_msg(STR_DONE); } } @@ -26833,9 +27024,27 @@ u8 PS3_GAME_MENU_CROSS() ret = extractps3iso(list_game_path[position], ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], FULL); else ret = extractps3iso(list_game_path[position], ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], SPLIT); - if(ret==FAILED) show_msg(STR_FAILED); - else show_msg(STR_DONE); + if(ret==SUCCESS) { + char ExtGame[512]; + + sprintf(ExtGame, "%s%s", ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], strrchr(list_game_path[position], '/')); + + int l= strlen(ExtGame); + if(!strcmp(&ExtGame[l - 2], ".0")) ExtGame[l - 6] = 0; else ExtGame[l - 4] = 0; + + add_GAMELIST(ExtGame); + + sort_GAMELIST(); + read_fav(); + + start_Load_GamePIC(); + + show_msg(STR_DONE); + } + else + show_msg(STR_FAILED); + end_loading(); } else if(item_is(STR_CONVERT_ISO)) { @@ -26848,8 +27057,30 @@ u8 PS3_GAME_MENU_CROSS() else ret = makeps3iso(list_game_path[position], ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], SPLIT); - if(ret==FAILED) show_msg(STR_FAILED); - else show_msg(STR_DONE); + if(ret==SUCCESS) { + char IsoGame[512]; + + if(is_ntfs(ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]])==YES + || strstr(ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], "/dev_hdd0")) { + sprintf(IsoGame, "%s%s.iso", ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], strrchr(list_game_path[position], '/')); + } else { + sprintf(IsoGame, "%s%s.iso.0", ITEMS_VALUE[ITEMS_POSITION][ITEMS_VALUE_POSITION[ITEMS_POSITION]], strrchr(list_game_path[position], '/')); + + } + + add_GAMELIST(IsoGame); + + sort_GAMELIST(); + + read_fav(); + + start_Load_GamePIC(); + + show_msg(STR_DONE); + } + else + show_msg(STR_FAILED); + end_loading(); } else if(item_is(STR_FIX_PERMS)) { @@ -26978,9 +27209,8 @@ void Draw_PS3_GAME_MENU_input() if(ICON0_creator == YES) return; if(txt_viewer_activ == YES) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -27288,9 +27518,8 @@ void Draw_PLUGINS_MANAGER_input() { if(MENU==NO) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -27365,18 +27594,23 @@ void Draw_AdjustScreen() if(path_info(TVTEST) != _FILE) Show_TVTEST=-1; - while(1){ - int x=25; + u8 LoopBreak=1; + while(LoopBreak) + { + + float x=INPUT_X; + float y=INPUT_Y; + SetFontZ(0); + adjust_screen(); cls(); - + if(Show_TVTEST==YES) { Draw_TVTEST(); FontColor(WHITE); - FontSize(15); - x=DrawButton(x, 485, STR_HIDETV, BUTTON_CROSS); + x=DrawButton(x, y, STR_HIDETV, BUTTON_CROSS); } else { Draw_Box(0,0,10, 0, X_MAX,Y_MAX, 0xFFFFFFFF, NO); Draw_Box(30,30,9 , 0, X_MAX-30*2,Y_MAX-30*2, 0x000000FF, NO); @@ -27420,11 +27654,11 @@ void Draw_AdjustScreen() FontColor(BLACK); FontSize(15); - if(Show_TVTEST != -1 && Load_GamePIC==NO) x=DrawButton(x, 485, STR_SHOWTV, BUTTON_CROSS); + if(Show_TVTEST != -1 && Load_GamePIC==NO) x=DrawButton(x, INPUT_Y, STR_SHOWTV, BUTTON_CROSS); } - x=DrawButton(x, 485, STR_RESET, BUTTON_SQUARE); - x=DrawButton(x, 485, STR_BACK, BUTTON_CIRCLE); + x=DrawButton(x, INPUT_Y, STR_RESET, BUTTON_SQUARE); + x=DrawButton(x, INPUT_Y, STR_BACK, BUTTON_CIRCLE); tiny3d_Flip(); ScreenShot(); @@ -27452,7 +27686,11 @@ void Draw_AdjustScreen() if(new_pad & BUTTON_UP) {if(videoscale_y < 120) videoscale_y+=10;} if(new_pad & BUTTON_RIGHT) {if(videoscale_x > -120) videoscale_x-=10;} if(new_pad & BUTTON_LEFT) {if(videoscale_x < 120) videoscale_x+=10;} - if(new_pad & BUTTON_CIRCLE) {write_setting(); return;} + if(new_pad & BUTTON_CIRCLE) { + write_setting(); + LoopBreak=0; + return; + } } } @@ -27584,9 +27822,8 @@ u8 input_COLOR(int n) void Draw_COLOR_input() { - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -27596,7 +27833,8 @@ void Draw_COLOR_input() void Draw_ChooseColor(u8 n) { - while(1) + u8 LoopBreak=1; + while(LoopBreak) { cls(); Draw_scene(); @@ -27609,7 +27847,10 @@ void Draw_ChooseColor(u8 n) ps3pad_read(); - if(input_COLOR(n) == BREAK) return; + if(input_COLOR(n) == BREAK) { + LoopBreak=0; + return; + } } } @@ -28180,9 +28421,8 @@ void input_SETTINGS() void Draw_SETTINGS_input() { - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -28321,10 +28561,12 @@ void AutoMount() if(Path_exist==NO) { end_loading(); - while(1) { + u8 LoopBreak=1; + while(LoopBreak) + { cls(); - int x=50, y=40; + float x=50, y=40; FontSize(20); FontColor(RED); @@ -28333,10 +28575,12 @@ void AutoMount() y+=20; DrawFormatString(x, y, "%s = %s", STR_PATH, list_game_path[0]); + x=INPUT_X; + y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); + SetFontZ(0); - DrawButton(25, 485, STR_BACKTOXMB, BUTTON_CIRCLE); + DrawButton(x, y, STR_BACKTOXMB, BUTTON_CIRCLE); tiny3d_Flip(); ScreenShot(); @@ -28345,6 +28589,7 @@ void AutoMount() if(new_pad & BUTTON_CIRCLE) { ioPadEnd(); + LoopBreak=0; exit(0); } } @@ -28452,9 +28697,8 @@ void Draw_filter_input() { if(filter==NO) return; - float x=25; - float y=485; - FontSize(15); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); SetFontZ(0); @@ -31774,15 +32018,42 @@ void input_MAIN() } } +float DrawTAG(float x, float y, float z, float min_width, float font_height, char *str) +{ + + float w = min_width; + + float w_str = GetWidth(str) + 8.0; + + while( w_str > w ) w += 4.0; + + float e = (w - (w_str-8.0))/2.0; + + if(PICTURE_offset[TAG] != 0) { + tiny3d_SetTexture(0, PICTURE_offset[TAG], PICTURE[TAG].width, PICTURE[TAG].height, PICTURE[TAG].pitch, TINY3D_TEX_FORMAT_A8R8G8B8, TEXTURE_LINEAR); + Draw_Box(x, y, z+1, 0, w, font_height, WHITE, YES); + } else + Draw_Box(x, y, z+1, 0, w, font_height, 0xA0A0A0A0, NO); + + DrawFormatString(x + e + 1, y+1, str); + + return x+w+1; +} + +#define INPUT_TAG_WIDTH_MIN + void Draw_MAIN_input() { if(MENU==YES) return; if(filter==YES) return; - int x=25, y=485; - + float tagbox_min_width = 50; + + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); + SetFontZ(0); + x=DrawButton(x, y, STR_SETTINGS, BUTTON_START); if(Game_stuff==YES) { x=DrawButton(x, y, STR_GAMEMENU, BUTTON_TRIANGLE); @@ -31797,45 +32068,100 @@ void Draw_MAIN_input() //x=DrawFormatString( x+10, y, "%s", STR_HOLD); FontColor(COLOR_1); if(hold_CIRCLE) { - DrawProgRing(x+12, y+7.5, 20, ((hold_CIRCLE%30)*100)/30, COLOR_3); + DrawProgRing(x+7, y+7.5, 20, ((hold_CIRCLE%30)*100)/30, COLOR_3); FontColor(COLOR_3); - DrawFormatString(x+15, y-12, "%d", (90 - hold_CIRCLE)/30); + DrawFormatString(x+10, y-12, "%d", (90 - hold_CIRCLE)/30); FontColor(COLOR_1); } - x=DrawButton(x+5, y, STR_BACKTOXMB, BUTTON_CIRCLE); + x=DrawButton(x, y, STR_BACKTOXMB, BUTTON_CIRCLE); - x=740; - y=480; + x=X_MAX-10-4*tagbox_min_width; + y=INPUT_Y; if(Game_stuff == YES) { + char tag_str[20]; + int t; + + FontColor(COLOR_1); + + if(list_game_platform[position] == _ISO_PS3 || list_game_platform[position] == _JB_PS3) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "PS3"); + } else + if(list_game_platform[position] == _ISO_PS2 || list_game_platform[position] == _JB_PS2) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "PS2"); + } else + if(list_game_platform[position] == _ISO_PS1 || list_game_platform[position] == _JB_PS1) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "PS1"); + } else + if(list_game_platform[position] == _ISO_PSP || list_game_platform[position] == _JB_PSP) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "PSP"); + } else { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "UNK"); + } + + float x1 = x; + + char *Ext = GetExtention(list_game_path[position]); + + if( (Ext[1] == 'I' || Ext[1] == 'i') + && (Ext[2] == 'S' || Ext[2] == 's') + && (Ext[3] == 'O' || Ext[3] == 'o') ) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "ISO"); + } else + if( (Ext[1] == 'B' || Ext[1] == 'b') + && (Ext[2] == 'I' || Ext[2] == 'i') + && (Ext[3] == 'N' || Ext[3] == 'n') ) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "BIN"); + } else + if( (Ext[1] == 'M' || Ext[1] == 'm') + && (Ext[2] == 'D' || Ext[2] == 'd') + && (Ext[3] == 'F' || Ext[3] == 'f') ) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "MDF"); + } else + if( (Ext[1] == 'I' || Ext[1] == 'i') + && (Ext[2] == 'M' || Ext[2] == 'm') + && (Ext[3] == 'G' || Ext[3] == 'g') ) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "IMG"); + } else + if( (Ext[1] == 'C' || Ext[1] == 'c') + && (Ext[2] == 'S' || Ext[2] == 's') + && (Ext[3] == 'O' || Ext[3] == 'o') ) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "CSO"); + } else { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "JB"); + } + if(is_66600(list_game_path[position])) { FontColor(COLOR_4); - x = DrawString(x, y, "666 "); + FontSize(INPUT_SIZE/2); + DrawTAG(x1, y-INPUT_SIZE/2, 0, 0, INPUT_SIZE/2, "666"); FontColor(COLOR_1); - } + FontSize(INPUT_SIZE); + } + if(usb) { - int t; + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "FAT32"); sscanf(list_game_path[position], "/dev_usb%d%*s" , &t); - x = Draw_USB(x , y, 20, COLOR_1, t); - } + sprintf(tag_str, "USB%d", t); + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, tag_str); + + } else if(is_ntfs(list_game_path[position]) == YES) { - int t; + sscanf(list_game_path[position], "/ntfs%d%*s" , &t); - FontColor(COLOR_3); - x = DrawString(x, y, "NTFS "); - x = Draw_USB(x , y, 20, COLOR_3 , t); - } - if(list_game_platform[position] == _ISO_PS3) { - Draw_GAMEDISK( x + 5, y, 0, 20, _ISO_PS3); - } else - if(list_game_platform[position] == _ISO_PS2) { - Draw_GAMEDISK( x + 5, y, 0, 20, _ISO_PS2); - } else - if(list_game_platform[position] == _ISO_PS1) { - Draw_GAMEDISK( x + 5, y, 0, 20, _ISO_PS1); - } else - if(list_game_platform[position] == _ISO_PSP) { - Draw_GAMEDISK( x + 5, y, 0, 20, _ISO_PSP); + sprintf(tag_str, "NTFS%d", t); + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, tag_str); + + char dev[10]; + sprintf(dev, "ntfs%d", t); + sprintf(tag_str, "USB%d", NTFS_Test_Device(dev)); + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, tag_str); + + } else + if( strstr(list_game_path[position], "/dev_hdd0") != NULL) { + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "UFS2"); + x = DrawTAG(x, y, 0, tagbox_min_width, INPUT_SIZE, "HDD0"); } + } } @@ -31955,6 +32281,7 @@ int main(void) { int i, j; char scan_path[128]; + u8 LoopBreak=1; NTFS_init_system_io(); AutoM = is_AutoMount(); // ManaGunZ_id @@ -31963,7 +32290,7 @@ int main(void) sysModuleLoad(SYSMODULE_JPGDEC); Init_Graph(); - //initAIO(); + initAIO(); ioPadInit(7); ioPadSetPressMode(0,1); SetCurrentFont(-1); @@ -32033,7 +32360,8 @@ int main(void) #ifndef RPCS3 if(init_ManaGunZ() == FAILED) { end_loading(); - while(1) { + LoopBreak=1; + while(LoopBreak) { cls(); ps3pad_read(); @@ -32041,10 +32369,12 @@ int main(void) FontColor(RED); DrawString(50, 100, "Error : Cannot init ManaGunZ"); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); + SetFontZ(0); - DrawButton(25, 485, STR_BACKTOXMB, BUTTON_CIRCLE); + DrawButton(x, y, STR_BACKTOXMB, BUTTON_CIRCLE); tiny3d_Flip(); ScreenShot(); @@ -32053,6 +32383,7 @@ int main(void) ioPadEnd(); sysModuleUnload(SYSMODULE_PNGDEC); sysModuleUnload(SYSMODULE_JPGDEC); + LoopBreak=0; return 0; } } @@ -32072,7 +32403,9 @@ int main(void) print_load("Get directories names from scan_dir.txt"); if(read_scan_dir()==FAILED){ end_loading(); - while(1) { + LoopBreak=1; + while(LoopBreak) + { cls(); ps3pad_read(); @@ -32082,10 +32415,12 @@ int main(void) FontColor(RED); DrawString(50, 40, "Error : Can't read scan_dir.txt"); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); + SetFontZ(0); - DrawButton(25, 485, STR_BACKTOXMB, BUTTON_CIRCLE); + DrawButton(x, y, STR_BACKTOXMB, BUTTON_CIRCLE); tiny3d_Flip(); ScreenShot(); @@ -32095,6 +32430,7 @@ int main(void) sysModuleUnload(SYSMODULE_PNGDEC); sysModuleUnload(SYSMODULE_JPGDEC); ioPadEnd(); + LoopBreak=0; return 0; } } @@ -32105,79 +32441,14 @@ int main(void) for(i=0; i<=device_number; i++) { sprintf(scan_path, "/%s/%s", list_device[i], scan_dir[j]); - print_load("Scanning : %s", scan_path); - - DIR *d; - struct dirent *dir; - - d = opendir(scan_path); - if(d==NULL) continue; - - while ((dir = readdir(d))) { - if(!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) continue; - - char temp[255]; - sprintf(temp, "%s/%s" , scan_path, dir->d_name); - - u8 ext = get_ext(temp); - - if(ext != _ISO_PS3 && ext != _ISO_PS2 && ext != _ISO_PS1 && ext != _ISO_PSP) - if(ext != _JB_PS3 && ext != _JB_PS2 && ext != _JB_PS1 && ext != _JB_PSP) continue; - - print_head("[%03d] %s", game_number+1, dir->d_name); - - if(game_number+2==MAX_GAME) { - print_load("Warning : too many games !"); - break; - } - - game_number++; - sprintf(list_game_path[game_number], "%s/%s" , scan_path, dir->d_name); - - strcpy(list_game_title[game_number], list_game_path[game_number]); - strcpy(list_game_title[game_number], &strrchr(list_game_title[game_number], '/')[1]); - RemoveExtention(list_game_title[game_number]); - - list_game_platform[game_number] = ext; - - if(ext == _ISO_PS3 || ext == _JB_PS3 || ext == _ISO_PSP || ext == _JB_PSP) { - GetParamSFO("TITLE", list_game_title[game_number], game_number, NULL); - } - - } - closedir(d); + get_GAMELIST(scan_path); } } - - print_load( "Sorting the games' list"); - int min; - char ta[255], tb[255]; - u8 t; - for(i = 0; i=97 && ta[0]<=123) ta[0]-=32; - if(tb[0]>=97 && tb[0]<=123) tb[0]-=32; - if (strcmp(ta, tb) < 0) { - min = j; - } - } - if(min==i) continue; - strcpy(ta , list_game_title[min]); - strcpy(list_game_title[min], list_game_title[i]); - strcpy(list_game_title[i], ta); - strcpy(tb, list_game_path[min]); - strcpy(list_game_path[min], list_game_path[i]); - strcpy(list_game_path[i], tb); - t = list_game_platform[min]; - list_game_platform[min] = list_game_platform[i]; - list_game_platform[i] = t; - } - + + sort_GAMELIST(); + start_Load_GamePIC(); - + print_load("Get Favorite game list"); read_fav(); @@ -32190,7 +32461,8 @@ int main(void) start_load_PIC1(); - while(1) { + LoopBreak=1; + while(LoopBreak) { while(game_number < 0) { cls(); @@ -32200,19 +32472,17 @@ int main(void) check_device(); - int x=50, y=40; - - FontSize(20); FontColor(RED); - DrawString(x, y, STR_NOGAME); + DrawString(50, 40, STR_NOGAME); + float x=INPUT_X; + float y=INPUT_Y; FontColor(COLOR_1); - FontSize(15); + SetFontZ(0); - x=25; - x=DrawButton(x, 485, STR_BACKTOXMB , BUTTON_CIRCLE); - x=DrawButton(x, 485, STR_FILEMANAGER, BUTTON_SELECT); + x=DrawButton(x, y, STR_BACKTOXMB , BUTTON_CIRCLE); + x=DrawButton(x, y, STR_FILEMANAGER, BUTTON_SELECT); tiny3d_Flip(); ScreenShot(); @@ -32292,4 +32562,3 @@ void Draw_scene() Draw_MENU(); } } - diff --git a/Makefile b/Makefile index eb7a1401..3789c37b 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ PKGFILES1 := $(CURDIR)/pkgfiles PKGFILES2 := $(CURDIR)/pkgfiles2 SFOXML := sfo.xml -VERSION := 1.33 +VERSION := 1.34 ifeq ($(FILEMANAGER), 1) PKGFILES := $(PKGFILES2) diff --git a/OffsetFinder/main.c b/OffsetFinder/main.c index 53ad0a13..ea819f93 100644 --- a/OffsetFinder/main.c +++ b/OffsetFinder/main.c @@ -241,12 +241,14 @@ uint8_t compare(u8 ignore, char *mem, char *flag, u32 size) int main() { - + char dump[255]; FILE *f; FILE *common; FILE *SKY; FILE *symbols; + FILE *IDPSet; + FILE *ERK; char temp[255]; char temp2[255]; @@ -256,6 +258,8 @@ int main() SKY = fopen("firmware_symbols.h", "w"); common = fopen("common.h", "w"); symbols = fopen("symbols.h", "w"); + IDPSet = fopen("firmware.h", "w"); + ERK = fopen("erk_symbols.h", "w"); fputs("#ifndef __COMMON_H__\n", common); fputs("#define __COMMON_H__\n\n", common); @@ -279,6 +283,13 @@ int main() fputs("#define umd_mutex_offset (0x64480+0x38C)\n\n", symbols); + fputs("#ifndef __FIRMWARE_H__\n", IDPSet); + fputs("#define __FIRMWARE_H__\n\n", IDPSet); + + fputs("#ifndef __SYMBOLS_H__\n", ERK); + fputs("#define __SYMBOLS_H__\n\n", ERK); + fputs("#define KERNEL_BASE 0x8000000000000000\n\n", ERK); + printf("Searching offsets...\n"); d = opendir("LV2"); @@ -340,7 +351,20 @@ int main() u64 FW_DATE_1=0; u64 FW_DATE_2=0; + u64 HTAB_OFFSET=0; + u64 MMAP_OFFSET1=0; + u64 MMAP_OFFSET2=0; + u64 SPE_OFFSET=0; + + u64 LPAR=0; + + u8 flag_lpar[0x10]={0x00, 0x00, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00}; + u8 flag_htab[0x8] = {0x41, 0xDA, 0x00, 0x54, 0xE9, 0x7F, 0x00, 0xA8}; + u8 flag_mmap1[0x8] = {0x88, 0x1F, 0x00, 0x99, 0x54, 0x00, 0x06, 0x3E}; + u8 flag_mmap2[0x8] = {0xE8, 0xFF, 0x00, 0xE0, 0x7C, 0x08, 0x03, 0x78}; + u8 flag_spe[0x8] = {0x39, 0x20, 0x00, 0x09, 0xE9, 0x43, 0x00, 0x00 }; + u8 flag_offset_fix[0x20] = {0x38, 0xDE, 0x00, 0x07, 0x88, 0x1E, 0x00, 0x07, 0x2F, 0x84, 0x00, 0x01, 0x98, 0x01, 0x00, 0x73, 0x88, 0x06, 0x00, 0x01, 0x88, 0xA6, 0x00, 0x08, 0x89, 0x26, 0x00, 0x02, 0x89, 0x66, 0x00, 0x03}; u8 flag_offset_2_fix[0x20] = {0xF9, 0x1F, 0x00, 0x20, 0xF8, 0xFF, 0x00, 0x28, 0xF8, 0xDF, 0x00, 0x30, 0xF8, 0xBF, 0x00, 0x38, 0xFB, 0xBF, 0x00, 0x40, 0x4B, 0xFA, 0x97, 0x45, 0x54, 0x63, 0x06, 0x3E, 0x2F, 0x83, 0x00, 0x00}; u8 flag_offset_fix_2B17[0x20] = {0x4E, 0x80, 0x00, 0x20, 0x3C, 0x80, 0x10, 0x50, 0x7C, 0x08, 0x02, 0xA6, 0xF8, 0x21, 0xFF, 0x71, 0x78, 0x84, 0x07, 0xC6, 0xFB, 0xE1, 0x00, 0x88, 0x64, 0x84, 0x03, 0x00, 0x7C, 0x7F, 0x1B, 0x78}; @@ -735,6 +759,10 @@ int main() } } + if(compare(0xFF, (char *) &memLV2[n], (char *) flag_lpar, sizeof(flag_lpar))) { + LPAR = n; + } + if(compare(0xFF, (char *) &memLV2[n], (char *) open_shared_kernel_object_symbol_flag, sizeof(open_shared_kernel_object_symbol_flag))) { open_shared_kernel_object_symbol = n; } @@ -1076,20 +1104,39 @@ int main() fread(memLV1,1,size, f); fclose(f); - - for(n=0x360000; nuGgq zFn|yOhGAy^xUpmV=N(@xEw;w}^<-ZH0Db}hX+Mm9#xMu~2cO!v_f8{~)Xt1%D_so|Lb3UcqMX$ zqE(ofxHa*Qe_a?Ymn*oofA6CYbtRLDPFWI_#h!Ov4_~?V;pmzE_bz|hG2bTw0N@{S zMa!Z9Ow&`OrphaoGdkKLMmiPmIMjQjuTrU2XZwEmg9Be|jhN;#D)=w-JkYf<-PwNd zH?N#xS(bd7ajzVW-PqL;S1wlxLa6BxCy4xg$+x#hjXe+T?E2I3cZYaEaQ8j2C!L75 z*O4}U<3{z?tx4RS*`_Fpg62QJ_mN#)@0>b&iRXFWCn_PNq0B9E9H10{Ha+4H!z^&@ zl~;T7zdHD0ZnpjCBM(b2yzq;Ns;F}>fAi)I?YWuTBf*e~w{~r8uhsG5OTV5zbokW* zLWl+fLFTPDd*jh)bk66l&u!@V!`sKN1zN%-mSufD>om4RRYx2`EJX-4oj5`knq&Z| zC`x647cj7h{CoHVroVqcdh&_K0<$u)_BJJ-pHVeEVB5BhYjyPW>=dVN-)1ii4NsRW z+xgkgpT{CE$exEe0DvmSc5bGqDwzm27YCn;(4pTi@KWn0`qV<#f7JPNxsR_r7}o z2F|}f{>P)oM_j^Knx<9-!OwM$0wF%9N=XzcLa0eQt&ib2)dg)`*LYpmg0pQxJaC+k z->q%ix{0RuCg zo%!+c(VMUT{z&DwFCS9EW?0#fPRZSwZSvNwTjWGMF3i_s=z1g)(%Z`p`Hv_{zC|3R z6dHYfR!5v7%d13OWkGvj;C!L)^yvbF?w+$Kr3|Hn`S98pwn~;O3IaCGNG_h}%xy@e z_`Q2}eP{mjeP{YdjvhUhy>w|r92&aFxfpX_`SLT7{rkTWoiAq<@?lK5selo{2q9mh z?jCXeMx3h3;FkkSp_aJGsVRKr%C!Q|3m740ZX)r5K-;udHxOvCVu{2|ES@YdEOKny z#t5Og)YzTbn#g898lRcTe^jlOIjdNd;_-N>)=s{VS2;lzMUgKFg5b-9ZA!$cssac# z|C+8^lPVd?kZ3fTZ|jKV6j`1tZ80oM675 z;M{;L3R^a9+F*8c#1<`nmP#djad^0J_UyTW=XsSxXR;jYh&e665M^0*&3qA1pDHzl z0f74}95w)BW7pn3b@F5~o1F*(0BD+C$z(FDqRPCgEuX?-@eWdTwiky6FI+!y;++}G zDvDtSrrrYMsD zAT@g+(MW_%rBYQ{5=#I8s;c35JVrvnAg?LQr!ZBPLEgH}4I07R*yyM`k-e!E3i(R4 z>TnplhysO4UXeD)<^dUH1J9X;1fPw7{77zIRMzz zNJGoPvMg?La#FBun+3RA!3hR}PAD99d7fYK%8oH+ip3(A%jNh|$zqE|i+3CcQA$DJ zd7`L_tLwU_>jn-6gRUS5qzP;Kv1DiLNFx<4O5D`#I~)Lf4FI-NN;N_V1JL*d)^E73 z%V3NV#+U&BKnQ^-iXPANzBn>F0T4p;-tRjA@Lt3WzuRzIYmJO`+{K#NMXh5Y)`?rA Z_%B$59id-Lfj0gltLJmd)idwsF9LR8gUTR0s(n$wMB(14Z6K5~$)ORlFoX zC4|HVOc8KGVmr9Xgcz#82Km6mHkNHkMzRzvS=O=F?CkFJ&U7AZiIucIwCoaG=zH4U z{`>p?>94#0p6;OtAux|?59t3Lz&vWhyl~ej=*v|eId(z;06!rFY}*Ea`DOL;pa3BR z6h%$`F}S>aso4-u)pFdw-`N`lfS&_EvJp&)mLo?RY&&XU(`*U*Ew4z*7L= z1OTg^&c3E-1AxZ>;PHBr&Ju2PY+^Y8NYEhBd|u6Sxq6IoIhD?2u9mOKrK+MR3W_2- z0RW1HVj+{wX6M53C1A;KpW706^pPK*s~6!c;U-dP1pvzRaxfG3e*0TDU5#Bfr)P(T z&JBI^pQC++LJ`lbUwg}q&GC3NCh(kCt$n#{;hxi<_I=QK=+vcrBoi@D^WsG@O>=9N zJQJz(*niIso%`hY$-!#AYlI2_jT0`X>jZ#m*b*sA!qwV2LjkWdnTUioZ{4=HSS*z$ z>wfx^2XFOzHSG!%%ncpaH!n=ag3tWn#djSJhh15D-#vG=FKu4D=n}rQSR|-j-`cY9 zjqSVk4}LbBx~iZri~4TtW(ij)lx&1h!)6@IF>|sH27S&oH?C;jxogichGokeH>^oU zBf(js4Ga#J&Yc^S`?WW(Y<~OQ4^J=*V*vnc+^{COynSg^(JJBQRN=ed zx%;MHKJoNh49k`gLN)ikZQFHKuFC5GApoRdGY(PIviP`WXXbHIyKhqa%;Gyd0}uS$FtAU;!<7I>#uE%_lUv(&;pzX%@RRjUWo_kl)K!a(DOinuTJa*yMI+RMnkb zwzOFaheKSY&B*x?+ALxkA9Q=9x=!^Dy}f78&c4$<(OfpIQivjotm?r~cj2)gft`=aM^~70X-W;c!5Fb=#Y} zd7dv@mQ4wQP*zoEo}nE!LJs@>`|pwO+;sbTQ4}OXKKDN`IB5Rj@m~*fEQ>`^z=9xH z48zR5ZwLXq&et%rgcAh5p~4l5r7Ig<#E~OM^Dq2)^XSAx+6YHthN?PEr|QI1ES4D< z=sWw$U$zyWe_^xe(LCaUWI||bT_&`&Tqi^$5w?=YsVH8rTL~6S`!k;BtxzzOQxpY< z{9gBl^|vh7JRWalY{g>H+P>qT6C^ z1`Ai5Rz7gxV0Q1meOU@!c+Vn)P=wgjr>Fa|p4ZD9%VJIQrX$fi4U#Ih|z~79&JW4H$-HNkI0ORkcYEN2955B%Y-l$TSQCBZQ`w#x zvc&T)MOrg6j#xCJKK0}iDpWzfP&z!8${qS5&wb%qtbUj!oFYq5>&Utql+2kq&L%#; zKi}HgI^lL}Q&WJZ5pg&eo2F@dG9E$*8R+jjZk7r`P1Bq+h-3;tp2=^TCHv*AuMBf6 zOJrHLJZ@*)#3l=KKsKA<3WmYETuo+8o0AK%*V62gs3M#U(7>B@srXwd>K6be^8{LJU`_;^=W_QMbNXD!PrMq}|pI21M= z$f20#+|G@M&JL-WtnPNH>Vzyw4Y?SdD`qd1vPc2I+zu4yfd2l|+uwcXo%rzZkP84n zmX%^_YpX+)1V)m@D<=PNBxIM&_S~@}N6+lu{dP*%bDT%>h%Cd>$boE%qDX&#f62B9 zMboq;2qO0Syt!q|TGPpeNeqN^9XfRI{Ktns3Z+sh>1txW7^6%xbY7Chuf%5nvxJjH zaRdPPMmh9(y^cg8Q4)AA4*(!ZGLA&Tw%g@mWU=ZE%``}Y07A>Mvdig8_xJUchlbC} z*=(j*Dw#CKWki5LC=@0v!&s6eW1r7wB$CNoJRUD9ij&Ug^A2}YlOq<5nN2R&75&u` zV-?s?$15FxOMJR8FnIPc09aX1N0ZQXogNt(VGYA@09-h!aj7oT?eUc7l0PuUR4$jJ z)9Eym&+Cp{PG?NhM1&Av8O9bRv8*VHr6^A9a=FSZ%i0u00mc|jjE~dlOqw-Kd{xQ3 z))*`BW;_<&Rztf>qN;GCW8*Xc+zkNjgb>-bZ3>|N3ASD+m&+8!7-4)t2!s%D9A_~M z^Q8tnxrssuk&C~_0pO5V^X#d+udk{Y^SC_bzpK1PF)!RTivIyiG(k9P@>OC00000< KMNUMnLSTaGtL-rW diff --git a/pkgfiles/USRDIR/GUI/common/PS3_STR.PNG b/pkgfiles/USRDIR/GUI/common/PS3_STR.PNG deleted file mode 100644 index e279994d2b6341ce1da1c4f525369bd3a562a40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2673 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 XzJ)`_`^+Ms00000NkvXXu0mjf25a05 diff --git a/pkgfiles/USRDIR/GUI/common/TAG.PNG b/pkgfiles/USRDIR/GUI/common/TAG.PNG new file mode 100644 index 0000000000000000000000000000000000000000..11566c02f5e1d3e19ebd5ac4738528b30138ac8e GIT binary patch literal 548 zcmV+<0^9wGP)XZ_a0I^*%%#08Mz!`A-;Qqb#au;~@=G`vv z$jt7TF$43<1GW$N%DZ$xCfYY0<9F-*#R1 z+Lxz)W_4B0o2K0Z0?=m$?7%J1{H$p|degM~ZM&Wgn~8iileF(A%hMe*BSUBZlcXJA ztyU2%W$x~fUPV7^8f}0rbBC2c^0qx!2%#TAr2CYT9Hb5XC?YL43o;u=q|Jgn#vrrM zo8|4WL~oYlF-Cy&GR0U^=b74Xx_8q-&B~(pCeT mnar#+vlHN;C??+-qy7RoQS-KNCJ5R90000