@@ -197,6 +197,52 @@ s32 MMCE_SetAccessMode(s32 chan, u8 mode)
197197 return err ? MMCE_RESULT_NOCARD : MMCE_Sync (chan );
198198}
199199
200+ static u8 DigitToNibble (char digit )
201+ {
202+ switch (digit ) {
203+ case '0' ... '9' :
204+ return digit - '0' ;
205+ case 'A' ... 'F' :
206+ return digit - 'A' + 10 ;
207+ case 'a' ... 'f' :
208+ return digit - 'a' + 10 ;
209+ default :
210+ return 0 ;
211+ }
212+ }
213+
214+ s32 MMCE_GetDiskID (s32 chan , dvddiskid * diskID )
215+ {
216+ bool err = false;
217+ u8 cmd [3 ], resp [10 ];
218+
219+ if (!EXI_LockEx (chan , EXI_DEVICE_0 )) return MMCE_RESULT_BUSY ;
220+ if (!EXI_Select (chan , EXI_DEVICE_0 , EXI_SPEED16MHZ )) {
221+ EXI_Unlock (chan );
222+ return MMCE_RESULT_NOCARD ;
223+ }
224+
225+ cmd [0 ] = 0x8B ;
226+ cmd [1 ] = 0x10 ;
227+ cmd [2 ] = 0x00 ;
228+
229+ err |= !EXI_ImmEx (chan , cmd , sizeof (cmd ), EXI_WRITE );
230+ err |= !EXI_ImmEx (chan , resp , sizeof (resp ), EXI_READ );
231+ err |= !EXI_Deselect (chan );
232+
233+ if (!err ) {
234+ memset (diskID , 0 , sizeof (* diskID ));
235+ memcpy (diskID -> gamename , & resp [0 ], 4 );
236+ memcpy (diskID -> company , & resp [4 ], 2 );
237+ diskID -> disknum = DigitToNibble (resp [6 ]) << 4 | DigitToNibble (resp [7 ]);
238+ diskID -> gamever = DigitToNibble (resp [8 ]) << 4 | DigitToNibble (resp [9 ]);
239+ }
240+
241+ EXI_Unlock (chan );
242+
243+ return err ? MMCE_RESULT_NOCARD : MMCE_RESULT_READY ;
244+ }
245+
200246s32 MMCE_SetDiskID (s32 chan , const dvddiskid * diskID )
201247{
202248 static const char digits [16 ] = "0123456789ABCDEF" ;
@@ -480,7 +526,7 @@ static void DbgHandler(u32 irq, frame_context *ctx)
480526
481527static bool __mmce_startup (DISC_INTERFACE * disc )
482528{
483- s32 chan = (disc -> ioType & 0xFF ) - '0' ;
529+ s32 chan = (char ) disc -> ioType - '0' ;
484530 u32 type , id ;
485531 u8 mode ;
486532
@@ -521,7 +567,7 @@ static bool __mmce_startup(DISC_INTERFACE *disc)
521567
522568static bool __mmce_isInserted (DISC_INTERFACE * disc )
523569{
524- s32 chan = (disc -> ioType & 0xFF ) - '0' ;
570+ s32 chan = (char ) disc -> ioType - '0' ;
525571
526572 if (disc -> ioType < DEVICE_TYPE_GAMECUBE_MMCE (0 )) return false;
527573 if (disc -> ioType > DEVICE_TYPE_GAMECUBE_MMCE (2 )) return false;
@@ -531,7 +577,7 @@ static bool __mmce_isInserted(DISC_INTERFACE *disc)
531577
532578static bool __mmce_readSectors (DISC_INTERFACE * disc , sec_t sector , sec_t numSectors , void * buffer )
533579{
534- s32 chan = (disc -> ioType & 0xFF ) - '0' ;
580+ s32 chan = (char ) disc -> ioType - '0' ;
535581
536582 if (disc -> ioType < DEVICE_TYPE_GAMECUBE_MMCE (0 )) return false;
537583 if (disc -> ioType > DEVICE_TYPE_GAMECUBE_MMCE (2 )) return false;
@@ -547,7 +593,7 @@ static bool __mmce_readSectors(DISC_INTERFACE *disc, sec_t sector, sec_t numSect
547593
548594static bool __mmce_writeSectors (DISC_INTERFACE * disc , sec_t sector , sec_t numSectors , const void * buffer )
549595{
550- s32 chan = (disc -> ioType & 0xFF ) - '0' ;
596+ s32 chan = (char ) disc -> ioType - '0' ;
551597
552598 if (disc -> ioType < DEVICE_TYPE_GAMECUBE_MMCE (0 )) return false;
553599 if (disc -> ioType > DEVICE_TYPE_GAMECUBE_MMCE (2 )) return false;
@@ -568,7 +614,7 @@ static bool __mmce_clearStatus(DISC_INTERFACE *disc)
568614
569615static bool __mmce_shutdown (DISC_INTERFACE * disc )
570616{
571- s32 chan = (disc -> ioType & 0xFF ) - '0' ;
617+ s32 chan = (char ) disc -> ioType - '0' ;
572618
573619 if (disc -> ioType < DEVICE_TYPE_GAMECUBE_MMCE (0 )) return false;
574620 if (disc -> ioType > DEVICE_TYPE_GAMECUBE_MMCE (2 )) return false;
0 commit comments