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);
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;
};
};
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

View File

@ -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()
{

View File

@ -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]);

View File

@ -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);