mirror of https://github.com/PCSX2/pcsx2.git
195 lines
4.9 KiB
C++
195 lines
4.9 KiB
C++
// cdvdcompat.cpp: implementation of the cdvdcompat class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "cdvddraft.h"
|
|
#include "cdvdcompat.h"
|
|
#include "cdvdmisc.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// test cdrom-from old interface ;p //
|
|
// added for psemupro compatibility and testing only! //
|
|
// although, its seems more stable than my old one hehe.. //
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
static char *libraryName = "PSEmuPro (C/DVD) Compatibility Driver";
|
|
const unsigned char version = 1;
|
|
const unsigned char revision = 0;
|
|
const unsigned char build = 22;
|
|
|
|
#define INT2BCD(n) ((n)/10)*16 + (n)%10
|
|
#define BCD2INT(n) ((n & 0x0F) + 10 * ( (n & 0xF0) >> 4))
|
|
#define MSF2SECT(m,s,f) (((m)*60 + (s) - 2)*75 + (f) )
|
|
#define SECT2MSF(sect,m,s,f){ (f) =(UI08)(sect%75);(s) =(UI08)(((sect - (f))/75)%60);(m) = (UI08)((((sect - (f))/75)-(s))/60); }
|
|
#define NORMALIZE(m,s,f) { while((f) >= 75){ (f) -= 75; (s) += 1; } while((s) >= 60){ (s) -= 60; (m) += 1;} }
|
|
|
|
/*************************************************************************/
|
|
/* psemupro library identifier functions */
|
|
/*************************************************************************/
|
|
char * CALLBACK PSEgetLibName()
|
|
{
|
|
return libraryName;
|
|
}
|
|
|
|
unsigned int CALLBACK PSEgetLibType()
|
|
{
|
|
return 1; // PSE_LT_CDR
|
|
}
|
|
|
|
unsigned int CALLBACK PSEgetLibVersion()
|
|
{
|
|
return version<<16|revision<<8|build;
|
|
}
|
|
|
|
/*************************************************************************/
|
|
/* psemupro config/test functions */
|
|
/*************************************************************************/
|
|
|
|
int CALLBACK CDRconfigure(void)
|
|
{
|
|
CDVDconfigure();
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
void CALLBACK CDRabout(void)
|
|
{
|
|
CDVDabout();
|
|
}
|
|
|
|
int CALLBACK CDRtest(void)
|
|
{
|
|
return CDVDtest();
|
|
}
|
|
|
|
/*************************************************************************/
|
|
/* psemupro library init/shutdown functions */
|
|
/*************************************************************************/
|
|
|
|
int CALLBACK CDRinit()
|
|
{
|
|
return CDVDinit();
|
|
}
|
|
|
|
int CALLBACK CDRshutdown()
|
|
{
|
|
CDVDshutdown();
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
int CALLBACK CDRopen()
|
|
{
|
|
return CDVDopen();
|
|
}
|
|
|
|
int CALLBACK CDRclose()
|
|
{
|
|
CDVDclose();
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
/*************************************************************************/
|
|
/* psemupro library cdrom functions */
|
|
/*************************************************************************/
|
|
|
|
int CALLBACK CDRgetTN(cdvdTN *buffer)
|
|
{
|
|
return CDVDgetTN(buffer);
|
|
}
|
|
|
|
int CALLBACK CDRgetTD(unsigned char track, unsigned char *buffer)
|
|
{
|
|
/* cdvdTD td;
|
|
|
|
int retval = CDVDgetTD(track, &td);
|
|
|
|
if(retval == CDVD_ERROR_FAIL)
|
|
return CDVD_ERROR_FAIL;
|
|
|
|
//SECT2MSF(retval, m, s, f);
|
|
|
|
NORMALIZE(td.minute, td.second, td.frame);
|
|
|
|
buffer[0] = INT2BCD(td.minute);
|
|
buffer[2] = INT2BCD(td.frame);
|
|
|
|
if(track == 0)
|
|
{
|
|
buffer[1] = INT2BCD(td.second);
|
|
}
|
|
else
|
|
{
|
|
// (add 0:2:0 to convert to pysical addr)
|
|
buffer[1] = INT2BCD(td.second+2);
|
|
}*/
|
|
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
int CALLBACK CDRreadTrack(unsigned char *time)
|
|
{
|
|
int lsn = MSF2SECT(BCD2INT(time[0]), BCD2INT(time[1]), BCD2INT(time[2]));
|
|
|
|
return CDVDreadTrack(lsn, CDVD_MODE_2352);
|
|
}
|
|
|
|
unsigned char *CALLBACK CDRgetBuffer(void)
|
|
{
|
|
return (CDVDgetBuffer() + 12);
|
|
}
|
|
|
|
// heck if i know if this works -_-
|
|
int CALLBACK CDRplay(unsigned char *sector)
|
|
{
|
|
flush_all();
|
|
int sect = MSF2SECT(sector[0], sector[1], sector[2]);
|
|
cdvd_play(sect, 0xFFFFFF);
|
|
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
int CALLBACK CDRstop(void)
|
|
{
|
|
flush_all();
|
|
cdvd_stop();
|
|
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|
|
|
|
/*************************************************************************/
|
|
/* psemupro library extended functions */
|
|
/*************************************************************************/
|
|
typedef struct tagCDRSTAT
|
|
{
|
|
unsigned long Type;
|
|
unsigned long Status;
|
|
unsigned char Time[3]; // current playing time
|
|
|
|
} CDRSTAT, *LPCDRSTAT;
|
|
|
|
int CALLBACK CDRgetStatus(LPCDRSTAT stat)
|
|
{
|
|
memset(stat, 0, sizeof(CDRSTAT));
|
|
|
|
stat->Type = 0x01; //always data for now..
|
|
|
|
if(cdvd_testready() != CDVD_ERROR_SUCCESS)
|
|
{
|
|
stat->Type = 0xff;
|
|
stat->Status |= 0x10;
|
|
}
|
|
else
|
|
{
|
|
// new disc, flush cashe markers
|
|
flush_all();
|
|
}
|
|
|
|
return CDVD_ERROR_SUCCESS;
|
|
}
|