Skip to content

Commit 4c08eaa

Browse files
committed
Add MMCE_GetDiskID
1 parent 97fd77b commit 4c08eaa

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

include/ogc/mmce.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ s32 MMCE_ProbeEx(s32 chan);
5151
s32 MMCE_GetDeviceID(s32 chan, u32 *id);
5252
s32 MMCE_GetAccessMode(s32 chan, u8 *mode);
5353
s32 MMCE_SetAccessMode(s32 chan, u8 mode);
54+
s32 MMCE_GetDiskID(s32 chan, dvddiskid *diskID);
5455
s32 MMCE_SetDiskID(s32 chan, const dvddiskid *diskID);
5556
s32 MMCE_GetDiskInfo(s32 chan, char diskInfo[64]);
5657
s32 MMCE_SetDiskInfo(s32 chan, const char diskInfo[64]);

libogc/mmce.c

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
200246
s32 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

481527
static 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

522568
static 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

532578
static 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

548594
static 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

569615
static 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

Comments
 (0)