From 3f28c12fe70228e24a5eb21937f8deb30a5019d4 Mon Sep 17 00:00:00 2001 From: gigaherz Date: Wed, 15 Jul 2009 00:27:27 +0000 Subject: [PATCH] Start improving the CDVD interface. Change the internal ISO interface to use it. I will later work on getting the typical plugins to support these new functions. I have tried to also update the linux side, but I can't compile or test it so it might not work properly. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1511 96395faa-99c1-11dd-bbfe-3dabce05a288 --- common/include/PS2Edefs.h | 63 +++++++--- pcsx2/CDVD/CDVD.cpp | 45 ++----- pcsx2/CDVD/CDVD.h | 1 - pcsx2/CDVD/CDVDaccess.cpp | 226 +++++++---------------------------- pcsx2/CDVD/CDVDaccess.h | 7 -- pcsx2/CDVD/CDVDisoReader.cpp | 93 +++++++++----- pcsx2/CDVD/CDVDisoReader.h | 17 --- pcsx2/CDVD/CdRom.cpp | 4 +- pcsx2/Linux/LnxMain.cpp | 4 +- pcsx2/Plugins.cpp | 212 ++++++++++++++++++++++---------- pcsx2/System.cpp | 4 + pcsx2/windows/WinMain.cpp | 6 +- 12 files changed, 316 insertions(+), 366 deletions(-) diff --git a/common/include/PS2Edefs.h b/common/include/PS2Edefs.h index 6a231705ad..8cff5434f3 100644 --- a/common/include/PS2Edefs.h +++ b/common/include/PS2Edefs.h @@ -393,6 +393,17 @@ void CALLBACK CDVDabout(); s32 CALLBACK CDVDtest(); void CALLBACK CDVDnewDiskCB(void (*callback)()); +// new funcs + +// read a track directly +s32 CALLBACK CDVDreadSector(u8* buffer, s32 lsn, int mode); + +// improved getBuffer +s32 CALLBACK CDVDgetBuffer2(u8* buffer); + +// tool function +s32 CALLBACK CDVDgetDualInfo(s32* dualType, u32* _layer1start); + #endif /* DEV9 plugin API */ @@ -615,12 +626,16 @@ typedef s32 (CALLBACK* _CDVDgetDiskType)(); typedef s32 (CALLBACK* _CDVDgetTrayStatus)(); typedef s32 (CALLBACK* _CDVDctrlTrayOpen)(); typedef s32 (CALLBACK* _CDVDctrlTrayClose)(); +typedef s32 (CALLBACK* _CDVDreadSector)(u8* buffer, u32 lsn, int mode); +typedef s32 (CALLBACK* _CDVDgetBuffer2)(u8* buffer); +typedef s32 (CALLBACK* _CDVDgetDualInfo)(s32* dualType, u32* _layer1start); typedef void (CALLBACK* _CDVDconfigure)(); typedef s32 (CALLBACK* _CDVDtest)(); typedef void (CALLBACK* _CDVDabout)(); typedef void (CALLBACK* _CDVDnewDiskCB)(void (*callback)()); + // DEV9 // NOTE: The read/write functions CANNOT use XMM/MMX regs // If you want to use them, need to save and restore current ones @@ -802,25 +817,37 @@ extern _SPU2test SPU2test; extern _SPU2about SPU2about; // CDVD -extern _CDVDinit CDVDinit; -extern _CDVDopen CDVDopen; -extern _CDVDclose CDVDclose; -extern _CDVDshutdown CDVDshutdown; -extern _CDVDreadTrack CDVDreadTrack; -extern _CDVDgetBuffer CDVDgetBuffer; -extern _CDVDreadSubQ CDVDreadSubQ; -extern _CDVDgetTN CDVDgetTN; -extern _CDVDgetTD CDVDgetTD; -extern _CDVDgetTOC CDVDgetTOC; -extern _CDVDgetDiskType CDVDgetDiskType; -extern _CDVDgetTrayStatus CDVDgetTrayStatus; -extern _CDVDctrlTrayOpen CDVDctrlTrayOpen; -extern _CDVDctrlTrayClose CDVDctrlTrayClose; +struct CDVDplugin { + _CDVDinit init; + _CDVDopen open; + _CDVDclose close; + _CDVDshutdown shutdown; + _CDVDreadTrack readTrack; + _CDVDgetBuffer getBuffer; + _CDVDreadSubQ readSubQ; + _CDVDgetTN getTN; + _CDVDgetTD getTD; + _CDVDgetTOC getTOC; + _CDVDgetDiskType getDiskType; + _CDVDgetTrayStatus getTrayStatus; + _CDVDctrlTrayOpen ctrlTrayOpen; + _CDVDctrlTrayClose ctrlTrayClose; -extern _CDVDconfigure CDVDconfigure; -extern _CDVDtest CDVDtest; -extern _CDVDabout CDVDabout; -extern _CDVDnewDiskCB CDVDnewDiskCB; + _CDVDconfigure configure; + _CDVDtest test; + _CDVDabout about; + _CDVDnewDiskCB newDiskCB; + + // special functions, not in external interface yet + _CDVDreadSector readSector; + _CDVDgetBuffer2 getBuffer2; + _CDVDgetDualInfo getDualInfo; + + int* initCount; +}; +extern CDVDplugin CDVD_plugin; // _plugin because of +extern CDVDplugin CDVD; +extern CDVDplugin ISO; // DEV9 extern _DEV9init DEV9init; diff --git a/pcsx2/CDVD/CDVD.cpp b/pcsx2/CDVD/CDVD.cpp index b792afa54f..25f399f29d 100644 --- a/pcsx2/CDVD/CDVD.cpp +++ b/pcsx2/CDVD/CDVD.cpp @@ -403,28 +403,28 @@ void cdvdReadKey(u8 arg0, u16 arg1, u32 arg2, u8* key) { s32 cdvdGetToc(void* toc) { - s32 ret = DoCDVDgetTOC(toc); + s32 ret = CDVD.getTOC(toc); if (ret == -1) ret = 0x80; return ret; } s32 cdvdReadSubQ(s32 lsn, cdvdSubQ* subq) { - s32 ret = DoCDVDreadSubQ(lsn, subq); + s32 ret = CDVD.readSubQ(lsn, subq); if (ret == -1) ret = 0x80; return ret; } s32 cdvdCtrlTrayOpen() { - s32 ret = DoCDVDctrlTrayOpen(); + s32 ret = CDVD.ctrlTrayOpen(); if (ret == -1) ret = 0x80; return ret; } s32 cdvdCtrlTrayClose() { - s32 ret = DoCDVDctrlTrayClose(); + s32 ret = CDVD.ctrlTrayClose(); if (ret == -1) ret = 0x80; return ret; } @@ -433,7 +433,7 @@ s32 cdvdCtrlTrayClose() // checks if tray was opened since last call to this func s32 cdvdGetTrayStatus() { - s32 ret = DoCDVDgetTrayStatus(); + s32 ret = CDVD.getTrayStatus(); if (ret == -1) return(CDVD_TRAY_CLOSE); @@ -460,41 +460,10 @@ static __forceinline void cdvdGetDiskType() // 0 if not on dual layer disc static s32 cdvdReadDvdDualInfo(s32* dualType, u32* layer1Start) { - u8 toc[2064]; *dualType = 0; *layer1Start = 0; - if(loadFromISO) - { - return ISOgetDualInfo(dualType,layer1Start); - } - else - { - // if error getting toc, settle for single layer disc ;) - if(cdvdGetToc(toc)) - return 0; - if(toc[14] & 0x60) - { - if(toc[14] & 0x10) - { - // otp dvd - *dualType = 2; - *layer1Start = (toc[25]<<16) + (toc[26]<<8) + (toc[27]) - 0x30000 + 1; - } - else - { - // ptp dvd - *dualType = 1; - *layer1Start = (toc[21]<<16) + (toc[22]<<8) + (toc[23]) - 0x30000 + 1; - } - } - else - { - // single layer dvd - *dualType = 0; - *layer1Start = (toc[21]<<16) + (toc[22]<<8) + (toc[23]) - 0x30000 + 1; - } - } + CDVD.getDualInfo(dualType,layer1Start); return 1; } @@ -554,7 +523,7 @@ void SaveState::cdvdFreeze() void cdvdNewDiskCB() { DoCDVDresetDiskTypeCache(); - cdvd.Type = CDVDgetDiskType(); + cdvd.Type = CDVD.getDiskType(); char str[g_MaxPath]; diff --git a/pcsx2/CDVD/CDVD.h b/pcsx2/CDVD/CDVD.h index 31e8232310..e254432fb2 100644 --- a/pcsx2/CDVD/CDVD.h +++ b/pcsx2/CDVD/CDVD.h @@ -22,7 +22,6 @@ #include "IopCommon.h" #include "CDVD/CDVDaccess.h" -extern bool loadFromISO; extern char isoFileName[]; #define btoi(b) ((b)/16*10 + (b)%16) /* BCD to u_char */ diff --git a/pcsx2/CDVD/CDVDaccess.cpp b/pcsx2/CDVD/CDVDaccess.cpp index d7d00a4222..45de67d835 100644 --- a/pcsx2/CDVD/CDVDaccess.cpp +++ b/pcsx2/CDVD/CDVDaccess.cpp @@ -35,7 +35,7 @@ static int diskTypeCached=-1; -static int psize; +int lastReadSize; static int plsn=0; static isoFile *blockDumpFile; @@ -100,12 +100,12 @@ int FindDiskType(int mType) cdvdTN tn; - DoCDVDgetTN(&tn); + CDVD.getTN(&tn); if((mt<0) || ((mt == CDVD_TYPE_DETCTDVDS) && (tn.strack != tn.etrack))) { cdvdTD td; - DoCDVDgetTD(0,&td); + CDVD.getTD(0,&td); if(td.lsn>452849) { iCDType = CDVD_TYPE_DETCTDVDS; @@ -127,12 +127,12 @@ int FindDiskType(int mType) for(int i=tn.strack;i<=tn.etrack;i++) { cdvdTD td,td2; - DoCDVDgetTD(i,&td); + CDVD.getTD(i,&td); if(tn.etrack>i) - DoCDVDgetTD(i+1,&td2); + CDVD.getTD(i+1,&td2); else - DoCDVDgetTD(0,&td2); + CDVD.getTD(0,&td2); int tlength = td2.lsn - td.lsn; @@ -174,13 +174,13 @@ int FindDiskType(int mType) void DetectDiskType() { - if (DoCDVDgetTrayStatus() == CDVD_TRAY_OPEN) + if (CDVD.getTrayStatus() == CDVD_TRAY_OPEN) { diskTypeCached = CDVD_TYPE_NODISC; return; } - int baseMediaType = DoCDVDgetDiskType(); + int baseMediaType = CDVD.getDiskType(); int mType = -1; switch(baseMediaType) // Paranoid mode: do not trust the plugin's detection system to work correctly. @@ -212,31 +212,25 @@ void DetectDiskType() // ///////////////////////////////////////////////// -int cdvdInitCount=0; - s32 DoCDVDinit() { - // called even when not used - ISOinit(); - - if(!loadFromISO) - { - cdvdInitCount++; // used to handle the case where the plugin was inited at boot, but then iso takes over - return CDVDinit(); - } - diskTypeCached=-1; - return 0; + if(CDVD.initCount) *CDVD.initCount++; // used to handle the case where the plugin was inited at boot, but then iso takes over + return CDVD.init(); +} + +void DoCDVDshutdown() +{ + if(CDVD.initCount) *CDVD.initCount--; + CDVD.shutdown(); } s32 DoCDVDopen(const char* pTitleFilename) { int ret=0; - if(loadFromISO) - ret = ISOopen(pTitleFilename); - else - ret = CDVDopen(pTitleFilename); + + ret = CDVD.open(pTitleFilename); int cdtype = DoCDVDdetectDiskType(); @@ -244,7 +238,7 @@ s32 DoCDVDopen(const char* pTitleFilename) { char fname_only[MAX_PATH]; - if(loadFromISO) + if(CDVD.init == ISO.init) { #ifdef _WIN32 char fname[MAX_PATH], ext[MAX_PATH]; @@ -298,7 +292,7 @@ s32 DoCDVDopen(const char* pTitleFilename) strcat(fname_only, ".dump"); #endif cdvdTD td; - DoCDVDgetTD(0, &td); + CDVD.getTD(0, &td); int blockofs=0; int blocksize=0; @@ -330,58 +324,9 @@ s32 DoCDVDopen(const char* pTitleFilename) return ret; } -void DoCDVDclose() -{ - if(loadFromISO) - ISOclose(); - else - CDVDclose(); - - if (blockDumpFile != NULL) isoClose(blockDumpFile); -} - -void DoCDVDshutdown() -{ - if((!loadFromISO)||(cdvdInitCount>0)) // handle the case where the plugin was inited at boot, but then iso takes over - { - cdvdInitCount--; - if (CDVDshutdown != NULL) CDVDshutdown(); - } - - ISOshutdown(); -} - s32 DoCDVDreadSector(u8* buffer, u32 lsn, int mode) { - int ret; - - if(loadFromISO) - ret = ISOreadSector(buffer,lsn,mode); - else - { - CDVDreadTrack(lsn,mode); - void* pbuffer = CDVDgetBuffer(); - if(pbuffer!=NULL) - { - switch(mode) - { - case CDVD_MODE_2048: - memcpy(buffer,pbuffer,2048); - break; - case CDVD_MODE_2328: - memcpy(buffer,pbuffer,2328); - break; - case CDVD_MODE_2340: - memcpy(buffer,pbuffer,2340); - break; - case CDVD_MODE_2352: - memcpy(buffer,pbuffer,2352); - break; - } - ret = 0; - } - else ret = -1; - } + int ret = CDVD.readSector(buffer,lsn,mode); if(ret==0) { @@ -395,48 +340,31 @@ s32 DoCDVDreadSector(u8* buffer, u32 lsn, int mode) s32 DoCDVDreadTrack(u32 lsn, int mode) { - if(loadFromISO) - return ISOreadTrack(lsn, mode); - else + // TEMP: until all the plugins use the new CDVDgetBuffer style + switch (mode) { - // TEMP: until I fix all the plugins to use the new CDVDgetBuffer style - switch (mode) - { - case CDVD_MODE_2352: - psize = 2352; - break; - case CDVD_MODE_2340: - psize = 2340; - break; - case CDVD_MODE_2328: - psize = 2328; - break; - case CDVD_MODE_2048: - psize = 2048; - break; - } - return CDVDreadTrack(lsn, mode); + case CDVD_MODE_2352: + lastReadSize = 2352; + break; + case CDVD_MODE_2340: + lastReadSize = 2340; + break; + case CDVD_MODE_2328: + lastReadSize = 2328; + break; + case CDVD_MODE_2048: + lastReadSize = 2048; + break; } + + return CDVD.readTrack(lsn,mode); } // return can be NULL (for async modes) + s32 DoCDVDgetBuffer(u8* buffer) { - int ret; - - if(loadFromISO) - ret = ISOgetBuffer(buffer); - else - { - // TEMP: until I fix all the plugins to use this function style - u8* pb = CDVDgetBuffer(); - if(pb!=NULL) - { - memcpy(buffer,pb,psize); - ret=0; - } - else ret= -1; - } + int ret = CDVD.getBuffer2(buffer); if(ret==0) { @@ -445,49 +373,10 @@ s32 DoCDVDgetBuffer(u8* buffer) isoWriteBlock(blockDumpFile, buffer, plsn); } } + return ret; } -s32 DoCDVDreadSubQ(u32 lsn, cdvdSubQ* subq) -{ - if(loadFromISO) - return ISOreadSubQ(lsn,subq); - else - return CDVDreadSubQ(lsn,subq); -} - -s32 DoCDVDgetTN(cdvdTN *Buffer) -{ - if(loadFromISO) - return ISOgetTN(Buffer); - else - return CDVDgetTN(Buffer); -} - -s32 DoCDVDgetTD(u8 Track, cdvdTD *Buffer) -{ - if(loadFromISO) - return ISOgetTD(Track,Buffer); - else - return CDVDgetTD(Track,Buffer); -} - -s32 DoCDVDgetTOC(void* toc) -{ - if(loadFromISO) - return ISOgetTOC(toc); - else - return CDVDgetTOC(toc); -} - -s32 DoCDVDgetDiskType() -{ - if(loadFromISO) - return ISOgetDiskType(); - else - return CDVDgetDiskType(); -} - s32 DoCDVDdetectDiskType() { if(diskTypeCached<0) @@ -498,38 +387,5 @@ s32 DoCDVDdetectDiskType() void DoCDVDresetDiskTypeCache() { - diskTypeCached=-1; -} - -s32 DoCDVDgetTrayStatus() -{ - if(loadFromISO) - return ISOgetTrayStatus(); - else - return CDVDgetTrayStatus(); - -} - -s32 DoCDVDctrlTrayOpen() -{ - if(loadFromISO) - return ISOctrlTrayOpen(); - else - return CDVDctrlTrayOpen(); -} - -s32 DoCDVDctrlTrayClose() -{ - if(loadFromISO) - return ISOctrlTrayClose(); - else - return CDVDctrlTrayClose(); -} - -void DoCDVDnewDiskCB(void (*callback)()) -{ - if(!loadFromISO) - { - if (CDVDnewDiskCB) CDVDnewDiskCB(callback); - } + diskTypeCached = -1; } diff --git a/pcsx2/CDVD/CDVDaccess.h b/pcsx2/CDVD/CDVDaccess.h index de9abb692b..ff4124dae1 100644 --- a/pcsx2/CDVD/CDVDaccess.h +++ b/pcsx2/CDVD/CDVDaccess.h @@ -27,13 +27,6 @@ extern s32 DoCDVDreadSector(u8* buffer, u32 lsn, int mode); extern s32 DoCDVDreadTrack(u32 lsn, int mode); extern s32 DoCDVDgetBuffer(u8* buffer); extern s32 DoCDVDreadSubQ(u32 lsn, cdvdSubQ* subq); -extern s32 DoCDVDgetTN(cdvdTN *Buffer); -extern s32 DoCDVDgetTD(u8 Track, cdvdTD *Buffer); -extern s32 DoCDVDgetTOC(void* toc); -extern s32 DoCDVDgetDiskType(); -extern s32 DoCDVDgetTrayStatus(); -extern s32 DoCDVDctrlTrayOpen(); -extern s32 DoCDVDctrlTrayClose(); extern void DoCDVDnewDiskCB(void (*callback)()); extern s32 DoCDVDdetectDiskType(); extern void DoCDVDresetDiskTypeCache(); diff --git a/pcsx2/CDVD/CDVDisoReader.cpp b/pcsx2/CDVD/CDVDisoReader.cpp index 5a5b878c87..e6c56b6b94 100644 --- a/pcsx2/CDVD/CDVDisoReader.cpp +++ b/pcsx2/CDVD/CDVDisoReader.cpp @@ -27,14 +27,12 @@ #include "CDVDisoReader.h" -bool loadFromISO=false; - char isoFileName[256]; u8 *pbuffer; int cdtype; -int psize; +static int psize; isoFile *iso; @@ -78,8 +76,7 @@ void __Log(char *fmt, ...) #define __Log 0&& #endif - -s32 ISOinit() +s32 CALLBACK ISOinit() { #ifdef PCSX2_DEBUG cdvdLog = fopen("logs/cdvdLog.txt", "w"); @@ -99,14 +96,14 @@ s32 ISOinit() return 0; } -void ISOshutdown() +void CALLBACK ISOshutdown() { #ifdef CDVD_LOG if (cdvdLog != NULL) fclose(cdvdLog); #endif } -s32 ISOopen(const char* pTitle) +s32 CALLBACK ISOopen(const char* pTitle) { //if (pTitle != NULL) strcpy(isoFileName, pTitle); @@ -127,12 +124,12 @@ s32 ISOopen(const char* pTitle) return 0; } -void ISOclose() +void CALLBACK ISOclose() { isoClose(iso); } -s32 ISOreadSubQ(u32 lsn, cdvdSubQ* subq) +s32 CALLBACK ISOreadSubQ(u32 lsn, cdvdSubQ* subq) { // fake it u8 min, sec, frm; @@ -155,7 +152,7 @@ s32 ISOreadSubQ(u32 lsn, cdvdSubQ* subq) return 0; } -s32 ISOgetTN(cdvdTN *Buffer) +s32 CALLBACK ISOgetTN(cdvdTN *Buffer) { Buffer->strack = 1; Buffer->etrack = 1; @@ -163,7 +160,7 @@ s32 ISOgetTN(cdvdTN *Buffer) return 0; } -s32 ISOgetTD(u8 Track, cdvdTD *Buffer) +s32 CALLBACK ISOgetTD(u8 Track, cdvdTD *Buffer) { if (Track == 0) { @@ -209,7 +206,7 @@ static void FindLayer1Start() } } -s32 ISOgetDualInfo(s32* dualType, u32* _layer1start) +s32 CALLBACK ISOgetDualInfo(s32* dualType, u32* _layer1start) { FindLayer1Start(); @@ -226,9 +223,14 @@ s32 ISOgetDualInfo(s32* dualType, u32* _layer1start) return 1; } -s32 ISOgetTOC(void* toc) +s32 CALLBACK ISOgetDiskType() { - u8 type = CDVDgetDiskType(); + return cdtype; +} + +s32 CALLBACK ISOgetTOC(void* toc) +{ + u8 type = ISOgetDiskType(); u8* tocBuff = (u8*)toc; //__Log("CDVDgetTOC\n"); @@ -291,12 +293,12 @@ s32 ISOgetTOC(void* toc) cdvdTN diskInfo; cdvdTD trackInfo; memset(tocBuff, 0, 1024); - if (CDVDgetTN(&diskInfo) == -1) + if (ISOgetTN(&diskInfo) == -1) { diskInfo.etrack = 0; diskInfo.strack = 1; } - if (CDVDgetTD(0, &trackInfo) == -1) trackInfo.lsn = 0; + if (ISOgetTD(0, &trackInfo) == -1) trackInfo.lsn = 0; tocBuff[0] = 0x41; tocBuff[1] = 0x00; @@ -317,7 +319,7 @@ s32 ISOgetTOC(void* toc) for (i = diskInfo.strack; i <= diskInfo.etrack; i++) { - err = CDVDgetTD(i, &trackInfo); + err = ISOgetTD(i, &trackInfo); lba_to_msf(trackInfo.lsn, &min, &sec, &frm); tocBuff[i*10+30] = trackInfo.type; tocBuff[i*10+32] = err == -1 ? 0 : itob(i); //number @@ -332,7 +334,7 @@ s32 ISOgetTOC(void* toc) return 0; } -s32 ISOreadSector(u8* tempbuffer, u32 lsn, int mode) +s32 CALLBACK ISOreadSector(u8* tempbuffer, u32 lsn, int mode) { int _lsn = lsn; @@ -375,7 +377,7 @@ s32 ISOreadSector(u8* tempbuffer, u32 lsn, int mode) return 0; } -s32 ISOreadTrack(u32 lsn, int mode) +s32 CALLBACK ISOreadTrack(u32 lsn, int mode) { int _lsn = lsn; @@ -410,28 +412,63 @@ s32 ISOreadTrack(u32 lsn, int mode) return 0; } -s32 ISOgetBuffer(u8* buffer) +s32 CALLBACK ISOgetBuffer2(u8* buffer) { memcpy_fast(buffer,pbuffer,psize); return 0; } -s32 ISOgetDiskType() -{ - return cdtype; -} - -s32 ISOgetTrayStatus() +s32 CALLBACK ISOgetTrayStatus() { return CDVD_TRAY_CLOSE; } -s32 ISOctrlTrayOpen() +s32 CALLBACK ISOctrlTrayOpen() { return 0; } -s32 ISOctrlTrayClose() +s32 CALLBACK ISOctrlTrayClose() { return 0; } +s32 CALLBACK ISOdummyS32() +{ + return 0; +} + +void CALLBACK ISOdummyVOID() +{ +} + +void CALLBACK ISOnewDiskCB(void(CALLBACK*)()) +{ +} + +CDVDplugin ISO = { + ISOinit, + ISOopen, + ISOclose, + ISOshutdown, + ISOreadTrack, + NULL, // emu shouldn't try to use this one. + ISOreadSubQ, + ISOgetTN, + ISOgetTD, + ISOgetTOC, + ISOgetDiskType, + ISOdummyS32, + ISOdummyS32, + ISOdummyS32, + + ISOdummyVOID, + ISOdummyS32, + ISOdummyVOID, + ISOnewDiskCB, + + ISOreadSector, + ISOgetBuffer2, + ISOgetDualInfo, + + NULL +}; diff --git a/pcsx2/CDVD/CDVDisoReader.h b/pcsx2/CDVD/CDVDisoReader.h index d63185651c..863633c6a3 100644 --- a/pcsx2/CDVD/CDVDisoReader.h +++ b/pcsx2/CDVD/CDVDisoReader.h @@ -45,21 +45,4 @@ void __Log(char *fmt, ...); extern char isoFileName[256]; extern isoFile *iso; -extern s32 ISOinit(); -extern void ISOshutdown(); -extern s32 ISOopen(const char* pTitle); -extern void ISOclose(); -extern s32 ISOreadSubQ(u32 lsn, cdvdSubQ* subq); -extern s32 ISOgetTN(cdvdTN *Buffer); -extern s32 ISOgetTD(u8 tn, cdvdTD *Buffer); -extern s32 ISOgetDiskType(); -extern s32 ISOgetTrayStatus(); -extern s32 ISOctrlTrayOpen(); -extern s32 ISOctrlTrayClose(); -extern s32 ISOreadSector(u8* tempbuffer, u32 lsn, int mode); -extern s32 ISOgetTOC(void* toc); -extern s32 ISOreadTrack(u32 lsn, int mode); -extern s32 ISOgetBuffer(u8* buffer); -extern s32 ISOgetDualInfo(s32* dualType, u32* _layer1start); - #endif \ No newline at end of file diff --git a/pcsx2/CDVD/CdRom.cpp b/pcsx2/CDVD/CdRom.cpp index c5f2aa5959..bf2ce8d187 100644 --- a/pcsx2/CDVD/CdRom.cpp +++ b/pcsx2/CDVD/CdRom.cpp @@ -332,7 +332,7 @@ void cdrInterrupt() { SetResultSize(3); cdr.StatP|= 0x2; cdr.Result[0] = cdr.StatP; - if (DoCDVDgetTN(&cdr.ResultTN) == -1) { + if (CDVD.getTN(&cdr.ResultTN) == -1) { cdr.Stat = DiskError; cdr.Result[0]|= 0x01; } else { @@ -347,7 +347,7 @@ void cdrInterrupt() { cdr.Track = btoi(cdr.Param[0]); SetResultSize(4); cdr.StatP|= 0x2; - if (DoCDVDgetTD(cdr.Track, &trackInfo) == -1) { + if (CDVD.getTD(cdr.Track, &trackInfo) == -1) { cdr.Stat = DiskError; cdr.Result[0]|= 0x01; } else { diff --git a/pcsx2/Linux/LnxMain.cpp b/pcsx2/Linux/LnxMain.cpp index 847110a13c..08a587e8da 100644 --- a/pcsx2/Linux/LnxMain.cpp +++ b/pcsx2/Linux/LnxMain.cpp @@ -335,7 +335,7 @@ void OnLanguage(GtkMenuItem *menuitem, gpointer user_data) void OnFile_RunCD(GtkMenuItem *menuitem, gpointer user_data) { - loadFromISO = false; + CDVD = CDVD_plugin; SysReset(); SysPrepareExecution(NULL); } @@ -343,7 +343,7 @@ void OnFile_RunCD(GtkMenuItem *menuitem, gpointer user_data) void OnRunIso_Ok(GtkButton* button, gpointer user_data) { gchar *File; - loadFromISO = true; + CDVD = ISO; File = (gchar*)gtk_file_selection_get_filename(GTK_FILE_SELECTION(FileSel)); strcpy(isoFileName, File); diff --git a/pcsx2/Plugins.cpp b/pcsx2/Plugins.cpp index e691ca8d5e..88afb69f62 100644 --- a/pcsx2/Plugins.cpp +++ b/pcsx2/Plugins.cpp @@ -138,25 +138,8 @@ _SPU2test SPU2test; _SPU2about SPU2about; // CDVD -_CDVDinit CDVDinit; -_CDVDopen CDVDopen; -_CDVDclose CDVDclose; -_CDVDshutdown CDVDshutdown; -_CDVDreadTrack CDVDreadTrack; -_CDVDgetBuffer CDVDgetBuffer; -_CDVDreadSubQ CDVDreadSubQ; -_CDVDgetTN CDVDgetTN; -_CDVDgetTD CDVDgetTD; -_CDVDgetTOC CDVDgetTOC; -_CDVDgetDiskType CDVDgetDiskType; -_CDVDgetTrayStatus CDVDgetTrayStatus; -_CDVDctrlTrayOpen CDVDctrlTrayOpen; -_CDVDctrlTrayClose CDVDctrlTrayClose; - -_CDVDconfigure CDVDconfigure; -_CDVDtest CDVDtest; -_CDVDabout CDVDabout; -_CDVDnewDiskCB CDVDnewDiskCB; +CDVDplugin CDVD_plugin = {0}; +CDVDplugin CDVD = {0}; // DEV9 _DEV9init DEV9init; @@ -218,18 +201,21 @@ _FWabout FWabout; DEV9handler dev9Handler; USBhandler usbHandler; -enum PluginTypes +namespace PluginTypes { - GS = 0, - PAD, - PAD1, - PAD2, - SPU2, - CDVD, - DEV9, - USB, - FW -}; + enum PluginTypes + { + GS = 0, + PAD, + PAD1, + PAD2, + SPU2, + CDVD, + DEV9, + USB, + FW + }; +} int PS2E_LT[9] = { PS2E_LT_GS, @@ -265,6 +251,10 @@ PS2E_FW_VERSION}; #define MapSymbol_Fallback(name,fallback) MapSymbolVar_Fallback(name,name,fallback) #define MapSymbol_Error(name) MapSymbolVar_Error(name,name) +#define MapSymbol2(base,name) MapSymbolVar(base##_plugin.name,base##name) +#define MapSymbol2_Fallback(base,name,fallback) MapSymbolVar_Fallback(base##_plugin.name,base##name,fallback) +#define MapSymbol2_Error(base,name) MapSymbolVar_Error(base##_plugin.name,base##name) + // for pad1/2 #define MapSymbolPAD(var,name) MapSymbolVar(var##name,PAD##name) #define MapSymbolPAD_Fallback(var,name) if((MapSymbolVarType(var##name,_PAD##name,PAD##name))==NULL) var##name = var##_##name @@ -292,7 +282,7 @@ static int _TestPS2Esyms(void* drv, int type, int expected_version, const string return 0; } -static __forceinline bool TestPS2Esyms(void* &drv, PluginTypes type, const string& filename) +static __forceinline bool TestPS2Esyms(void* &drv, PluginTypes::PluginTypes type, const string& filename) { if (_TestPS2Esyms(drv, PS2E_LT[type],PS2E_VERSION[type],filename) < 0) return false; return true; @@ -324,7 +314,7 @@ int LoadGSplugin(const string& filename) GSplugin = SysLoadLibrary(filename.c_str()); if (GSplugin == NULL) { Msgbox::Alert ("Could Not Load GS Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = GSplugin; - if (!TestPS2Esyms(drv, GS, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::GS, filename)) return -1; MapSymbol_Error(GSinit); MapSymbol_Error(GSshutdown); MapSymbol_Error(GSopen); @@ -379,7 +369,7 @@ int LoadPAD1plugin(const string& filename) { PAD1plugin = SysLoadLibrary(filename.c_str()); if (PAD1plugin == NULL) { Msgbox::Alert("Could Not Load PAD1 Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = PAD1plugin; - if (!TestPS2Esyms(drv, PAD, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::PAD, filename)) return -1; MapSymbolPAD_Error(PAD1,init); MapSymbolPAD_Error(PAD1,shutdown); MapSymbolPAD_Error(PAD1,open); @@ -416,7 +406,7 @@ int LoadPAD2plugin(const string& filename) { PAD2plugin = SysLoadLibrary(filename.c_str()); if (PAD2plugin == NULL) { Msgbox::Alert("Could Not Load PAD2 Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = PAD2plugin; - if (!TestPS2Esyms(drv, PAD, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::PAD, filename)) return -1; MapSymbolPAD_Error(PAD2,init); MapSymbolPAD_Error(PAD2,shutdown); MapSymbolPAD_Error(PAD2,open); @@ -451,7 +441,7 @@ int LoadSPU2plugin(const string& filename) { SPU2plugin = SysLoadLibrary(filename.c_str()); if (SPU2plugin == NULL) { Msgbox::Alert("Could Not Load SPU2 Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = SPU2plugin; - if (!TestPS2Esyms(drv, SPU2, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::SPU2, filename)) return -1; MapSymbol_Error(SPU2init); MapSymbol_Error(SPU2shutdown); MapSymbol_Error(SPU2open); @@ -489,32 +479,119 @@ void CALLBACK CDVD_about() {} s32 CALLBACK CDVD_test() { return 0; } void CALLBACK CDVD_newDiskCB(void (*callback)()) {} +s32 CALLBACK CDVD_getBuffer2(u8* buffer) +{ + int ret; + + extern int lastReadSize; + + // TEMP: until I fix all the plugins to use this function style + u8* pb = CDVD.getBuffer(); + if(pb!=NULL) + { + memcpy(buffer,pb,lastReadSize); + ret=0; + } + else ret= -1; + + return ret; +} + + +s32 CALLBACK CDVD_readSector(u8* buffer, u32 lsn, int mode) +{ + int ret; + + CDVD.readTrack(lsn,mode); + void* pbuffer = CDVD.getBuffer(); + if(pbuffer!=NULL) + { + switch(mode) + { + case CDVD_MODE_2048: + memcpy(buffer,pbuffer,2048); + break; + case CDVD_MODE_2328: + memcpy(buffer,pbuffer,2328); + break; + case CDVD_MODE_2340: + memcpy(buffer,pbuffer,2340); + break; + case CDVD_MODE_2352: + memcpy(buffer,pbuffer,2352); + break; + } + ret = 0; + } + else ret = -1; + + return ret; +} + +s32 CALLBACK CDVD_getDualInfo(s32* dualType, u32* layer1Start) +{ + u8 toc[2064]; + + // if error getting toc, settle for single layer disc ;) + if(CDVD.getTOC(toc)) + return 0; + if(toc[14] & 0x60) + { + if(toc[14] & 0x10) + { + // otp dvd + *dualType = 2; + *layer1Start = (toc[25]<<16) + (toc[26]<<8) + (toc[27]) - 0x30000 + 1; + } + else + { + // ptp dvd + *dualType = 1; + *layer1Start = (toc[21]<<16) + (toc[22]<<8) + (toc[23]) - 0x30000 + 1; + } + } + else + { + // single layer dvd + *dualType = 0; + *layer1Start = (toc[21]<<16) + (toc[22]<<8) + (toc[23]) - 0x30000 + 1; + } +} + +int cdvdInitCount; int LoadCDVDplugin(const string& filename) { void *drv; CDVDplugin = SysLoadLibrary(filename.c_str()); if (CDVDplugin == NULL) { Msgbox::Alert("Could Not Load CDVD Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = CDVDplugin; - if (!TestPS2Esyms(drv, CDVD, filename)) return -1; - MapSymbol_Error(CDVDinit); - MapSymbol_Error(CDVDshutdown); - MapSymbol_Error(CDVDopen); - MapSymbol_Error(CDVDclose); - MapSymbol_Error(CDVDreadTrack); - MapSymbol_Error(CDVDgetBuffer); - MapSymbol_Error(CDVDreadSubQ); - MapSymbol_Error(CDVDgetTN); - MapSymbol_Error(CDVDgetTD); - MapSymbol_Error(CDVDgetTOC); - MapSymbol_Error(CDVDgetDiskType); - MapSymbol_Error(CDVDgetTrayStatus); - MapSymbol_Error(CDVDctrlTrayOpen); - MapSymbol_Error(CDVDctrlTrayClose); + if (!TestPS2Esyms(drv, PluginTypes::CDVD, filename)) return -1; + MapSymbol2_Error(CDVD,init); + MapSymbol2_Error(CDVD,shutdown); + MapSymbol2_Error(CDVD,open); + MapSymbol2_Error(CDVD,close); + MapSymbol2_Error(CDVD,readTrack); + MapSymbol2_Error(CDVD,getBuffer); + MapSymbol2_Error(CDVD,readSubQ); + MapSymbol2_Error(CDVD,getTN); + MapSymbol2_Error(CDVD,getTD); + MapSymbol2_Error(CDVD,getTOC); + MapSymbol2_Error(CDVD,getDiskType); + MapSymbol2_Error(CDVD,getTrayStatus); + MapSymbol2_Error(CDVD,ctrlTrayOpen); + MapSymbol2_Error(CDVD,ctrlTrayClose); - MapSymbol_Fallback(CDVDconfigure,CDVD_configure); - MapSymbol_Fallback(CDVDabout,CDVD_about); - MapSymbol_Fallback(CDVDtest,CDVD_test); - MapSymbol(CDVDnewDiskCB); + MapSymbol2_Fallback(CDVD,configure,CDVD_configure); + MapSymbol2_Fallback(CDVD,about,CDVD_about); + MapSymbol2_Fallback(CDVD,test,CDVD_test); + MapSymbol2_Fallback(CDVD,newDiskCB,CDVD_newDiskCB); + + MapSymbol2_Fallback(CDVD,readSector,CDVD_readSector); + MapSymbol2_Fallback(CDVD,getBuffer2,CDVD_getBuffer2); + MapSymbol2_Fallback(CDVD,getDualInfo,CDVD_getDualInfo); + + CDVD.initCount = &cdvdInitCount; + cdvdInitCount=0; return 0; } @@ -532,7 +609,7 @@ int LoadDEV9plugin(const string& filename) { DEV9plugin = SysLoadLibrary(filename.c_str()); if (DEV9plugin == NULL) { Msgbox::Alert("Could Not Load DEV9 Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = DEV9plugin; - if (!TestPS2Esyms(drv, DEV9, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::DEV9, filename)) return -1; MapSymbol_Error(DEV9init); MapSymbol_Error(DEV9shutdown); MapSymbol_Error(DEV9open); @@ -569,7 +646,7 @@ int LoadUSBplugin(const string& filename) { USBplugin = SysLoadLibrary(filename.c_str()); if (USBplugin == NULL) { Msgbox::Alert("Could Not Load USB Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = USBplugin; - if (!TestPS2Esyms(drv, USB, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::USB, filename)) return -1; MapSymbol_Error(USBinit); MapSymbol_Error(USBshutdown); MapSymbol_Error(USBopen); @@ -606,7 +683,7 @@ int LoadFWplugin(const string& filename) { FWplugin = SysLoadLibrary(filename.c_str()); if (FWplugin == NULL) { Msgbox::Alert("Could Not Load FW Plugin '%hs': %s", params &filename, SysLibError()); return -1; } drv = FWplugin; - if (!TestPS2Esyms(drv, FW, filename)) return -1; + if (!TestPS2Esyms(drv, PluginTypes::FW, filename)) return -1; MapSymbol_Error(FWinit); MapSymbol_Error(FWshutdown); MapSymbol_Error(FWopen); @@ -721,6 +798,10 @@ void ShutdownPlugins() //if (CDVDshutdown != NULL) CDVDshutdown(); DoCDVDshutdown(); + + // safety measures, in case ISO is currently loaded. + if(cdvdInitCount>0) + CDVD_plugin.shutdown(); if (DEV9shutdown != NULL) DEV9shutdown(); if (USBshutdown != NULL) USBshutdown(); @@ -764,9 +845,9 @@ bool OpenCDVD(const char* pTitleFilename) if (!OpenStatus.CDVD && !only_loading_elf) { //First, we need the data. - DoCDVDnewDiskCB(cdvdNewDiskCB); + CDVD.newDiskCB(cdvdNewDiskCB); - if (DoCDVDopen(pTitleFilename) != 0) + if (CDVD.open(pTitleFilename) != 0) { if (g_Startup.BootMode != BootMode_Elf) { @@ -904,6 +985,12 @@ int OpenPlugins(const char* pTitleFilename) OpenStatus.name = false; \ } +#define CLOSE_PLUGIN2( name ) \ + if( OpenStatus.name ) { \ + name.close(); \ + OpenStatus.name = false; \ + } + void ClosePlugins( bool closegs ) { @@ -929,12 +1016,7 @@ void ClosePlugins( bool closegs ) } } - //CLOSE_PLUGIN( CDVD ); - if( OpenStatus.CDVD ) - { - DoCDVDclose(); - OpenStatus.CDVD = false; - } + CLOSE_PLUGIN2( CDVD ); CLOSE_PLUGIN( DEV9 ); CLOSE_PLUGIN( USB ); diff --git a/pcsx2/System.cpp b/pcsx2/System.cpp index eff13a3209..4907f3a3ee 100644 --- a/pcsx2/System.cpp +++ b/pcsx2/System.cpp @@ -388,6 +388,10 @@ void SysEndExecution() // use_bios - forces the game to boot through the PS2 bios, instead of bypassing it. void SysPrepareExecution( const char* elf_file, bool use_bios ) { + // solve a little crash + if(CDVD.init == NULL) + CDVD = CDVD_plugin; + if( !g_EmulationInProgress ) { try diff --git a/pcsx2/windows/WinMain.cpp b/pcsx2/windows/WinMain.cpp index 746b288adf..2be2bdb3b9 100644 --- a/pcsx2/windows/WinMain.cpp +++ b/pcsx2/windows/WinMain.cpp @@ -676,7 +676,7 @@ LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) string outstr; if( Open_Iso_File_Proc( outstr ) ) { - loadFromISO = true; + CDVD = ISO; strcpy(isoFileName,outstr.c_str()); @@ -693,7 +693,7 @@ LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case ID_FILE_RUNCD: - loadFromISO = false; + CDVD = CDVD_plugin; SysReset(); SysPrepareExecution( NULL ); break; @@ -738,7 +738,7 @@ LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case ID_CONFIG_CDVDROM: - if (CDVDconfigure) CDVDconfigure(); + if (CDVD.configure) CDVD.configure(); break; case ID_CONFIG_DEV9: