From 3c82ef2e0ebde088581319910ddc62b1fa1fd1be Mon Sep 17 00:00:00 2001 From: sulokutdcmago Date: Sat, 6 Oct 2012 09:43:50 +0000 Subject: [PATCH] Icon centered when there's no banner Function to get free blocks in card library Save permissions display is more user friendly Better screen cleanup Some helper macros in gci.h --- source/bitmap.c | 27 ++- source/bitmap.h | 3 +- source/card.c | 409 ++++++++++++++++++++++++---------------------- source/card.h | 36 ++-- source/freetype.c | 79 ++++++--- source/gci.h | 5 + 6 files changed, 314 insertions(+), 245 deletions(-) diff --git a/source/bitmap.c b/source/bitmap.c index 10bfc09..095d2b3 100644 --- a/source/bitmap.c +++ b/source/bitmap.c @@ -14,8 +14,10 @@ #include #include #include -#include "bitmap.h" - +#include "bitmap.h" +#include "gci.h" + +extern GCI gci; //*extern GXRModeObj *vmode; /*** Graphics Mode Object ***/ //extern u32 *xfb[2] = { NULL, NULL }; /*** Framebuffers ***/ //extern int whichfb = 0; /*** Frame buffer toggle ***/ @@ -163,7 +165,7 @@ u32 ShowBMP(u8 * bmpfile) { return 1; } -/*** +/*** ShowBanner is ShowBMP but modified to be simpler. We don't need to check for a header since we generated the bmp BGR values directly for each save game. ***/ @@ -189,10 +191,10 @@ void ShowBanner(u8 *banner) { fboffset -= (height * 90); fboffset += width/2+3; //at this point the banner is perfectly aligned with right window fboffset += ((height *320)>>1)+3; - + //fboffset += 24; //force banner to display to the right of icon - fboffset += 44; //force banner to display to the right of icon - + fboffset += 43; //force banner to display to the right of icon + for (rows = 0; rows < height; rows++) { for (cols = 0; cols < (fbwidth >> 1); cols++) { xfb[whichfb][fboffset + cols] =CvtRGB (bgr[2], bgr[1], bgr[0], @@ -232,9 +234,16 @@ void ShowIcon(u8 *icon) { fboffset -= (height * 90); fboffset += width/2+3; fboffset += ((height *320)>>1)+3; - - fboffset += 20; //center icon - + + if (SDCARD_GetBannerFmt(gci.banner_fmt) == 1 || SDCARD_GetBannerFmt(gci.banner_fmt) == 2 ) + { + fboffset += 20; + }else + { + fboffset += 47; //center icon + } + + for (rows = 0; rows < height; rows++) { for (cols = 0; cols < (fbwidth >> 1); cols++) { xfb[whichfb][fboffset + cols] =CvtRGB (bgr[2], bgr[1], bgr[0], diff --git a/source/bitmap.h b/source/bitmap.h index 05d1cb4..d04dd1f 100644 --- a/source/bitmap.h +++ b/source/bitmap.h @@ -2,7 +2,8 @@ extern GXRModeObj *vmode; /*** Graphics Mode Object ***/ extern u32 *xfb[2]; /*** Framebuffers ***/ extern int whichfb; /*** Frame buffer toggle ***/ -extern u8 bitmapfile[]; +extern u8 bitmapfile[]; +u32 CvtRGB(u8 r1, u8 g1, u8 b1, u8 r2, u8 g2, u8 b2); u32 ShowBMP (u8 *bmpfile); void ShowBanner (); void ShowIcon (); diff --git a/source/card.c b/source/card.c index 57d246b..0e564e2 100644 --- a/source/card.c +++ b/source/card.c @@ -135,7 +135,7 @@ typedef struct _card_block { void *cmd_usr_buf; lwpq_t wait_sync_queue; syswd_t timeout_svc; - + cardcallback card_ext_cb; cardcallback card_tx_cb; cardcallback card_exi_cb; @@ -145,7 +145,7 @@ typedef struct _card_block { cardcallback card_unlock_cb; } card_block; -static u32 card_sector_size[] = +static u32 card_sector_size[] = { 0x0002000, 0x0004000, @@ -157,7 +157,7 @@ static u32 card_sector_size[] = 0x0000000 }; -static u32 card_latency[] = +static u32 card_latency[] = { 0x00000004, 0x00000008, @@ -181,10 +181,10 @@ static void __erase_callback(s32 chn,s32 result); static void __dsp_donecallback(u32 chn); static s32 __dounlock(s32 chn,u32 *key); static s32 __card_readsegment(s32 chn,cardcallback callback); - s32 __card_read(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback callback); +s32 __card_read(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback callback); static s32 __card_updatefat(s32 chn,struct card_bat *fatblock,cardcallback callback); static s32 __card_updatedir(s32 chn,cardcallback callback); - s32 __card_write(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback callback); +s32 __card_write(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback callback); static s32 __card_writepage(s32 chn,cardcallback callback); s32 __card_sectorerase(s32 chn,u32 sector,cardcallback callback); static s32 __card_onreset(s32 final); @@ -222,14 +222,14 @@ static void __card_checksum(u16 *buff,u32 len,u16 *cs1,u16 *cs2) printf("__card_checksum(%p,%d,%p,%p)\n",buff,len,cs1,cs2); #endif *cs1 = 0; - *cs2 = 0; + *cs2 = 0; len /= 2; - for (i = 0; i < len; ++i) { - *cs1 += buff[i]; - *cs2 += (buff[i] ^ 0xffff); - } - if (*cs1 == 0xffff) *cs1 = 0; - if (*cs2 == 0xffff) *cs2 = 0; + for (i = 0; i < len; ++i) { + *cs1 += buff[i]; + *cs2 += (buff[i] ^ 0xffff); + } + if (*cs1 == 0xffff) *cs1 = 0; + if (*cs2 == 0xffff) *cs2 = 0; } static s32 __card_putcntrlblock(card_block *card,s32 result) @@ -255,7 +255,7 @@ static s32 __card_getcntrlblock(s32 chn,card_block **card) rcard = &cardmap[chn]; if(!rcard->attached) { _CPU_ISR_Restore(level); - return CARD_ERROR_NOCARD; + return CARD_ERROR_NOCARD; } ret = CARD_ERROR_BUSY; @@ -318,7 +318,7 @@ static void __card_updateiconoffsets(struct card_direntry *entry,card_stat *stat stats->icon_speed = 0; iconaddr = 0; } - + if(entry->bannerfmt&CARD_BANNER_MASK) { if(!(entry->bannerfmt&0x10)) { bnrfmt = (entry->bannerfmt&CARD_BANNER_MASK); @@ -337,7 +337,7 @@ static void __card_updateiconoffsets(struct card_direntry *entry,card_stat *stat stats->offset_banner = -1; stats->offset_banner_tlut = -1; } - } + } nicons = 0; for(i=0;iiconfmt[i]) { - case 1: //CARD_ICON_CI with shared palette + case 1: //CARD_ICON_CI with shared palette stats->offset_icon[i] = iconaddr; stats->offset_icon_tlut[i] = iconbase + (nicons*1024); iconaddr += 1024; @@ -381,11 +381,11 @@ s32 __card_getstatusex(s32 chn,s32 fileno,struct card_direntry *entry) s32 ret; card_block *card = NULL; struct card_dat *dirblock = NULL; - - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(fileno<0 || fileno>=CARD_MAXFILES) return CARD_ERROR_FATAL_ERROR; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - + ret = CARD_ERROR_BROKEN; dirblock = __card_getdirblock(card); if(dirblock) { @@ -401,8 +401,8 @@ static s32 __card_setstatusexasync(s32 chn,s32 fileno,struct card_direntry *entr card_block *card = NULL; struct card_dat *dirblock = NULL; struct card_direntry *entries = NULL; - - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(fileno<0 || fileno>=CARD_MAXFILES) return CARD_ERROR_FATAL_ERROR; if(entry->filename[0]==0xff || entry->filename[0]==0) return CARD_ERROR_FATAL_ERROR; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; @@ -438,7 +438,7 @@ static s32 __card_setstatusexasync(s32 chn,s32 fileno,struct card_direntry *entr memcpy(entries[fileno].gamecode,entry->gamecode,4); memcpy(entries[fileno].company,entry->company,2); } - + entries[fileno].lastmodified = entry->lastmodified; entries[fileno].bannerfmt = entry->bannerfmt; entries[fileno].iconaddr = entry->iconaddr; @@ -524,7 +524,7 @@ static s32 __card_seek(card_file *file,s32 len,s32 offset,card_block **rcard) } card->curr_file = file; file->len = len; - + if(offsetoffset) { file->offset = 0; file->iblock = entry->block; @@ -584,7 +584,7 @@ static u32 __card_checkdir(card_block *card,u32 *currdir) if(card->curr_dir==NULL) { card->curr_dir = dirblock[dir]; memcpy(dirblock[dir],dirblock[dir^1],8192); - } + } else if(card->curr_dir==dirblock[0]) dir = 0; else dir = 1; @@ -640,7 +640,7 @@ static u32 __card_checkfat(card_block *card,u32 *currfat) if(card->curr_fat==NULL) { card->curr_fat = fatblock[fat]; memcpy(fatblock[fat],fatblock[fat^1],8192); - } + } else if(card->curr_fat==fatblock[0]) fat = 0; else fat = 1; @@ -670,7 +670,7 @@ static u32 __card_iscard(u32 id) if(id&~0xffff) return 0; if(id&0x03) return 0; - + ret = 0; tmp = id&0xfc; if(tmp==EXI_MEMCARD59 || tmp==EXI_MEMCARD123 @@ -702,9 +702,9 @@ static s32 __card_allocblock(s32 chn,u32 blocksneed,cardcallback callback) #ifdef _CARD_DEBUG printf("__card_allocblock(%p,%d)\n",fatblock,fatblock->freeblocks); #endif - + if(fatblock->freeblocks=((card->blocks)-CARD_SYSAREA)) return CARD_ERROR_BROKEN; - + currblock++; if(currblock=card->blocks) currblock = CARD_SYSAREA; if(fatblock->fat[currblock-CARD_SYSAREA]==0) { @@ -759,7 +759,7 @@ static s32 __card_freeblock(s32 chn,u16 block,cardcallback callback) card = &cardmap[chn]; if(!card->attached) return CARD_ERROR_NOCARD; - + fatblock = __card_getbatblock(card); next = fatblock->fat[block-CARD_SYSAREA]; while(1) { @@ -783,7 +783,7 @@ static s32 __card_unlockedhandler(s32 chn,s32 dev) if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; card = &cardmap[chn]; - + ret = CARD_ERROR_READY; cb = card->card_unlock_cb; if(cb) { @@ -862,7 +862,7 @@ static s32 __card_sleep(s32 chn) if(err) ret = CARD_ERROR_NOCARD; else ret = CARD_ERROR_READY; - + return ret; } @@ -886,7 +886,7 @@ static s32 __card_wake(s32 chn) if(err) ret = CARD_ERROR_NOCARD; else ret = CARD_ERROR_READY; - + return ret; } #endif @@ -902,7 +902,7 @@ static s32 __card_enableinterrupt(s32 chn,u32 enable) if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(EXI_Select(chn,EXI_DEVICE_0,EXI_SPEED16MHZ)==0) return CARD_ERROR_NOCARD; - + err = 0; val[0] = 0x81; if(enable) val[1] = 0x01; @@ -910,10 +910,10 @@ static s32 __card_enableinterrupt(s32 chn,u32 enable) if(EXI_Imm(chn,val,2,EXI_WRITE,NULL)==0) err |= 0x01; if(EXI_Sync(chn)==0) err |= 0x02; if(EXI_Deselect(chn)==0) err |= 0x04; - + if(err) ret = CARD_ERROR_BUSY; else ret = CARD_ERROR_READY; - + return ret; } @@ -932,7 +932,7 @@ static s32 __card_txhandler(s32 chn,s32 dev) err = 0; if(EXI_Deselect(chn)==0) ret |= err; if(EXI_Unlock(chn)==0) ret |= err; - + cb = card->card_tx_cb; if(cb) { card->card_tx_cb = NULL; @@ -960,7 +960,7 @@ static void __timeouthandler(syswd_t alarm,void *cbarg) chn++; } if(chn=EXI_CHANNEL_2) return; - + if(card->attached) { EXI_RegisterEXICallback(chn,NULL); @@ -1020,7 +1020,7 @@ static s32 __retry(s32 chn) EXI_Unlock(chn); return CARD_ERROR_NOCARD; } - + if(card->cmd[0]==0x52) { if(EXI_ImmEx(chn,card->workarea+CARD_READSIZE,card->latency,EXI_WRITE)==0) { EXI_Deselect(chn); @@ -1110,7 +1110,7 @@ static s32 __card_exthandler(s32 chn,s32 dev) card->attached = 0; EXI_RegisterEXICallback(chn,NULL); SYS_CancelAlarm(card->timeout_svc); - + cb = card->card_exi_cb; if(cb) { card->card_exi_cb = NULL; @@ -1122,7 +1122,7 @@ static s32 __card_exthandler(s32 chn,s32 dev) card->card_ext_cb = NULL; cb(chn,CARD_ERROR_NOCARD); } - + } return 1; } @@ -1186,7 +1186,7 @@ static void __erase_callback(s32 chn,s32 result) file = card->curr_file; if((ret=__card_write(chn,(file->iblock*card->sector_size),card->sector_size,card->cmd_usr_buf,__write_callback))>=0) return; } - + cb = card->card_api_cb; card->card_api_cb = NULL; __card_putcntrlblock(card,ret); @@ -1228,7 +1228,7 @@ static void __read_callback(s32 chn,s32 result) } len = file->lensector_size?card->sector_size:file->len; if(__card_read(chn,(file->iblock*card->sector_size),len,card->cmd_usr_buf,__read_callback)>=0) return; - + } } else ret = CARD_ERROR_CANCELED; @@ -1251,10 +1251,10 @@ static void __delete_callback(s32 chn,s32 result) #endif cb = card->card_api_cb; card->card_api_cb = NULL; - + ret = result; if(ret>=0 && (ret=__card_freeblock(chn,card->curr_fileblock,cb))>=0) return; - + __card_putcntrlblock(card,ret); if(cb) cb(chn,ret); } @@ -1278,7 +1278,7 @@ static void __format_callback(s32 chn,s32 result) card->curr_dir = card->workarea+CARD_SYSDIR; memcpy(card->curr_dir,card->workarea+CARD_SYSDIR_BACK,8192); - + card->curr_fat = card->workarea+CARD_SYSBAT; memcpy(card->curr_fat,card->workarea+CARD_SYSBAT_BACK,8192); } @@ -1352,14 +1352,14 @@ static void __unlocked_callback(s32 chn,s32 result) #endif if(chn=EXI_CHANNEL_2) return; card = &cardmap[chn]; - + ret = result; if(ret>=0) { card->card_unlock_cb = __unlocked_callback; if(EXI_Lock(chn,EXI_DEVICE_0,__card_unlockedhandler)==1) { card->card_unlock_cb = NULL; ret = __retry(chn); - } else + } else ret = 0; } if(ret<0) { @@ -1446,7 +1446,7 @@ static s32 __card_writepage(s32 chn,cardcallback callback) if(EXI_ImmEx(chn,card->cmd,card->cmd_len,EXI_WRITE)==1 && EXI_Dma(chn,card->cmd_usr_buf,128,card->cmd_mode,__card_txhandler)==1) return CARD_ERROR_READY; - + card->card_exi_cb = NULL; EXI_Deselect(chn); EXI_Unlock(chn); @@ -1472,15 +1472,15 @@ static s32 __card_readsegment(s32 chn,cardcallback callback) card->cmd_len = 5; card->cmd_mode = EXI_READ; card->cmd_retries = 0; - + ret = __card_start(chn,callback,NULL); if(ret<0) return ret; - + err = 0; if(EXI_ImmEx(chn,card->cmd,card->cmd_len,EXI_WRITE)==0) err |= 0x01; if(EXI_ImmEx(chn,card->workarea+CARD_READSIZE,card->latency,EXI_WRITE)==0) err |= 0x02; if(EXI_Dma(chn,card->cmd_usr_buf,CARD_READSIZE,card->cmd_mode,__card_txhandler)==0) err |= 0x04; - + if(err) { card->card_tx_cb = NULL; EXI_Deselect(chn); @@ -1563,9 +1563,9 @@ s32 __card_write(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback cal #endif if(chn= EXI_CHANNEL_2) return CARD_ERROR_FATAL_ERROR; card = &cardmap[chn]; - + if(!card->attached) return CARD_ERROR_NOCARD; - + card->cmd_blck_cnt = block_len>>7; card->cmd_sector_addr = address; card->cmd_usr_buf = buffer; @@ -1590,7 +1590,7 @@ s32 __card_read(s32 chn,u32 address,u32 block_len,void *buffer,cardcallback call card->cmd_usr_buf = buffer; card->card_xfer_cb = callback; ret = __card_readsegment(chn,__blockreadcallback); - + return ret; } @@ -1615,10 +1615,10 @@ static s32 __card_formatregion(s32 chn,u32 encode,cardcallback callback) if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - + header = workarea = card->workarea; memset(header,0xff,8192); - + tmp = _viReg[55]; header->encoding = encode; @@ -1636,7 +1636,7 @@ static s32 __card_formatregion(s32 chn,u32 encode,cardcallback callback) rnd_val = (((rnd_val*(u64)0x0000000041c64e6d)+(u64)0x0000000000003039)>>16); rnd_val &= (u64)0x0000000000007fff; - + cnt++; } __SYS_UnlockSramEx(0); @@ -1646,7 +1646,7 @@ static s32 __card_formatregion(s32 chn,u32 encode,cardcallback callback) header->device_id = 0; header->size = card->card_size; __card_checksum((u16*)header,508,&header->chksum1,&header->chksum2); - + cnt = 0; while(cnt<2) { memblock = workarea+((cnt+1)<<13); @@ -1671,9 +1671,9 @@ static s32 __card_formatregion(s32 chn,u32 encode,cardcallback callback) cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; - + DCStoreRange(card->workarea,0xA000); - + card->format_step = 0; if((ret=__card_sectorerase(chn,(card->sector_size*card->format_step),__format_callback))>=0) return ret; @@ -1690,19 +1690,19 @@ s32 __card_sectorerase(s32 chn,u32 sector,cardcallback callback) #endif if(chn= EXI_CHANNEL_2) return CARD_ERROR_FATAL_ERROR; card = &cardmap[chn]; - + if(sector%card->sector_size) return CARD_ERROR_FATAL_ERROR; - + card->cmd[0] = 0xf1; card->cmd[1] = (sector>>17)&0x7f; card->cmd[2] = (sector>>9)&0xff; card->cmd_len = 3; card->cmd_mode = -1; card->cmd_retries = 3; - + ret = __card_start(chn,NULL,callback); if(ret<0) return ret; - + if(EXI_ImmEx(chn,card->cmd,card->cmd_len,EXI_WRITE)==0) { card->card_exi_cb = NULL; return CARD_ERROR_NOCARD; @@ -1772,7 +1772,7 @@ static void __card_createfatcallback(s32 chn,s32 result) #endif cb = card->card_api_cb; card->card_api_cb = NULL; - + dirblock = __card_getdirblock(card); file = card->curr_file; @@ -1795,11 +1795,11 @@ static void __card_createfatcallback(s32 chn,s32 result) file->offset = 0; file->iblock = card->curr_fileblock; - + if((ret=__card_updatedir(chn,cb))<0) { __card_putcntrlblock(card,ret); if(cb) cb(chn,ret); - } + } } static s32 __card_updatefat(s32 chn,struct card_bat *fatblock,cardcallback callback) @@ -1833,14 +1833,14 @@ static s32 __card_updatedir(s32 chn,cardcallback callback) card = &cardmap[chn]; if(!card->attached) return CARD_ERROR_NOCARD; - + dirblock = __card_getdirblock(card); dircntrl = dirblock+8128; ++dircntrl->updated; __card_checksum((u16*)dirblock,0x1ffc,&dircntrl->chksum1,&dircntrl->chksum2); DCStoreRange(dirblock,0x2000); card->card_erase_cb = callback; - + return __card_sectorerase(chn,(((u32)dirblock-(u32)card->workarea)>>13)*card->sector_size,__card_direrasecallback); } @@ -1865,7 +1865,7 @@ static void __card_dounmount(s32 chn,s32 result) } static s32 __card_domount(s32 chn) -{ +{ u8 status,kval; s32 ret = CARD_ERROR_READY; u8 sum, cnt; @@ -1901,7 +1901,7 @@ static s32 __card_domount(s32 chn) if((ret=__card_clearstatus(chn))<0) goto exit; if((ret=__card_readstatus(chn,&status))<0) goto exit; - + if(EXI_Probe(chn)==0) { ret = CARD_ERROR_NOCARD; goto exit; @@ -1911,7 +1911,7 @@ static s32 __card_domount(s32 chn) printf("__card_domount(card locked)\n"); #endif if((ret=__dounlock(chn,card->key))<0) goto exit; - + cnt = 0; sum = 0; sramex = __SYS_LockSramEx(); @@ -1937,7 +1937,7 @@ static s32 __card_domount(s32 chn) } cnt = ~sramex->flashID_chksum[chn]; __SYS_UnlockSramEx(0); - + if(cnt!=sum) { #ifdef _CARD_DEBUG printf("__card_domount: sram mismatch\n"); @@ -1958,12 +1958,12 @@ static s32 __card_domount(s32 chn) } if((ret=__card_read(chn,(card->sector_size*(card->mount_step-2)),card->sector_size,card->workarea+((card->mount_step-2)<<13),__card_mountcallback))<0) goto exit; - return ret; - + return ret; + exit: EXI_Unlock(chn); __card_dounmount(chn,ret); - + return ret; } @@ -1972,7 +1972,7 @@ static void __card_mountcallback(s32 chn,s32 result) s32 ret; cardcallback cb; card_block *card = &cardmap[chn]; - + ret = result; if(ret==CARD_ERROR_NOCARD || ret==CARD_ERROR_IOERROR) { __card_dounmount(chn,ret); @@ -1987,7 +1987,7 @@ static void __card_mountcallback(s32 chn,s32 result) __card_putcntrlblock(card,ret); } } - + cb = card->card_api_cb; card->card_api_cb = NULL; if(cb) cb(chn,ret); @@ -1995,7 +1995,7 @@ static void __card_mountcallback(s32 chn,s32 result) static __inline__ void __card_srand(u32 val) { - crand_next = val; + crand_next = val; } static __inline__ u32 __card_rand() @@ -2007,7 +2007,7 @@ static __inline__ u32 __card_rand() static u32 __card_initval() { u32 ticks = gettick(); - + __card_srand(ticks); return ((0x7FEC8000|__card_rand())&~0x00000fff); } @@ -2019,7 +2019,7 @@ static u32 __card_dummylen() __card_srand(ticks); val = (__card_rand()&0x1f)+1; - + do { ticks = gettick(); val = ticks<>24)&0xff; regbuf[2] = ((address&0x00FF0000)>>16)&0xff; } - + err = 0; if(EXI_ImmEx(chn,regbuf,5,EXI_WRITE)==0) err |= 0x01; if(EXI_ImmEx(chn,card->workarea+CARD_READSIZE,card->latency,EXI_WRITE)==0) err |= 0x02; @@ -2137,7 +2137,7 @@ static s32 __card_readarrayunlock(s32 chn,u32 address,void *buffer,u32 len,u32 f if(err) ret = CARD_ERROR_NOCARD; else ret = CARD_ERROR_READY; - + return ret; } @@ -2168,7 +2168,7 @@ static void __dsp_donecallback(u32 chn) __card_mountcallback(chn,CARD_ERROR_NOCARD); return; } - + val = exnor(card->cipher,((len+card->latency+4)<<3)+1); { u32 a,b,c,r1,r2,r3; @@ -2255,9 +2255,9 @@ static s32 __dounlock(s32 chn,u32 *key) #endif array_addr = __card_initval(); len = __card_dummylen(); - + if(__card_readarrayunlock(chn,array_addr,tmp_buffer,len,0)<0) return CARD_ERROR_NOCARD; - + val = exnor_1st(array_addr,(len<<3)+1); { @@ -2282,7 +2282,7 @@ static s32 __dounlock(s32 chn,u32 *key) c = ((u32*)tmp_buffer)[2]; d = ((u32*)tmp_buffer)[3]; e = ((u32*)tmp_buffer)[4]; - + a = a^card->cipher; val = exnor(card->cipher,32); { @@ -2296,7 +2296,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + b = b^card->cipher; val = exnor(card->cipher,32); { @@ -2310,7 +2310,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + c = c^card->cipher; val = exnor(card->cipher,32); { @@ -2324,7 +2324,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + d = d^card->cipher; val = exnor(card->cipher,32); { @@ -2338,7 +2338,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + e = e^card->cipher; val = exnor(card->cipher,(len<<3)); { @@ -2352,7 +2352,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + val = exnor(card->cipher,33); { u32 a,b,c,r1,r2,r3; @@ -2365,7 +2365,7 @@ static s32 __dounlock(s32 chn,u32 *key) r1 = (val|(r3>>31)); card->cipher = r1; } - + cipher1[0] = d; cipher1[1] = e; *cipher2 = __dsp_hash((u8*)cipher1, 8); @@ -2373,7 +2373,7 @@ static s32 __dounlock(s32 chn,u32 *key) key[0] = a; key[1] = b; key[2] = c; - + return CARD_ERROR_READY; } @@ -2450,7 +2450,7 @@ s32 CARD_ProbeEx(s32 chn,s32 *mem_size,s32 *sect_size) u32 idx = _ROTL(card_id,23)&0x1c; *sect_size = card_sector_size[idx>>2]; } - ret = CARD_ERROR_READY; + ret = CARD_ERROR_READY; } } } @@ -2489,7 +2489,7 @@ s32 CARD_MountAsync(s32 chn,void *workarea,cardcallback detach_cb,cardcallback a if(!attachcb) attachcb = __card_defaultapicallback; card->card_api_cb = attachcb; card->card_exi_cb = NULL; - + if(!card->attached) { if(EXI_Attach(chn,__card_exthandler)==0) { card->result = CARD_ERROR_NOCARD; @@ -2518,7 +2518,7 @@ s32 CARD_MountAsync(s32 chn,void *workarea,cardcallback detach_cb,cardcallback a __card_domount(chn); return 1; } - + ret = CARD_ERROR_WRONGDEVICE; _CPU_ISR_Restore(level); return ret; @@ -2557,15 +2557,15 @@ s32 CARD_ReadAsync(card_file *file,void *buffer,u32 len,u32 offset,cardcallback if(len<=0 || (len&0x1ff) || (offset>0 && (offset&0x1ff))) return CARD_ERROR_FATAL_ERROR; if((ret=__card_seek(file,len,offset,&card))<0) return ret; - + DCInvalidateRange(buffer,len); - + cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; if(len>=(card->sector_size-(file->offset&(card->sector_size-1)))) len = (card->sector_size-(file->offset&(card->sector_size-1))); - + if((ret=__card_read(file->chn,(file->iblock*card->sector_size),len,buffer,__read_callback))<0) { __card_putcntrlblock(card,ret); return ret; @@ -2594,7 +2594,7 @@ s32 CARD_WriteAsync(card_file *file,void *buffer,u32 len,u32 offset,cardcallback __card_putcntrlblock(card,CARD_ERROR_FATAL_ERROR); return CARD_ERROR_FATAL_ERROR; } - + DCStoreRange(buffer,len); cb = callback; if(!cb) cb = __card_defaultapicallback; @@ -2630,10 +2630,10 @@ s32 CARD_CreateAsync(s32 chn,const char *filename,u32 size,card_file *file,cardc #endif len = strlen(filename); if(len>CARD_FILENAMELEN) return CARD_ERROR_NAMETOOLONG; - + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; if(size<=0 || size%card->sector_size) return CARD_ERROR_FATAL_ERROR; - + dirblock = __card_getdirblock(card); filenum = -1; @@ -2664,11 +2664,11 @@ s32 CARD_CreateAsync(s32 chn,const char *filename,u32 size,card_file *file,cardc cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; - + entry[filenum].length = size/card->sector_size; memset(entry[filenum].filename,0,CARD_FILENAMELEN); memcpy(entry[filenum].filename,filename,len+1); - + card->curr_file = file; file->chn = chn; file->filenum = filenum; @@ -2676,7 +2676,7 @@ s32 CARD_CreateAsync(s32 chn,const char *filename,u32 size,card_file *file,cardc __card_putcntrlblock(card,ret); return ret; } - + return 0; } @@ -2704,10 +2704,10 @@ s32 CARD_CreateEntryAsync(s32 chn,card_dir *direntry,card_file *file,cardcallbac #endif len = strlen((const char*)direntry->filename); if(len>CARD_FILENAMELEN) return CARD_ERROR_NAMETOOLONG; - + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; if(direntry->filelen<=0 || direntry->filelen%card->sector_size) return CARD_ERROR_FATAL_ERROR; - + dirblock = __card_getdirblock(card); filenum = -1; @@ -2738,11 +2738,11 @@ s32 CARD_CreateEntryAsync(s32 chn,card_dir *direntry,card_file *file,cardcallbac cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; - + entry[filenum].length = direntry->filelen/card->sector_size; memset(entry[filenum].filename,0,CARD_FILENAMELEN); memcpy(entry[filenum].filename,direntry->filename,len+1); - + card->curr_file = file; file->chn = chn; file->filenum = filenum; @@ -2750,7 +2750,7 @@ s32 CARD_CreateEntryAsync(s32 chn,card_dir *direntry,card_file *file,cardcallbac __card_putcntrlblock(card,ret); return ret; } - + return 0; } @@ -2771,7 +2771,7 @@ s32 CARD_Open(s32 chn,const char *filename,card_file *file) card_block *card = NULL; if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - + file->filenum = -1; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; if((ret=__card_getfilenum(card,filename,(const char*)card_gamecode,(const char*)card_company,&fileno))<0) { @@ -2787,7 +2787,7 @@ s32 CARD_Open(s32 chn,const char *filename,card_file *file) file->filenum = fileno; file->offset = 0; file->len = dirblock->entries[fileno].length*card->sector_size; - file->iblock = dirblock->entries[fileno].block; + file->iblock = dirblock->entries[fileno].block; __card_putcntrlblock(card,CARD_ERROR_READY); return CARD_ERROR_READY; @@ -2800,7 +2800,7 @@ s32 CARD_OpenEntry(s32 chn,card_dir *entry,card_file *file) card_block *card = NULL; if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - + file->filenum = -1; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; if((ret=__card_getfilenum(card,(const char*)entry->filename,(const char*)entry->gamecode,(const char*)entry->company,&fileno))<0) { @@ -2818,7 +2818,7 @@ s32 CARD_OpenEntry(s32 chn,card_dir *entry,card_file *file) file->filenum = entry->fileno; file->offset = 0; file->len = dirblock->entries[fileno].length*card->sector_size; - file->iblock = dirblock->entries[fileno].block; + file->iblock = dirblock->entries[fileno].block; __card_putcntrlblock(card,CARD_ERROR_READY); return CARD_ERROR_READY; @@ -2832,7 +2832,7 @@ s32 CARD_Close(card_file *file) if(file->chnchn>=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(file->filenum<0 || file->filenum>=CARD_MAXFILES) return CARD_ERROR_NOFILE; if((ret=__card_getcntrlblock(file->chn,&card))<0) return ret; - + file->chn = -1; __card_putcntrlblock(card,CARD_ERROR_READY); return CARD_ERROR_READY; @@ -2853,13 +2853,13 @@ s32 CARD_DeleteAsync(s32 chn,const char *filename,cardcallback callback) __card_putcntrlblock(card,ret); return ret; } - + dirblock = __card_getdirblock(card); entry = &dirblock->entries[fileno]; - + card->curr_fileblock = entry->block; memset(entry,-1,sizeof(struct card_direntry)); - + cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; @@ -2894,13 +2894,13 @@ s32 CARD_DeleteEntryAsync(s32 chn,card_dir *dir_entry,cardcallback callback) #endif if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - + dirblock = __card_getdirblock(card); entry = &dirblock->entries[dir_entry->fileno]; - + card->curr_fileblock = entry->block; memset(entry,-1,sizeof(struct card_direntry)); - + cb = callback; if(!cb) cb = __card_defaultapicallback; card->card_api_cb = cb; @@ -2952,76 +2952,76 @@ s32 CARD_GetErrorCode(s32 chn) return card->result; } -s32 __card_findnext(card_dir *dir) -{ - s32 ret; - struct card_dat *dirblock = NULL; - struct card_direntry *entries = NULL; - card_block *card = NULL; +s32 __card_findnext(card_dir *dir) +{ + s32 ret; + struct card_dat *dirblock = NULL; + struct card_direntry *entries = NULL; + card_block *card = NULL; - if(dir->chnchn>=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - if(dir->fileno>=CARD_MAXFILES) return CARD_ERROR_NOFILE; - if((ret=__card_getcntrlblock(dir->chn,&card))<0) return ret; + if(dir->chnchn>=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if(dir->fileno>=CARD_MAXFILES) return CARD_ERROR_NOFILE; + if((ret=__card_getcntrlblock(dir->chn,&card))<0) return ret; - if(!card->attached) return CARD_ERROR_NOCARD; - dirblock = __card_getdirblock(card); + if(!card->attached) return CARD_ERROR_NOCARD; + dirblock = __card_getdirblock(card); - entries = dirblock->entries; - do { - //printf("%s\n", entries[dir->fileno].filename); - if(entries[dir->fileno].gamecode[0]!=0xff) { - if ((dir->showall || memcmp(entries[dir->fileno].gamecode,card_gamecode,4)==0) - && (dir->showall || memcmp(entries[dir->fileno].company,card_company,2)==0)) { + entries = dirblock->entries; + do { + //printf("%s\n", entries[dir->fileno].filename); + if(entries[dir->fileno].gamecode[0]!=0xff) { + if ((dir->showall || memcmp(entries[dir->fileno].gamecode,card_gamecode,4)==0) + && (dir->showall || memcmp(entries[dir->fileno].company,card_company,2)==0)) { dir->filelen = entries[dir->fileno].length*card->sector_size; - memcpy(dir->filename, entries[dir->fileno].filename, CARD_FILENAMELEN); - memcpy(dir->gamecode, entries[dir->fileno].gamecode, 4); - memcpy(dir->company, entries[dir->fileno].company, 2); + memcpy(dir->filename, entries[dir->fileno].filename, CARD_FILENAMELEN); + memcpy(dir->gamecode, entries[dir->fileno].gamecode, 4); + memcpy(dir->company, entries[dir->fileno].company, 2); - __card_putcntrlblock(card,CARD_ERROR_READY); - return CARD_ERROR_READY; - } - } - dir->fileno++; - } while (dir->fileno < CARD_MAXFILES); - __card_putcntrlblock(card,CARD_ERROR_NOFILE); - return CARD_ERROR_NOFILE; -} + __card_putcntrlblock(card,CARD_ERROR_READY); + return CARD_ERROR_READY; + } + } + dir->fileno++; + } while (dir->fileno < CARD_MAXFILES); + __card_putcntrlblock(card,CARD_ERROR_NOFILE); + return CARD_ERROR_NOFILE; +} -s32 CARD_FindFirst(s32 chn, card_dir *dir, bool showall) -{ - // initialise structure - dir->chn = chn; - dir->fileno = 0; +s32 CARD_FindFirst(s32 chn, card_dir *dir, bool showall) +{ + // initialise structure + dir->chn = chn; + dir->fileno = 0; dir->filelen = 0; - dir->filename[0] = 0; - dir->gamecode[0] = 0; - dir->company[0] = 0; + dir->filename[0] = 0; + dir->gamecode[0] = 0; + dir->company[0] = 0; dir->showall = showall; - return __card_findnext(dir); -} + return __card_findnext(dir); +} -s32 CARD_FindNext(card_dir *dir) -{ - dir->fileno++; +s32 CARD_FindNext(card_dir *dir) +{ + dir->fileno++; - return __card_findnext(dir); + return __card_findnext(dir); } s32 CARD_GetDirectory(s32 chn,card_dir *dir_entries,s32 *count,bool showall) { s32 i,cnt; - s32 ret = CARD_ERROR_READY; - struct card_dat *dirblock = NULL; - struct card_direntry *entries = NULL; - card_block *card = NULL; + s32 ret = CARD_ERROR_READY; + struct card_dat *dirblock = NULL; + struct card_direntry *entries = NULL; + card_block *card = NULL; - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - if((ret=__card_getcntrlblock(chn,&card))<0) return ret; + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - if(!card->attached) return CARD_ERROR_NOCARD; - dirblock = __card_getdirblock(card); + if(!card->attached) return CARD_ERROR_NOCARD; + dirblock = __card_getdirblock(card); - entries = dirblock->entries; + entries = dirblock->entries; for(i=0,cnt=0;i=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - if((ret=__card_getcntrlblock(chn,&card))<0) return ret; + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; *sector_size = card->sector_size; - ret = __card_putcntrlblock(card,CARD_ERROR_READY); + ret = __card_putcntrlblock(card,CARD_ERROR_READY); return ret; } s32 CARD_GetBlockCount(s32 chn,u32 *block_count) { - s32 ret; - card_block *card = NULL; + s32 ret; + card_block *card = NULL; - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; - if((ret=__card_getcntrlblock(chn,&card))<0) return ret; + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; *block_count = card->blocks; - ret = __card_putcntrlblock(card,CARD_ERROR_READY); + ret = __card_putcntrlblock(card,CARD_ERROR_READY); return ret; } s32 CARD_GetStatus(s32 chn,s32 fileno,card_stat *stats) { - s32 ret; + s32 ret; card_block *card = NULL; struct card_dat *dirblock = NULL; struct card_direntry *entry = NULL; - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(fileno<0 || fileno>=CARD_MAXFILES) return CARD_ERROR_FATAL_ERROR; - if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; + dirblock = __card_getdirblock(card); if(dirblock) { entry = &dirblock->entries[fileno]; @@ -3108,12 +3108,12 @@ s32 CARD_SetStatusAsync(s32 chn,s32 fileno,card_stat *stats,cardcallback callbac struct card_dat *dirblock = NULL; struct card_direntry *entry = NULL; - if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; if(fileno<0 || fileno>=CARD_MAXFILES) return CARD_ERROR_FATAL_ERROR; if(stats->icon_addr!=-1 && stats->icon_addr>CARD_READSIZE) return CARD_ERROR_FATAL_ERROR; if(stats->comment_addr!=-1 && stats->comment_addr>8128) return CARD_ERROR_FATAL_ERROR; if((ret=__card_getcntrlblock(chn,&card))<0) return ret; - + ret = CARD_ERROR_BROKEN; dirblock = __card_getdirblock(card); if(dirblock) { @@ -3124,7 +3124,7 @@ s32 CARD_SetStatusAsync(s32 chn,s32 fileno,card_stat *stats,cardcallback callbac entry->iconspeed = stats->icon_speed; entry->commentaddr = stats->comment_addr; __card_updateiconoffsets(entry,stats); - + if(entry->iconaddr==-1) entry->iconfmt = ((entry->iconfmt&~CARD_ICON_MASK)|CARD_ICON_CI); entry->lastmodified = time(NULL); @@ -3185,7 +3185,7 @@ s32 CARD_SetCompany(const char *company) for(i=0;i<2;i++) card_company[i] = 0xff; if(company && strlen(company)<=2) memcpy(card_company,company,2) ; _CPU_ISR_Restore(level); - + return CARD_ERROR_READY; } @@ -3197,7 +3197,7 @@ s32 CARD_SetGamecode(const char *gamecode) for(i=0;i<4;i++) card_gamecode[i] = 0xff; if(gamecode && strlen(gamecode)<=4) memcpy(card_gamecode,gamecode,4) ; _CPU_ISR_Restore(level); - + return CARD_ERROR_READY; } @@ -3228,3 +3228,20 @@ s32 CARD_GetSerialNo(s32 chn,u32 *serial1,u32 *serial2) return __card_putcntrlblock(card,ret); } + +s32 CARD_GetFreeBlocks(s32 chn, u16* freeblocks) +{ + s32 ret; + card_block *card = NULL; + struct card_bat *fatblock = NULL; + + if(chn=EXI_CHANNEL_2) return CARD_ERROR_NOCARD; + if((ret=__card_getcntrlblock(chn,&card))<0) return ret; + + fatblock = __card_getbatblock(card); + *freeblocks = fatblock->freeblocks; + + ret = __card_putcntrlblock(card,CARD_ERROR_READY); + + return ret; +} diff --git a/source/card.h b/source/card.h index 4b634e5..639ee68 100644 --- a/source/card.h +++ b/source/card.h @@ -31,11 +31,11 @@ distribution. #ifndef __CARD_H__ #define __CARD_H__ -/*! -\file card.h +/*! +\file card.h \brief Memory card subsystem -*/ +*/ #include @@ -52,7 +52,7 @@ distribution. #define CARD_WORKAREA (5*8*1024) /*!< minimum size of the workarea passed to Mount[Async]() */ #define CARD_READSIZE 512 /*!< minimum size of block to read from memory card */ -#define CARD_FILENAMELEN 32 /*!< maximum filename length */ +#define CARD_FILENAMELEN 32 /*!< maximum filename length */ #define CARD_MAXFILES 128 /*!< maximum number of files on the memory card */ /*! \addtogroup card_errors Memory card error codes @@ -145,16 +145,16 @@ typedef struct _card_file { \param company[2] string identifier <=2. \param showall boolean flag whether to showall entries or ony those identified by card_gamecode and card_company, previously set within the call to CARD_Init() */ -typedef struct _card_dir { - s32 chn; - u32 fileno; +typedef struct _card_dir { + s32 chn; + u32 fileno; u32 filelen; u8 permissions; - u8 filename[CARD_FILENAMELEN]; - u8 gamecode[4]; + u8 filename[CARD_FILENAMELEN]; + u8 gamecode[4]; u8 company[2]; bool showall; -} card_dir; +} card_dir; /*! \typedef struct card_stat @@ -163,7 +163,7 @@ typedef struct _card_dir { \param len length of file. \param gamecode[4] string identifier <=4. \param company[2] string identifier <=2. -\param banner_fmt format of banner. +\param banner_fmt format of banner. \param icon_addr icon image address in file. \param icon_speed speed of an animated icon. \param comment_addr address in file of the comment block. @@ -461,7 +461,7 @@ s32 CARD_GetErrorCode(s32 chn); \return \ref card_errors "card error codes" */ s32 CARD_FindFirst(s32 chn, card_dir *dir, bool showall); - + /*! \fn s32 CARD_FindNext(card_dir *dir) \brief Returns the next directory entry from the memory cards directory structure. @@ -469,7 +469,7 @@ s32 CARD_FindFirst(s32 chn, card_dir *dir, bool showall); \return \ref card_errors "card error codes" */ -s32 CARD_FindNext(card_dir *dir); +s32 CARD_FindNext(card_dir *dir); /*! \fn s32 CARD_GetDirectory(s32 chn, card_dir *dir_entries, s32 *count, bool showall) @@ -482,7 +482,7 @@ s32 CARD_FindNext(card_dir *dir); \return \ref card_errors "card error codes" */ s32 CARD_GetDirectory(s32 chn, card_dir *dir_entries, s32 *count, bool showall); - + /*! \fn s32 CARD_GetSectorSize(s32 chn,u32 *sector_size) \brief Returns the next directory entry from the memory cards directory structure. @@ -598,6 +598,14 @@ s32 CARD_SetCompany(const char *company); */ s32 CARD_SetGamecode(const char *gamecode); +/*! \fn s32 CARD_GetFreeBlocks(s32 chn) +\brief Get the free blocks in memory card +\param[in] chn CARD slot. +\param[in] freeblocks pointer to receive freeblocks value. + +\return \ref card_errors "card error codes" or free blocks +*/ +s32 CARD_GetFreeBlocks(s32 chn, u16* freeblocks); /*! \fn s32 __card_getstatusex(s32 chn,s32 fileno,struct card_direntry *entry) \brief Get the directory entry (GCI header) diff --git a/source/freetype.c b/source/freetype.c index 08b5b9e..9debfb6 100644 --- a/source/freetype.c +++ b/source/freetype.c @@ -773,7 +773,11 @@ void showSaveInfo(int sel) //clear right pane, but just the save info int bgcolor = getcolour(84,174,211); - DrawBoxFilled(375, 145, 605, 390, bgcolor); + DrawBoxFilled(375, 145, 605, 390, bgcolor); + //clear the right side just in case we went offscreen with previous comment + DrawVLine (606, 145, 390, CvtRGB(84,174,211,183,209,240)); + DrawVLine (608, 145, 390, CvtRGB(230,232,250,242,243,252)); + DrawBoxFilled(610, 145, 640, 390, getcolour(255,255,255)); // read file, display some more info // TODO: only read the necessary header + comment, display banner and icon files @@ -796,18 +800,31 @@ void showSaveInfo(int sel) // struct gci now contains header info } - - //Draw nice gradient background for banner and icon - DrawBox (410, 163, 410+160, 163+39, getcolour (255,255,255)); - DrawBoxFilledGradient(412, 164, (410+159), (164+37), BLUECOL, PURPLECOL); - - //Show icon and banner - if ((gci.banner_fmt&CARD_BANNER_MASK) == CARD_BANNER_RGB) { - bannerloadRGB(bannerdata); - } - else if ((gci.banner_fmt&CARD_BANNER_MASK) == CARD_BANNER_CI) { - bannerloadCI(bannerdataCI, tlutbanner); - } + + //Draw nice gradient background for banner and icon + if(SDCARD_GetBannerFmt(gci.banner_fmt) == 1 || SDCARD_GetBannerFmt(gci.banner_fmt) == 2){ + //Box for icon+banner + DrawHLine (410, 410+160, 162, getcolour (255,255,255)); + DrawBox (410, 163, 410+160, 163+39, getcolour (255,255,255)); + DrawHLine (410, 410+160, 164+39, getcolour (255,255,255)); + DrawBoxFilledGradient(412, 164, (410+158), (164+37), BLUECOL, PURPLECOL); + }else + { + //Box for icon + DrawHLine (468, 468+42, 162, getcolour (255,255,255)); + DrawBox (468, 163, 468+42, 163+39, getcolour (255,255,255)); + DrawHLine (468, 468+42, 164+39, getcolour (255,255,255)); + DrawBoxFilledGradient(468+2, 164, (468+40), (164+37), BLUECOL, PURPLECOL); + } + + //Show banner if there is one + if (SDCARD_GetBannerFmt(gci.banner_fmt) == CARD_BANNER_RGB) { + bannerloadRGB(bannerdata); + } + else if (SDCARD_GetBannerFmt(gci.banner_fmt) == CARD_BANNER_CI) { + bannerloadCI(bannerdataCI, tlutbanner); + } + //Show first icon if ((gci.icon_fmt&CARD_ICON_MASK)== 1) { //CI with shared palette @@ -822,14 +839,14 @@ void showSaveInfo(int sel) /*** Display relevant info for this save ***/ sprintf(txt, "#%d %s/%s", sel, gamecode, company); - DrawText(x, y, txt); - y += 60; + DrawText(x, y-4, txt); + y += 65; //DrawText(x, y, "File Description:"); //y += 20; - char comment1[26]; - char comment2[6]; + char comment1[32]; + char comment2[32]; //We go ahead and print the full 32byte comment lines - could go offscreen //but we like to live dangerously @@ -850,7 +867,7 @@ void showSaveInfo(int sel) DrawText(x, y, comment2); y += 20; memset(comment2, 0, sizeof(comment2)); - y += 20; + y += 10; // Compute date/time u32 t = gci.time; // seconds since jan 1, 2000 @@ -861,7 +878,15 @@ void showSaveInfo(int sel) y += 20; */ - t += 946684800; //let's add seconds since Epoch (jan 1, 1970 to jan 1,2000) + t += 946684800; //let's add seconds since Epoch (jan 1, 1970 to jan 1,2000) + + //Dolphin memory card manager and some homebrew store time with seconds since Epoch, which results in time being +30 years + /* + if (time(NULL) < 1893456000 && t > 1893456000) + t -= 946684800; + */ + //Above's solution will stop working after the year 2030... so better not to depend on current time, as it might be wrong + int month, day, year, hour, min, sec; month = day = year = hour = min = sec = 0; char monthstr[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", @@ -905,15 +930,19 @@ void showSaveInfo(int sel) DrawText(x, y, txt); y += 20; //M-> Cant' move the file //C->can't copy the file //P->public file //Most frecuent: xxP - sprintf(txt, "Perm: %s%s%s", - (gci.unknown1 & 16) ? "M " : "x ", - (gci.unknown1 & 8) ? "C " : "x ", - (gci.unknown1 & 4) ? "P" : "x"); +/* sprintf(txt, "Perm: %s%s%s", + (gci.unknown1 & 16) ? "M " : "x ", + (gci.unknown1 & 8) ? "C " : "x ", + (gci.unknown1 & 4) ? "P" : "x"); +*/ + sprintf(txt, "Perm: %s%s%s", + (gci.unknown1 & 16) ? "" : "Move | ", + (gci.unknown1 & 8) ? "" : "Copy | ", + (gci.unknown1 & 4) ? "Public" : "Private"); DrawText(x, y, txt); y += 20; sprintf(txt, "Copy Count: %02d", gci.unknown2); DrawText(x, y, txt); - //y += 20; #ifdef DEBUG_VALUES /*** Uncomment to print some debug info ***/ @@ -1282,7 +1311,7 @@ int ShowSelector (int saveinfo) void writeStatusBar( char *line1, char *line2) { int bgcolor = getcolour(0xff,0xff,0xff); - DrawBoxFilled(10, 404, 610, 455, bgcolor); + DrawBoxFilled(10, 404, 640, 455, bgcolor); //setfontcolour(84,174,211); setfontcolour(28,28,28); DrawText(40, 425, line1); diff --git a/source/gci.h b/source/gci.h index c440777..e2c42c7 100644 --- a/source/gci.h +++ b/source/gci.h @@ -14,6 +14,11 @@ // Also, libogc creates card entries with time since 1970 and gamecube uses time since 2000... thus libogc adds 30 years! //#define STATUSOGC + +#define SDCARD_GetBannerFmt(banner_fmt) ((banner_fmt) & 0x03) +#define SDCARD_GetIconFmt(icon_fmt,n) (((icon_fmt)>>(2*(n))) & 0x03) +#define SDCARD_GetIconSpeed(icon_speed,n) (((icon_speed)>>(2*(n))) & 0x03) +#define SDCARD_GetIconAnim(banner_fmt) ((banner_fmt) & 0x04) typedef struct { u8 gamecode[4];