@@ -903,7 +903,7 @@ static void __dvd_statebusycb(s32 result)
903903 }
904904 if (__dvd_currcmd == 0x0019 ) {
905905 if (_diReg [7 ]& DVD_DI_MODE ) {
906- DVD_GcodeLowWrite (__dvd_executing -> currtxsize ,__dvd_executing -> offset + __dvd_executing -> txdsize ,__dvd_statebusycb );
906+ DVD_LowGcodeWrite (__dvd_executing -> currtxsize ,__dvd_executing -> offset + __dvd_executing -> txdsize ,__dvd_statebusycb );
907907 return ;
908908 }
909909 if (_diReg [8 ]) {
@@ -1623,14 +1623,14 @@ static void __dvd_statebusy(dvdcmdblk *block)
16231623 case 24 :
16241624 _diReg [1 ] = _diReg [1 ];
16251625 block -> currtxsize = block -> len ;
1626- DVD_GcodeLowRead (block -> buf ,block -> len ,block -> offset ,__dvd_statebusycb );
1626+ DVD_LowGcodeRead (block -> buf ,block -> len ,block -> offset ,__dvd_statebusycb );
16271627 return ;
16281628 case 25 :
16291629 _diReg [1 ] = _diReg [1 ];
16301630 len = block -> len - block -> txdsize ;
16311631 if (len < __dvd_gcode_writebufsize ) block -> currtxsize = len ;
16321632 else block -> currtxsize = __dvd_gcode_writebufsize ;
1633- DVD_GcodeLowWriteBuffer (block -> buf + (DVD_GCODE_BLKSIZE * block -> txdsize ),block -> currtxsize ,__dvd_statebusycb );
1633+ DVD_LowGcodeWriteBuffer (block -> buf + (DVD_GCODE_BLKSIZE * block -> txdsize ),block -> currtxsize ,__dvd_statebusycb );
16341634 return ;
16351635 default :
16361636 return ;
@@ -2134,10 +2134,10 @@ s32 DVD_LowWriteDma(dvdcmdbuf cmdbuf,void *buf,u32 len,dvdcallbacklow cb)
21342134 return 1 ;
21352135}
21362136
2137- s32 DVD_GcodeLowRead (void * buf ,u32 len ,u32 offset ,dvdcallbacklow cb )
2137+ s32 DVD_LowGcodeRead (void * buf ,u32 len ,u32 offset ,dvdcallbacklow cb )
21382138{
21392139#ifdef _DVD_DEBUG
2140- printf ("DVD_GcodeLowRead (%p,%d,%d)\n" ,buf ,len ,offset );
2140+ printf ("DVD_LowGcodeRead (%p,%d,%d)\n" ,buf ,len ,offset );
21412141#endif
21422142 struct timespec tb ;
21432143
@@ -2158,10 +2158,10 @@ s32 DVD_GcodeLowRead(void *buf,u32 len,u32 offset,dvdcallbacklow cb)
21582158 return 1 ;
21592159}
21602160
2161- s32 DVD_GcodeLowWriteBuffer (void * buf ,u32 len ,dvdcallbacklow cb )
2161+ s32 DVD_LowGcodeWriteBuffer (void * buf ,u32 len ,dvdcallbacklow cb )
21622162{
21632163#ifdef _DVD_DEBUG
2164- printf ("DVD_GcodeLowWriteBuffer (%p,%d)\n" ,buf ,len );
2164+ printf ("DVD_LowGcodeWriteBuffer (%p,%d)\n" ,buf ,len );
21652165#endif
21662166 struct timespec tb ;
21672167
@@ -2191,10 +2191,10 @@ s32 DVD_GcodeLowWriteBuffer(void *buf,u32 len,dvdcallbacklow cb)
21912191 return 1 ;
21922192}
21932193
2194- s32 DVD_GcodeLowWrite (u32 len ,u32 offset ,dvdcallbacklow cb )
2194+ s32 DVD_LowGcodeWrite (u32 len ,u32 offset ,dvdcallbacklow cb )
21952195{
21962196#ifdef _DVD_DEBUG
2197- printf ("DVD_GcodeLowWrite (%d,%d)\n" ,len ,offset );
2197+ printf ("DVD_LowGcodeWrite (%d,%d)\n" ,len ,offset );
21982198#endif
21992199 struct timespec tb ;
22002200
@@ -3527,7 +3527,7 @@ void DVD_Init(void)
35273527u32 DVD_SetAutoInvalidation (u32 auto_inv )
35283528{
35293529 u32 ret = __dvd_autoinvalidation ;
3530- __dvd_autoinvalidation = auto_inv ;
3530+ __dvd_autoinvalidation = auto_inv ;
35313531 return ret ;
35323532}
35333533
@@ -3568,6 +3568,7 @@ static bool __gcdvd_ReadSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSecto
35683568 if (numSectors & ~0x1fffff ) return false;
35693569 if (disc -> bytesPerSector != 2048 ) return false;
35703570 if (!SYS_IsDMAAddress (buffer , 32 )) return false;
3571+ if (!__dvd_initflag ) return false;
35713572
35723573 if (DVD_ReadAbs (& blk , buffer , numSectors << 11 , sector << 11 ) < 0 )
35733574 return false;
@@ -3588,21 +3589,30 @@ static bool __gcdvd_ClearStatus(DISC_INTERFACE *disc)
35883589static bool __gcdvd_Shutdown (DISC_INTERFACE * disc )
35893590{
35903591 dvdcmdblk blk ;
3592+
3593+ if (disc -> ioType != DEVICE_TYPE_GAMECUBE_DVD ) return false;
3594+ if (!__dvd_initflag ) return true;
3595+
35913596 DVD_StopMotor (& blk );
35923597 return true;
35933598}
35943599
35953600static bool __gcode_Startup (DISC_INTERFACE * disc )
35963601{
3602+ s32 cover ;
35973603 dvdcmdblk blk ;
35983604
3599- DVD_Init ();
3600- DVD_Reset (DVD_RESETNONE );
3605+ do {
3606+ cover = DVD_LowGetCoverStatus ();
3607+ } while (cover == DVD_COVER_RESET );
36013608
3602- if (DVD_Inquiry ( & blk , & __dvd_driveinfo ) < 0 )
3609+ if (cover == DVD_COVER_OPEN )
36033610 return false;
36043611
3605- if (__dvd_driveinfo .rel_date != 0x20196c64 )
3612+ DVD_Init ();
3613+ DVD_Reset (DVD_RESETNONE );
3614+
3615+ if (DVD_Inquiry (& blk , & __dvd_driveinfo ) < 0 || __dvd_driveinfo .rel_date != 0x20196c64 )
36063616 return false;
36073617
36083618 if (__dvd_driveinfo .pad [1 ] == 'w' )
@@ -3611,13 +3621,18 @@ static bool __gcode_Startup(DISC_INTERFACE *disc)
36113621 disc -> features &= ~FEATURE_MEDIUM_CANWRITE ;
36123622
36133623 __dvd_gcode_writebufsize = __dvd_driveinfo .pad [3 ] + 1 ;
3614-
36153624 return true;
36163625}
36173626
36183627static bool __gcode_IsInserted (DISC_INTERFACE * disc )
36193628{
3620- if (DVD_LowGetCoverStatus () == DVD_COVER_OPEN )
3629+ s32 cover ;
3630+
3631+ do {
3632+ cover = DVD_LowGetCoverStatus ();
3633+ } while (cover == DVD_COVER_RESET );
3634+
3635+ if (cover == DVD_COVER_OPEN )
36213636 return false;
36223637
36233638 return true;
@@ -3633,6 +3648,7 @@ static bool __gcode_ReadSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSecto
36333648 if (numSectors & ~0x7fffff ) return false;
36343649 if (disc -> bytesPerSector != 512 ) return false;
36353650 if (!SYS_IsDMAAddress (buffer , 32 )) return false;
3651+ if (!__dvd_initflag ) return false;
36363652
36373653 if (DVD_GcodeRead (& blk , buffer , numSectors << 9 , sector ) < 0 )
36383654 return false;
@@ -3650,6 +3666,7 @@ static bool __gcode_WriteSectors(DISC_INTERFACE *disc,sec_t sector,sec_t numSect
36503666 if ((u32 )numSectors != numSectors ) return false;
36513667 if (disc -> bytesPerSector != 512 ) return false;
36523668 if (!SYS_IsDMAAddress (buffer , 32 )) return false;
3669+ if (!__dvd_initflag ) return false;
36533670
36543671 if (DVD_GcodeWrite (& blk , buffer , numSectors , sector ) < 0 )
36553672 return false;
0 commit comments