diff --git a/core/hw/gdrom/gdrom_response.cpp b/core/hw/gdrom/gdrom_response.cpp index 1389884f7..d88166348 100644 --- a/core/hw/gdrom/gdrom_response.cpp +++ b/core/hw/gdrom/gdrom_response.cpp @@ -49,14 +49,3 @@ u16 reply_71[] = u32 reply_71_sz=sizeof(reply_71); -char szExDT[8][32] = -{ - "Any...", - "CD-DA", - "Mode1", - "Mode2", - "Mode2-Form1", - "Mode2-Form2", - "Mode2-Non-XA", - "-> GD UNKNOWN TYPE <=" -}; diff --git a/core/hw/gdrom/gdromv3.h b/core/hw/gdrom/gdromv3.h index 97dfd3c34..eeba937d5 100644 --- a/core/hw/gdrom/gdromv3.h +++ b/core/hw/gdrom/gdromv3.h @@ -134,6 +134,7 @@ struct GD_SecNumbT u8 full; }; }; +extern GD_SecNumbT SecNumber; struct read_params_t { @@ -212,6 +213,7 @@ struct cdda_t }; }CurrAddr,EndAddr,StartAddr; } ; +extern cdda_t cdda; union ByteCount_t { @@ -254,11 +256,7 @@ extern GD_HardwareInfo_t GD_HardwareInfo; //Response strings extern u16 reply_a1[]; -extern u16 reply_11[]; extern u16 reply_71[]; -extern char szExDT[8][32]; - - #define GD_IMPEDHI0_Read 0x005F7000 // (R) These are all diff --git a/core/imgread/ImgReader.cpp b/core/imgread/ImgReader.cpp index e0562688d..984aa9bdf 100644 --- a/core/imgread/ImgReader.cpp +++ b/core/imgread/ImgReader.cpp @@ -39,6 +39,23 @@ u32 libGDR_GetTrackNumber(u32 sector, u32& elapsed) return 0xAA; } +bool libGDR_GetTrack(u32 track_num, u32& start_fad, u32& end_fad) +{ + if (track_num == 0 || track_num > disc->tracks.size()) + return false; + start_fad = disc->tracks[track_num - 1].StartFAD; + end_fad = disc->tracks[track_num - 1].EndFAD; + if (end_fad == 0) + { + if (track_num == disc->tracks.size()) + end_fad = disc->LeadOut.StartFAD - 1; + else + end_fad = disc->tracks[track_num].StartFAD - 1; + } + + return true; +} + //TODO : fix up u32 libGDR_GetDiscType() { diff --git a/core/reios/gdrom_hle.cpp b/core/reios/gdrom_hle.cpp index 3243667fd..3906909b9 100644 --- a/core/reios/gdrom_hle.cpp +++ b/core/reios/gdrom_hle.cpp @@ -132,7 +132,7 @@ void GD_HLE_Command(u32 cc, u32 prm) switch(cc) { case GDCC_GETTOC: - WARN_LOG(REIOS, "GDROM: *FIXME* CMD GETTOC CC:%X PRM:%X",cc,prm); + WARN_LOG(REIOS, "GDROM: *FIXME* CMD GETTOC PRM:%X", prm); break; case GDCC_GETTOC2: @@ -144,7 +144,7 @@ void GD_HLE_Command(u32 cc, u32 prm) break; case GDCC_INIT: - INFO_LOG(REIOS, "GDROM: CMD INIT CC:%X PRM:%X",cc,prm); + INFO_LOG(REIOS, "GDROM: CMD INIT PRM:%X", prm); break; case GDCC_PIOREAD: @@ -157,27 +157,50 @@ void GD_HLE_Command(u32 cc, u32 prm) case GDCC_PLAY_SECTOR: - WARN_LOG(REIOS, "GDROM: CMD PLAYSEC? CC:%X PRM:%X",cc,prm); + WARN_LOG(REIOS, "GDROM: CMD PLAYSEC? PRM:%X", prm); break; case GDCC_RELEASE: - WARN_LOG(REIOS, "GDROM: CMD RELEASE? CC:%X PRM:%X",cc,prm); + WARN_LOG(REIOS, "GDROM: CMD RELEASE? PRM:%X", prm); break; case GDCC_STOP: - WARN_LOG(REIOS, "GDROM: CMD STOP CC:%X PRM:%X",cc,prm); + INFO_LOG(REIOS, "GDROM: CMD STOP PRM:%X", prm); + cdda.playing = false; + SecNumber.Status = GD_STANDBY; break; case GDCC_SEEK: - WARN_LOG(REIOS, "GDROM: CMD SEEK CC:%X PRM:%X",cc,prm); + INFO_LOG(REIOS, "GDROM: CMD SEEK PRM:%X", prm); + cdda.playing = false; + SecNumber.Status = GD_PAUSE; break; case GDCC_PLAY: - WARN_LOG(REIOS, "GDROM: CMD PLAY PRM:%X args: %x %x %x %x", prm, ReadMem32(prm), ReadMem32(prm + 4), ReadMem32(prm + 8), ReadMem32(prm + 12)); + { + + u32 first_track = ReadMem32(prm); + u32 last_track = ReadMem32(prm + 4); + u32 repeats = ReadMem32(prm + 8); + u32 start_fad, end_fad, dummy; + libGDR_GetTrack(first_track, start_fad, dummy); + libGDR_GetTrack(last_track, dummy, end_fad); + INFO_LOG(REIOS, "GDROM: CMD PLAY first_track %x last_track %x repeats %x start_fad %x end_fad %x param4 %x", first_track, last_track, repeats, + start_fad, end_fad, ReadMem32(prm + 12)); + cdda.playing = true; + cdda.StartAddr.FAD = start_fad; + cdda.EndAddr.FAD = end_fad; + cdda.repeats = repeats; + if (SecNumber.Status != GD_PAUSE || cdda.CurrAddr.FAD < start_fad || cdda.CurrAddr.FAD > end_fad) + cdda.CurrAddr.FAD = start_fad; + SecNumber.Status = GD_PLAY; + } break; case GDCC_PAUSE: - WARN_LOG(REIOS, "GDROM: CMD PAUSE CC:%X PRM:%X",cc,prm); + INFO_LOG(REIOS, "GDROM: CMD PAUSE"); + cdda.playing = false; + SecNumber.Status = GD_PAUSE; break; case GDCC_READ: @@ -266,7 +289,7 @@ void GD_HLE_Command(u32 cc, u32 prm) // 1 | 0 | 0 | 0 | 0 | repeat count // ------------------------------------------------------ // 2-3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 - WriteMem32(dst0, 2); // repeat 0, status 2 (standby) + WriteMem32(dst0, (cdda.repeats << 8) | SecNumber.Status); // bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 // byte | | | | | | | | @@ -372,7 +395,7 @@ void gdrom_hle_op() case GDROM_SECTOR_MODE: - INFO_LOG(REIOS, "GDROM: HLE GDROM_SECTOR_MODE PTR_r4:%X",r[4]); + WARN_LOG(REIOS, "GDROM: HLE GDROM_SECTOR_MODE PTR_r4:%X",r[4]); for(int i=0; i<4; i++) { SecMode[i] = ReadMem32(r[4]+(i<<2)); INFO_LOG(REIOS, "%08X", SecMode[i]); diff --git a/core/types.h b/core/types.h index cd2b9c5b6..e608bf785 100644 --- a/core/types.h +++ b/core/types.h @@ -793,6 +793,7 @@ void libGDR_GetToc(u32* toc,u32 area); u32 libGDR_GetDiscType(); void libGDR_GetSessionInfo(u8* pout,u8 session); u32 libGDR_GetTrackNumber(u32 sector, u32& elapsed); +bool libGDR_GetTrack(u32 track_num, u32& start_fad, u32& end_fad); // 0x00600000 - 0x006007FF [NAOMI] (modem area for dreamcast) u32 libExtDevice_ReadMem_A0_006(u32 addr,u32 size);