reios: cdda support

This commit is contained in:
Flyinghead 2019-07-31 22:08:56 +02:00
parent 55f76d02c0
commit e162f3ac83
5 changed files with 53 additions and 25 deletions

View File

@ -49,14 +49,3 @@ u16 reply_71[] =
u32 reply_71_sz=sizeof(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 <="
};

View File

@ -134,6 +134,7 @@ struct GD_SecNumbT
u8 full; u8 full;
}; };
}; };
extern GD_SecNumbT SecNumber;
struct read_params_t struct read_params_t
{ {
@ -212,6 +213,7 @@ struct cdda_t
}; };
}CurrAddr,EndAddr,StartAddr; }CurrAddr,EndAddr,StartAddr;
} ; } ;
extern cdda_t cdda;
union ByteCount_t union ByteCount_t
{ {
@ -254,11 +256,7 @@ extern GD_HardwareInfo_t GD_HardwareInfo;
//Response strings //Response strings
extern u16 reply_a1[]; extern u16 reply_a1[];
extern u16 reply_11[];
extern u16 reply_71[]; extern u16 reply_71[];
extern char szExDT[8][32];
#define GD_IMPEDHI0_Read 0x005F7000 // (R) These are all #define GD_IMPEDHI0_Read 0x005F7000 // (R) These are all

View File

@ -39,6 +39,23 @@ u32 libGDR_GetTrackNumber(u32 sector, u32& elapsed)
return 0xAA; 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 //TODO : fix up
u32 libGDR_GetDiscType() u32 libGDR_GetDiscType()
{ {

View File

@ -132,7 +132,7 @@ void GD_HLE_Command(u32 cc, u32 prm)
switch(cc) switch(cc)
{ {
case GDCC_GETTOC: 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; break;
case GDCC_GETTOC2: case GDCC_GETTOC2:
@ -144,7 +144,7 @@ void GD_HLE_Command(u32 cc, u32 prm)
break; break;
case GDCC_INIT: 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; break;
case GDCC_PIOREAD: case GDCC_PIOREAD:
@ -157,27 +157,50 @@ void GD_HLE_Command(u32 cc, u32 prm)
case GDCC_PLAY_SECTOR: 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; break;
case GDCC_RELEASE: 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; break;
case GDCC_STOP: 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; break;
case GDCC_SEEK: 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; break;
case GDCC_PLAY: 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; break;
case GDCC_PAUSE: 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; break;
case GDCC_READ: case GDCC_READ:
@ -266,7 +289,7 @@ void GD_HLE_Command(u32 cc, u32 prm)
// 1 | 0 | 0 | 0 | 0 | repeat count // 1 | 0 | 0 | 0 | 0 | repeat count
// ------------------------------------------------------ // ------------------------------------------------------
// 2-3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 // 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 // bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
// byte | | | | | | | | // byte | | | | | | | |
@ -372,7 +395,7 @@ void gdrom_hle_op()
case GDROM_SECTOR_MODE: 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++) { for(int i=0; i<4; i++) {
SecMode[i] = ReadMem32(r[4]+(i<<2)); SecMode[i] = ReadMem32(r[4]+(i<<2));
INFO_LOG(REIOS, "%08X", SecMode[i]); INFO_LOG(REIOS, "%08X", SecMode[i]);

View File

@ -793,6 +793,7 @@ void libGDR_GetToc(u32* toc,u32 area);
u32 libGDR_GetDiscType(); u32 libGDR_GetDiscType();
void libGDR_GetSessionInfo(u8* pout,u8 session); void libGDR_GetSessionInfo(u8* pout,u8 session);
u32 libGDR_GetTrackNumber(u32 sector, u32& elapsed); 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) // 0x00600000 - 0x006007FF [NAOMI] (modem area for dreamcast)
u32 libExtDevice_ReadMem_A0_006(u32 addr,u32 size); u32 libExtDevice_ReadMem_A0_006(u32 addr,u32 size);