CHD: Reworked the extra frame handling

This way Sonic 2, F355, Crazy Taxi, Rayman 2 and Daytona USA work.
This commit is contained in:
Christoph "baka0815" Schwerdtfeger 2018-10-09 22:12:47 +02:00
parent 6a8eafbc5c
commit e72bd9161e
1 changed files with 18 additions and 8 deletions

View File

@ -38,18 +38,28 @@ struct CHDTrack : TrackFile
u32 StartHunk; u32 StartHunk;
u32 fmt; u32 fmt;
CHDTrack(CHDDisc* disc, u32 StartFAD,u32 StartHunk, u32 fmt) u32 extraframes; /* number of "spillage" frames in previous tracks */
CHDTrack(CHDDisc* disc, u32 StartFAD,u32 StartHunk, u32 fmt, u32 extraframes)
{ {
this->disc=disc; this->disc=disc;
this->StartFAD=StartFAD; this->StartFAD=StartFAD;
this->StartHunk=StartHunk; this->StartHunk=StartHunk;
this->fmt=fmt; this->fmt=fmt;
this->extraframes = extraframes;
} }
virtual void Read(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type) virtual void Read(u32 FAD,u8* dst,SectorFormat* sector_type,u8* subcode,SubcodeFormat* subcode_type)
{ {
u32 fad_offs=FAD-StartFAD; s32 fad_offs = FAD - (StartFAD + extraframes);
u32 hunk=(fad_offs)/disc->sph + StartHunk; u32 hunk=(fad_offs)/(s32)disc->sph + StartHunk;
if (fad_offs < 0)
{
hunk--;
fad_offs += disc->sph;
}
if (disc->old_hunk!=hunk) if (disc->old_hunk!=hunk)
{ {
chd_read(disc->chd,hunk,disc->hunk_mem); //CHDERR_NONE chd_read(disc->chd,hunk,disc->hunk_mem); //CHDERR_NONE
@ -141,14 +151,14 @@ bool CHDDisc::TryOpen(const wchar* file)
} }
printf("%s\n",temp); printf("%s\n",temp);
Track t; Track t;
t.StartFAD = total_frames + extraframes; t.StartFAD = total_frames;
int padded = (frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING;
extraframes += (padded * CD_TRACK_PADDING) - frames;
total_frames += frames; total_frames += frames;
t.EndFAD = total_frames - 1 + extraframes; t.EndFAD = total_frames - 1;
t.ADDR = 0; t.ADDR = 0;
t.CTRL = strcmp(type,"AUDIO") == 0 ? 0 : 4; t.CTRL = strcmp(type,"AUDIO") == 0 ? 0 : 4;
t.file = new CHDTrack(this, t.StartFAD, total_hunks, strcmp(type,"MODE1") ? 2352 : 2048); t.file = new CHDTrack(this, t.StartFAD, total_hunks, strcmp(type,"MODE1") ? 2352 : 2048, extraframes);
int padded = (frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING;
extraframes += (padded * CD_TRACK_PADDING) - frames;
total_hunks += frames / sph; total_hunks += frames / sph;
if (frames % sph) if (frames % sph)