82 lines
1.7 KiB
C++
82 lines
1.7 KiB
C++
#include "emuware/emuware.h"
|
|
|
|
#include "Mednadisc.h"
|
|
|
|
#include "error.h"
|
|
|
|
#include "cdrom/CDAccess.h"
|
|
#include "cdrom/CDUtility.h"
|
|
#include "cdrom/cdromif.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)
|
|
{
|
|
CDAccess* disc = NULL;
|
|
try {
|
|
disc = CDAccess_Open(fname,false);
|
|
}
|
|
catch(MDFN_Error &) {
|
|
return NULL;
|
|
}
|
|
|
|
MednaDisc* md = new MednaDisc();
|
|
md->disc = disc;
|
|
disc->Read_TOC(&md->toc);
|
|
return md;
|
|
}
|
|
|
|
struct JustTOC
|
|
{
|
|
uint8 first_track;
|
|
uint8 last_track;
|
|
uint8 disc_type;
|
|
};
|
|
|
|
EW_EXPORT void mednadisc_ReadTOC(MednaDisc* md, JustTOC* justToc, CDUtility::TOC_Track *tracks101)
|
|
{
|
|
CDUtility::TOC &toc = md->toc;
|
|
justToc->first_track = toc.first_track;
|
|
justToc->last_track = toc.last_track;
|
|
justToc->disc_type = toc.disc_type;
|
|
memcpy(tracks101,toc.tracks,sizeof(toc.tracks));
|
|
}
|
|
|
|
//NOTE: the subcode will come out interleaved.
|
|
//Don't try changing this unless youre REALLY bored. It's convoluted.
|
|
//If you do, make sure you have three states: must_interleave, must_deinterleaved and dontcare
|
|
EW_EXPORT int32 mednadisc_ReadSector(MednaDisc* md, int lba, void* buf2448)
|
|
{
|
|
CDAccess* disc = md->disc;
|
|
CDUtility::TOC &toc = md->toc;
|
|
try
|
|
{
|
|
//EDIT: this is handled now by the individual readers
|
|
//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 &) {
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
EW_EXPORT void mednadisc_CloseCD(MednaDisc* md)
|
|
{
|
|
delete md;
|
|
}
|