add TOC-testing to mednadisc

This commit is contained in:
zeromus 2015-02-01 02:10:55 +00:00
parent 8c10f401e2
commit 8845b02010
2 changed files with 36 additions and 14 deletions

View File

@ -9,16 +9,32 @@
#include "cdrom/cdromif.h" #include "cdrom/cdromif.h"
#include "cdrom/CDAccess_Image.h" #include "cdrom/CDAccess_Image.h"
class MednaDisc
{
public:
~MednaDisc()
{
delete disc;
}
CDAccess* disc;
CDUtility::TOC toc;
};
EW_EXPORT void* mednadisc_LoadCD(const char* fname) EW_EXPORT void* mednadisc_LoadCD(const char* fname)
{ {
CDAccess* disc = NULL; CDAccess* disc = NULL;
try { try {
disc = cdaccess_open_image(fname,false); disc = cdaccess_open_image(fname,false);
} }
catch(MDFN_Error &e) { catch(MDFN_Error &) {
return NULL; return NULL;
} }
return disc;
MednaDisc* md = new MednaDisc();
md->disc = disc;
disc->Read_TOC(&md->toc);
return md;
} }
struct JustTOC struct JustTOC
@ -28,28 +44,34 @@ struct JustTOC
uint8 disc_type; uint8 disc_type;
}; };
EW_EXPORT void mednadisc_ReadTOC(CDAccess* disc, JustTOC* justToc, CDUtility::TOC_Track *tracks101) EW_EXPORT void mednadisc_ReadTOC(MednaDisc* md, JustTOC* justToc, CDUtility::TOC_Track *tracks101)
{ {
CDUtility::TOC toc; CDUtility::TOC &toc = md->toc;
disc->Read_TOC(&toc);
justToc->first_track = toc.first_track; justToc->first_track = toc.first_track;
justToc->last_track = toc.last_track; justToc->last_track = toc.last_track;
justToc->disc_type = toc.disc_type; justToc->disc_type = toc.disc_type;
memcpy(tracks101,toc.tracks,sizeof(toc.tracks)); memcpy(tracks101,toc.tracks,sizeof(toc.tracks));
} }
EW_EXPORT int32 mednadisc_ReadSector(CDAccess* disc, int lba, void* buf2448) EW_EXPORT int32 mednadisc_ReadSector(MednaDisc* md, int lba, void* buf2448)
{ {
try { CDAccess* disc = md->disc;
disc->Read_Raw_Sector((uint8*)buf2448,lba); CDUtility::TOC &toc = md->toc;
try
{
//if it's at the lead-out track or beyond, synthesize it as a lead-out sector
if(lba >= (int32)toc.tracks[100].lba)
synth_leadout_sector_lba(0x02, toc, lba, (uint8*)buf2448);
else
disc->Read_Raw_Sector((uint8*)buf2448,lba);
} }
catch(MDFN_Error &e) { catch(MDFN_Error &) {
return 0; return 0;
} }
return 1; return 1;
} }
EW_EXPORT void mednadisc_CloseCD(CDAccess* disc) EW_EXPORT void mednadisc_CloseCD(MednaDisc* md)
{ {
delete disc; delete md;
} }

View File

@ -2,8 +2,8 @@
#include "emuware/emuware.h" #include "emuware/emuware.h"
class CDAccess; class MednaDisc;
EW_EXPORT void* mednadisc_LoadCD(const char* fname); EW_EXPORT void* mednadisc_LoadCD(const char* fname);
EW_EXPORT int32 mednadisc_ReadSector(CDAccess* disc, int lba, void* buf2448); EW_EXPORT int32 mednadisc_ReadSector(MednaDisc* disc, int lba, void* buf2448);
EW_EXPORT void mednadisc_CloseCD(CDAccess* disc); EW_EXPORT void mednadisc_CloseCD(MednaDisc* disc);