@@ -376,48 +376,79 @@ static void Show_About_uLE(void)
376376}
377377
378378#ifdef MMCE
379+ #define VMC_NORMAL 0
380+ #define VMC_BOOTCARD 1
381+
382+ #define SET_SPECIFIC 0
383+ #define SET_NEXT_CARD 1
384+ #define SET_PREV_CARD 2
385+ #define BUILD_SETCARD (param , type , mode , num ) param = type << 24; param |= mode << 16; param |= num;
386+
387+ enum mmceman_cmds {
388+ MMCE_CMD_PING = 0x1 ,
389+ MMCE_CMD_GET_STATUS ,
390+ MMCE_CMD_GET_CARD ,
391+ MMCE_CMD_SET_CARD ,
392+ MMCE_CMD_GET_CHANNEL ,
393+ MMCE_CMD_SET_CHANNEL ,
394+ MMCE_CMD_GET_GAMEID ,
395+ MMCE_CMD_SET_GAMEID ,
396+ MMCE_CMD_RESET ,
397+ MMCE_SETTINGS_ACK_WAIT_CYCLES ,
398+ MMCE_SETTINGS_SET_ALARMS ,
399+ };
400+
401+ #define MAX_GAMEID_LEN 256
379402struct cardinfo_t {
380403 char * product ;
381404 int revision ;
382405 int protocol ;
383406 int validcard ;
407+ char gid [MAX_GAMEID_LEN ];
384408};
385- static void Show_MMCEManager (void )
386- {
387- int event = 1 , post_event = 0 , curcard = 0 , res , i ;
388- int hpos [2 ] = {2 , 38 };
389- char TextRow [256 ];
390- char * sd2psx = "SD2PSX" ;
391- char * mcpro = "MemCardPro2" ;
392- char * unk = LNG (Unknown );
393- struct cardinfo_t CardInfo [2 ] = {
394- {unk , 0 , 0 , FALSE},
395- {unk , 0 , 0 , FALSE},
396- };
397-
409+
410+ const char * mmce_product_ids [] = {"Unknown" , "SD2PSX" , "MemCard PRO2" , "PicoMemcard+" , "PicoMemcardZero" };
411+ static void refresh_mmceman_data (struct cardinfo_t * CardInfo ) {
398412 char * mmce = "mmce0:" ;
413+ int i , res ;
399414 for (i = 0 ; i < 2 ; i ++ ) {
400415 mmce [4 ] = '0' + i ;
401- res = fileXioDevctl (mmce , 0x1 /* MMCE_CMD_PING*/ , NULL , 0 , NULL , 0 );
416+ res = fileXioDevctl (mmce , MMCE_CMD_PING , NULL , 0 , NULL , 0 );
402417 if (res != -1 ) {
403- if (((res & 0xFF00 ) >> 8 ) == 1 ) {
404- CardInfo [i ].product = sd2psx ;
405- } else if (((res & 0xFF00 ) >> 8 ) == 2 ) {
406- CardInfo [i ].product = mcpro ;
407- } else {
408- CardInfo [i ].product = unk ;
409- }
418+ if (((res & 0xFF00 ) >> 8 ) > 0 && ((res & 0xFF00 ) >> 8 ) < 5 ) {
419+ CardInfo [i ].product = mmce_product_ids [((res & 0xFF00 ) >> 8 )];
420+ } else {
421+ CardInfo [i ].product = LNG (Unknown );
422+ }
410423 CardInfo [i ].revision = (res & 0xFF );
411424 CardInfo [i ].protocol = ((res & 0xFF0000 ) >> 16 );
412425 CardInfo [i ].validcard = TRUE;
413- } else CardInfo [i ].validcard = FALSE;
426+ if (fileXioDevctl (mmce , MMCE_CMD_GET_GAMEID , NULL , 0 , & CardInfo [i ].gid , MAX_GAMEID_LEN ) == -1 ) {
427+ strncpy (CardInfo [i ].gid , LNG (Unknown ), MAX_GAMEID_LEN );
428+ }
429+ } else CardInfo [i ].validcard = FALSE;
414430 }
431+ }
432+
433+ static void Show_MMCEManager (void )
434+ {
435+ int event = 1 , post_event = 0 , curcard = 0 , res , i ;
436+ int hpos [2 ] = {2 , 40 };
437+ char TextRow [256 ];
438+ char * unk = LNG (Unknown );
439+ struct cardinfo_t CardInfo [2 ] = {
440+ {LNG (Unknown ), -1 , -1 , FALSE, "" },
441+ {LNG (Unknown ), -1 , -1 , FALSE, "" },
442+ };
443+ char * mmce = "mmce0:" ;
444+ refresh_mmceman_data (CardInfo );
415445
416446 //----- Start of event loop -----
417447 while (1 ) {
418448 //Pad response section
419449 waitAnyPadReady ();
420450 if (readpad () && new_pad ) {
451+ mmce [4 ] = '0' + curcard ;//update the devctl target on every new pad to avoid surprises
421452 if (new_pad & PAD_CIRCLE ) {
422453 event |= 2 ;
423454 if (setting -> GUI_skin [0 ]) {
@@ -428,8 +459,19 @@ static void Show_MMCEManager(void)
428459 } else if (new_pad & PAD_CROSS ) {
429460 curcard ^= 1 ;
430461 event |= 2 ;
462+ } else if (new_pad & PAD_R1 || new_pad & PAD_R2 ) {
463+ u32 param ;
464+ BUILD_SETCARD (param , VMC_NORMAL , (new_pad & PAD_R1 ) ? SET_PREV_CARD : SET_NEXT_CARD , 0 )
465+ res = fileXioDevctl (mmce , MMCE_CMD_SET_CARD , & param , sizeof (param ), NULL , 0 );
466+ event |= 2 ;
467+ } else if (new_pad & PAD_SELECT ) {
468+ refresh_mmceman_data (CardInfo );
469+ event |= 2 ;
431470 } else if (new_pad & PAD_START ) {
432- //SET GAMEID
471+ if (keyboard (TextRow , 36 ) > 0 ) {
472+ fileXioDevctl (mmce , MMCE_CMD_SET_GAMEID , TextRow , 255 , NULL , 0 );
473+ event |= 2 ;
474+ }
433475 }
434476
435477 }
@@ -441,22 +483,23 @@ static void Show_MMCEManager(void)
441483 ((SCREEN_WIDTH - LINE_THICKNESS ) / 2 ) , Frame_start_y ,
442484 ((SCREEN_WIDTH - LINE_THICKNESS ) / 2 ) + LINE_THICKNESS , Frame_end_y );
443485 //PrintPos(03, 10, "Device Info:", COLOR_TEXT);
444- for (i = 0 ; i < 2 ; i ++ )
445- {
486+ for (i = 0 ; i < 2 ; i ++ ) {
446487 sprintf (TextRow , "mmce%d: " , i );
447488 PrintPos (01 , hpos [i ], TextRow , curcard == i ? COLOR_SELECT : COLOR_TEXT );
448489 if (CardInfo [i ].validcard ) {
449490 sprintf (TextRow , " Device: %s" , CardInfo [i ].product );
450491 PrintPos (02 , hpos [i ], TextRow , COLOR_TEXT );
451492 sprintf (TextRow , " Revision: %d, Protocol: %d" , CardInfo [i ].revision , CardInfo [i ].protocol );
452493 PrintPos (03 , hpos [i ], TextRow , COLOR_TEXT );
494+ snprintf (TextRow , 36 , " GameId '%s'" , CardInfo [i ].gid );
495+ PrintPos (04 , hpos [i ], TextRow , COLOR_TEXT );
453496 } else {
454497 sprintf (TextRow , "%s" , "No device Found" );
455498 PrintPos (02 , hpos [i ], TextRow , COLOR_GRAPH3 );
456499 }
457500 }
458501
459- setScrTmp ("MMCE Manager" , "R1/R2:card L1/L2:chan START:SetGameID " FNCH_CROSS ":card slot " FNCH_CIRCLE ":Back" );
502+ setScrTmp ("MMCE Manager" , "R1/R2:card L1/L2:chan START:SetGameID " FNCH_CROSS ":card slot " FNCH_CIRCLE ":Back SELECT:Refresh " );
460503 }
461504 drawScr ();
462505 post_event = event ;
0 commit comments