From a58cfdac407bc1d8fedc11acd924b275ba28cc51 Mon Sep 17 00:00:00 2001 From: "SND\\dario86_cp" Date: Sat, 12 Mar 2011 18:54:28 +0000 Subject: Commited patch in issue #8171 (by darktjm). git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@64524 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/cdriso.c | 215 +++-- libpcsxcore/cdriso.h | 8 + libpcsxcore/cdrom.c | 1509 +++++++++++++++--------------- libpcsxcore/cdrom.h | 21 +- libpcsxcore/debug.c | 12 +- libpcsxcore/decode_xa.c | 2 +- libpcsxcore/disr3000a.c | 674 +++++++------- libpcsxcore/ix86/iR3000A.c | 17 +- libpcsxcore/ix86/ix86.c | 2 +- libpcsxcore/ix86_64/iR3000A-64.c | 31 +- libpcsxcore/ix86_64/ix86-64.c | 16 +- libpcsxcore/ix86_64/ix86-64.h | 22 +- libpcsxcore/ix86_64/ix86_cpudetect.c | 984 ++++++++++---------- libpcsxcore/ix86_64/ix86_mmx.c | 3 +- libpcsxcore/ix86_64/ix86_sse.c | 34 - libpcsxcore/mdec.c | 28 +- libpcsxcore/misc.c | 84 +- libpcsxcore/plugin_common.h | 99 ++ libpcsxcore/plugins.c | 1701 +++++++++++++++++----------------- libpcsxcore/plugins.h | 649 +++++-------- libpcsxcore/ppc/pR3000A.c | 13 +- libpcsxcore/ppf.c | 57 +- libpcsxcore/psemu_plugin_defs.h | 175 ++++ libpcsxcore/psxbios.c | 236 ++--- libpcsxcore/psxbios.h | 6 +- libpcsxcore/psxcommon.h | 1 + libpcsxcore/psxcounters.c | 6 +- libpcsxcore/psxinterpreter.c | 380 ++++---- libpcsxcore/psxmem.c | 28 +- libpcsxcore/psxmem.h | 134 +-- libpcsxcore/r3000a.h | 117 +++ libpcsxcore/sio.c | 225 ++--- libpcsxcore/socket.c | 2 +- 33 files changed, 3873 insertions(+), 3618 deletions(-) create mode 100644 libpcsxcore/plugin_common.h (limited to 'libpcsxcore') diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index 4a4982c7..4ecf5eee 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -44,12 +44,12 @@ static unsigned char subbuffer[SUB_FRAMESIZE]; static unsigned char sndbuffer[CD_FRAMESIZE_RAW * 10]; #define CDDA_FRAMETIME (1000 * (sizeof(sndbuffer) / CD_FRAMESIZE_RAW) / 75) - - -#define MODE1_DATA_SIZE 2048 - -static boolean isMode1ISO = FALSE; - + + +#define MODE1_DATA_SIZE 2048 + +static boolean isMode1ISO = FALSE; + #ifdef _WIN32 static HANDLE threadid; @@ -61,15 +61,6 @@ static volatile boolean playing = FALSE; static boolean cddaBigEndian = FALSE; static volatile unsigned int cddaCurOffset = 0; -char* CALLBACK CDR__getDriveLetter(void); -long CALLBACK CDR__configure(void); -long CALLBACK CDR__test(void); -void CALLBACK CDR__about(void); -long CALLBACK CDR__setfilename(char *filename); -long CALLBACK CDR__getStatus(struct CdrStat *stat); - -extern void *hCDRDriver; - struct trackinfo { enum {DATA=1, CDDA} type; u8 start[3]; // MSF-format @@ -82,11 +73,11 @@ static int numtracks = 0; static struct trackinfo ti[MAXTRACKS]; // get a sector from a msf-array -unsigned int msf2sec(char *msf) { +unsigned int msf2sec(u8 *msf) { return ((msf[0] * 60 + msf[1]) * 75) + msf[2]; } -void sec2msf(unsigned int s, char *msf) { +void sec2msf(unsigned int s, u8 *msf) { msf[0] = s / 75 / 60; s = s - msf[0] * 75 * 60; msf[1] = s / 75; @@ -95,7 +86,7 @@ void sec2msf(unsigned int s, char *msf) { } // divide a string of xx:yy:zz into m, s, f -static void tok2msf(char *time, char *msf) { +static void tok2msf(char *time, u8 *msf) { char *token; token = strtok(time, ":"); @@ -187,7 +178,8 @@ static void *playthread(void *param) s += d; - fread( subbuffer, 1, SUB_FRAMESIZE, cddaHandle ); + if(fread( subbuffer, SUB_FRAMESIZE, 1, cddaHandle ) != 1) + perror("cdr sub read"); } } else { @@ -195,9 +187,10 @@ static void *playthread(void *param) sec = cddaCurOffset / CD_FRAMESIZE_RAW; - if (subHandle != NULL) { - fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET); - fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); + if (s && subHandle != NULL) { + if(fseek(subHandle, sec * SUB_FRAMESIZE, SEEK_SET) < 0 || + fread(subbuffer, SUB_FRAMESIZE, 1, subHandle) != 1) + perror("cdr sub read"); } } @@ -269,7 +262,7 @@ static void *playthread(void *param) // Vib Ribbon: decoded buffer IRQ - iso_play_cdbuf = sndbuffer; + iso_play_cdbuf = (u16 *)sndbuffer; iso_play_bufptr = 0; } @@ -406,21 +399,21 @@ static int parsetoc(const char *isofile) { sscanf(linebuf, "DATAFILE \"%[^\"]\" #%d %8s", name, &t, time2); t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0); t += 2 * 75; - sec2msf(t, (char *)&ti[numtracks].start); - tok2msf((char *)&time2, (char *)&ti[numtracks].length); + sec2msf(t, (u8 *)&ti[numtracks].start); + tok2msf((char *)&time2, (u8 *)&ti[numtracks].length); } else { sscanf(linebuf, "DATAFILE \"%[^\"]\" %8s", name, time); - tok2msf((char *)&time, (char *)&ti[numtracks].length); + tok2msf((char *)&time, (u8 *)&ti[numtracks].length); } } else if (!strcmp(token, "FILE")) { sscanf(linebuf, "FILE \"%[^\"]\" #%d %8s %8s", name, &t, time, time2); - tok2msf((char *)&time, (char *)&ti[numtracks].start); + tok2msf((char *)&time, (u8 *)&ti[numtracks].start); t /= CD_FRAMESIZE_RAW + (subChanMixed ? SUB_FRAMESIZE : 0); - t += msf2sec(ti[numtracks].start) + 2 * 75; - sec2msf(t, (char *)&ti[numtracks].start); - tok2msf((char *)&time2, (char *)&ti[numtracks].length); + t += msf2sec((u8 *)&ti[numtracks].start) + 2 * 75; + sec2msf(t, (u8 *)&ti[numtracks].start); + tok2msf((char *)&time2, (u8 *)&ti[numtracks].length); } } @@ -497,10 +490,10 @@ static int parsecue(const char *isofile) { if (*tmp != '\n') sscanf(tmp, "%8s", time); } - tok2msf((char *)&time, (char *)&ti[numtracks].start); + tok2msf((char *)&time, (u8 *)&ti[numtracks].start); - t = msf2sec(ti[numtracks].start) + 2 * 75; - sec2msf(t, ti[numtracks].start); + t = msf2sec((u8 *)&ti[numtracks].start) + 2 * 75; + sec2msf(t, (u8 *)&ti[numtracks].start); // If we've already seen another track, this is its end if (numtracks > 1) { @@ -607,29 +600,37 @@ static int parsemds(const char *isofile) { memset(&ti, 0, sizeof(ti)); // check if it's a valid mds file - fread(&i, 1, sizeof(unsigned int), fi); - i = SWAP32(i); - if (i != 0x4944454D) { + if(fread(&i, sizeof(unsigned int), 1, fi) != 1 || + SWAP32(i) != 0x4944454D) { // not an valid mds file fclose(fi); return -1; } // get offset to session block - fseek(fi, 0x50, SEEK_SET); - fread(&offset, 1, sizeof(unsigned int), fi); + if(fseek(fi, 0x50, SEEK_SET) < 0 || + fread(&offset, sizeof(unsigned int), 1, fi) != 1) { + fclose(fi); + return -1; + } offset = SWAP32(offset); // get total number of tracks offset += 14; - fseek(fi, offset, SEEK_SET); - fread(&s, 1, sizeof(unsigned short), fi); + if(fseek(fi, offset, SEEK_SET) < 0 || + fread(&s, sizeof(unsigned short), 1, fi) != 1) { + fclose(fi); + return -1; + } s = SWAP16(s); numtracks = s; // get offset to track blocks - fseek(fi, 4, SEEK_CUR); - fread(&offset, 1, sizeof(unsigned int), fi); + if(fseek(fi, 4, SEEK_CUR) < 0 || + fread(&offset, sizeof(unsigned int), 1, fi) != 1) { + fclose(fi); + return -1; + } offset = SWAP32(offset); // skip lead-in data @@ -664,11 +665,17 @@ static int parsemds(const char *isofile) { } // get the track length - fread(&extra_offset, 1, sizeof(unsigned int), fi); + if(fread(&extra_offset, sizeof(unsigned int), 1, fi) != 1) { + fclose(fi); + return -1; + } extra_offset = SWAP32(extra_offset); - fseek(fi, extra_offset + 4, SEEK_SET); - fread(&l, 1, sizeof(unsigned int), fi); + if(fseek(fi, extra_offset + 4, SEEK_SET) < 0 || + fread(&l, sizeof(unsigned int), 1, fi)) { + fclose(fi); + return -1; + } l = SWAP32(l); sec2msf(l, ti[i].length); @@ -735,8 +742,8 @@ static void PrintTracks(void) { // This function is invoked by the front-end when opening an ISO // file for playback static long CALLBACK ISOopen(void) { - u32 modeTest = 0; - + u32 modeTest = 0; + if (cdHandle != NULL) { return 0; // it's already open } @@ -750,7 +757,7 @@ static long CALLBACK ISOopen(void) { cddaBigEndian = FALSE; subChanMixed = FALSE; - subChanRaw = FALSE; + subChanRaw = FALSE; isMode1ISO = FALSE; if (parseccd(GetIsoFile()) == 0) { @@ -764,21 +771,21 @@ static long CALLBACK ISOopen(void) { } else if (parsetoc(GetIsoFile()) == 0) { SysPrintf("[+toc]"); - } else { - //guess whether it is mode1/2048 - fseek(cdHandle, 0, SEEK_END); - if(ftell(cdHandle) % 2048 == 0) { - fseek(cdHandle, 0, SEEK_SET); - fread(&modeTest, 4, 1, cdHandle); - if(SWAP32(modeTest)!=0xffffff00) isMode1ISO = TRUE; - } - fseek(cdHandle, 0, SEEK_SET); - } + } else { + //guess whether it is mode1/2048 + fseek(cdHandle, 0, SEEK_END); + if(ftell(cdHandle) % 2048 == 0) { + if(fseek(cdHandle, 0, SEEK_SET) >= 0 && + fread(&modeTest, 4, 1, cdHandle) == 1 && + SWAP32(modeTest)!=0xffffff00) isMode1ISO = TRUE; + } + fseek(cdHandle, 0, SEEK_SET); + } if (!subChanMixed && opensubfile(GetIsoFile()) == 0) { SysPrintf("[+sub]"); } - + SysPrintf(".\n"); PrintTracks(); @@ -880,29 +887,33 @@ static long CALLBACK ISOreadTrack(unsigned char *time) { } if (subChanMixed) { - fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET); - fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle); - fread(subbuffer, 1, SUB_FRAMESIZE, cdHandle); + if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * (CD_FRAMESIZE_RAW + SUB_FRAMESIZE), SEEK_SET) < 0 || + fread(cdbuffer, CD_FRAMESIZE_RAW, 1, cdHandle) != 1 || + fread(subbuffer, SUB_FRAMESIZE, 1, cdHandle) != 1) + return -1; if (subChanRaw) DecodeRawSubData(); } - else { - if(isMode1ISO) { - fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * MODE1_DATA_SIZE, SEEK_SET); - fread(cdbuffer + 12, 1, MODE1_DATA_SIZE, cdHandle); - memset(cdbuffer, 0, 12); //not really necessary, fake mode 2 header - cdbuffer[0] = (time[0]); - cdbuffer[1] = (time[1]); - cdbuffer[2] = (time[2]); - cdbuffer[3] = 1; //mode 1 + else { + if(isMode1ISO) { + if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * MODE1_DATA_SIZE, SEEK_SET) < 0 || + fread(cdbuffer + 12, MODE1_DATA_SIZE, 1, cdHandle) != 1) + return -1; + memset(cdbuffer, 0, 12); //not really necessary, fake mode 2 header + cdbuffer[0] = (time[0]); + cdbuffer[1] = (time[1]); + cdbuffer[2] = (time[2]); + cdbuffer[3] = 1; //mode 1 } else { - fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW, SEEK_SET); - fread(cdbuffer, 1, CD_FRAMESIZE_RAW, cdHandle); + if(fseek(cdHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * CD_FRAMESIZE_RAW, SEEK_SET) < 0 || + fread(cdbuffer, CD_FRAMESIZE_RAW, 1, cdHandle) != 1) + return -1; } if (subHandle != NULL) { - fseek(subHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * SUB_FRAMESIZE, SEEK_SET); - fread(subbuffer, 1, SUB_FRAMESIZE, subHandle); + if(fseek(subHandle, MSF2SECT(btoi(time[0]), btoi(time[1]), btoi(time[2])) * SUB_FRAMESIZE, SEEK_SET) < 0 || + fread(subbuffer, SUB_FRAMESIZE, 1, subHandle) != 1) + return -1; if (subChanRaw) DecodeRawSubData(); } @@ -963,37 +974,37 @@ static long CALLBACK ISOgetStatus(struct CdrStat *stat) { stat->Type = ti[1].type; return 0; -} - -// read CDDA sector into buffer -long CALLBACK ISOreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) { - unsigned char msf[3] = {m, s, f}; - unsigned char *p; - - msf[0] = itob(msf[0]); - msf[1] = itob(msf[1]); - msf[2] = itob(msf[2]); - - if (ISOreadTrack(msf) != 0) return -1; - - p = ISOgetBuffer(); - if (p == NULL) return -1; - - memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector - - if (cddaBigEndian) { - int i; - unsigned char tmp; - +} + +// read CDDA sector into buffer +static long CALLBACK ISOreadCDDA(unsigned char m, unsigned char s, unsigned char f, unsigned char *buffer) { + unsigned char msf[3] = {m, s, f}; + unsigned char *p; + + msf[0] = itob(msf[0]); + msf[1] = itob(msf[1]); + msf[2] = itob(msf[2]); + + if (ISOreadTrack(msf) != 0) return -1; + + p = ISOgetBuffer(); + if (p == NULL) return -1; + + memcpy(buffer, p - 12, CD_FRAMESIZE_RAW); // copy from the beginning of the sector + + if (cddaBigEndian) { + int i; + unsigned char tmp; + for (i = 0; i < CD_FRAMESIZE_RAW / 2; i++) { tmp = buffer[i * 2]; buffer[i * 2] = buffer[i * 2 + 1]; buffer[i * 2 + 1] = tmp; } - } - - return 0; -} + } + + return 0; +} void cdrIsoInit(void) { CDR_init = ISOinit; @@ -1008,7 +1019,7 @@ void cdrIsoInit(void) { CDR_stop = ISOstop; CDR_getBufferSub = ISOgetBufferSub; CDR_getStatus = ISOgetStatus; - CDR_readCDDA = ISOreadCDDA; + CDR_readCDDA = ISOreadCDDA; CDR_getDriveLetter = CDR__getDriveLetter; CDR_configure = CDR__configure; diff --git a/libpcsxcore/cdriso.h b/libpcsxcore/cdriso.h index 27d1ecd0..dfa863d9 100644 --- a/libpcsxcore/cdriso.h +++ b/libpcsxcore/cdriso.h @@ -28,6 +28,14 @@ extern "C" { void cdrIsoInit(void); int cdrIsoActive(void); +unsigned int msf2sec(u8 *msf); +void sec2msf(unsigned int s, u8 *msf); + +extern u16 *iso_play_cdbuf; +extern u16 iso_play_bufptr; + +long CALLBACK ISOinit(void); + #ifdef __cplusplus } #endif diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index b49d0358..4be39d22 100644 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -22,8 +22,10 @@ */ #include "cdrom.h" +#include "cdriso.h" #include "ppf.h" #include "psxdma.h" +#include "spu.h" cdrStruct cdr; @@ -91,29 +93,29 @@ unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 }; #define Acknowledge 3 #define DataEnd 4 #define DiskError 5 - -/* Modes flags */ -#define MODE_SPEED (1<<7) // 0x80 -#define MODE_STRSND (1<<6) // 0x40 ADPCM on/off -#define MODE_SIZE_2340 (1<<5) // 0x20 -#define MODE_SIZE_2328 (1<<4) // 0x10 -#define MODE_SIZE_2048 (0<<4) // 0x00 -#define MODE_SF (1<<3) // 0x08 channel on/off -#define MODE_REPORT (1<<2) // 0x04 -#define MODE_AUTOPAUSE (1<<1) // 0x02 -#define MODE_CDDA (1<<0) // 0x01 - -/* Status flags */ -#define STATUS_PLAY (1<<7) // 0x80 -#define STATUS_SEEK (1<<6) // 0x40 -#define STATUS_READ (1<<5) // 0x20 -#define STATUS_SHELLOPEN (1<<4) // 0x10 -#define STATUS_UNKNOWN3 (1<<3) // 0x08 -#define STATUS_UNKNOWN2 (1<<2) // 0x04 -#define STATUS_ROTATING (1<<1) // 0x02 -#define STATUS_ERROR (1<<0) // 0x01 - - + +/* Modes flags */ +#define MODE_SPEED (1<<7) // 0x80 +#define MODE_STRSND (1<<6) // 0x40 ADPCM on/off +#define MODE_SIZE_2340 (1<<5) // 0x20 +#define MODE_SIZE_2328 (1<<4) // 0x10 +#define MODE_SIZE_2048 (0<<4) // 0x00 +#define MODE_SF (1<<3) // 0x08 channel on/off +#define MODE_REPORT (1<<2) // 0x04 +#define MODE_AUTOPAUSE (1<<1) // 0x02 +#define MODE_CDDA (1<<0) // 0x01 + +/* Status flags */ +#define STATUS_PLAY (1<<7) // 0x80 +#define STATUS_SEEK (1<<6) // 0x40 +#define STATUS_READ (1<<5) // 0x20 +#define STATUS_SHELLOPEN (1<<4) // 0x10 +#define STATUS_UNKNOWN3 (1<<3) // 0x08 +#define STATUS_UNKNOWN2 (1<<2) // 0x04 +#define STATUS_ROTATING (1<<1) // 0x02 +#define STATUS_ERROR (1<<0) // 0x01 + + // 1x = 75 sectors per second // PSXCLK = 1 sec in the ps @@ -122,21 +124,12 @@ unsigned char Test23[] = { 0x43, 0x58, 0x44, 0x32, 0x39 ,0x34, 0x30, 0x51 }; static struct CdrStat stat; static struct SubQ *subq; - - -extern unsigned int msf2sec(char *msf); -extern void sec2msf(unsigned int s, char *msf); - - -extern u16 *iso_play_cdbuf; -extern u16 iso_play_bufptr; -extern long CALLBACK ISOinit(void); -extern void CALLBACK SPUirq(void); -extern SPUregisterCallback SPU_registerCallback; +#ifndef H_SPUirqAddr #define H_SPUirqAddr 0x1f801da4 #define H_SPUaddr 0x1f801da6 #define H_SPUctrl 0x1f801daa +#endif #define H_CDLeft 0x1f801db0 #define H_CDRight 0x1f801db2 @@ -165,12 +158,12 @@ extern SPUregisterCallback SPU_registerCallback; psxRegs.intCycle[PSXINT_CDRLID].sCycle = psxRegs.cycle; \ } -#define CDRPLAY_INT(eCycle) { \ - psxRegs.interrupt |= (1 << PSXINT_CDRPLAY); \ - psxRegs.intCycle[PSXINT_CDRPLAY].cycle = eCycle; \ - psxRegs.intCycle[PSXINT_CDRPLAY].sCycle = psxRegs.cycle; \ -} - +#define CDRPLAY_INT(eCycle) { \ + psxRegs.interrupt |= (1 << PSXINT_CDRPLAY); \ + psxRegs.intCycle[PSXINT_CDRPLAY].cycle = eCycle; \ + psxRegs.intCycle[PSXINT_CDRPLAY].sCycle = psxRegs.cycle; \ +} + #define StartReading(type, eCycle) { \ cdr.Reading = type; \ cdr.FirstSector = 1; \ @@ -193,7 +186,7 @@ extern SPUregisterCallback SPU_registerCallback; cdr.Play = FALSE; \ cdr.FastForward = 0; \ cdr.FastBackward = 0; \ - SPU_registerCallback( SPUirq ); \ + SPU_registerCallback( SPUirq ); \ } \ } @@ -206,11 +199,11 @@ extern SPUregisterCallback SPU_registerCallback; void cdrDecodedBufferInterrupt() { - u16 buf_ptr[0x400], lcv; - -#if 0 - return; -#endif + u16 buf_ptr[0x400], lcv; + +#if 0 + return; +#endif // ISO reader only @@ -329,7 +322,7 @@ void cdrLidSeekInterrupt() } -void Check_Shell( int Irq ) +static void Check_Shell( int Irq ) { // check case open/close if (cdr.LidCheck > 0) @@ -346,7 +339,7 @@ void Check_Shell( int Irq ) i = stat.Status; if (CDR_getStatus(&stat) != -1) { - // BIOS hangs + BIOS error messages + // BIOS hangs + BIOS error messages //if (stat.Type == 0xff) //cdr.Stat = DiskError; @@ -439,7 +432,7 @@ void Check_Shell( int Irq ) } -void Find_CurTrack() { +static void Find_CurTrack() { cdr.CurTrack = 0; if (CDR_getTN(cdr.ResultTN) != -1) { @@ -459,11 +452,11 @@ void Find_CurTrack() { // find next track boundary - only need m:s accuracy sect1 = cdr.SetSectorPlay[0] * 60 * 75 + cdr.SetSectorPlay[1] * 75; sect2 = cdr.ResultTD[2] * 60 * 75 + cdr.ResultTD[1] * 75; - - // Twisted Metal 4 - psx cdda pregap (2-sec) - // - fix in-game music - sect2 -= 75 * 2; - + + // Twisted Metal 4 - psx cdda pregap (2-sec) + // - fix in-game music + sect2 -= 75 * 2; + if( sect1 >= sect2 ) { cdr.CurTrack++; continue; @@ -486,50 +479,50 @@ static void ReadTrack( u8 *time ) { cdr.RErr = CDR_readTrack(cdr.Prev); } - -void CDXA_Attenuation( s16 *buf, int size, int stereo ) -{ - s16 *spsound; - s32 lc,rc; - int i; - - spsound = buf; - -#if 0 - // mono xa attenuation - // - Tales of Phantasia (voice meter) - if( stereo == 0 ) { - s16 temp[32768]; - int dst; - - dst = 0; - for( i = 0; i < size; i++, dst+=2 ) { - temp[dst+0] = spsound[i]; - temp[dst+1] = spsound[i]; - } - - size *= 2*2; - memcpy( spsound, temp, size ); - } -#endif - - for( i = 0; i < size / 2; i += 2 ) - { - lc = (spsound[i+0] * cdr.AttenuatorLeft[0] + spsound[i+1] * cdr.AttenuatorRight[1]) / 128; - rc = (spsound[i+1] * cdr.AttenuatorRight[0] + spsound[i+0] * cdr.AttenuatorLeft[1]) / 128; - - if( lc < -32768 ) lc = -32768; - if( rc < -32768 ) rc = -32768; - if( lc > 32767 ) lc = 32767; - if( rc > 32767 ) rc = 32767; - - spsound[i + 0] = lc; - spsound[i + 1] = rc; - } -} - - -void AddIrqQueue(unsigned char irq, unsigned long ecycle) { + +static void CDXA_Attenuation( s16 *buf, int size, int stereo ) +{ + s16 *spsound; + s32 lc,rc; + int i; + + spsound = buf; + +#if 0 + // mono xa attenuation + // - Tales of Phantasia (voice meter) + if( stereo == 0 ) { + s16 temp[32768]; + int dst; + + dst = 0; + for( i = 0; i < size; i++, dst+=2 ) { + temp[dst+0] = spsound[i]; + temp[dst+1] = spsound[i]; + } + + size *= 2*2; + memcpy( spsound, temp, size ); + } +#endif + + for( i = 0; i < size / 2; i += 2 ) + { + lc = (spsound[i+0] * cdr.AttenuatorLeft[0] + spsound[i+1] * cdr.AttenuatorRight[1]) / 128; + rc = (spsound[i+1] * cdr.AttenuatorRight[0] + spsound[i+0] * cdr.AttenuatorLeft[1]) / 128; + + if( lc < -32768 ) lc = -32768; + if( rc < -32768 ) rc = -32768; + if( lc > 32767 ) lc = 32767; + if( rc > 32767 ) rc = 32767; + + spsound[i + 0] = lc; + spsound[i + 1] = rc; + } +} + + +static void AddIrqQueue(unsigned char irq, unsigned long ecycle) { cdr.Irq = irq; cdr.eCycle = ecycle; @@ -539,7 +532,7 @@ void AddIrqQueue(unsigned char irq, unsigned long ecycle) { } -void Set_Track() +static void Set_Track() { if (CDR_getTN(cdr.ResultTN) != -1) { int lcv; @@ -571,374 +564,374 @@ void Set_Track() } -static u8 fake_subq_local[3], fake_subq_real[3], fake_subq_index, fake_subq_change; -void Create_Fake_Subq() -{ - u8 temp_cur[3], temp_next[3], temp_start[3], pregap; - int diff; - - if (CDR_getTN(cdr.ResultTN) == -1) return; - if( cdr.CurTrack+1 <= cdr.ResultTN[1] ) { - pregap = 150; - if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) == -1 ) return; - } else { - // last track - cd size - pregap = 0; - if( CDR_getTD(0, cdr.ResultTD) == -1 ) return; - } - - if( cdr.Play == TRUE ) { - temp_cur[0] = cdr.SetSectorPlay[0]; - temp_cur[1] = cdr.SetSectorPlay[1]; - temp_cur[2] = cdr.SetSectorPlay[2]; - } else { - temp_cur[0] = btoi( cdr.Prev[0] ); - temp_cur[1] = btoi( cdr.Prev[1] ); - temp_cur[2] = btoi( cdr.Prev[2] ); - } - - fake_subq_real[0] = temp_cur[0]; - fake_subq_real[1] = temp_cur[1]; - fake_subq_real[2] = temp_cur[2]; - - temp_next[0] = cdr.ResultTD[2]; - temp_next[1] = cdr.ResultTD[1]; - temp_next[2] = cdr.ResultTD[0]; - - - // flag- next track - if( msf2sec(temp_cur) >= msf2sec( temp_next )-pregap ) { - fake_subq_change = 1; - - cdr.CurTrack++; - - // end cd - if( pregap == 0 ) StopCdda(); - } - - ////////////////////////////////////////////////// - ////////////////////////////////////////////////// - - // repair - if( cdr.CurTrack <= cdr.ResultTN[1] ) { - if( CDR_getTD(cdr.CurTrack, cdr.ResultTD) == -1 ) return; - } else { - // last track - cd size - if( CDR_getTD(0, cdr.ResultTD) == -1 ) return; - } - - temp_start[0] = cdr.ResultTD[2]; - temp_start[1] = cdr.ResultTD[1]; - temp_start[2] = cdr.ResultTD[0]; - - -#ifdef CDR_LOG - CDR_LOG( "CDDA FAKE SUB - %d:%d:%d / %d:%d:%d / %d:%d:%d\n", - temp_cur[0], temp_cur[1], temp_cur[2], - temp_start[0], temp_start[1], temp_start[2], - temp_next[0], temp_next[1], temp_next[2]); -#endif - - - - // local time - pregap / real - diff = msf2sec(temp_cur) - msf2sec( temp_start ); - if( diff < 0 ) { - fake_subq_index = 0; - - sec2msf( -diff, fake_subq_local ); - } else { - fake_subq_index = 1; - - sec2msf( diff, fake_subq_local ); - } -} - - -void cdrPlayInterrupt_Autopause() -{ - if ((cdr.Mode & (MODE_AUTOPAUSE|MODE_CDDA)) != (MODE_AUTOPAUSE|MODE_CDDA)) return; - - // Reschedule IRQ - if ( cdr.Irq || cdr.Stat ) { -#ifdef CDR_LOG - CDR_LOG("=== BUSY === cdrPlayInterrupt\n"); -#endif - - //CDRPLAY_INT( 0x800 ); - return; - } - - - if( CDR_getStatus(&stat) == -1) return; - - subq = (struct SubQ *)CDR_getBufferSub(); - - if (subq != NULL ) { -#ifdef CDR_LOG - CDR_LOG( "CDDA SUB - %X:%X:%X\n", - subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); -#endif - - /* - CDDA Autopause - - Silhouette Mirage ($3) - Tomb Raider 1 ($7) - */ - - if( cdr.CurTrack < btoi( subq->TrackNumber ) ) { -#ifdef CDR_LOG - CDR_LOG( "CDDA STOP\n" ); -#endif - - // Magic the Gathering - // - looping territory cdda - - // ...? - //cdr.ResultReady = 1; - //cdr.Stat = DataReady; - cdr.Stat = DataEnd; - psxHu32ref(0x1070) |= SWAP32((u32)0x4); - - - StopCdda(); - } - } else { -#ifdef CDR_LOG___0 - CDR_LOG( "CDDA FAKE SUB - %d:%d:%d\n", - temp_cur[0], temp_cur[1], temp_cur[2] ); -#endif - - //if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) { - if( fake_subq_change ) { -#ifdef CDR_LOG - CDR_LOG( "CDDA STOP\n" ); -#endif - - // Magic the Gathering - // - looping territory cdda - - // ...? - //cdr.ResultReady = 1; - //cdr.Stat = DataReady; - cdr.Stat = DataEnd; - psxHu32ref(0x1070) |= SWAP32((u32)0x4); - - - StopCdda(); - - fake_subq_change = 0; - } - } -} - - -void cdrPlayInterrupt_Repplay() -{ - // BIOS - HACK: Switch between local / absolute times - static u8 report_time = 1; - - - if ((cdr.Mode & (MODE_REPORT|MODE_CDDA)) != (MODE_REPORT|MODE_CDDA)) return; - -#ifdef CDR_LOG - CDR_LOG("cdrRepplayInterrupt() Log: KEY END\n"); -#endif - - // Doom - no more cdda playing - // - fixes boot with irq cmd reschedule - - // Reschedule IRQ - if ( cdr.Irq || cdr.Stat ) { -#ifdef CDR_LOG - CDR_LOG("=== BUSY === cdrRepplayInterrupt\n"); -#endif - - //CDREPPLAY_INT( 0x800 ); - return; - } - - - memset( cdr.Result, 0, 8 ); - if( CDR_getStatus(&stat) == -1) return; - - cdr.Result[0] = cdr.StatP; - - - subq = (struct SubQ *)CDR_getBufferSub(); - if (subq != NULL ) { -#ifdef CDR_LOG - CDR_LOG( "REPPLAY SUB - %X:%X:%X\n", - subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); -#endif - - - /* - skip subQ integrity check (audio playback) - - mainly useful for DATA LibCrypt checking - */ - //if( SWAP16(subq->CRC) != calcCrc((unsigned char *)subq + 12, 10) ) - - // Rayman: audio pregap flag / track change - // - not all CDs will use PREGAPs, so we track it manually - if( cdr.CurTrack < btoi( subq->TrackNumber ) ) { - cdr.Result[0] |= 0x10; - - cdr.CurTrack = btoi( subq->TrackNumber ); - } - - - // BIOS CD Player: data already BCD format - cdr.Result[1] = subq->TrackNumber; - cdr.Result[2] = subq->IndexNumber; - - - // BIOS CD Player: switch between local / absolute times - if( report_time == 0 ) { - cdr.Result[3] = subq->AbsoluteAddress[0]; - cdr.Result[4] = subq->AbsoluteAddress[1]; - cdr.Result[5] = subq->AbsoluteAddress[2]; - - report_time = 1; - } else { - cdr.Result[3] = subq->TrackRelativeAddress[0]; - cdr.Result[4] = subq->TrackRelativeAddress[1]; - cdr.Result[5] = subq->TrackRelativeAddress[2]; - - cdr.Result[4] |= 0x80; - - report_time = 0; - } - } else { -#ifdef CDR_LOG___0 - CDR_LOG( "REPPLAY FAKE - %d:%d:%d\n", - temp_cur[0], temp_cur[1], temp_cur[2] ); -#endif - - // Rayman: check track change - //if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) { - if( fake_subq_change ) { -#ifdef CDR_LOG___0 - CDR_LOG( "TRACK CHANGE %d - %d %d %d ==> %d %d %d\n", - cdr.CurTrack, - temp_cur[0], temp_cur[1], temp_cur[2], - temp_next[0], temp_next[1], temp_next[2] ); -#endif - - cdr.Result[0] |= 0x10; - - fake_subq_change = 0; - } - - - // track # / index # - cdr.Result[1] = itob(cdr.CurTrack); - cdr.Result[2] = itob(fake_subq_index); - - if( report_time == 0 ) { - // absolute - cdr.Result[3] = itob( fake_subq_real[0] ); - cdr.Result[4] = itob( fake_subq_real[1] ); - cdr.Result[5] = itob( fake_subq_real[2] ); - - report_time = 1; - } else { - // local - cdr.Result[3] = itob( fake_subq_local[0] ); - cdr.Result[4] = itob( fake_subq_local[1] ); - cdr.Result[5] = itob( fake_subq_local[2] ); - - cdr.Result[4] |= 0x80; - - report_time = 0; - } - - cdr.Result[6] = 0; - cdr.Result[7] = 0; - } - - - // Rayman: Logo freeze (resultready + dataready) - cdr.ResultReady = 1; - cdr.Stat = DataReady; - - SetResultSize(8); - psxHu32ref(0x1070) |= SWAP32((u32)0x4); -} - - -void cdrPlayInterrupt() -{ - if( !cdr.Play ) return; - - ////////////////////////////////////////// - ////////////////////////////////////////// - -#ifdef CDR_LOG - CDR_LOG( "CDDA - %d:%d:%d\n", - cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); -#endif - - - { - u8 temp[3]; - - temp[0] = itob(cdr.SetSectorPlay[0]); - temp[1] = itob(cdr.SetSectorPlay[1]); - temp[2] = itob(cdr.SetSectorPlay[2]); - - // get subq - CDR_readTrack( temp ); - } - - if( CDR_readCDDA ) { - CDR_readCDDA( cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], cdr.Transfer ); - - CDXA_Attenuation( (short *) cdr.Transfer, 2352, 1 ); - } - - - - // mute data track - if( (Config.Cdda) || - (CDR_getStatus(&stat) != -1 && stat.Type == 1 && cdr.CurTrack == 1) ) - memset( cdr.Transfer, 0, CD_FRAMESIZE_RAW ); - - - if( SPU_playCDDAchannel) - SPU_playCDDAchannel((short *)cdr.Transfer, CD_FRAMESIZE_RAW); - - CDRPLAY_INT( cdReadTime ); - - ////////////////////////////////////////// - ////////////////////////////////////////// - - subq = (struct SubQ *)CDR_getBufferSub(); - if (subq == NULL ) - Create_Fake_Subq(); - - cdrPlayInterrupt_Autopause(); - cdrPlayInterrupt_Repplay(); - - ////////////////////////////////////////// - ////////////////////////////////////////// - - cdr.SetSectorPlay[2]++; - if (cdr.SetSectorPlay[2] == 75) { - cdr.SetSectorPlay[2] = 0; - cdr.SetSectorPlay[1]++; - if (cdr.SetSectorPlay[1] == 60) { - cdr.SetSectorPlay[1] = 0; - cdr.SetSectorPlay[0]++; - } - } - - - Check_Shell(0); -} - - +static u8 fake_subq_local[3], fake_subq_real[3], fake_subq_index, fake_subq_change; +static void Create_Fake_Subq() +{ + u8 temp_cur[3], temp_next[3], temp_start[3], pregap; + int diff; + + if (CDR_getTN(cdr.ResultTN) == -1) return; + if( cdr.CurTrack+1 <= cdr.ResultTN[1] ) { + pregap = 150; + if( CDR_getTD(cdr.CurTrack+1, cdr.ResultTD) == -1 ) return; + } else { + // last track - cd size + pregap = 0; + if( CDR_getTD(0, cdr.ResultTD) == -1 ) return; + } + + if( cdr.Play == TRUE ) { + temp_cur[0] = cdr.SetSectorPlay[0]; + temp_cur[1] = cdr.SetSectorPlay[1]; + temp_cur[2] = cdr.SetSectorPlay[2]; + } else { + temp_cur[0] = btoi( cdr.Prev[0] ); + temp_cur[1] = btoi( cdr.Prev[1] ); + temp_cur[2] = btoi( cdr.Prev[2] ); + } + + fake_subq_real[0] = temp_cur[0]; + fake_subq_real[1] = temp_cur[1]; + fake_subq_real[2] = temp_cur[2]; + + temp_next[0] = cdr.ResultTD[2]; + temp_next[1] = cdr.ResultTD[1]; + temp_next[2] = cdr.ResultTD[0]; + + + // flag- next track + if( msf2sec(temp_cur) >= msf2sec( temp_next )-pregap ) { + fake_subq_change = 1; + + cdr.CurTrack++; + + // end cd + if( pregap == 0 ) StopCdda(); + } + + ////////////////////////////////////////////////// + ////////////////////////////////////////////////// + + // repair + if( cdr.CurTrack <= cdr.ResultTN[1] ) { + if( CDR_getTD(cdr.CurTrack, cdr.ResultTD) == -1 ) return; + } else { + // last track - cd size + if( CDR_getTD(0, cdr.ResultTD) == -1 ) return; + } + + temp_start[0] = cdr.ResultTD[2]; + temp_start[1] = cdr.ResultTD[1]; + temp_start[2] = cdr.ResultTD[0]; + + +#ifdef CDR_LOG + CDR_LOG( "CDDA FAKE SUB - %d:%d:%d / %d:%d:%d / %d:%d:%d\n", + temp_cur[0], temp_cur[1], temp_cur[2], + temp_start[0], temp_start[1], temp_start[2], + temp_next[0], temp_next[1], temp_next[2]); +#endif + + + + // local time - pregap / real + diff = msf2sec(temp_cur) - msf2sec( temp_start ); + if( diff < 0 ) { + fake_subq_index = 0; + + sec2msf( -diff, fake_subq_local ); + } else { + fake_subq_index = 1; + + sec2msf( diff, fake_subq_local ); + } +} + + +static void cdrPlayInterrupt_Autopause() +{ + if ((cdr.Mode & (MODE_AUTOPAUSE|MODE_CDDA)) != (MODE_AUTOPAUSE|MODE_CDDA)) return; + + // Reschedule IRQ + if ( cdr.Irq || cdr.Stat ) { +#ifdef CDR_LOG + CDR_LOG("=== BUSY === cdrPlayInterrupt\n"); +#endif + + //CDRPLAY_INT( 0x800 ); + return; + } + + + if( CDR_getStatus(&stat) == -1) return; + + subq = (struct SubQ *)CDR_getBufferSub(); + + if (subq != NULL ) { +#ifdef CDR_LOG + CDR_LOG( "CDDA SUB - %X:%X:%X\n", + subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); +#endif + + /* + CDDA Autopause + + Silhouette Mirage ($3) + Tomb Raider 1 ($7) + */ + + if( cdr.CurTrack < btoi( subq->TrackNumber ) ) { +#ifdef CDR_LOG + CDR_LOG( "CDDA STOP\n" ); +#endif + + // Magic the Gathering + // - looping territory cdda + + // ...? + //cdr.ResultReady = 1; + //cdr.Stat = DataReady; + cdr.Stat = DataEnd; + psxHu32ref(0x1070) |= SWAP32((u32)0x4); + + + StopCdda(); + } + } else { +#ifdef CDR_LOG___0 + CDR_LOG( "CDDA FAKE SUB - %d:%d:%d\n", + temp_cur[0], temp_cur[1], temp_cur[2] ); +#endif + + //if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) { + if( fake_subq_change ) { +#ifdef CDR_LOG + CDR_LOG( "CDDA STOP\n" ); +#endif + + // Magic the Gathering + // - looping territory cdda + + // ...? + //cdr.ResultReady = 1; + //cdr.Stat = DataReady; + cdr.Stat = DataEnd; + psxHu32ref(0x1070) |= SWAP32((u32)0x4); + + + StopCdda(); + + fake_subq_change = 0; + } + } +} + + +static void cdrPlayInterrupt_Repplay() +{ + // BIOS - HACK: Switch between local / absolute times + static u8 report_time = 1; + + + if ((cdr.Mode & (MODE_REPORT|MODE_CDDA)) != (MODE_REPORT|MODE_CDDA)) return; + +#ifdef CDR_LOG + CDR_LOG("cdrRepplayInterrupt() Log: KEY END\n"); +#endif + + // Doom - no more cdda playing + // - fixes boot with irq cmd reschedule + + // Reschedule IRQ + if ( cdr.Irq || cdr.Stat ) { +#ifdef CDR_LOG + CDR_LOG("=== BUSY === cdrRepplayInterrupt\n"); +#endif + + //CDREPPLAY_INT( 0x800 ); + return; + } + + + memset( cdr.Result, 0, 8 ); + if( CDR_getStatus(&stat) == -1) return; + + cdr.Result[0] = cdr.StatP; + + + subq = (struct SubQ *)CDR_getBufferSub(); + if (subq != NULL ) { +#ifdef CDR_LOG + CDR_LOG( "REPPLAY SUB - %X:%X:%X\n", + subq->AbsoluteAddress[0], subq->AbsoluteAddress[1], subq->AbsoluteAddress[2] ); +#endif + + + /* + skip subQ integrity check (audio playback) + - mainly useful for DATA LibCrypt checking + */ + //if( SWAP16(subq->CRC) != calcCrc((unsigned char *)subq + 12, 10) ) + + // Rayman: audio pregap flag / track change + // - not all CDs will use PREGAPs, so we track it manually + if( cdr.CurTrack < btoi( subq->TrackNumber ) ) { + cdr.Result[0] |= 0x10; + + cdr.CurTrack = btoi( subq->TrackNumber ); + } + + + // BIOS CD Player: data already BCD format + cdr.Result[1] = subq->TrackNumber; + cdr.Result[2] = subq->IndexNumber; + + + // BIOS CD Player: switch between local / absolute times + if( report_time == 0 ) { + cdr.Result[3] = subq->AbsoluteAddress[0]; + cdr.Result[4] = subq->AbsoluteAddress[1]; + cdr.Result[5] = subq->AbsoluteAddress[2]; + + report_time = 1; + } else { + cdr.Result[3] = subq->TrackRelativeAddress[0]; + cdr.Result[4] = subq->TrackRelativeAddress[1]; + cdr.Result[5] = subq->TrackRelativeAddress[2]; + + cdr.Result[4] |= 0x80; + + report_time = 0; + } + } else { +#ifdef CDR_LOG___0 + CDR_LOG( "REPPLAY FAKE - %d:%d:%d\n", + temp_cur[0], temp_cur[1], temp_cur[2] ); +#endif + + // Rayman: check track change + //if( msf2sec(temp_cur) >= msf2sec( temp_next ) ) { + if( fake_subq_change ) { +#ifdef CDR_LOG___0 + CDR_LOG( "TRACK CHANGE %d - %d %d %d ==> %d %d %d\n", + cdr.CurTrack, + temp_cur[0], temp_cur[1], temp_cur[2], + temp_next[0], temp_next[1], temp_next[2] ); +#endif + + cdr.Result[0] |= 0x10; + + fake_subq_change = 0; + } + + + // track # / index # + cdr.Result[1] = itob(cdr.CurTrack); + cdr.Result[2] = itob(fake_subq_index); + + if( report_time == 0 ) { + // absolute + cdr.Result[3] = itob( fake_subq_real[0] ); + cdr.Result[4] = itob( fake_subq_real[1] ); + cdr.Result[5] = itob( fake_subq_real[2] ); + + report_time = 1; + } else { + // local + cdr.Result[3] = itob( fake_subq_local[0] ); + cdr.Result[4] = itob( fake_subq_local[1] ); + cdr.Result[5] = itob( fake_subq_local[2] ); + + cdr.Result[4] |= 0x80; + + report_time = 0; + } + + cdr.Result[6] = 0; + cdr.Result[7] = 0; + } + + + // Rayman: Logo freeze (resultready + dataready) + cdr.ResultReady = 1; + cdr.Stat = DataReady; + + SetResultSize(8); + psxHu32ref(0x1070) |= SWAP32((u32)0x4); +} + + +void cdrPlayInterrupt() +{ + if( !cdr.Play ) return; + + ////////////////////////////////////////// + ////////////////////////////////////////// + +#ifdef CDR_LOG + CDR_LOG( "CDDA - %d:%d:%d\n", + cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2] ); +#endif + + + { + u8 temp[3]; + + temp[0] = itob(cdr.SetSectorPlay[0]); + temp[1] = itob(cdr.SetSectorPlay[1]); + temp[2] = itob(cdr.SetSectorPlay[2]); + + // get subq + CDR_readTrack( temp ); + } + + if( CDR_readCDDA ) { + CDR_readCDDA( cdr.SetSectorPlay[0], cdr.SetSectorPlay[1], cdr.SetSectorPlay[2], cdr.Transfer ); + + CDXA_Attenuation( (short *) cdr.Transfer, 2352, 1 ); + } + + + + // mute data track + if( (Config.Cdda) || + (CDR_getStatus(&stat) != -1 && stat.Type == 1 && cdr.CurTrack == 1) ) + memset( cdr.Transfer, 0, CD_FRAMESIZE_RAW ); + + + if( SPU_playCDDAchannel) + SPU_playCDDAchannel((short *)cdr.Transfer, CD_FRAMESIZE_RAW); + + CDRPLAY_INT( cdReadTime ); + + ////////////////////////////////////////// + ////////////////////////////////////////// + + subq = (struct SubQ *)CDR_getBufferSub(); + if (subq == NULL ) + Create_Fake_Subq(); + + cdrPlayInterrupt_Autopause(); + cdrPlayInterrupt_Repplay(); + + ////////////////////////////////////////// + ////////////////////////////////////////// + + cdr.SetSectorPlay[2]++; + if (cdr.SetSectorPlay[2] == 75) { + cdr.SetSectorPlay[2] = 0; + cdr.SetSectorPlay[1]++; + if (cdr.SetSectorPlay[1] == 60) { + cdr.SetSectorPlay[1] = 0; + cdr.SetSectorPlay[0]++; + } + } + + + Check_Shell(0); +} + + void cdrInterrupt() { int i; unsigned char Irq = cdr.Irq; @@ -977,13 +970,13 @@ void cdrInterrupt() { break; case CdlPlay: - fake_subq_change = 0; - - if( cdr.Seeked == FALSE ) { - memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); - cdr.Seeked = TRUE; - } - + fake_subq_change = 0; + + if( cdr.Seeked == FALSE ) { + memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); + cdr.Seeked = TRUE; + } + /* Rayman: detect track changes - fixes logo freeze @@ -1060,11 +1053,11 @@ void cdrInterrupt() { cdr.SetSectorPlay[1] = cdr.ResultTD[1]; cdr.SetSectorPlay[2] = cdr.ResultTD[0]; - // reset data - Set_Track(); - Find_CurTrack(); - ReadTrack( cdr.SetSectorPlay ); - + // reset data + Set_Track(); + Find_CurTrack(); + ReadTrack( cdr.SetSectorPlay ); + //CDR_play(cdr.SetSectorPlay); } } @@ -1084,12 +1077,12 @@ void cdrInterrupt() { cdr.Stat = Acknowledge; cdr.StatP |= STATUS_PLAY; - - - // BIOS player - set flag again - cdr.Play = TRUE; - CDRPLAY_INT( cdReadTime ); + + // BIOS player - set flag again + cdr.Play = TRUE; + + CDRPLAY_INT( cdReadTime ); break; case CdlForward: @@ -1251,30 +1244,30 @@ void cdrInterrupt() { memset(cdr.Result + 2, 0, 3 + 3); // CRC wrong, wipe out time data } } - } else { - if( cdr.Play == FALSE ) Create_Fake_Subq(); - - - // track # / index # - cdr.Result[0] = itob(cdr.CurTrack); - cdr.Result[1] = itob(fake_subq_index); - - // local - cdr.Result[2] = itob( fake_subq_local[0] ); - cdr.Result[3] = itob( fake_subq_local[1] ); - cdr.Result[4] = itob( fake_subq_local[2] ); - - // absolute - cdr.Result[5] = itob( fake_subq_real[0] ); - cdr.Result[6] = itob( fake_subq_real[1] ); - cdr.Result[7] = itob( fake_subq_real[2] ); - } - - // redump.org - wipe time - if( !cdr.Play && CheckSBI(cdr.Result+5) ) { - memset( cdr.Result+2, 0, 6 ); - } - + } else { + if( cdr.Play == FALSE ) Create_Fake_Subq(); + + + // track # / index # + cdr.Result[0] = itob(cdr.CurTrack); + cdr.Result[1] = itob(fake_subq_index); + + // local + cdr.Result[2] = itob( fake_subq_local[0] ); + cdr.Result[3] = itob( fake_subq_local[1] ); + cdr.Result[4] = itob( fake_subq_local[2] ); + + // absolute + cdr.Result[5] = itob( fake_subq_real[0] ); + cdr.Result[6] = itob( fake_subq_real[1] ); + cdr.Result[7] = itob( fake_subq_real[2] ); + } + + // redump.org - wipe time + if( !cdr.Play && CheckSBI(cdr.Result+5) ) { + memset( cdr.Result+2, 0, 6 ); + } + cdr.Stat = Acknowledge; break; @@ -1320,21 +1313,21 @@ void cdrInterrupt() { cdr.StatP |= STATUS_ROTATING; cdr.Result[0] = cdr.StatP; cdr.StatP |= STATUS_SEEK; - cdr.Stat = Acknowledge; - - /* - Crusaders of Might and Magic = 0.5x-4x - - fix cutscene speech start - - Eggs of Steel = 2x-? - - fix new game - - Medievil = ?-4x - - fix cutscene speech - - Rockman X5 = 0.5-4x - - fix capcom logo - */ + cdr.Stat = Acknowledge; + + /* + Crusaders of Might and Magic = 0.5x-4x + - fix cutscene speech start + + Eggs of Steel = 2x-? + - fix new game + + Medievil = ?-4x + - fix cutscene speech + + Rockman X5 = 0.5-4x + - fix capcom logo + */ AddIrqQueue(CdlSeekL + 0x20, cdReadTime * 4); break; @@ -1345,10 +1338,10 @@ void cdrInterrupt() { cdr.Result[0] = cdr.StatP; cdr.Seeked = TRUE; cdr.Stat = Complete; - - - // Mega Man Legends 2: must update read cursor for getlocp - ReadTrack( cdr.SetSector ); + + + // Mega Man Legends 2: must update read cursor for getlocp + ReadTrack( cdr.SetSector ); break; case CdlSeekP: @@ -1357,7 +1350,7 @@ void cdrInterrupt() { cdr.Result[0] = cdr.StatP; cdr.StatP |= STATUS_SEEK; cdr.Stat = Acknowledge; - AddIrqQueue(CdlSeekP + 0x20, cdReadTime * 1); + AddIrqQueue(CdlSeekP + 0x20, cdReadTime * 1); break; case CdlSeekP + 0x20: @@ -1368,12 +1361,12 @@ void cdrInterrupt() { cdr.Stat = Complete; cdr.Seeked = TRUE; - // GameShark Music Player - memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); - - // Tomb Raider 2: must update read cursor for getlocp - Find_CurTrack(); - ReadTrack( cdr.SetSectorPlay ); + // GameShark Music Player + memcpy( cdr.SetSectorPlay, cdr.SetSector, 4 ); + + // Tomb Raider 2: must update read cursor for getlocp + Find_CurTrack(); + ReadTrack( cdr.SetSectorPlay ); break; case CdlTest: @@ -1489,43 +1482,43 @@ void cdrInterrupt() { case READ_ACK: if (!cdr.Reading) return; - - // Fighting Force 2 - update subq time immediately - // - fixes new game - ReadTrack( cdr.SetSector ); - - - // Crusaders of Might and Magic - update getlocl now - // - fixes cutscene speech - { - u8 *buf = CDR_getBuffer(); - memcpy(cdr.Transfer, buf, 8); - } - - - /* - Duke Nukem: Land of the Babes - seek then delay read for one frame - - fixes cutscenes - */ - + + // Fighting Force 2 - update subq time immediately + // - fixes new game + ReadTrack( cdr.SetSector ); + + + // Crusaders of Might and Magic - update getlocl now + // - fixes cutscene speech + { + u8 *buf = CDR_getBuffer(); + memcpy(cdr.Transfer, buf, 8); + } + + + /* + Duke Nukem: Land of the Babes - seek then delay read for one frame + - fixes cutscenes + */ + if (!cdr.Seeked) { cdr.Seeked = TRUE; cdr.StatP |= STATUS_SEEK; - cdr.StatP &= ~STATUS_READ; - - // Crusaders of Might and Magic - use short time - // - fix cutscene speech (startup) - - // ??? - use more accurate seek time later - CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1); - } else { - cdr.StatP |= STATUS_READ; - cdr.StatP &= ~STATUS_SEEK; - - CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1); - } - + cdr.StatP &= ~STATUS_READ; + + // Crusaders of Might and Magic - use short time + // - fix cutscene speech (startup) + + // ??? - use more accurate seek time later + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1); + } else { + cdr.StatP |= STATUS_READ; + cdr.StatP &= ~STATUS_SEEK; + + CDREAD_INT((cdr.Mode & 0x80) ? (cdReadTime / 2) : cdReadTime * 1); + } + SetResultSize(1); cdr.StatP |= STATUS_ROTATING; cdr.Result[0] = cdr.StatP; @@ -1599,52 +1592,52 @@ void cdrReadInterrupt() { if ((!cdr.Muted) && (cdr.Mode & MODE_STRSND) && (!Config.Xa) && (cdr.FirstSector != -1)) { // CD-XA // Firemen 2: Multi-XA files - briefings, cutscenes - if( cdr.FirstSector == 1 && (cdr.Mode & MODE_SF)==0 ) { - cdr.File = cdr.Transfer[4 + 0]; - cdr.Channel = cdr.Transfer[4 + 1]; - } - - if((cdr.Transfer[4 + 2] & 0x4) && - (cdr.Transfer[4 + 1] == cdr.Channel) && - (cdr.Transfer[4 + 0] == cdr.File)) { - int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector); - - if (!ret) { - int xa_type; - -#if 0 - // save - set only for FirstSector - xa_type = cdr.Xa.stereo; - - - // Duke Nukem - Time to Kill - speech, music volume control - // Tekken 3 - post-match fade out - if( cdr.Xa.stereo == 0 ) - CDXA_Attenuation( cdr.Xa.pcm, cdr.Xa.nsamples * 2, cdr.Xa.stereo ); - else - CDXA_Attenuation( cdr.Xa.pcm, cdr.Xa.nsamples * 4, cdr.Xa.stereo ); - - - // fix mono xa attenuation - if( cdr.Xa.stereo == 0 ) cdr.Xa.stereo = 1; -#endif + if( cdr.FirstSector == 1 && (cdr.Mode & MODE_SF)==0 ) { + cdr.File = cdr.Transfer[4 + 0]; + cdr.Channel = cdr.Transfer[4 + 1]; + } + + if((cdr.Transfer[4 + 2] & 0x4) && + (cdr.Transfer[4 + 1] == cdr.Channel) && + (cdr.Transfer[4 + 0] == cdr.File)) { + int ret = xa_decode_sector(&cdr.Xa, cdr.Transfer+4, cdr.FirstSector); + + if (!ret) { +#if 0 + int xa_type; + + // save - set only for FirstSector + xa_type = cdr.Xa.stereo; + + + // Duke Nukem - Time to Kill - speech, music volume control + // Tekken 3 - post-match fade out + if( cdr.Xa.stereo == 0 ) + CDXA_Attenuation( cdr.Xa.pcm, cdr.Xa.nsamples * 2, cdr.Xa.stereo ); + else + CDXA_Attenuation( cdr.Xa.pcm, cdr.Xa.nsamples * 4, cdr.Xa.stereo ); + + + // fix mono xa attenuation + if( cdr.Xa.stereo == 0 ) cdr.Xa.stereo = 1; +#endif SPU_playADPCMchannel(&cdr.Xa); cdr.FirstSector = 0; - - -#if 0 - cdr.Xa.stereo = xa_type; -#endif - + +#if 0 + cdr.Xa.stereo = xa_type; +#endif + + #if 0 - // Crash Team Racing: music, speech - // - done using cdda decoded buffer (spu irq) + // Crash Team Racing: music, speech + // - done using cdda decoded buffer (spu irq) // - don't do here // signal ADPCM data ready - psxHu32ref(0x1070) |= SWAP32((u32)0x200); + psxHu32ref(0x1070) |= SWAP32((u32)0x200); #endif } else cdr.FirstSector = -1; @@ -1677,9 +1670,9 @@ void cdrReadInterrupt() { } /* - Croc 2: $40 - only FORM1 (*) - Judge Dredd: $C8 - only FORM1 (*) - Sim Theme Park - no adpcm at all (zero) + Croc 2: $40 - only FORM1 (*) + Judge Dredd: $C8 - only FORM1 (*) + Sim Theme Park - no adpcm at all (zero) */ if( (cdr.Mode & MODE_STRSND) == 0 || (cdr.Transfer[4+2] & 0x4) != 0x4 ) { @@ -1689,7 +1682,7 @@ void cdrReadInterrupt() { // Rockman X5 - no music restart problem cdr.Stat = NoIntr; } - psxHu32ref(0x1070) |= SWAP32((u32)0x4); + psxHu32ref(0x1070) |= SWAP32((u32)0x4); Check_Shell(0); } @@ -1746,13 +1739,13 @@ void cdrWrite0(unsigned char rt) { // Tekken: CDXA fade-out else if( rt == 2 ) { - //cdr.AttenuatorLeft[0] = 0; - //cdr.AttenuatorLeft[1] = 0; + //cdr.AttenuatorLeft[0] = 0; + //cdr.AttenuatorLeft[1] = 0; } else if( rt == 3 ) { - // Tekken 3 - character menu (don't do this!) - //cdr.AttenuatorRight[0] = 0; - //cdr.AttenuatorRight[1] = 0; + // Tekken 3 - character menu (don't do this!) + //cdr.AttenuatorRight[0] = 0; + //cdr.AttenuatorRight[1] = 0; } } @@ -1782,7 +1775,7 @@ void cdrWrite1(unsigned char rt) { // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 3 ) { - cdr.AttenuatorRight[0] = rt; + cdr.AttenuatorRight[0] = rt; } @@ -1813,8 +1806,8 @@ void cdrWrite1(unsigned char rt) { case CdlNop: cdr.Ctrl |= 0x80; - cdr.Stat = NoIntr; - + cdr.Stat = NoIntr; + // Twisted Metal 3 - fix music AddIrqQueue(cdr.Cmd, 0x800); break; @@ -1934,7 +1927,7 @@ void cdrWrite1(unsigned char rt) { /* GameShark CD Player: save time for resume - Twisted Metal - World Tour: don't mix Setloc / CdlPlay cursors + Twisted Metal - World Tour: don't mix Setloc / CdlPlay cursors */ StopCdda(); @@ -1959,8 +1952,8 @@ void cdrWrite1(unsigned char rt) { cdr.Stat = NoIntr; AddIrqQueue(cdr.Cmd, 0x800); - // Duke Nukem - Time to Kill - // - do not directly set cd-xa volume + // Duke Nukem - Time to Kill + // - do not directly set cd-xa volume //SPU_writeRegister( H_CDLeft, 0x0000 ); //SPU_writeRegister( H_CDRight, 0x0000 ); break; @@ -1971,8 +1964,8 @@ void cdrWrite1(unsigned char rt) { cdr.Stat = NoIntr; AddIrqQueue(cdr.Cmd, 0x800); - // Duke Nukem - Time to Kill - // - do not directly set cd-xa volume + // Duke Nukem - Time to Kill + // - do not directly set cd-xa volume //SPU_writeRegister( H_CDLeft, 0x7f00 ); //SPU_writeRegister( H_CDRight, 0x7f00 ); break; @@ -2016,13 +2009,13 @@ void cdrWrite1(unsigned char rt) { case CdlGetlocP: cdr.Ctrl |= 0x80; - cdr.Stat = NoIntr; + cdr.Stat = NoIntr; // GameShark CDX / Lite Player: pretty narrow time window // - doesn't always work due to time inprecision - //AddIrqQueue(cdr.Cmd, 0x28); - - // Tomb Raider 2 - cdda + //AddIrqQueue(cdr.Cmd, 0x28); + + // Tomb Raider 2 - cdda AddIrqQueue(cdr.Cmd, 0x40); break; @@ -2046,21 +2039,21 @@ void cdrWrite1(unsigned char rt) { cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; AddIrqQueue(cdr.Cmd, 0x800); - - StopCdda(); - StopReading(); - + + StopCdda(); + StopReading(); + break; case CdlSeekP: // ((u32 *)cdr.SetSectorSeek)[0] = ((u32 *)cdr.SetSector)[0]; cdr.Ctrl |= 0x80; cdr.Stat = NoIntr; - - // Tomb Raider 2 - reset cdda - StopCdda(); - StopReading(); - + + // Tomb Raider 2 - reset cdda + StopCdda(); + StopReading(); + AddIrqQueue(cdr.Cmd, 0x800); break; @@ -2131,10 +2124,10 @@ void cdrWrite2(unsigned char rt) { // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 2 ) { - cdr.AttenuatorLeft[0] = rt; + cdr.AttenuatorLeft[0] = rt; } else if( (cdr.Ctrl & 3) == 3 ) { - cdr.AttenuatorRight[1] = rt; + cdr.AttenuatorRight[1] = rt; } @@ -2180,14 +2173,14 @@ void cdrWrite3(unsigned char rt) { // Tekken: CDXA fade-out if( (cdr.Ctrl & 3) == 2 ) { - cdr.AttenuatorLeft[1] = rt; + cdr.AttenuatorLeft[1] = rt; } else if( (cdr.Ctrl & 3) == 3 && rt == 0x20 ) { -#ifdef CDR_LOG - CDR_LOG( "CD-XA Volume: %X %X | %X %X\n", - cdr.AttenuatorLeft[0], cdr.AttenuatorLeft[1], - cdr.AttenuatorRight[0], cdr.AttenuatorRight[1] ); -#endif +#ifdef CDR_LOG + CDR_LOG( "CD-XA Volume: %X %X | %X %X\n", + cdr.AttenuatorLeft[0], cdr.AttenuatorLeft[1], + cdr.AttenuatorRight[0], cdr.AttenuatorRight[1] ); +#endif } @@ -2212,23 +2205,23 @@ void cdrWrite3(unsigned char rt) { cdr.Irq = 0; return; } - + #if 1 - if (cdr.Reading && !cdr.ResultReady) { - CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); - } -#else - // XA streaming - incorrect timing because of this reschedule - // - Final Fantasy Tactics - // - various other games - - /* - if (cdr.Reading && !cdr.ResultReady) { - CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); - } - */ -#endif - + if (cdr.Reading && !cdr.ResultReady) { + CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); + } +#else + // XA streaming - incorrect timing because of this reschedule + // - Final Fantasy Tactics + // - various other games + + /* + if (cdr.Reading && !cdr.ResultReady) { + CDREAD_INT((cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime); + } + */ +#endif + return; } @@ -2236,9 +2229,9 @@ void cdrWrite3(unsigned char rt) { cdr.Readed = 1; cdr.pTransfer = cdr.Transfer; - switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { - case MODE_SIZE_2328: - case MODE_SIZE_2048: + switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { + case MODE_SIZE_2328: + case MODE_SIZE_2048: cdr.pTransfer += 12; break; @@ -2254,7 +2247,7 @@ void cdrWrite3(unsigned char rt) { void psxDma3(u32 madr, u32 bcr, u32 chcr) { u32 cdsize; - u8 *ptr, *cdwrap_ptr; + u8 *ptr; #ifdef CDR_LOG CDR_LOG("psxDma3() Log: *** DMA 3 *** %x addr = %x size = %x\n", chcr, madr, bcr); @@ -2272,18 +2265,18 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { cdsize = (bcr & 0xffff) * 4; - // Ape Escape: bcr = 0001 / 0000 - // - fix boot - if( cdsize == 0 ) - { - switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { - case MODE_SIZE_2340: cdsize = 2340; break; - case MODE_SIZE_2328: cdsize = 2328; break; - case MODE_SIZE_2048: cdsize = 2048; break; - } - } - - + // Ape Escape: bcr = 0001 / 0000 + // - fix boot + if( cdsize == 0 ) + { + switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { + case MODE_SIZE_2340: cdsize = 2340; break; + case MODE_SIZE_2328: cdsize = 2328; break; + case MODE_SIZE_2048: cdsize = 2048; break; + } + } + + ptr = (u8 *)PSXM(madr); if (ptr == NULL) { #ifdef CPU_LOG @@ -2292,8 +2285,8 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { break; } - -#if 1 + +#if 1 /* GS CDX: Enhancement CD crash - Setloc 0:0:0 @@ -2313,70 +2306,70 @@ void psxDma3(u32 madr, u32 bcr, u32 chcr) { psxCpu->Clear(madr, cdsize / 4); cdr.pTransfer += cdsize; -#else - cdwrap_ptr = cdr.Transfer; - switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { - case MODE_SIZE_2340: cdwrap_ptr += 2340; break; - case MODE_SIZE_2328: cdwrap_ptr += 12 + 2328; break; - case MODE_SIZE_2048: cdwrap_ptr += 12 + 2048; break; - } - - - // fast copy - no wrap - if( cdr.pTransfer + cdsize <= cdwrap_ptr ) { - memcpy(ptr, cdr.pTransfer, cdsize); - - psxCpu->Clear(madr, cdsize / 4); - cdr.pTransfer += cdsize; - } else { - int lcv; - - /* - CDROM wrapping - - Ape Escape - used several times - Gameshark Lite - opening movie - - Gameshark CDX: enhancement CD patcher - - calls CdlPlay @ 0:2:0 - - spams DMA3 and overruns buffer - */ - - for( lcv = 0; lcv < cdsize; lcv++ ) - { - // wrap cdrom ptr - if( cdr.pTransfer == cdwrap_ptr ) { - switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { - case MODE_SIZE_2328: - case MODE_SIZE_2048: - cdr.pTransfer = cdr.Transfer + 12; - break; - - case MODE_SIZE_2340: - cdr.pTransfer = cdr.Transfer + 0; - break; - } - } - - - *(ptr+lcv) = *cdr.pTransfer; - - cdr.pTransfer++; - } - - - psxCpu->Clear(madr, cdsize / 4); - } -#endif +#else + u8 *cdwrap_ptr = cdr.Transfer; + switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { + case MODE_SIZE_2340: cdwrap_ptr += 2340; break; + case MODE_SIZE_2328: cdwrap_ptr += 12 + 2328; break; + case MODE_SIZE_2048: cdwrap_ptr += 12 + 2048; break; + } + + + // fast copy - no wrap + if( cdr.pTransfer + cdsize <= cdwrap_ptr ) { + memcpy(ptr, cdr.pTransfer, cdsize); + + psxCpu->Clear(madr, cdsize / 4); + cdr.pTransfer += cdsize; + } else { + int lcv; + + /* + CDROM wrapping + + Ape Escape - used several times + Gameshark Lite - opening movie + + Gameshark CDX: enhancement CD patcher + - calls CdlPlay @ 0:2:0 + - spams DMA3 and overruns buffer + */ + + for( lcv = 0; lcv < cdsize; lcv++ ) + { + // wrap cdrom ptr + if( cdr.pTransfer == cdwrap_ptr ) { + switch (cdr.Mode & (MODE_SIZE_2340|MODE_SIZE_2328)) { + case MODE_SIZE_2328: + case MODE_SIZE_2048: + cdr.pTransfer = cdr.Transfer + 12; + break; + + case MODE_SIZE_2340: + cdr.pTransfer = cdr.Transfer + 0; + break; + } + } + + + *(ptr+lcv) = *cdr.pTransfer; + + cdr.pTransfer++; + } + + + psxCpu->Clear(madr, cdsize / 4); + } +#endif // burst vs normal - if( chcr == 0x11400100 ) { + if( chcr == 0x11400100 ) { #if 1 - CDRDMA_INT( (cdsize/4) / 4 ); -#else - // Experimental burst dma transfer (0.333x max) - CDRDMA_INT( (cdsize/4) / 3 ); + CDRDMA_INT( (cdsize/4) / 4 ); +#else + // Experimental burst dma transfer (0.333x max) + CDRDMA_INT( (cdsize/4) / 3 ); #endif } else if( chcr == 0x11000000 ) { @@ -2405,30 +2398,30 @@ void cdrReset() { memset(&cdr, 0, sizeof(cdr)); cdr.CurTrack = 1; cdr.File = 1; - cdr.Channel = 1; - -#if 0 - // BIOS player - default values - cdr.AttenuatorLeft[0] = 0x80; - cdr.AttenuatorLeft[1] = 0x00; - cdr.AttenuatorRight[0] = 0x80; - cdr.AttenuatorRight[1] = 0x00; -#endif + cdr.Channel = 1; + +#if 0 + // BIOS player - default values + cdr.AttenuatorLeft[0] = 0x80; + cdr.AttenuatorLeft[1] = 0x00; + cdr.AttenuatorRight[0] = 0x80; + cdr.AttenuatorRight[1] = 0x00; +#endif } int cdrFreeze(gzFile f, int Mode) { uintptr_t tmp; - - - if( Mode == 0 ) { - StopCdda(); - } - - + + + if( Mode == 0 ) { + StopCdda(); + } + + gzfreeze(&cdr, sizeof(cdr)); - - + + if (Mode == 1) tmp = cdr.pTransfer - cdr.Transfer; @@ -2442,9 +2435,9 @@ int cdrFreeze(gzFile f, int Mode) { void LidInterrupt() { cdr.LidCheck = 0x20; // start checker - - CDRLID_INT( cdReadTime * 3 ); - + + CDRLID_INT( cdReadTime * 3 ); + // generate interrupt if none active - open or close if (cdr.Irq == 0 || cdr.Irq == 0xff) { cdr.Ctrl |= 0x80; diff --git a/libpcsxcore/cdrom.h b/libpcsxcore/cdrom.h index c943f3b1..355f1c6a 100644 --- a/libpcsxcore/cdrom.h +++ b/libpcsxcore/cdrom.h @@ -71,7 +71,7 @@ typedef struct { unsigned char ResultTD[4]; unsigned char SetSector[4]; unsigned char SetSectorSeek[4]; - unsigned char SetSectorPlay[4]; + unsigned char SetSectorPlay[4]; unsigned char Track; boolean Play, Muted; int CurTrack; @@ -90,21 +90,22 @@ typedef struct { boolean Seeked; u8 LidCheck; - u8 FastForward; - u8 FastBackward; - - u8 AttenuatorLeft[2], AttenuatorRight[2]; + u8 FastForward; + u8 FastBackward; + + u8 AttenuatorLeft[2], AttenuatorRight[2]; } cdrStruct; extern cdrStruct cdr; void cdrDecodedBufferInterrupt(); -void cdrReset(); -void cdrInterrupt(); -void cdrReadInterrupt(); -void cdrLidSeekInterrupt(); -void cdrPlayInterrupt(); +void cdrReset(void); +void cdrInterrupt(void); +void cdrReadInterrupt(void); +void cdrLidSeekInterrupt(void); +void cdrPlayInterrupt(void); +void LidInterrupt(void); unsigned char cdrRead0(void); unsigned char cdrRead1(void); unsigned char cdrRead2(void); diff --git a/libpcsxcore/debug.c b/libpcsxcore/debug.c index 307a0020..5455e305 100644 --- a/libpcsxcore/debug.c +++ b/libpcsxcore/debug.c @@ -256,7 +256,7 @@ typedef struct breakpoint_s { static breakpoint_t *first = NULL; -int add_breakpoint(int type, u32 address) { +static int add_breakpoint(int type, u32 address) { breakpoint_t *bp = (breakpoint_t *)malloc(sizeof(breakpoint_t)); bp->type = type; @@ -278,7 +278,7 @@ int add_breakpoint(int type, u32 address) { return bp->number; } -void delete_breakpoint(breakpoint_t * bp) { +static void delete_breakpoint(breakpoint_t * bp) { if (bp == first) { if (bp->next == bp) { first = NULL; @@ -293,11 +293,11 @@ void delete_breakpoint(breakpoint_t * bp) { free(bp); } -breakpoint_t *next_breakpoint(breakpoint_t *bp) { +static breakpoint_t *next_breakpoint(breakpoint_t *bp) { return bp->next != first ? bp->next : 0; } -breakpoint_t *find_breakpoint(int number) { +static breakpoint_t *find_breakpoint(int number) { breakpoint_t *p; for (p = first; p; p = next_breakpoint(p)) { @@ -371,12 +371,12 @@ void DebugVSync() { ProcessCommands(); } -void MarkMap(u32 address, int mask) { +static void MarkMap(u32 address, int mask) { if ((address & 0xff000000) != 0x80000000) return; MemoryMap[address & 0x001fffff] |= mask; } -int IsMapMarked(u32 address, int mask) { +static int IsMapMarked(u32 address, int mask) { return (MemoryMap[address & 0x001fffff] & mask) != 0; } diff --git a/libpcsxcore/decode_xa.c b/libpcsxcore/decode_xa.c index ee1dd6f3..abca4cc7 100644 --- a/libpcsxcore/decode_xa.c +++ b/libpcsxcore/decode_xa.c @@ -68,7 +68,7 @@ static int K1[4] = { #define BLKSIZ 28 /* block size (32 - 4 nibbles) */ //=========================================== -void ADPCM_InitDecode(ADPCM_Decode_t *decp) { +static void ADPCM_InitDecode(ADPCM_Decode_t *decp) { decp->y0 = 0; decp->y1 = 0; } diff --git a/libpcsxcore/disr3000a.c b/libpcsxcore/disr3000a.c index d99fe982..10f4b41c 100644 --- a/libpcsxcore/disr3000a.c +++ b/libpcsxcore/disr3000a.c @@ -1,337 +1,337 @@ -/*************************************************************************** - * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * - ***************************************************************************/ - -/* -* R3000A disassembler. -*/ - -#include "psxcommon.h" - -char ostr[256]; - -// Names of registers -static char *disRNameGPR[] = { - "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", - "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", - "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"}; - -static char *disRNameCP2D[] = { - "VXY0", "VZ0", "VXY1", "VZ1", "VXY2", "VZ2", "RGB", "OTZ", - "IR0", "IR1", "IR2", "IR3", "SXY0", "SXY1", "SXY2", "SXYP", - "SZ0", "SZ1", "SZ2", "SZ3", "RGB0", "RGB1", "RGB2", "RES1", - "MAC0", "MAC1", "MAC2", "MAC3", "IRGB", "ORGB", "LZCS", "LZCR"}; - -static char *disRNameCP2C[] = { - "R11R12", "R13R21", "R22R23", "R31R32", "R33", "TRX", "TRY", "TRZ", - "L11L12", "L13L21", "L22L23", "L31L32", "L33", "RBK", "BBK", "GBK", - "LR1LR2", "LR3LG1", "LG2LG3", "LB1LB2", "LB3", "RFC", "GFC", "BFC", - "OFX", "OFY", "H", "DQA", "DQB", "ZSF3", "ZSF4", "FLAG"}; - -char *disRNameCP0[] = { - "Index" , "Random" , "EntryLo0", "EntryLo1", "Context" , "PageMask" , "Wired" , "*Check me*", - "BadVAddr" , "Count" , "EntryHi" , "Compare" , "Status" , "Cause" , "ExceptPC" , "PRevID" , - "Config" , "LLAddr" , "WatchLo" , "WatchHi" , "XContext", "*RES*" , "*RES*" , "*RES*" , - "*RES*" , "*RES* " , "PErr" , "CacheErr", "TagLo" , "TagHi" , "ErrorEPC" , "*RES*" }; - - -// Type deffinition of our functions - -typedef char* (*TdisR3000AF)(u32 code, u32 pc); - -// These macros are used to assemble the disassembler functions -#define MakeDisFg(fn, b) char* fn(u32 code, u32 pc) { b; return ostr; } -#define MakeDisF(fn, b) \ - static char* fn(u32 code, u32 pc) { \ - sprintf (ostr, "%8.8x %8.8x:", pc, code); \ - b; /*ostr[(strlen(ostr) - 1)] = 0;*/ return ostr; \ - } - - -#include "r3000a.h" - -#undef _Funct_ -#undef _Rd_ -#undef _Rt_ -#undef _Rs_ -#undef _Sa_ -#undef _Im_ -#undef _Target_ - -#define _Funct_ ((code ) & 0x3F) // The funct part of the instruction register -#define _Rd_ ((code >> 11) & 0x1F) // The rd part of the instruction register -#define _Rt_ ((code >> 16) & 0x1F) // The rt part of the instruction register -#define _Rs_ ((code >> 21) & 0x1F) // The rs part of the instruction register -#define _Sa_ ((code >> 6) & 0x1F) // The sa part of the instruction register -#define _Im_ ( code & 0xFFFF) // The immediate part of the instruction register - -#define _Target_ ((pc & 0xf0000000) + ((code & 0x03ffffff) * 4)) -#define _Branch_ (pc + 4 + ((short)_Im_ * 4)) -#define _OfB_ _Im_, _nRs_ - -#define dName(i) sprintf(ostr, "%s %-7s,", ostr, i) -#define dGPR(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.r[i], disRNameGPR[i]) -#define dCP0(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.CP0.r[i], disRNameCP0[i]) -#define dCP2D(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.CP2D.r[i], disRNameCP2D[i]) -#define dCP2C(i) sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.CP2C.r[i], disRNameCP2C[i]) -#define dHI() sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.n.hi, "hi") -#define dLO() sprintf(ostr, "%s %8.8x (%s),", ostr, psxRegs.GPR.n.lo, "lo") -#define dImm() sprintf(ostr, "%s %4.4x (%d),", ostr, _Im_, _Im_) -#define dTarget() sprintf(ostr, "%s %8.8x,", ostr, _Target_) -#define dSa() sprintf(ostr, "%s %2.2x (%d),", ostr, _Sa_, _Sa_) -#define dOfB() sprintf(ostr, "%s %4.4x (%8.8x (%s)),", ostr, _Im_, psxRegs.GPR.r[_Rs_], disRNameGPR[_Rs_]) -#define dOffset() sprintf(ostr, "%s %8.8x,", ostr, _Branch_) -#define dCode() sprintf(ostr, "%s %8.8x,", ostr, (code >> 6) & 0xffffff) - -/********************************************************* -* Arithmetic with immediate operand * -* Format: OP rt, rs, immediate * -*********************************************************/ -MakeDisF(disADDI, dName("ADDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disADDIU, dName("ADDIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disANDI, dName("ANDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disORI, dName("ORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disSLTI, dName("SLTI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disSLTIU, dName("SLTIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) -MakeDisF(disXORI, dName("XORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) - -/********************************************************* -* Register arithmetic * -* Format: OP rd, rs, rt * -*********************************************************/ -MakeDisF(disADD, dName("ADD"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disADDU, dName("ADDU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disAND, dName("AND"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disNOR, dName("NOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disOR, dName("OR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disSLT, dName("SLT"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disSLTU, dName("SLTU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disSUB, dName("SUB"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disSUBU, dName("SUBU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disXOR, dName("XOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) - -/********************************************************* -* Register arithmetic & Register trap logic * -* Format: OP rs, rt * -*********************************************************/ -MakeDisF(disDIV, dName("DIV"); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disDIVU, dName("DIVU"); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disMULT, dName("MULT"); dGPR(_Rs_); dGPR(_Rt_);) -MakeDisF(disMULTU, dName("MULTU"); dGPR(_Rs_); dGPR(_Rt_);) - -/********************************************************* -* Register branch logic * -* Format: OP rs, offset * -*********************************************************/ -MakeDisF(disBGEZ, dName("BGEZ"); dGPR(_Rs_); dOffset();) -MakeDisF(disBGEZAL, dName("BGEZAL"); dGPR(_Rs_); dOffset();) -MakeDisF(disBGTZ, dName("BGTZ"); dGPR(_Rs_); dOffset();) -MakeDisF(disBLEZ, dName("BLEZ"); dGPR(_Rs_); dOffset();) -MakeDisF(disBLTZ, dName("BLTZ"); dGPR(_Rs_); dOffset();) -MakeDisF(disBLTZAL, dName("BLTZAL"); dGPR(_Rs_); dOffset();) - -/********************************************************* -* Shift arithmetic with constant shift * -* Format: OP rd, rt, sa * -*********************************************************/ -MakeDisF(disSLL, if (code) { dName("SLL"); dGPR(_Rd_); dGPR(_Rt_); dSa(); } else { dName("NOP"); }) -MakeDisF(disSRA, dName("SRA"); dGPR(_Rd_); dGPR(_Rt_); dSa();) -MakeDisF(disSRL, dName("SRL"); dGPR(_Rd_); dGPR(_Rt_); dSa();) - -/********************************************************* -* Shift arithmetic with variant register shift * -* Format: OP rd, rt, rs * -*********************************************************/ -MakeDisF(disSLLV, dName("SLLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) -MakeDisF(disSRAV, dName("SRAV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) -MakeDisF(disSRLV, dName("SRLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) - -/********************************************************* -* Load higher 16 bits of the first word in GPR with imm * -* Format: OP rt, immediate * -*********************************************************/ -MakeDisF(disLUI, dName("LUI"); dGPR(_Rt_); dImm();) - -/********************************************************* -* Move from HI/LO to GPR * -* Format: OP rd * -*********************************************************/ -MakeDisF(disMFHI, dName("MFHI"); dGPR(_Rd_); dHI();) -MakeDisF(disMFLO, dName("MFLO"); dGPR(_Rd_); dLO();) - -/********************************************************* -* Move from GPR to HI/LO * -* Format: OP rd * -*********************************************************/ -MakeDisF(disMTHI, dName("MTHI"); dHI(); dGPR(_Rs_);) -MakeDisF(disMTLO, dName("MTLO"); dLO(); dGPR(_Rs_);) - -/********************************************************* -* Special purpose instructions * -* Format: OP * -*********************************************************/ -MakeDisF(disBREAK, dName("BREAK")) -MakeDisF(disRFE, dName("RFE")) -MakeDisF(disSYSCALL, dName("SYSCALL")) -MakeDisF(disHLE, dName("HLE")) - - -MakeDisF(disRTPS, dName("RTPS")) -MakeDisF(disOP , dName("OP")) -MakeDisF(disNCLIP, dName("NCLIP")) -MakeDisF(disDPCS, dName("DPCS")) -MakeDisF(disINTPL, dName("INTPL")) -MakeDisF(disMVMVA, dName("MVMVA")) -MakeDisF(disNCDS , dName("NCDS")) -MakeDisF(disCDP , dName("CDP")) -MakeDisF(disNCDT , dName("NCDT")) -MakeDisF(disNCCS , dName("NCCS")) -MakeDisF(disCC , dName("CC")) -MakeDisF(disNCS , dName("NCS")) -MakeDisF(disNCT , dName("NCT")) -MakeDisF(disSQR , dName("SQR")) -MakeDisF(disDCPL , dName("DCPL")) -MakeDisF(disDPCT , dName("DPCT")) -MakeDisF(disAVSZ3, dName("AVSZ3")) -MakeDisF(disAVSZ4, dName("AVSZ4")) -MakeDisF(disRTPT , dName("RTPT")) -MakeDisF(disGPF , dName("GPF")) -MakeDisF(disGPL , dName("GPL")) -MakeDisF(disNCCT , dName("NCCT")) - -MakeDisF(disMFC2, dName("MFC2"); dGPR(_Rt_); dCP2C(_Rd_);) -MakeDisF(disMTC2, dName("MTC2"); dCP2C(_Rd_); dGPR(_Rt_);) -MakeDisF(disCFC2, dName("CFC2"); dGPR(_Rt_); dCP2C(_Rd_);) -MakeDisF(disCTC2, dName("CTC2"); dCP2C(_Rd_); dGPR(_Rt_);) - -/********************************************************* -* Register branch logic * -* Format: OP rs, rt, offset * -*********************************************************/ -MakeDisF(disBEQ, dName("BEQ"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) -MakeDisF(disBNE, dName("BNE"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) - -/********************************************************* -* Jump to target * -* Format: OP target * -*********************************************************/ -MakeDisF(disJ, dName("J"); dTarget();) -MakeDisF(disJAL, dName("JAL"); dTarget(); dGPR(31);) - -/********************************************************* -* Register jump * -* Format: OP rs, rd * -*********************************************************/ -MakeDisF(disJR, dName("JR"); dGPR(_Rs_);) -MakeDisF(disJALR, dName("JALR"); dGPR(_Rs_); dGPR(_Rd_)) - -/********************************************************* -* Load and store for GPR * -* Format: OP rt, offset(base) * -*********************************************************/ -MakeDisF(disLB, dName("LB"); dGPR(_Rt_); dOfB();) -MakeDisF(disLBU, dName("LBU"); dGPR(_Rt_); dOfB();) -MakeDisF(disLH, dName("LH"); dGPR(_Rt_); dOfB();) -MakeDisF(disLHU, dName("LHU"); dGPR(_Rt_); dOfB();) -MakeDisF(disLW, dName("LW"); dGPR(_Rt_); dOfB();) -MakeDisF(disLWL, dName("LWL"); dGPR(_Rt_); dOfB();) -MakeDisF(disLWR, dName("LWR"); dGPR(_Rt_); dOfB();) -MakeDisF(disLWC2, dName("LWC2"); dCP2D(_Rt_); dOfB();) -MakeDisF(disSB, dName("SB"); dGPR(_Rt_); dOfB();) -MakeDisF(disSH, dName("SH"); dGPR(_Rt_); dOfB();) -MakeDisF(disSW, dName("SW"); dGPR(_Rt_); dOfB();) -MakeDisF(disSWL, dName("SWL"); dGPR(_Rt_); dOfB();) -MakeDisF(disSWR, dName("SWR"); dGPR(_Rt_); dOfB();) -MakeDisF(disSWC2, dName("SWC2"); dCP2D(_Rt_); dOfB();) - -/********************************************************* -* Moves between GPR and COPx * -* Format: OP rt, fs * -*********************************************************/ -MakeDisF(disMFC0, dName("MFC0"); dGPR(_Rt_); dCP0(_Rd_);) -MakeDisF(disMTC0, dName("MTC0"); dCP0(_Rd_); dGPR(_Rt_);) -MakeDisF(disCFC0, dName("CFC0"); dGPR(_Rt_); dCP0(_Rd_);) -MakeDisF(disCTC0, dName("CTC0"); dCP0(_Rd_); dGPR(_Rt_);) - -/********************************************************* -* Unknow instruction (would generate an exception) * -* Format: ? * -*********************************************************/ -MakeDisF(disNULL, dName("*** Bad OP ***");) - - -TdisR3000AF disR3000A_SPECIAL[] = { // Subset of disSPECIAL - disSLL , disNULL , disSRL , disSRA , disSLLV , disNULL , disSRLV , disSRAV , - disJR , disJALR , disNULL, disNULL, disSYSCALL, disBREAK , disNULL , disNULL , - disMFHI, disMTHI , disMFLO, disMTLO, disNULL , disNULL , disNULL , disNULL , - disMULT, disMULTU, disDIV , disDIVU, disNULL , disNULL , disNULL , disNULL , - disADD , disADDU , disSUB , disSUBU, disAND , disOR , disXOR , disNOR , - disNULL, disNULL , disSLT , disSLTU, disNULL , disNULL , disNULL , disNULL , - disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL , - disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL}; - -MakeDisF(disSPECIAL, disR3000A_SPECIAL[_Funct_](code, pc)) - -TdisR3000AF disR3000A_BCOND[] = { // Subset of disBCOND - disBLTZ , disBGEZ , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disBLTZAL, disBGEZAL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; - -MakeDisF(disBCOND, disR3000A_BCOND[_Rt_](code, pc)) - -TdisR3000AF disR3000A_COP0[] = { // Subset of disCOP0 - disMFC0, disNULL, disCFC0, disNULL, disMTC0, disNULL, disCTC0, disNULL, - disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disRFE , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; - -MakeDisF(disCOP0, disR3000A_COP0[_Rs_](code, pc)) - -TdisR3000AF disR3000A_BASIC[] = { // Subset of disBASIC (based on rs) - disMFC2, disNULL, disCFC2, disNULL, disMTC2, disNULL, disCTC2, disNULL, - disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, - disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; - -MakeDisF(disBASIC, disR3000A_BASIC[_Rs_](code, pc)) - -TdisR3000AF disR3000A_COP2[] = { // Subset of disR3000F_COP2 (based on funct) - disBASIC, disRTPS , disNULL , disNULL , disNULL, disNULL , disNCLIP, disNULL, - disNULL , disNULL , disNULL , disNULL , disOP , disNULL , disNULL , disNULL, - disDPCS , disINTPL, disMVMVA, disNCDS , disCDP , disNULL , disNCDT , disNULL, - disNULL , disNULL , disNULL , disNCCS , disCC , disNULL , disNCS , disNULL, - disNCT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, - disSQR , disDCPL , disDPCT , disNULL , disNULL, disAVSZ3, disAVSZ4, disNULL, - disRTPT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, - disNULL , disNULL , disNULL , disNULL , disNULL, disGPF , disGPL , disNCCT }; - -MakeDisF(disCOP2, disR3000A_COP2[_Funct_](code, pc)) - -TdisR3000AF disR3000A[] = { - disSPECIAL , disBCOND , disJ , disJAL , disBEQ , disBNE , disBLEZ , disBGTZ , - disADDI , disADDIU , disSLTI , disSLTIU, disANDI, disORI , disXORI , disLUI , - disCOP0 , disNULL , disCOP2 , disNULL , disNULL, disNULL, disNULL , disNULL , - disNULL , disNULL , disNULL , disNULL , disNULL, disNULL, disNULL , disNULL , - disLB , disLH , disLWL , disLW , disLBU , disLHU , disLWR , disNULL , - disSB , disSH , disSWL , disSW , disNULL, disNULL, disSWR , disNULL , - disNULL , disNULL , disLWC2 , disNULL , disNULL, disNULL, disNULL , disNULL , - disNULL , disNULL , disSWC2 , disHLE , disNULL, disNULL, disNULL , disNULL }; - -MakeDisFg(disR3000AF, disR3000A[code >> 26](code, pc)) +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* R3000A disassembler. +*/ + +#include "psxcommon.h" + +char ostr[256]; + +// Names of registers +static char *disRNameGPR[] = { + "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", + "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", + "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"}; + +static char *disRNameCP2D[] = { + "VXY0", "VZ0", "VXY1", "VZ1", "VXY2", "VZ2", "RGB", "OTZ", + "IR0", "IR1", "IR2", "IR3", "SXY0", "SXY1", "SXY2", "SXYP", + "SZ0", "SZ1", "SZ2", "SZ3", "RGB0", "RGB1", "RGB2", "RES1", + "MAC0", "MAC1", "MAC2", "MAC3", "IRGB", "ORGB", "LZCS", "LZCR"}; + +static char *disRNameCP2C[] = { + "R11R12", "R13R21", "R22R23", "R31R32", "R33", "TRX", "TRY", "TRZ", + "L11L12", "L13L21", "L22L23", "L31L32", "L33", "RBK", "BBK", "GBK", + "LR1LR2", "LR3LG1", "LG2LG3", "LB1LB2", "LB3", "RFC", "GFC", "BFC", + "OFX", "OFY", "H", "DQA", "DQB", "ZSF3", "ZSF4", "FLAG"}; + +char *disRNameCP0[] = { + "Index" , "Random" , "EntryLo0", "EntryLo1", "Context" , "PageMask" , "Wired" , "*Check me*", + "BadVAddr" , "Count" , "EntryHi" , "Compare" , "Status" , "Cause" , "ExceptPC" , "PRevID" , + "Config" , "LLAddr" , "WatchLo" , "WatchHi" , "XContext", "*RES*" , "*RES*" , "*RES*" , + "*RES*" , "*RES* " , "PErr" , "CacheErr", "TagLo" , "TagHi" , "ErrorEPC" , "*RES*" }; + + +// Type deffinition of our functions + +typedef char* (*TdisR3000AF)(u32 code, u32 pc); + +// These macros are used to assemble the disassembler functions +#define MakeDisFg(fn, b) char* fn(u32 code, u32 pc) { return b; } +#define MakeDisF(fn, b) \ + static char* fn(u32 code, u32 pc) { \ + char *s = ostr+sprintf (ostr, "%8.8x %8.8x:", pc, code); \ + b; s[-1] = 0; return ostr; \ + } + + +#include "r3000a.h" + +#undef _Funct_ +#undef _Rd_ +#undef _Rt_ +#undef _Rs_ +#undef _Sa_ +#undef _Im_ +#undef _Target_ + +#define _Funct_ ((code ) & 0x3F) // The funct part of the instruction register +#define _Rd_ ((code >> 11) & 0x1F) // The rd part of the instruction register +#define _Rt_ ((code >> 16) & 0x1F) // The rt part of the instruction register +#define _Rs_ ((code >> 21) & 0x1F) // The rs part of the instruction register +#define _Sa_ ((code >> 6) & 0x1F) // The sa part of the instruction register +#define _Im_ ( code & 0xFFFF) // The immediate part of the instruction register + +#define _Target_ ((pc & 0xf0000000) + ((code & 0x03ffffff) * 4)) +#define _Branch_ (pc + 4 + ((short)_Im_ * 4)) +#define _OfB_ _Im_, _nRs_ + +#define dName(i) s+=sprintf(s, " %-7s ", i) +#define dGPR(i) s+=sprintf(s, " %8.8x (%d/%s),", psxRegs.GPR.r[i], i, disRNameGPR[i]) +#define dCP0(i) s+=sprintf(s, " %8.8x (%d/%s),", psxRegs.CP0.r[i], i, disRNameCP0[i]) +#define dCP2D(i) s+=sprintf(s, " %8.8x (%d/%s),", psxRegs.CP2D.r[i], i, disRNameCP2D[i]) +#define dCP2C(i) s+=sprintf(s, " %8.8x (%d/%s),", psxRegs.CP2C.r[i], i, disRNameCP2C[i]) +#define dHI() s+=sprintf(s, " %8.8x (hi),", psxRegs.GPR.n.hi) +#define dLO() s+=sprintf(s, " %8.8x (lo),", psxRegs.GPR.n.lo) +#define dImm() s+=sprintf(s, " %4.4x (%d),", _Im_, _Im_) +#define dTarget() s+=sprintf(s, " %8.8x,", _Target_) +#define dSa() s+=sprintf(s, " %2.2x (%d),", _Sa_, _Sa_) +#define dOfB() s+=sprintf(s, " %4.4x (%8.8x (%d/%s)),", _Im_, psxRegs.GPR.r[_Rs_], _Rs_, disRNameGPR[_Rs_]) +#define dOffset() s+=sprintf(s, " %8.8x,", _Branch_) +#define dCode() s+=sprintf(s, " %8.8x,", (code >> 6) & 0xffffff) + +/********************************************************* +* Arithmetic with immediate operand * +* Format: OP rt, rs, immediate * +*********************************************************/ +MakeDisF(disADDI, dName("ADDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disADDIU, dName("ADDIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disANDI, dName("ANDI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disORI, dName("ORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disSLTI, dName("SLTI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disSLTIU, dName("SLTIU"); dGPR(_Rt_); dGPR(_Rs_); dImm();) +MakeDisF(disXORI, dName("XORI"); dGPR(_Rt_); dGPR(_Rs_); dImm();) + +/********************************************************* +* Register arithmetic * +* Format: OP rd, rs, rt * +*********************************************************/ +MakeDisF(disADD, dName("ADD"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disADDU, dName("ADDU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disAND, dName("AND"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disNOR, dName("NOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disOR, dName("OR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSLT, dName("SLT"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSLTU, dName("SLTU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSUB, dName("SUB"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disSUBU, dName("SUBU"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disXOR, dName("XOR"); dGPR(_Rd_); dGPR(_Rs_); dGPR(_Rt_);) + +/********************************************************* +* Register arithmetic & Register trap logic * +* Format: OP rs, rt * +*********************************************************/ +MakeDisF(disDIV, dName("DIV"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disDIVU, dName("DIVU"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disMULT, dName("MULT"); dGPR(_Rs_); dGPR(_Rt_);) +MakeDisF(disMULTU, dName("MULTU"); dGPR(_Rs_); dGPR(_Rt_);) + +/********************************************************* +* Register branch logic * +* Format: OP rs, offset * +*********************************************************/ +MakeDisF(disBGEZ, dName("BGEZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBGEZAL, dName("BGEZAL"); dGPR(_Rs_); dOffset();) +MakeDisF(disBGTZ, dName("BGTZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLEZ, dName("BLEZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLTZ, dName("BLTZ"); dGPR(_Rs_); dOffset();) +MakeDisF(disBLTZAL, dName("BLTZAL"); dGPR(_Rs_); dOffset();) + +/********************************************************* +* Shift arithmetic with constant shift * +* Format: OP rd, rt, sa * +*********************************************************/ +MakeDisF(disSLL, if (code) { dName("SLL"); dGPR(_Rd_); dGPR(_Rt_); dSa(); } else { dName("NOP"); }) +MakeDisF(disSRA, dName("SRA"); dGPR(_Rd_); dGPR(_Rt_); dSa();) +MakeDisF(disSRL, dName("SRL"); dGPR(_Rd_); dGPR(_Rt_); dSa();) + +/********************************************************* +* Shift arithmetic with variant register shift * +* Format: OP rd, rt, rs * +*********************************************************/ +MakeDisF(disSLLV, dName("SLLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) +MakeDisF(disSRAV, dName("SRAV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) +MakeDisF(disSRLV, dName("SRLV"); dGPR(_Rd_); dGPR(_Rt_); dGPR(_Rs_);) + +/********************************************************* +* Load higher 16 bits of the first word in GPR with imm * +* Format: OP rt, immediate * +*********************************************************/ +MakeDisF(disLUI, dName("LUI"); dGPR(_Rt_); dImm();) + +/********************************************************* +* Move from HI/LO to GPR * +* Format: OP rd * +*********************************************************/ +MakeDisF(disMFHI, dName("MFHI"); dGPR(_Rd_); dHI();) +MakeDisF(disMFLO, dName("MFLO"); dGPR(_Rd_); dLO();) + +/********************************************************* +* Move from GPR to HI/LO * +* Format: OP rd * +*********************************************************/ +MakeDisF(disMTHI, dName("MTHI"); dHI(); dGPR(_Rs_);) +MakeDisF(disMTLO, dName("MTLO"); dLO(); dGPR(_Rs_);) + +/********************************************************* +* Special purpose instructions * +* Format: OP * +*********************************************************/ +MakeDisF(disBREAK, dName("BREAK")) +MakeDisF(disRFE, dName("RFE")) +MakeDisF(disSYSCALL, dName("SYSCALL")) +MakeDisF(disHLE, dName("HLE")) + + +MakeDisF(disRTPS, dName("RTPS")) +MakeDisF(disOP , dName("OP")) +MakeDisF(disNCLIP, dName("NCLIP")) +MakeDisF(disDPCS, dName("DPCS")) +MakeDisF(disINTPL, dName("INTPL")) +MakeDisF(disMVMVA, dName("MVMVA")) +MakeDisF(disNCDS , dName("NCDS")) +MakeDisF(disCDP , dName("CDP")) +MakeDisF(disNCDT , dName("NCDT")) +MakeDisF(disNCCS , dName("NCCS")) +MakeDisF(disCC , dName("CC")) +MakeDisF(disNCS , dName("NCS")) +MakeDisF(disNCT , dName("NCT")) +MakeDisF(disSQR , dName("SQR")) +MakeDisF(disDCPL , dName("DCPL")) +MakeDisF(disDPCT , dName("DPCT")) +MakeDisF(disAVSZ3, dName("AVSZ3")) +MakeDisF(disAVSZ4, dName("AVSZ4")) +MakeDisF(disRTPT , dName("RTPT")) +MakeDisF(disGPF , dName("GPF")) +MakeDisF(disGPL , dName("GPL")) +MakeDisF(disNCCT , dName("NCCT")) + +MakeDisF(disMFC2, dName("MFC2"); dGPR(_Rt_); dCP2C(_Rd_);) +MakeDisF(disMTC2, dName("MTC2"); dCP2C(_Rd_); dGPR(_Rt_);) +MakeDisF(disCFC2, dName("CFC2"); dGPR(_Rt_); dCP2C(_Rd_);) +MakeDisF(disCTC2, dName("CTC2"); dCP2C(_Rd_); dGPR(_Rt_);) + +/********************************************************* +* Register branch logic * +* Format: OP rs, rt, offset * +*********************************************************/ +MakeDisF(disBEQ, dName("BEQ"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) +MakeDisF(disBNE, dName("BNE"); dGPR(_Rs_); dGPR(_Rt_); dOffset();) + +/********************************************************* +* Jump to target * +* Format: OP target * +*********************************************************/ +MakeDisF(disJ, dName("J"); dTarget();) +MakeDisF(disJAL, dName("JAL"); dTarget(); dGPR(31);) + +/********************************************************* +* Register jump * +* Format: OP rs, rd * +*********************************************************/ +MakeDisF(disJR, dName("JR"); dGPR(_Rs_);) +MakeDisF(disJALR, dName("JALR"); dGPR(_Rs_); dGPR(_Rd_)) + +/********************************************************* +* Load and store for GPR * +* Format: OP rt, offset(base) * +*********************************************************/ +MakeDisF(disLB, dName("LB"); dGPR(_Rt_); dOfB();) +MakeDisF(disLBU, dName("LBU"); dGPR(_Rt_); dOfB();) +MakeDisF(disLH, dName("LH"); dGPR(_Rt_); dOfB();) +MakeDisF(disLHU, dName("LHU"); dGPR(_Rt_); dOfB();) +MakeDisF(disLW, dName("LW"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWL, dName("LWL"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWR, dName("LWR"); dGPR(_Rt_); dOfB();) +MakeDisF(disLWC2, dName("LWC2"); dCP2D(_Rt_); dOfB();) +MakeDisF(disSB, dName("SB"); dGPR(_Rt_); dOfB();) +MakeDisF(disSH, dName("SH"); dGPR(_Rt_); dOfB();) +MakeDisF(disSW, dName("SW"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWL, dName("SWL"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWR, dName("SWR"); dGPR(_Rt_); dOfB();) +MakeDisF(disSWC2, dName("SWC2"); dCP2D(_Rt_); dOfB();) + +/********************************************************* +* Moves between GPR and COPx * +* Format: OP rt, fs * +*********************************************************/ +MakeDisF(disMFC0, dName("MFC0"); dGPR(_Rt_); dCP0(_Rd_);) +MakeDisF(disMTC0, dName("MTC0"); dCP0(_Rd_); dGPR(_Rt_);) +MakeDisF(disCFC0, dName("CFC0"); dGPR(_Rt_); dCP0(_Rd_);) +MakeDisF(disCTC0, dName("CTC0"); dCP0(_Rd_); dGPR(_Rt_);) + +/********************************************************* +* Unknow instruction (would generate an exception) * +* Format: ? * +*********************************************************/ +MakeDisF(disNULL, dName("*** Bad OP ***");) + + +TdisR3000AF disR3000A_SPECIAL[] = { // Subset of disSPECIAL + disSLL , disNULL , disSRL , disSRA , disSLLV , disNULL , disSRLV , disSRAV , + disJR , disJALR , disNULL, disNULL, disSYSCALL, disBREAK , disNULL , disNULL , + disMFHI, disMTHI , disMFLO, disMTLO, disNULL , disNULL , disNULL , disNULL , + disMULT, disMULTU, disDIV , disDIVU, disNULL , disNULL , disNULL , disNULL , + disADD , disADDU , disSUB , disSUBU, disAND , disOR , disXOR , disNOR , + disNULL, disNULL , disSLT , disSLTU, disNULL , disNULL , disNULL , disNULL , + disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL , + disNULL, disNULL , disNULL, disNULL, disNULL , disNULL , disNULL , disNULL}; + +static MakeDisFg(disSPECIAL, disR3000A_SPECIAL[_Funct_](code, pc)) + +TdisR3000AF disR3000A_BCOND[] = { // Subset of disBCOND + disBLTZ , disBGEZ , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disBLTZAL, disBGEZAL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL , disNULL , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +static MakeDisFg(disBCOND, disR3000A_BCOND[_Rt_](code, pc)) + +TdisR3000AF disR3000A_COP0[] = { // Subset of disCOP0 + disMFC0, disNULL, disCFC0, disNULL, disMTC0, disNULL, disCTC0, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disRFE , disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +static MakeDisFg(disCOP0, disR3000A_COP0[_Rs_](code, pc)) + +TdisR3000AF disR3000A_BASIC[] = { // Subset of disBASIC (based on rs) + disMFC2, disNULL, disCFC2, disNULL, disMTC2, disNULL, disCTC2, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, + disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL, disNULL}; + +static MakeDisFg(disBASIC, disR3000A_BASIC[_Rs_](code, pc)) + +TdisR3000AF disR3000A_COP2[] = { // Subset of disR3000F_COP2 (based on funct) + disBASIC, disRTPS , disNULL , disNULL , disNULL, disNULL , disNCLIP, disNULL, + disNULL , disNULL , disNULL , disNULL , disOP , disNULL , disNULL , disNULL, + disDPCS , disINTPL, disMVMVA, disNCDS , disCDP , disNULL , disNCDT , disNULL, + disNULL , disNULL , disNULL , disNCCS , disCC , disNULL , disNCS , disNULL, + disNCT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, + disSQR , disDCPL , disDPCT , disNULL , disNULL, disAVSZ3, disAVSZ4, disNULL, + disRTPT , disNULL , disNULL , disNULL , disNULL, disNULL , disNULL , disNULL, + disNULL , disNULL , disNULL , disNULL , disNULL, disGPF , disGPL , disNCCT }; + +static MakeDisFg(disCOP2, disR3000A_COP2[_Funct_](code, pc)) + +TdisR3000AF disR3000A[] = { + disSPECIAL , disBCOND , disJ , disJAL , disBEQ , disBNE , disBLEZ , disBGTZ , + disADDI , disADDIU , disSLTI , disSLTIU, disANDI, disORI , disXORI , disLUI , + disCOP0 , disNULL , disCOP2 , disNULL , disNULL, disNULL, disNULL , disNULL , + disNULL , disNULL , disNULL , disNULL , disNULL, disNULL, disNULL , disNULL , + disLB , disLH , disLWL , disLW , disLBU , disLHU , disLWR , disNULL , + disSB , disSH , disSWL , disSW , disNULL, disNULL, disSWR , disNULL , + disNULL , disNULL , disLWC2 , disNULL , disNULL, disNULL, disNULL , disNULL , + disNULL , disNULL , disSWC2 , disHLE , disNULL, disNULL, disNULL , disNULL }; + +MakeDisFg(disR3000AF, disR3000A[code >> 26](code, pc)) diff --git a/libpcsxcore/ix86/iR3000A.c b/libpcsxcore/ix86/iR3000A.c index 39b434bf..291a1770 100644 --- a/libpcsxcore/ix86/iR3000A.c +++ b/libpcsxcore/ix86/iR3000A.c @@ -344,6 +344,7 @@ static void iDumpRegs() { void iDumpBlock(char *ptr) { FILE *f; u32 i; + char buf[100]; SysPrintf("dump1 %x:%x, %x\n", psxRegs.pc, pc, psxRegs.cycle); @@ -354,8 +355,8 @@ void iDumpBlock(char *ptr) { f = fopen("dump1", "w"); fwrite(ptr, 1, (u32)x86Ptr - (u32)ptr, f); fclose(f); - system("ndisasmw -u dump1"); - fflush(stdout); + sprintf(buf, "objdump -m i386 -M i386 -D -b binary --adjust-vma=0x%lx dump1", (unsigned long)ptr); + system(buf); } #define REC_FUNC(f) \ @@ -1551,9 +1552,6 @@ static void recLW() { resp+= 4; } -extern u32 LWL_MASK[4]; -extern u32 LWL_SHIFT[4]; - void iLWLk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -1703,9 +1701,6 @@ static void recLWBlock(int count) { resp = respsave; } -extern u32 LWR_MASK[4]; -extern u32 LWR_SHIFT[4]; - void iLWRk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -2051,9 +2046,6 @@ static void recSWBlock(int count) { resp = respsave; } -extern u32 SWL_MASK[4]; -extern u32 SWL_SHIFT[4]; - void iSWLk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -2133,9 +2125,6 @@ void recSWL() { resp+= 8; } -extern u32 SWR_MASK[4]; -extern u32 SWR_SHIFT[4]; - void iSWRk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); diff --git a/libpcsxcore/ix86/ix86.c b/libpcsxcore/ix86/ix86.c index 1525ac37..ef0e0d3a 100644 --- a/libpcsxcore/ix86/ix86.c +++ b/libpcsxcore/ix86/ix86.c @@ -54,7 +54,7 @@ void x86SetJ32(u32 *j32) { void x86Align(int bytes) { // fordward align - x86Ptr = (s8*)(((u32)x86Ptr + bytes) & ~(bytes - 1)); + x86Ptr = (s8*)(((u32)x86Ptr + bytes - 1) & ~(bytes - 1)); } #define SIB 4 diff --git a/libpcsxcore/ix86_64/iR3000A-64.c b/libpcsxcore/ix86_64/iR3000A-64.c index fe146589..7f9a35cb 100644 --- a/libpcsxcore/ix86_64/iR3000A-64.c +++ b/libpcsxcore/ix86_64/iR3000A-64.c @@ -354,9 +354,10 @@ static void iDumpRegs() { } } -void iDumpBlock(char *ptr) { +static void iDumpBlock(s8 *ptr) { FILE *f; u32 i; + char buf[200]; SysPrintf("dump1 %x:%x, %x\n", psxRegs.pc, pc, psxRegs.cycle); @@ -364,11 +365,31 @@ void iDumpBlock(char *ptr) { SysPrintf("%s\n", disR3000AF(PSXMu32(i), i)); fflush(stdout); +#if 1 f = fopen("dump1", "w"); - fwrite(ptr, 1, (uptr)x86Ptr - (uptr)ptr, f); - fclose(f); - //system("ndisasm -b64 dump1"); - fflush(stdout); + if(f) { + /* errors don't really matter, but gcc complains if ignored */ + int err; + err = fwrite(ptr, (uptr)x86Ptr - (uptr)ptr, 1, f) != 1; + err = fclose(f) != 0 || err; + if(!err) { + sprintf(buf, "objdump -m i386 -M x86-64 -D -b binary --adjust-vma=0x%lx dump1", (unsigned long)ptr); + err = system(buf); + } else + perror("dump1"); + remove("dump1"); + } +#else + /* probably pointless; branch targets are still not symbols */ + sprintf(buf, + "gdb --batch --quiet" + " -ex 'set verbose 0'" + " -ex 'set confirm 0'" + " -ex 'attach %d'" + " -ex 'disas/r %p,%p'" + , getpid(), ptr, x86Ptr - 1); + system(buf); +#endif } #define REC_FUNC(f) \ diff --git a/libpcsxcore/ix86_64/ix86-64.c b/libpcsxcore/ix86_64/ix86-64.c index 582b3a40..31ae8ea8 100644 --- a/libpcsxcore/ix86_64/ix86-64.c +++ b/libpcsxcore/ix86_64/ix86-64.c @@ -119,7 +119,7 @@ void CheckX86Ptr( void ) { } -void writeVAROP(unsigned opl, u64 op) +static void writeVAROP(unsigned opl, u64 op) { while (opl--) { @@ -177,14 +177,14 @@ void SET8R( int cc, int to ) write8( 0xC0 | ( to ) ); } -u8* J8Rel( int cc, int to ) +u8* J8Rel( int cc, u8 to ) { write8( cc ); write8( to ); - return x86Ptr - 1; + return (u8 *)x86Ptr - 1; } -u16* J16Rel( int cc, u32 to ) +u16* J16Rel( int cc, u16 to ) { write16( 0x0F66 ); write8( cc ); @@ -214,7 +214,7 @@ void CMOV32MtoR( int cc, x86IntRegType to, uptr from ) } //////////////////////////////////////////////////// -void x86SetPtr( char* ptr ) +void x86SetPtr( s8* ptr ) { x86Ptr = ptr; } @@ -2364,7 +2364,7 @@ u8* JMP8( u8 to ) { write8( 0xEB ); write8( to ); - return x86Ptr - 1; + return (u8 *)x86Ptr - 1; } /* jmp rel32 */ @@ -2687,7 +2687,7 @@ void CMP64I32toR( x86IntRegType to, u32 from ) /* cmp m64 to r64 */ void CMP64MtoR( x86IntRegType to, uptr from ) { - MEMADDR_OP(1, VAROP1(0x3B), true, 2, from, 0); + MEMADDR_OP(1, VAROP1(0x3B), true, to, from, 0); } // cmp r64 to r64 @@ -2935,7 +2935,7 @@ void SETG8R( x86IntRegType to ) { SET8R(0x9f, to); } // seta r8 void SETA8R( x86IntRegType to ) { SET8R(0x97, to); } // setae r8 -void SETAE8R( x86IntRegType to ) { SET8R(0x99, to); } +void SETAE8R( x86IntRegType to ) { SET8R(0x93, to); } /* setb r8 */ void SETB8R( x86IntRegType to ) { SET8R( 0x92, to ); } /* setb r8 */ diff --git a/libpcsxcore/ix86_64/ix86-64.h b/libpcsxcore/ix86_64/ix86-64.h index 009fa5a1..95945a0f 100644 --- a/libpcsxcore/ix86_64/ix86-64.h +++ b/libpcsxcore/ix86_64/ix86-64.h @@ -191,9 +191,9 @@ typedef struct { u32 x86Flags; // Feature Flags u32 x86EFlags; // Extended Feature Flags //all the above returns hex values - s8 x86ID[16]; // Vendor ID //the vendor creator (in %s) - s8 x86Type[20]; //cpu type in char format //the cpu type (in %s) - s8 x86Fam[50]; // family in char format //the original cpu name string (in %s) + char x86ID[16]; // Vendor ID //the vendor creator (in %s) + char x86Type[20]; //cpu type in char format //the cpu type (in %s) + char x86Fam[50]; // family in char format //the original cpu name string (in %s) u32 cpuspeed; // speed of cpu //this will give cpu speed (in %d) } CPUINFO; @@ -228,7 +228,7 @@ extern u32 *j32Ptr[32]; #define RexB(w, base) RexRXB(w, 0, 0, base) #define RexRB(w, reg, base) RexRXB(w, reg, 0, base) -void x86SetPtr( char *ptr ); +void x86SetPtr( s8 *ptr ); void x86Shutdown( void ); void x86SetJ8( u8 *j8 ); @@ -245,7 +245,8 @@ u64 GetCPUTick( void ); #define ModRM(mod, rm, reg) write8( ( mod << 6 ) | ( (rm & 7) << 3 ) | ( reg & 7 ) ) #define SibSB(ss, rm, index) write8( ( ss << 6 ) | ( rm << 3 ) | ( index ) ) void SET8R( int cc, int to ); -u8* J8Rel( int cc, int to ); +u8* J8Rel( int cc, u8 to ); +u16* J16Rel( int cc, u16 to ); u32* J32Rel( int cc, u32 to ); void CMOV32RtoR( int cc, int to, int from ); void CMOV32MtoR( int cc, int to, uptr from ); @@ -478,6 +479,8 @@ void CMOVLE32MtoR( x86IntRegType to, uptr from ); void ADD64ItoR( x86IntRegType to, u32 from ); // add m64 to r64 void ADD64MtoR( x86IntRegType to, uptr from ); +// add r64 to r64 +void ADD64RtoR( x86IntRegType to, x86IntRegType from ); // add imm32 to r32 void ADD32ItoR( x86IntRegType to, u32 from ); @@ -529,6 +532,7 @@ void INC16M( uptr to ); // sub m64 to r64 void SUB64MtoR( x86IntRegType to, uptr from ); void SUB64ItoR( x86IntRegType to, u32 from ); +void SUB64RtoR( x86IntRegType to, x86IntRegType from ); // sub imm32 to r32 void SUB32ItoR( x86IntRegType to, u32 from ); @@ -795,6 +799,10 @@ u8* JMP8( u8 to ); // jmp rel32 u32* JMP32( uptr to ); + +// jump rel8/rel32 (back jump only) +u8* JMP( uptr to ); + // jmp r32 (r64 if __x86_64__) void JMPR( x86IntRegType to ); // jmp m32 @@ -1751,6 +1759,7 @@ void SSE2EMU_MOVD_XMM_to_M32( uptr to, x86SSERegType from ); void SSE2EMU_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ); //////////////////////////////////////////////////// +void CheckX86Ptr(void); #ifdef _DEBUG #define WRITECHECK() CheckX86Ptr() #else @@ -1769,6 +1778,9 @@ void SSE2EMU_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from ); #define write32( val ) writeVAL((u32)(val)) #define write64( val ) writeVAL((u64)(val)) +void WriteRmOffset(x86IntRegType to, int offset); +void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset); + #ifdef __cplusplus } #endif diff --git a/libpcsxcore/ix86_64/ix86_cpudetect.c b/libpcsxcore/ix86_64/ix86_cpudetect.c index 664e6b7d..76305974 100644 --- a/libpcsxcore/ix86_64/ix86_cpudetect.c +++ b/libpcsxcore/ix86_64/ix86_cpudetect.c @@ -1,492 +1,492 @@ -/* Cpudetection lib - * Copyright (C) 2002-2003 Pcsx2 Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA - */ - -#ifdef __x86_64__ - -#if defined (_WIN32) -#include -#endif - -#include -#include - -#include "ix86-64.h" - -#if defined (_MSC_VER) && _MSC_VER >= 1400 - - void __cpuid(int* CPUInfo, int InfoType); - unsigned __int64 __rdtsc(); - - #pragma intrinsic(__cpuid) - #pragma intrinsic(__rdtsc) - -#endif - -CAPABILITIES cpucaps; -CPUINFO cpuinfo; - -#define cpuid(cmd,a,b,c,d) \ - __asm__ __volatile__("cpuid" \ - : "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "0" (cmd)) - -static s32 iCpuId( u32 cmd, u32 *regs ) -{ - int flag=1; - -#if defined (_MSC_VER) && _MSC_VER >= 1400 - - __cpuid( regs, cmd ); - - return 0; - -#elif defined (_MSC_VER) - -#ifdef __x86_64__ - assert(0); -#else // __x86_64__ - __asm - { - push ebx; - push edi; - - pushfd; - pop eax; - mov edx, eax; - xor eax, 1 << 21; - push eax; - popfd; - pushfd; - pop eax; - xor eax, edx; - mov flag, eax; - } - if ( ! flag ) - { - return -1; - } - - __asm - { - mov eax, cmd; - cpuid; - mov edi, [regs] - mov [edi], eax; - mov [edi+4], ebx; - mov [edi+8], ecx; - mov [edi+12], edx; - - pop edi; - pop ebx; - } -#endif // __x86_64__ - return 0; - - -#else - -#ifndef __x86_64__ - // see if we can use cpuid - __asm__ __volatile__ ( - "sub $0x18, %%esp\n" - "pushf\n" - "pop %%eax\n" - "mov %%eax, %%edx\n" - "xor $0x200000, %%eax\n" - "push %%eax\n" - "popf\n" - "pushf\n" - "pop %%eax\n" - "xor %%edx, %%eax\n" - "mov %%eax, %0\n" - "add $0x18, %%esp\n" - : "=r"(flag) : - ); -#endif - - if ( !flag ) - return -1; - - cpuid(cmd, regs[0], regs[1], regs[2], regs[3]); - return 0; -#endif // _MSC_VER -} - -u64 GetCPUTick( void ) -{ -#if defined (_MSC_VER) && _MSC_VER >= 1400 - - return __rdtsc(); - -#elif defined(__MSCW32__) && !defined(__x86_64__) - - __asm rdtsc; - -#else - - u32 _a, _d; - __asm__ __volatile__ ("rdtsc" : "=a"(_a), "=d"(_d)); - return (u64)_a | ((u64)_d << 32); - -#endif -} - -#if defined(__LINUX__) || defined(__APPLE__) - -#include -#include -//* -unsigned long timeGetTime2() -{ - struct timeval tv; - gettimeofday(&tv, 0); // well, maybe there are better ways - return (unsigned long)tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works -} -//*/ -#endif - -s64 CPUSpeedHz( unsigned int time ) -{ - s64 timeStart, - timeStop; - s64 startTick, - endTick; - s64 overhead; - - if( ! cpucaps.hasTimeStampCounter ) - { - return 0; //check if function is supported - } - - overhead = GetCPUTick() - GetCPUTick(); - - timeStart = timeGetTime2( ); - while( timeGetTime2( ) == timeStart ) - { - timeStart = timeGetTime2( ); - } - for(;;) - { - timeStop = timeGetTime2( ); - if ( ( timeStop - timeStart ) > 1 ) - { - startTick = GetCPUTick( ); - break; - } - } - - timeStart = timeStop; - for(;;) - { - timeStop = timeGetTime2( ); - if ( ( timeStop - timeStart ) > time ) - { - endTick = GetCPUTick( ); - break; - } - } - - return (s64)( ( endTick - startTick ) + ( overhead ) ); -} - -//////////////////////////////////////////////////// -void cpudetectInit( void ) -{ - u32 regs[ 4 ]; - u32 cmds; - u32 AMDspeed; - s8 AMDspeedString[10]; - int cputype=0; // Cpu type - //AMD 64 STUFF - u32 x86_64_8BITBRANDID; - u32 x86_64_12BITBRANDID; - memset( cpuinfo.x86ID, 0, sizeof( cpuinfo.x86ID ) ); - cpuinfo.x86Family = 0; - cpuinfo.x86Model = 0; - cpuinfo.x86PType = 0; - cpuinfo.x86StepID = 0; - cpuinfo.x86Flags = 0; - cpuinfo.x86EFlags = 0; - - if ( iCpuId( 0, regs ) == -1 ) return; - - cmds = regs[ 0 ]; - ((u32*)cpuinfo.x86ID)[ 0 ] = regs[ 1 ]; - ((u32*)cpuinfo.x86ID)[ 1 ] = regs[ 3 ]; - ((u32*)cpuinfo.x86ID)[ 2 ] = regs[ 2 ]; - if ( cmds >= 0x00000001 ) - { - if ( iCpuId( 0x00000001, regs ) != -1 ) - { - cpuinfo.x86StepID = regs[ 0 ] & 0xf; - cpuinfo.x86Model = (regs[ 0 ] >> 4) & 0xf; - cpuinfo.x86Family = (regs[ 0 ] >> 8) & 0xf; - cpuinfo.x86PType = (regs[ 0 ] >> 12) & 0x3; - x86_64_8BITBRANDID = regs[1] & 0xff; - cpuinfo.x86Flags = regs[ 3 ]; - } - } - if ( iCpuId( 0x80000000, regs ) != -1 ) - { - cmds = regs[ 0 ]; - if ( cmds >= 0x80000001 ) - { - if ( iCpuId( 0x80000001, regs ) != -1 ) - { - x86_64_12BITBRANDID = regs[1] & 0xfff; - cpuinfo.x86EFlags = regs[ 3 ]; - - } - } - } - switch(cpuinfo.x86PType) - { - case 0: - strcpy( cpuinfo.x86Type, "Standard OEM"); - break; - case 1: - strcpy( cpuinfo.x86Type, "Overdrive"); - break; - case 2: - strcpy( cpuinfo.x86Type, "Dual"); - break; - case 3: - strcpy( cpuinfo.x86Type, "Reserved"); - break; - default: - strcpy( cpuinfo.x86Type, "Unknown"); - break; - } - if ( cpuinfo.x86ID[ 0 ] == 'G' ){ cputype=0;}//trick lines but if you know a way better ;p - if ( cpuinfo.x86ID[ 0 ] == 'A' ){ cputype=1;} - - if ( cputype == 0 ) //intel cpu - { - if( ( cpuinfo.x86Family >= 7 ) && ( cpuinfo.x86Family < 15 ) ) - { - strcpy( cpuinfo.x86Fam, "Intel P6 family (Not PIV and Higher then PPro" ); - } - else - { - switch( cpuinfo.x86Family ) - { - // Start at 486 because if it's below 486 there is no cpuid instruction - case 4: - strcpy( cpuinfo.x86Fam, "Intel 486" ); - break; - case 5: - switch( cpuinfo.x86Model ) - { - case 4: - case 8: // 0.25 µm - strcpy( cpuinfo.x86Fam, "Intel Pentium (MMX)"); - break; - default: - strcpy( cpuinfo.x86Fam, "Intel Pentium" ); - } - break; - case 6: - switch( cpuinfo.x86Model ) - { - case 0: // Pentium pro (P6 A-Step) - case 1: // Pentium pro - strcpy( cpuinfo.x86Fam, "Intel Pentium Pro" ); - break; - - case 2: // 66 MHz FSB - case 5: // Xeon/Celeron (0.25 µm) - case 6: // Internal L2 cache - strcpy( cpuinfo.x86Fam, "Intel Pentium II" ); - break; - - case 7: // Xeon external L2 cache - case 8: // Xeon/Celeron with 256 KB on-die L2 cache - case 10: // Xeon/Celeron with 1 or 2 MB on-die L2 cache - case 11: // Xeon/Celeron with Tualatin core, on-die cache - strcpy( cpuinfo.x86Fam, "Intel Pentium III" ); - break; - case 15: // Core 2 Duo Allendale/Conroe - strcpy( cpuinfo.x86Fam, "Intel Core 2 Duo" ); - break; - - default: - strcpy( cpuinfo.x86Fam, "Intel Pentium Pro (Unknown)" ); - } - break; - case 15: - switch( cpuinfo.x86Model ) - { - case 0: // Willamette (A-Step) - case 1: // Willamette - strcpy( cpuinfo.x86Fam, "Willamette Intel Pentium IV" ); - break; - case 2: // Northwood - strcpy( cpuinfo.x86Fam, "Northwood Intel Pentium IV" ); - break; - - default: - strcpy( cpuinfo.x86Fam, "Intel Pentium IV (Unknown)" ); - break; - } - break; - default: - strcpy( cpuinfo.x86Fam, "Unknown Intel CPU" ); - } - } - } - else if ( cputype == 1 ) //AMD cpu - { - if( cpuinfo.x86Family >= 7 ) - { - if((x86_64_12BITBRANDID !=0) || (x86_64_8BITBRANDID !=0)) - { - if(x86_64_8BITBRANDID == 0 ) - { - switch((x86_64_12BITBRANDID >>6)& 0x3f) - { - case 4: - strcpy(cpuinfo.x86Fam,"AMD Athlon(tm) 64 Processor"); - AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); - //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); - sprintf(AMDspeedString," %d",AMDspeed); - strcat(AMDspeedString,"00+"); - strcat(cpuinfo.x86Fam,AMDspeedString); - break; - case 12: - strcpy(cpuinfo.x86Fam,"AMD Opteron(tm) Processor"); - break; - case 5: - strcpy( cpuinfo.x86Fam, "AMD Athlon X2 Processor" ); - AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); - //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); - sprintf(AMDspeedString," %d",AMDspeed); - strcat(AMDspeedString,"00+"); - strcat(cpuinfo.x86Fam,AMDspeedString); - break; - case 44: - strcpy( cpuinfo.x86Fam, "AMD Opteron(tm) Dual Core Processor" ); - break; - default: - strcpy(cpuinfo.x86Fam,"Unknown AMD 64 proccesor"); - - } - } - else //8bit brand id is non zero - { - strcpy(cpuinfo.x86Fam,"Unsupported yet AMD64 cpu"); - } - } - else - { - strcpy( cpuinfo.x86Fam, "AMD K7+ Processor" ); - } - } - else - { - switch ( cpuinfo.x86Family ) - { - case 4: - switch( cpuinfo.x86Model ) - { - case 14: - case 15: // Write-back enhanced - strcpy( cpuinfo.x86Fam, "AMD 5x86 Processor" ); - break; - - case 3: // DX2 - case 7: // Write-back enhanced DX2 - case 8: // DX4 - case 9: // Write-back enhanced DX4 - strcpy( cpuinfo.x86Fam, "AMD 486 Processor" ); - break; - - - default: - strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); - - } - break; - - case 5: - switch( cpuinfo.x86Model) - { - case 0: // SSA 5 (75, 90 and 100 Mhz) - case 1: // 5k86 (PR 120 and 133 MHz) - case 2: // 5k86 (PR 166 MHz) - case 3: // K5 5k86 (PR 200 MHz) - strcpy( cpuinfo.x86Fam, "AMD K5 Processor" ); - break; - - case 6: - case 7: // (0.25 µm) - case 8: // K6-2 - case 9: // K6-III - case 14: // K6-2+ / K6-III+ - strcpy( cpuinfo.x86Fam, "AMD K6 Series Processor" ); - break; - - default: - strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); - } - break; - case 6: - strcpy( cpuinfo.x86Fam, "AMD Athlon XP Processor" ); - break; - default: - strcpy( cpuinfo.x86Fam, "Unknown AMD CPU" ); - } - } - } - //capabilities - cpucaps.hasFloatingPointUnit = ( cpuinfo.x86Flags >> 0 ) & 1; - cpucaps.hasVirtual8086ModeEnhancements = ( cpuinfo.x86Flags >> 1 ) & 1; - cpucaps.hasDebuggingExtensions = ( cpuinfo.x86Flags >> 2 ) & 1; - cpucaps.hasPageSizeExtensions = ( cpuinfo.x86Flags >> 3 ) & 1; - cpucaps.hasTimeStampCounter = ( cpuinfo.x86Flags >> 4 ) & 1; - cpucaps.hasModelSpecificRegisters = ( cpuinfo.x86Flags >> 5 ) & 1; - cpucaps.hasPhysicalAddressExtension = ( cpuinfo.x86Flags >> 6 ) & 1; - cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 7 ) & 1; - cpucaps.hasCOMPXCHG8BInstruction = ( cpuinfo.x86Flags >> 8 ) & 1; - cpucaps.hasAdvancedProgrammableInterruptController = ( cpuinfo.x86Flags >> 9 ) & 1; - cpucaps.hasSEPFastSystemCall = ( cpuinfo.x86Flags >> 11 ) & 1; - cpucaps.hasMemoryTypeRangeRegisters = ( cpuinfo.x86Flags >> 12 ) & 1; - cpucaps.hasPTEGlobalFlag = ( cpuinfo.x86Flags >> 13 ) & 1; - cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 14 ) & 1; - cpucaps.hasConditionalMoveAndCompareInstructions = ( cpuinfo.x86Flags >> 15 ) & 1; - cpucaps.hasFGPageAttributeTable = ( cpuinfo.x86Flags >> 16 ) & 1; - cpucaps.has36bitPageSizeExtension = ( cpuinfo.x86Flags >> 17 ) & 1; - cpucaps.hasProcessorSerialNumber = ( cpuinfo.x86Flags >> 18 ) & 1; - cpucaps.hasCFLUSHInstruction = ( cpuinfo.x86Flags >> 19 ) & 1; - cpucaps.hasDebugStore = ( cpuinfo.x86Flags >> 21 ) & 1; - cpucaps.hasACPIThermalMonitorAndClockControl = ( cpuinfo.x86Flags >> 22 ) & 1; - cpucaps.hasMultimediaExtensions = ( cpuinfo.x86Flags >> 23 ) & 1; //mmx - cpucaps.hasFastStreamingSIMDExtensionsSaveRestore = ( cpuinfo.x86Flags >> 24 ) & 1; - cpucaps.hasStreamingSIMDExtensions = ( cpuinfo.x86Flags >> 25 ) & 1; //sse - cpucaps.hasStreamingSIMD2Extensions = ( cpuinfo.x86Flags >> 26 ) & 1; //sse2 - cpucaps.hasSelfSnoop = ( cpuinfo.x86Flags >> 27 ) & 1; - cpucaps.hasHyperThreading = ( cpuinfo.x86Flags >> 28 ) & 1; - cpucaps.hasThermalMonitor = ( cpuinfo.x86Flags >> 29 ) & 1; - cpucaps.hasIntel64BitArchitecture = ( cpuinfo.x86Flags >> 30 ) & 1; - //that is only for AMDs - cpucaps.hasMultimediaExtensionsExt = ( cpuinfo.x86EFlags >> 22 ) & 1; //mmx2 - cpucaps.hasAMD64BitArchitecture = ( cpuinfo.x86EFlags >> 29 ) & 1; //64bit cpu - cpucaps.has3DNOWInstructionExtensionsExt = ( cpuinfo.x86EFlags >> 30 ) & 1; //3dnow+ - cpucaps.has3DNOWInstructionExtensions = ( cpuinfo.x86EFlags >> 31 ) & 1; //3dnow - cpuinfo.cpuspeed = (u32 )(CPUSpeedHz( 1000 ) / 1000000); -} - -#endif +/* Cpudetection lib + * Copyright (C) 2002-2003 Pcsx2 Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA + */ + +#ifdef __x86_64__ + +#if defined (_WIN32) +#include +#endif + +#include +#include + +#include "ix86-64.h" + +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + void __cpuid(int* CPUInfo, int InfoType); + unsigned __int64 __rdtsc(); + + #pragma intrinsic(__cpuid) + #pragma intrinsic(__rdtsc) + +#endif + +CAPABILITIES cpucaps; +CPUINFO cpuinfo; + +#define cpuid(cmd,a,b,c,d) \ + __asm__ __volatile__("cpuid" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "0" (cmd)) + +static s32 iCpuId( u32 cmd, u32 *regs ) +{ + int flag=1; + +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + __cpuid( regs, cmd ); + + return 0; + +#elif defined (_MSC_VER) + +#ifdef __x86_64__ + assert(0); +#else // __x86_64__ + __asm + { + push ebx; + push edi; + + pushfd; + pop eax; + mov edx, eax; + xor eax, 1 << 21; + push eax; + popfd; + pushfd; + pop eax; + xor eax, edx; + mov flag, eax; + } + if ( ! flag ) + { + return -1; + } + + __asm + { + mov eax, cmd; + cpuid; + mov edi, [regs] + mov [edi], eax; + mov [edi+4], ebx; + mov [edi+8], ecx; + mov [edi+12], edx; + + pop edi; + pop ebx; + } +#endif // __x86_64__ + return 0; + + +#else + +#ifndef __x86_64__ + // see if we can use cpuid + __asm__ __volatile__ ( + "sub $0x18, %%esp\n" + "pushf\n" + "pop %%eax\n" + "mov %%eax, %%edx\n" + "xor $0x200000, %%eax\n" + "push %%eax\n" + "popf\n" + "pushf\n" + "pop %%eax\n" + "xor %%edx, %%eax\n" + "mov %%eax, %0\n" + "add $0x18, %%esp\n" + : "=r"(flag) : + ); +#endif + + if ( !flag ) + return -1; + + cpuid(cmd, regs[0], regs[1], regs[2], regs[3]); + return 0; +#endif // _MSC_VER +} + +u64 GetCPUTick( void ) +{ +#if defined (_MSC_VER) && _MSC_VER >= 1400 + + return __rdtsc(); + +#elif defined(__MSCW32__) && !defined(__x86_64__) + + __asm rdtsc; + +#else + + u32 _a, _d; + __asm__ __volatile__ ("rdtsc" : "=a"(_a), "=d"(_d)); + return (u64)_a | ((u64)_d << 32); + +#endif +} + +#if defined(__LINUX__) || defined(__APPLE__) + +#include +#include +//* +static unsigned long timeGetTime2() +{ + struct timeval tv; + gettimeofday(&tv, 0); // well, maybe there are better ways + return (unsigned long)tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works +} +//*/ +#endif + +static s64 CPUSpeedHz( unsigned int time ) +{ + s64 timeStart, + timeStop; + s64 startTick, + endTick; + s64 overhead; + + if( ! cpucaps.hasTimeStampCounter ) + { + return 0; //check if function is supported + } + + overhead = GetCPUTick() - GetCPUTick(); + + timeStart = timeGetTime2( ); + while( timeGetTime2( ) == timeStart ) + { + timeStart = timeGetTime2( ); + } + for(;;) + { + timeStop = timeGetTime2( ); + if ( ( timeStop - timeStart ) > 1 ) + { + startTick = GetCPUTick( ); + break; + } + } + + timeStart = timeStop; + for(;;) + { + timeStop = timeGetTime2( ); + if ( ( timeStop - timeStart ) > time ) + { + endTick = GetCPUTick( ); + break; + } + } + + return (s64)( ( endTick - startTick ) + ( overhead ) ); +} + +//////////////////////////////////////////////////// +void cpudetectInit( void ) +{ + u32 regs[ 4 ]; + u32 cmds; + u32 AMDspeed; + char AMDspeedString[10]; + int cputype=0; // Cpu type + //AMD 64 STUFF + u32 x86_64_8BITBRANDID = 0; + u32 x86_64_12BITBRANDID = 0; + memset( cpuinfo.x86ID, 0, sizeof( cpuinfo.x86ID ) ); + cpuinfo.x86Family = 0; + cpuinfo.x86Model = 0; + cpuinfo.x86PType = 0; + cpuinfo.x86StepID = 0; + cpuinfo.x86Flags = 0; + cpuinfo.x86EFlags = 0; + + if ( iCpuId( 0, regs ) == -1 ) return; + + cmds = regs[ 0 ]; + ((u32*)cpuinfo.x86ID)[ 0 ] = regs[ 1 ]; + ((u32*)cpuinfo.x86ID)[ 1 ] = regs[ 3 ]; + ((u32*)cpuinfo.x86ID)[ 2 ] = regs[ 2 ]; + if ( cmds >= 0x00000001 ) + { + if ( iCpuId( 0x00000001, regs ) != -1 ) + { + cpuinfo.x86StepID = regs[ 0 ] & 0xf; + cpuinfo.x86Model = (regs[ 0 ] >> 4) & 0xf; + cpuinfo.x86Family = (regs[ 0 ] >> 8) & 0xf; + cpuinfo.x86PType = (regs[ 0 ] >> 12) & 0x3; + x86_64_8BITBRANDID = regs[1] & 0xff; + cpuinfo.x86Flags = regs[ 3 ]; + } + } + if ( iCpuId( 0x80000000, regs ) != -1 ) + { + cmds = regs[ 0 ]; + if ( cmds >= 0x80000001 ) + { + if ( iCpuId( 0x80000001, regs ) != -1 ) + { + x86_64_12BITBRANDID = regs[1] & 0xfff; + cpuinfo.x86EFlags = regs[ 3 ]; + + } + } + } + switch(cpuinfo.x86PType) + { + case 0: + strcpy( cpuinfo.x86Type, "Standard OEM"); + break; + case 1: + strcpy( cpuinfo.x86Type, "Overdrive"); + break; + case 2: + strcpy( cpuinfo.x86Type, "Dual"); + break; + case 3: + strcpy( cpuinfo.x86Type, "Reserved"); + break; + default: + strcpy( cpuinfo.x86Type, "Unknown"); + break; + } + if ( cpuinfo.x86ID[ 0 ] == 'G' ){ cputype=0;}//trick lines but if you know a way better ;p + if ( cpuinfo.x86ID[ 0 ] == 'A' ){ cputype=1;} + + if ( cputype == 0 ) //intel cpu + { + if( ( cpuinfo.x86Family >= 7 ) && ( cpuinfo.x86Family < 15 ) ) + { + strcpy( cpuinfo.x86Fam, "Intel P6 family (Not PIV and Higher then PPro" ); + } + else + { + switch( cpuinfo.x86Family ) + { + // Start at 486 because if it's below 486 there is no cpuid instruction + case 4: + strcpy( cpuinfo.x86Fam, "Intel 486" ); + break; + case 5: + switch( cpuinfo.x86Model ) + { + case 4: + case 8: // 0.25 �m + strcpy( cpuinfo.x86Fam, "Intel Pentium (MMX)"); + break; + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium" ); + } + break; + case 6: + switch( cpuinfo.x86Model ) + { + case 0: // Pentium pro (P6 A-Step) + case 1: // Pentium pro + strcpy( cpuinfo.x86Fam, "Intel Pentium Pro" ); + break; + + case 2: // 66 MHz FSB + case 5: // Xeon/Celeron (0.25 �m) + case 6: // Internal L2 cache + strcpy( cpuinfo.x86Fam, "Intel Pentium II" ); + break; + + case 7: // Xeon external L2 cache + case 8: // Xeon/Celeron with 256 KB on-die L2 cache + case 10: // Xeon/Celeron with 1 or 2 MB on-die L2 cache + case 11: // Xeon/Celeron with Tualatin core, on-die cache + strcpy( cpuinfo.x86Fam, "Intel Pentium III" ); + break; + case 15: // Core 2 Duo Allendale/Conroe + strcpy( cpuinfo.x86Fam, "Intel Core 2 Duo" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium Pro (Unknown)" ); + } + break; + case 15: + switch( cpuinfo.x86Model ) + { + case 0: // Willamette (A-Step) + case 1: // Willamette + strcpy( cpuinfo.x86Fam, "Willamette Intel Pentium IV" ); + break; + case 2: // Northwood + strcpy( cpuinfo.x86Fam, "Northwood Intel Pentium IV" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "Intel Pentium IV (Unknown)" ); + break; + } + break; + default: + strcpy( cpuinfo.x86Fam, "Unknown Intel CPU" ); + } + } + } + else if ( cputype == 1 ) //AMD cpu + { + if( cpuinfo.x86Family >= 7 ) + { + if((x86_64_12BITBRANDID !=0) || (x86_64_8BITBRANDID !=0)) + { + if(x86_64_8BITBRANDID == 0 ) + { + switch((x86_64_12BITBRANDID >>6)& 0x3f) + { + case 4: + strcpy(cpuinfo.x86Fam,"AMD Athlon(tm) 64 Processor"); + AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); + //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); + sprintf(AMDspeedString," %d",AMDspeed); + strcat(AMDspeedString,"00+"); + strcat(cpuinfo.x86Fam,AMDspeedString); + break; + case 12: + strcpy(cpuinfo.x86Fam,"AMD Opteron(tm) Processor"); + break; + case 5: + strcpy( cpuinfo.x86Fam, "AMD Athlon X2 Processor" ); + AMDspeed = 22 + (x86_64_12BITBRANDID & 0x1f); + //AMDspeedString = strtol(AMDspeed, (char**)NULL,10); + sprintf(AMDspeedString," %d",AMDspeed); + strcat(AMDspeedString,"00+"); + strcat(cpuinfo.x86Fam,AMDspeedString); + break; + case 44: + strcpy( cpuinfo.x86Fam, "AMD Opteron(tm) Dual Core Processor" ); + break; + default: + strcpy(cpuinfo.x86Fam,"Unknown AMD 64 proccesor"); + + } + } + else //8bit brand id is non zero + { + strcpy(cpuinfo.x86Fam,"Unsupported yet AMD64 cpu"); + } + } + else + { + strcpy( cpuinfo.x86Fam, "AMD K7+ Processor" ); + } + } + else + { + switch ( cpuinfo.x86Family ) + { + case 4: + switch( cpuinfo.x86Model ) + { + case 14: + case 15: // Write-back enhanced + strcpy( cpuinfo.x86Fam, "AMD 5x86 Processor" ); + break; + + case 3: // DX2 + case 7: // Write-back enhanced DX2 + case 8: // DX4 + case 9: // Write-back enhanced DX4 + strcpy( cpuinfo.x86Fam, "AMD 486 Processor" ); + break; + + + default: + strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); + + } + break; + + case 5: + switch( cpuinfo.x86Model) + { + case 0: // SSA 5 (75, 90 and 100 Mhz) + case 1: // 5k86 (PR 120 and 133 MHz) + case 2: // 5k86 (PR 166 MHz) + case 3: // K5 5k86 (PR 200 MHz) + strcpy( cpuinfo.x86Fam, "AMD K5 Processor" ); + break; + + case 6: + case 7: // (0.25 �m) + case 8: // K6-2 + case 9: // K6-III + case 14: // K6-2+ / K6-III+ + strcpy( cpuinfo.x86Fam, "AMD K6 Series Processor" ); + break; + + default: + strcpy( cpuinfo.x86Fam, "AMD Unknown Processor" ); + } + break; + case 6: + strcpy( cpuinfo.x86Fam, "AMD Athlon XP Processor" ); + break; + default: + strcpy( cpuinfo.x86Fam, "Unknown AMD CPU" ); + } + } + } + //capabilities + cpucaps.hasFloatingPointUnit = ( cpuinfo.x86Flags >> 0 ) & 1; + cpucaps.hasVirtual8086ModeEnhancements = ( cpuinfo.x86Flags >> 1 ) & 1; + cpucaps.hasDebuggingExtensions = ( cpuinfo.x86Flags >> 2 ) & 1; + cpucaps.hasPageSizeExtensions = ( cpuinfo.x86Flags >> 3 ) & 1; + cpucaps.hasTimeStampCounter = ( cpuinfo.x86Flags >> 4 ) & 1; + cpucaps.hasModelSpecificRegisters = ( cpuinfo.x86Flags >> 5 ) & 1; + cpucaps.hasPhysicalAddressExtension = ( cpuinfo.x86Flags >> 6 ) & 1; + cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 7 ) & 1; + cpucaps.hasCOMPXCHG8BInstruction = ( cpuinfo.x86Flags >> 8 ) & 1; + cpucaps.hasAdvancedProgrammableInterruptController = ( cpuinfo.x86Flags >> 9 ) & 1; + cpucaps.hasSEPFastSystemCall = ( cpuinfo.x86Flags >> 11 ) & 1; + cpucaps.hasMemoryTypeRangeRegisters = ( cpuinfo.x86Flags >> 12 ) & 1; + cpucaps.hasPTEGlobalFlag = ( cpuinfo.x86Flags >> 13 ) & 1; + cpucaps.hasMachineCheckArchitecture = ( cpuinfo.x86Flags >> 14 ) & 1; + cpucaps.hasConditionalMoveAndCompareInstructions = ( cpuinfo.x86Flags >> 15 ) & 1; + cpucaps.hasFGPageAttributeTable = ( cpuinfo.x86Flags >> 16 ) & 1; + cpucaps.has36bitPageSizeExtension = ( cpuinfo.x86Flags >> 17 ) & 1; + cpucaps.hasProcessorSerialNumber = ( cpuinfo.x86Flags >> 18 ) & 1; + cpucaps.hasCFLUSHInstruction = ( cpuinfo.x86Flags >> 19 ) & 1; + cpucaps.hasDebugStore = ( cpuinfo.x86Flags >> 21 ) & 1; + cpucaps.hasACPIThermalMonitorAndClockControl = ( cpuinfo.x86Flags >> 22 ) & 1; + cpucaps.hasMultimediaExtensions = ( cpuinfo.x86Flags >> 23 ) & 1; //mmx + cpucaps.hasFastStreamingSIMDExtensionsSaveRestore = ( cpuinfo.x86Flags >> 24 ) & 1; + cpucaps.hasStreamingSIMDExtensions = ( cpuinfo.x86Flags >> 25 ) & 1; //sse + cpucaps.hasStreamingSIMD2Extensions = ( cpuinfo.x86Flags >> 26 ) & 1; //sse2 + cpucaps.hasSelfSnoop = ( cpuinfo.x86Flags >> 27 ) & 1; + cpucaps.hasHyperThreading = ( cpuinfo.x86Flags >> 28 ) & 1; + cpucaps.hasThermalMonitor = ( cpuinfo.x86Flags >> 29 ) & 1; + cpucaps.hasIntel64BitArchitecture = ( cpuinfo.x86Flags >> 30 ) & 1; + //that is only for AMDs + cpucaps.hasMultimediaExtensionsExt = ( cpuinfo.x86EFlags >> 22 ) & 1; //mmx2 + cpucaps.hasAMD64BitArchitecture = ( cpuinfo.x86EFlags >> 29 ) & 1; //64bit cpu + cpucaps.has3DNOWInstructionExtensionsExt = ( cpuinfo.x86EFlags >> 30 ) & 1; //3dnow+ + cpucaps.has3DNOWInstructionExtensions = ( cpuinfo.x86EFlags >> 31 ) & 1; //3dnow + cpuinfo.cpuspeed = (u32 )(CPUSpeedHz( 1000 ) / 1000000); +} + +#endif diff --git a/libpcsxcore/ix86_64/ix86_mmx.c b/libpcsxcore/ix86_64/ix86_mmx.c index 09784a9c..4df678f0 100644 --- a/libpcsxcore/ix86_64/ix86_mmx.c +++ b/libpcsxcore/ix86_64/ix86_mmx.c @@ -1,6 +1,7 @@ // stop compiling if NORECBUILD build (only for Visual Studio) -#ifdef __x86_64__ +/* note that ix86-64.h disables all MMX, so no point in compiling this, ever */ +#ifndef __x86_64__ #if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD)) diff --git a/libpcsxcore/ix86_64/ix86_sse.c b/libpcsxcore/ix86_64/ix86_sse.c index 8a4f0217..09907043 100644 --- a/libpcsxcore/ix86_64/ix86_sse.c +++ b/libpcsxcore/ix86_64/ix86_sse.c @@ -89,9 +89,6 @@ XMMSSEType g_xmmtypes[XMMREGS] = {0}; -void WriteRmOffset(x86IntRegType to, int offset); -void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset); - /* movups [r32][r32*scale] to xmm1 */ void SSE_MOVUPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale ) { @@ -1326,24 +1323,6 @@ void SSE2EMU_MOVD_XMM_to_RmOffset(x86IntRegType to, x86SSERegType from, int offs MOV32RtoRmOffset(to, EAX, offset); } -#ifndef __x86_64__ -extern void SetMMXstate(); - -void SSE2EMU_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from) -{ - SSE_MOVLPS_XMM_to_M64(p, from); - MOVQMtoR(to, p); - SetMMXstate(); -} - -void SSE2EMU_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from) -{ - MOVQRtoM(p, from); - SSE_MOVLPS_M64_to_XMM(to, p); - SetMMXstate(); -} -#endif - /****************************************************************************/ /* SSE2 Emulated functions for SSE CPU's by kekko */ /****************************************************************************/ @@ -1398,16 +1377,7 @@ void SSE2EMU_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from ) { MOV32RmtoR(to, to); } -#ifndef __x86_64__ -extern void SetFPUstate(); -extern void _freeMMXreg(int mmxreg); -#endif - void SSE2EMU_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { -#ifndef __x86_64__ - SetFPUstate(); - _freeMMXreg(7); -#endif SSE_MOVAPS_XMM_to_M128((uptr)f, from); FLD32((uptr)&f[0]); @@ -1423,10 +1393,6 @@ void SSE2EMU_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from ) { } void SSE2EMU_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from ) { -#ifndef __x86_64__ - SetFPUstate(); - _freeMMXreg(7); -#endif FILD32(from); FSTP32((uptr)&f[0]); FILD32(from+4); diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c index 303bd679..b25b9612 100644 --- a/libpcsxcore/mdec.c +++ b/libpcsxcore/mdec.c @@ -19,7 +19,7 @@ ***************************************************************************/ #include "mdec.h" - + /* memory speed is 1 byte per MDEC_BIAS psx clock * That mean (PSXCLK / MDEC_BIAS) B/s * MDEC_BIAS = 2.0 => ~16MB/s @@ -31,8 +31,8 @@ * 320x240x16@50Hz => 7.68 MB/s * 320x240x16@60Hz => 9.216 MB/s * so 2.0 to 4.0 should be fine. - */ -#define MDEC_BIAS 2.0f + */ +#define MDEC_BIAS 2.0f #define DSIZE 8 #define DSIZE2 (DSIZE * DSIZE) @@ -80,7 +80,7 @@ static inline void fillrow(int *blk, int val) { = blk[4] = blk[5] = blk[6] = blk[7] = val; } -void idct(int *block,int used_col) { +static void idct(int *block,int used_col) { int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; int z5, z10, z11, z12, z13; int *ptr; @@ -263,7 +263,7 @@ static void iqtab_init(int *iqtab, unsigned char *iq_y) { #define MDEC_END_OF_DATA 0xfe00 -unsigned short *rl2blk(int *blk, unsigned short *mdec_rl) { +static unsigned short *rl2blk(int *blk, unsigned short *mdec_rl) { int i, k, q_scale, rl, used_col; int *iqtab; @@ -324,7 +324,7 @@ unsigned short *rl2blk(int *blk, unsigned short *mdec_rl) { #define CLAMP_SCALE8(a) (CLAMP8(SCALE8(a))) #define CLAMP_SCALE5(a) (CLAMP5(SCALE5(a))) -inline void putlinebw15(u16 *image, int *Yblk) { +static inline void putlinebw15(u16 *image, int *Yblk) { int i; int A = (mdec.reg0 & MDEC0_STP) ? 0x8000 : 0; @@ -335,7 +335,7 @@ inline void putlinebw15(u16 *image, int *Yblk) { } } -inline void putquadrgb15(u16 *image, int *Yblk, int Cr, int Cb) { +static inline void putquadrgb15(u16 *image, int *Yblk, int Cr, int Cb) { int Y, R, G, B; int A = (mdec.reg0 & MDEC0_STP) ? 0x8000 : 0; R = MULR(Cr); @@ -353,7 +353,7 @@ inline void putquadrgb15(u16 *image, int *Yblk, int Cr, int Cb) { image[17] = MAKERGB15(CLAMP_SCALE5(Y + R), CLAMP_SCALE5(Y + G), CLAMP_SCALE5(Y + B), A); } -inline void yuv2rgb15(int *blk, unsigned short *image) { +static inline void yuv2rgb15(int *blk, unsigned short *image) { int x, y; int *Yblk = blk + DSIZE2 * 2; int *Crblk = blk; @@ -376,7 +376,7 @@ inline void yuv2rgb15(int *blk, unsigned short *image) { } } -inline void putlinebw24(u8 * image, int *Yblk) { +static inline void putlinebw24(u8 * image, int *Yblk) { int i; unsigned char Y; for (i = 0; i < 8 * 3; i += 3, Yblk++) { @@ -387,7 +387,7 @@ inline void putlinebw24(u8 * image, int *Yblk) { } } -inline void putquadrgb24(u8 * image, int *Yblk, int Cr, int Cb) { +static inline void putquadrgb24(u8 * image, int *Yblk, int Cr, int Cb) { int Y, R, G, B; R = MULR(Cr); @@ -545,7 +545,7 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { int dmacnt; if (chcr != 0x01000200) return; - + size = (bcr >> 16) * (bcr & 0xffff); /* size in byte */ size *= 4; @@ -558,7 +558,7 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { mdec.pending_dma1.bcr = bcr; mdec.pending_dma1.chcr = chcr; /* do not free the dma */ - } else { + } else { image = (u8 *)PSXM(adr); @@ -619,9 +619,9 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { memcpy(image, mdec.block_buffer, size); mdec.block_buffer_pos = mdec.block_buffer + size; } - } + } - /* define the power of mdec */ + /* define the power of mdec */ MDECOUTDMA_INT((int) ((dmacnt* MDEC_BIAS))); } } diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index 3f47e083..533dfd71 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -51,7 +51,7 @@ struct iso_directory_record { char name [1]; }; -void mmssdd( char *b, char *p ) +static void mmssdd( char *b, char *p ) { int m, s, d; #if defined(__BIGENDIAN__) @@ -101,9 +101,9 @@ void mmssdd( char *b, char *p ) READTRACK(); \ memcpy(_dir + 2048, buf + 12, 2048); -int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { +static int GetCdromFile(u8 *mdir, u8 *time, char *filename) { struct iso_directory_record *dir; - char ddir[4096]; + u8 ddir[4096]; u8 *buf; int i; @@ -144,7 +144,7 @@ int LoadCdrom() { struct iso_directory_record *dir; u8 time[4], *buf; u8 mdir[4096]; - s8 exename[256]; + char exename[256]; if (!Config.HLE) { if (!Config.SlowBoot) psxRegs.pc = psxRegs.GPR.n.ra; @@ -177,7 +177,7 @@ int LoadCdrom() { if (GetCdromFile(mdir, time, exename) == -1) { sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); if (GetCdromFile(mdir, time, exename) == -1) { - char *ptr = strstr(buf + 12, "cdrom:"); + char *ptr = strstr((char *)buf + 12, "cdrom:"); if (ptr != NULL) { ptr += 6; while (*ptr == '\\' || *ptr == '/') ptr++; @@ -226,7 +226,8 @@ int LoadCdrom() { int LoadCdromFile(const char *filename, EXE_HEADER *head) { struct iso_directory_record *dir; u8 time[4],*buf; - u8 mdir[4096], exename[256]; + u8 mdir[4096]; + char exename[256]; u32 size, addr; sscanf(filename, "cdrom:\\%256s", exename); @@ -281,7 +282,7 @@ int CheckCdrom() { CdromLabel[0] = '\0'; CdromId[0] = '\0'; - strncpy(CdromLabel, buf + 52, 32); + strncpy(CdromLabel, (char *)buf + 52, 32); // skip head and sub, and go to the root directory record dir = (struct iso_directory_record *)&buf[12 + 156]; @@ -297,7 +298,7 @@ int CheckCdrom() { if (GetCdromFile(mdir, time, exename) == -1) { sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); if (GetCdromFile(mdir, time, exename) == -1) { - char *ptr = strstr(buf + 12, "cdrom:"); // possibly the executable is in some subdir + char *ptr = strstr((char *)buf + 12, "cdrom:"); // possibly the executable is in some subdir if (ptr != NULL) { ptr += 6; while (*ptr == '\\' || *ptr == '/') ptr++; @@ -359,7 +360,8 @@ static int PSXGetFileType(FILE *f) { current = ftell(f); fseek(f, 0L, SEEK_SET); - fread(mybuf, 2048, 1, f); + if(fread(mybuf, 2048, 1, f) != 1) + return INVALID_EXE; fseek(f, current, SEEK_SET); exe_hdr = (EXE_HEADER *)mybuf; @@ -386,7 +388,8 @@ static void LoadLibPS() { if (f != NULL) { fseek(f, 0x800, SEEK_SET); - fread(psxM + 0x10000, 0x61000, 1, f); + if(fread(psxM + 0x10000, 0x61000, 1, f) != 1) + perror(buf); fclose(f); } } @@ -415,10 +418,14 @@ int Load(const char *ExePath) { type = PSXGetFileType(tmpFile); switch (type) { case PSX_EXE: - fread(&tmpHead, sizeof(EXE_HEADER), 1, tmpFile); - fseek(tmpFile, 0x800, SEEK_SET); - fread(PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size), 1, tmpFile); + if(fread(&tmpHead, sizeof(EXE_HEADER), 1, tmpFile) != 1 || + fseek(tmpFile, 0x800, SEEK_SET) < 0 || + fread(PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size), 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + } fclose(tmpFile); + if(retval == -1) break; psxRegs.pc = SWAP32(tmpHead.pc0); psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); @@ -430,21 +437,36 @@ int Load(const char *ExePath) { case CPE_EXE: fseek(tmpFile, 6, SEEK_SET); /* Something tells me we should go to 4 and read the "08 00" here... */ do { - fread(&opcode, 1, 1, tmpFile); + if(fread(&opcode, 1, 1, tmpFile) != 1) { + perror(ExePath); + retval = -1; + break; + } switch (opcode) { case 1: /* Section loading */ - fread(§ion_address, 4, 1, tmpFile); - fread(§ion_size, 4, 1, tmpFile); + if(fread(§ion_address, 4, 1, tmpFile) != 1 || + fread(§ion_size, 4, 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + break; + } section_address = SWAPu32(section_address); section_size = SWAPu32(section_size); #ifdef EMU_LOG EMU_LOG("Loading %08X bytes from %08X to %08X\n", section_size, ftell(tmpFile), section_address); #endif - fread(PSXM(section_address), section_size, 1, tmpFile); + if(fread(PSXM(section_address), section_size, 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + } break; case 3: /* register loading (PC only?) */ - fseek(tmpFile, 2, SEEK_CUR); /* unknown field */ - fread(&psxRegs.pc, 4, 1, tmpFile); + if(fseek(tmpFile, 2, SEEK_CUR) < 0 || /* unknown field */ + fread(&psxRegs.pc, 4, 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + break; + } psxRegs.pc = SWAPu32(psxRegs.pc); break; case 0: /* End of file */ @@ -458,19 +480,31 @@ int Load(const char *ExePath) { break; case COFF_EXE: - fread(&coffHead, sizeof(coffHead), 1, tmpFile); - fread(&optHead, sizeof(optHead), 1, tmpFile); + if(fread(&coffHead, sizeof(coffHead), 1, tmpFile) != 1 || + fread(&optHead, sizeof(optHead), 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + break; + } psxRegs.pc = SWAP32(optHead.entry); psxRegs.GPR.n.sp = 0x801fff00; for (i = 0; i < SWAP16(coffHead.f_nscns); i++) { - fseek(tmpFile, sizeof(FILHDR) + SWAP16(coffHead.f_opthdr) + sizeof(section) * i, SEEK_SET); - fread(§ion, sizeof(section), 1, tmpFile); + if(fseek(tmpFile, sizeof(FILHDR) + SWAP16(coffHead.f_opthdr) + sizeof(section) * i, SEEK_SET) < 0 || + fread(§ion, sizeof(section), 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + break; + } if (section.s_scnptr != 0) { - fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET); - fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile); + if(fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET) < 0 || + fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile) != 1) { + retval = -1; + perror(ExePath); + break; + } } else { memset(PSXM(SWAP32(section.s_paddr)), 0, SWAP32(section.s_size)); } diff --git a/libpcsxcore/plugin_common.h b/libpcsxcore/plugin_common.h new file mode 100644 index 00000000..7e12d59e --- /dev/null +++ b/libpcsxcore/plugin_common.h @@ -0,0 +1,99 @@ +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PLUGIN_COMMON_H__ +#define __PLUGIN_COMMON_H__ + +//#define ENABLE_SIO1API 1 + +#ifndef _WIN32 + +typedef void* HWND; +#define CALLBACK + +#else + +#include + +#endif + +#include "decode_xa.h" + +typedef struct { + uint32_t ulFreezeVersion; + uint32_t ulStatus; + uint32_t ulControl[256]; + unsigned char psxVRam[1024*1024*2]; +} GPUFreeze_t; + +#ifdef Status /* defined by X11 includes */ +#undef Status +#endif + +struct CdrStat { + uint32_t Type; + uint32_t Status; + unsigned char Time[3]; +}; + +struct SubQ { + char res0[12]; + unsigned char ControlAndADR; + unsigned char TrackNumber; + unsigned char IndexNumber; + unsigned char TrackRelativeAddress[3]; + unsigned char Filler; + unsigned char AbsoluteAddress[3]; + unsigned char CRC[2]; + char res1[72]; +}; + +typedef struct { + char PluginName[8]; + uint32_t PluginVersion; + uint32_t Size; + unsigned char SPUPorts[0x200]; + unsigned char SPURam[0x80000]; + xa_decode_t xa; + unsigned char *SPUInfo; +} SPUFreeze_t; + +typedef long (CALLBACK* GPUshowScreenPicCB)(unsigned char *); +typedef void (CALLBACK* GPUdisplayTextCB)(char *); +typedef void (CALLBACK* PADsetSensitiveCB)(int); + +typedef struct { + char EmuName[32]; + char CdromID[9]; // ie. 'SCPH12345', no \0 trailing character + char CdromLabel[11]; + void *psxMem; + GPUshowScreenPicCB GPU_showScreenPic; + GPUdisplayTextCB GPU_displayText; + PADsetSensitiveCB PAD_setSensitive; + char GPUpath[256]; // paths must be absolute + char SPUpath[256]; + char CDRpath[256]; + char MCD1path[256]; + char MCD2path[256]; + char BIOSpath[256]; // 'HLE' for internal bios + char Unused[1024]; +} netInfo; + + +#endif diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index dca6e7b6..009bf2dd 100644 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -1,849 +1,852 @@ -/*************************************************************************** - * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * - ***************************************************************************/ - -/* -* Plugin library callback/access functions. -*/ - -#include "plugins.h" -#include "cdriso.h" - -static char IsoFile[MAXPATHLEN] = ""; -static s64 cdOpenCaseTime = 0; - -GPUupdateLace GPU_updateLace; -GPUinit GPU_init; -GPUshutdown GPU_shutdown; -GPUconfigure GPU_configure; -GPUtest GPU_test; -GPUabout GPU_about; -GPUopen GPU_open; -GPUclose GPU_close; -GPUreadStatus GPU_readStatus; -GPUreadData GPU_readData; -GPUreadDataMem GPU_readDataMem; -GPUwriteStatus GPU_writeStatus; -GPUwriteData GPU_writeData; -GPUwriteDataMem GPU_writeDataMem; -GPUdmaChain GPU_dmaChain; -GPUkeypressed GPU_keypressed; -GPUdisplayText GPU_displayText; -GPUmakeSnapshot GPU_makeSnapshot; -GPUfreeze GPU_freeze; -GPUgetScreenPic GPU_getScreenPic; -GPUshowScreenPic GPU_showScreenPic; -GPUclearDynarec GPU_clearDynarec; -GPUvBlank GPU_vBlank; -GPUregisterCallback GPU_registerCallback; -GPUidle GPU_idle; -GPUvisualVibration GPU_visualVibration; -GPUcursor GPU_cursor; - -CDRinit CDR_init; -CDRshutdown CDR_shutdown; -CDRopen CDR_open; -CDRclose CDR_close; -CDRtest CDR_test; -CDRgetTN CDR_getTN; -CDRgetTD CDR_getTD; -CDRreadTrack CDR_readTrack; -CDRgetBuffer CDR_getBuffer; -CDRplay CDR_play; -CDRstop CDR_stop; -CDRgetStatus CDR_getStatus; -CDRgetDriveLetter CDR_getDriveLetter; -CDRgetBufferSub CDR_getBufferSub; -CDRconfigure CDR_configure; -CDRabout CDR_about; -CDRsetfilename CDR_setfilename; -CDRreadCDDA CDR_readCDDA; -CDRgetTE CDR_getTE; - -SPUconfigure SPU_configure; -SPUabout SPU_about; -SPUinit SPU_init; -SPUshutdown SPU_shutdown; -SPUtest SPU_test; -SPUopen SPU_open; -SPUclose SPU_close; -SPUplaySample SPU_playSample; -SPUwriteRegister SPU_writeRegister; -SPUreadRegister SPU_readRegister; -SPUwriteDMA SPU_writeDMA; -SPUreadDMA SPU_readDMA; -SPUwriteDMAMem SPU_writeDMAMem; -SPUreadDMAMem SPU_readDMAMem; -SPUplayADPCMchannel SPU_playADPCMchannel; -SPUfreeze SPU_freeze; -SPUregisterCallback SPU_registerCallback; -SPUasync SPU_async; -SPUplayCDDAchannel SPU_playCDDAchannel; - -PADconfigure PAD1_configure; -PADabout PAD1_about; -PADinit PAD1_init; -PADshutdown PAD1_shutdown; -PADtest PAD1_test; -PADopen PAD1_open; -PADclose PAD1_close; -PADquery PAD1_query; -PADreadPort1 PAD1_readPort1; -PADkeypressed PAD1_keypressed; -PADstartPoll PAD1_startPoll; -PADpoll PAD1_poll; -PADsetSensitive PAD1_setSensitive; -PADregisterVibration PAD1_registerVibration; -PADregisterCursor PAD1_registerCursor; - -PADconfigure PAD2_configure; -PADabout PAD2_about; -PADinit PAD2_init; -PADshutdown PAD2_shutdown; -PADtest PAD2_test; -PADopen PAD2_open; -PADclose PAD2_close; -PADquery PAD2_query; -PADreadPort2 PAD2_readPort2; -PADkeypressed PAD2_keypressed; -PADstartPoll PAD2_startPoll; -PADpoll PAD2_poll; -PADsetSensitive PAD2_setSensitive; -PADregisterVibration PAD2_registerVibration; -PADregisterCursor PAD2_registerCursor; - -NETinit NET_init; -NETshutdown NET_shutdown; -NETopen NET_open; -NETclose NET_close; -NETtest NET_test; -NETconfigure NET_configure; -NETabout NET_about; -NETpause NET_pause; -NETresume NET_resume; -NETqueryPlayer NET_queryPlayer; -NETsendData NET_sendData; -NETrecvData NET_recvData; -NETsendPadData NET_sendPadData; -NETrecvPadData NET_recvPadData; -NETsetInfo NET_setInfo; -NETkeypressed NET_keypressed; - -#ifdef ENABLE_SIO1API - -SIO1init SIO1_init; -SIO1shutdown SIO1_shutdown; -SIO1open SIO1_open; -SIO1close SIO1_close; -SIO1test SIO1_test; -SIO1configure SIO1_configure; -SIO1about SIO1_about; -SIO1pause SIO1_pause; -SIO1resume SIO1_resume; -SIO1keypressed SIO1_keypressed; -SIO1writeData8 SIO1_writeData8; -SIO1writeData16 SIO1_writeData16; -SIO1writeData32 SIO1_writeData32; -SIO1writeStat16 SIO1_writeStat16; -SIO1writeStat32 SIO1_writeStat32; -SIO1writeMode16 SIO1_writeMode16; -SIO1writeMode32 SIO1_writeMode32; -SIO1writeCtrl16 SIO1_writeCtrl16; -SIO1writeCtrl32 SIO1_writeCtrl32; -SIO1writeBaud16 SIO1_writeBaud16; -SIO1writeBaud32 SIO1_writeBaud32; -SIO1readData8 SIO1_readData8; -SIO1readData16 SIO1_readData16; -SIO1readData32 SIO1_readData32; -SIO1readStat16 SIO1_readStat16; -SIO1readStat32 SIO1_readStat32; -SIO1readMode16 SIO1_readMode16; -SIO1readMode32 SIO1_readMode32; -SIO1readCtrl16 SIO1_readCtrl16; -SIO1readCtrl32 SIO1_readCtrl32; -SIO1readBaud16 SIO1_readBaud16; -SIO1readBaud32 SIO1_readBaud32; -SIO1registerCallback SIO1_registerCallback; - -#endif - -static const char *err; - -#define CheckErr(func) { \ - err = SysLibError(); \ - if (err != NULL) { SysMessage(_("Error loading %s: %s"), func, err); return -1; } \ -} - -#define LoadSym(dest, src, name, checkerr) { \ - dest = (src)SysLoadSym(drv, name); \ - if (checkerr) { CheckErr(name); } else SysLibError(); \ -} - -void *hGPUDriver = NULL; - -void CALLBACK GPU__displayText(char *pText) { - SysPrintf("%s\n", pText); -} - -void CALLBACK GPUbusy( int ticks ) -{ - //printf( "GPUbusy( %i )\n", ticks ); - //fflush( 0 ); - - psxRegs.interrupt |= (1 << PSXINT_GPUBUSY); - psxRegs.intCycle[PSXINT_GPUBUSY].cycle = ticks; - psxRegs.intCycle[PSXINT_GPUBUSY].sCycle = psxRegs.cycle; -} - -long CALLBACK GPU__configure(void) { return 0; } -long CALLBACK GPU__test(void) { return 0; } -void CALLBACK GPU__about(void) {} -void CALLBACK GPU__makeSnapshot(void) {} -void CALLBACK GPU__keypressed(int key) {} -long CALLBACK GPU__getScreenPic(unsigned char *pMem) { return -1; } -long CALLBACK GPU__showScreenPic(unsigned char *pMem) { return -1; } -void CALLBACK GPU__clearDynarec(void (CALLBACK *callback)(void)) {} -void CALLBACK GPU__vBlank(int val) {} -void CALLBACK GPU__registerCallback(void (CALLBACK *callback)(int)) {} -void CALLBACK GPU__idle(void) {} -void CALLBACK GPU__visualVibration(unsigned long iSmall, unsigned long iBig) {} -void CALLBACK GPU__cursor(int player, int x, int y) {} - -#define LoadGpuSym1(dest, name) \ - LoadSym(GPU_##dest, GPU##dest, name, TRUE); - -#define LoadGpuSym0(dest, name) \ - LoadSym(GPU_##dest, GPU##dest, name, FALSE); \ - if (GPU_##dest == NULL) GPU_##dest = (GPU##dest) GPU__##dest; - -#define LoadGpuSymN(dest, name) \ - LoadSym(GPU_##dest, GPU##dest, name, FALSE); - -static int LoadGPUplugin(const char *GPUdll) { - void *drv; - - hGPUDriver = SysLoadLibrary(GPUdll); - if (hGPUDriver == NULL) { - GPU_configure = NULL; - SysMessage (_("Could not load GPU plugin %s!"), GPUdll); return -1; - } - drv = hGPUDriver; - LoadGpuSym1(init, "GPUinit"); - LoadGpuSym1(shutdown, "GPUshutdown"); - LoadGpuSym1(open, "GPUopen"); - LoadGpuSym1(close, "GPUclose"); - LoadGpuSym1(readData, "GPUreadData"); - LoadGpuSym1(readDataMem, "GPUreadDataMem"); - LoadGpuSym1(readStatus, "GPUreadStatus"); - LoadGpuSym1(writeData, "GPUwriteData"); - LoadGpuSym1(writeDataMem, "GPUwriteDataMem"); - LoadGpuSym1(writeStatus, "GPUwriteStatus"); - LoadGpuSym1(dmaChain, "GPUdmaChain"); - LoadGpuSym1(updateLace, "GPUupdateLace"); - LoadGpuSym0(keypressed, "GPUkeypressed"); - LoadGpuSym0(displayText, "GPUdisplayText"); - LoadGpuSym0(makeSnapshot, "GPUmakeSnapshot"); - LoadGpuSym1(freeze, "GPUfreeze"); - LoadGpuSym0(getScreenPic, "GPUgetScreenPic"); - LoadGpuSym0(showScreenPic, "GPUshowScreenPic"); - LoadGpuSym0(clearDynarec, "GPUclearDynarec"); - LoadGpuSym0(vBlank, "GPUvBlank"); - LoadGpuSym0(registerCallback, "GPUregisterCallback"); - LoadGpuSym0(idle, "GPUidle"); - LoadGpuSym0(visualVibration, "GPUvisualVibration"); - LoadGpuSym0(cursor, "GPUcursor"); - LoadGpuSym0(configure, "GPUconfigure"); - LoadGpuSym0(test, "GPUtest"); - LoadGpuSym0(about, "GPUabout"); - - return 0; -} - -void *hCDRDriver = NULL; - -long CALLBACK CDR__play(unsigned char *sector) { return 0; } -long CALLBACK CDR__stop(void) { return 0; } - -long CALLBACK CDR__getStatus(struct CdrStat *stat) { - if (cdOpenCaseTime < 0 || cdOpenCaseTime > (s64)time(NULL)) - stat->Status = 0x10; - else - stat->Status = 0; - - return 0; -} - -char* CALLBACK CDR__getDriveLetter(void) { return NULL; } -long CALLBACK CDR__configure(void) { return 0; } -long CALLBACK CDR__test(void) { return 0; } -void CALLBACK CDR__about(void) {} -long CALLBACK CDR__setfilename(char*filename) { return 0; } - -#define LoadCdrSym1(dest, name) \ - LoadSym(CDR_##dest, CDR##dest, name, TRUE); - -#define LoadCdrSym0(dest, name) \ - LoadSym(CDR_##dest, CDR##dest, name, FALSE); \ - if (CDR_##dest == NULL) CDR_##dest = (CDR##dest) CDR__##dest; - -#define LoadCdrSymN(dest, name) \ - LoadSym(CDR_##dest, CDR##dest, name, FALSE); - -static int LoadCDRplugin(const char *CDRdll) { - void *drv; - - if (CDRdll == NULL) { - cdrIsoInit(); - return 0; - } - - hCDRDriver = SysLoadLibrary(CDRdll); - if (hCDRDriver == NULL) { - CDR_configure = NULL; - SysMessage (_("Could not load CD-ROM plugin %s!"), CDRdll); return -1; - } - drv = hCDRDriver; - LoadCdrSym1(init, "CDRinit"); - LoadCdrSym1(shutdown, "CDRshutdown"); - LoadCdrSym1(open, "CDRopen"); - LoadCdrSym1(close, "CDRclose"); - LoadCdrSym1(getTN, "CDRgetTN"); - LoadCdrSym1(getTD, "CDRgetTD"); - LoadCdrSym1(readTrack, "CDRreadTrack"); - LoadCdrSym1(getBuffer, "CDRgetBuffer"); - LoadCdrSym1(getBufferSub, "CDRgetBufferSub"); - LoadCdrSym0(play, "CDRplay"); - LoadCdrSym0(stop, "CDRstop"); - LoadCdrSym0(getStatus, "CDRgetStatus"); - LoadCdrSym0(getDriveLetter, "CDRgetDriveLetter"); - LoadCdrSym0(configure, "CDRconfigure"); - LoadCdrSym0(test, "CDRtest"); - LoadCdrSym0(about, "CDRabout"); - LoadCdrSym0(setfilename, "CDRsetfilename"); - LoadCdrSymN(readCDDA, "CDRreadCDDA"); - LoadCdrSymN(getTE, "CDRgetTE"); - - return 0; -} - -void *hSPUDriver = NULL; - -long CALLBACK SPU__configure(void) { return 0; } -void CALLBACK SPU__about(void) {} -long CALLBACK SPU__test(void) { return 0; } - -#define LoadSpuSym1(dest, name) \ - LoadSym(SPU_##dest, SPU##dest, name, TRUE); - -#define LoadSpuSym0(dest, name) \ - LoadSym(SPU_##dest, SPU##dest, name, FALSE); \ - if (SPU_##dest == NULL) SPU_##dest = (SPU##dest) SPU__##dest; - -#define LoadSpuSymN(dest, name) \ - LoadSym(SPU_##dest, SPU##dest, name, FALSE); - -static int LoadSPUplugin(const char *SPUdll) { - void *drv; - - hSPUDriver = SysLoadLibrary(SPUdll); - if (hSPUDriver == NULL) { - SPU_configure = NULL; - SysMessage (_("Could not load SPU plugin %s!"), SPUdll); return -1; - } - drv = hSPUDriver; - LoadSpuSym1(init, "SPUinit"); - LoadSpuSym1(shutdown, "SPUshutdown"); - LoadSpuSym1(open, "SPUopen"); - LoadSpuSym1(close, "SPUclose"); - LoadSpuSym0(configure, "SPUconfigure"); - LoadSpuSym0(about, "SPUabout"); - LoadSpuSym0(test, "SPUtest"); - LoadSpuSym1(writeRegister, "SPUwriteRegister"); - LoadSpuSym1(readRegister, "SPUreadRegister"); - LoadSpuSym1(writeDMA, "SPUwriteDMA"); - LoadSpuSym1(readDMA, "SPUreadDMA"); - LoadSpuSym1(writeDMAMem, "SPUwriteDMAMem"); - LoadSpuSym1(readDMAMem, "SPUreadDMAMem"); - LoadSpuSym1(playADPCMchannel, "SPUplayADPCMchannel"); - LoadSpuSym1(freeze, "SPUfreeze"); - LoadSpuSym1(registerCallback, "SPUregisterCallback"); - LoadSpuSymN(async, "SPUasync"); - LoadSpuSymN(playCDDAchannel, "SPUplayCDDAchannel"); - - return 0; -} - -void *hPAD1Driver = NULL; -void *hPAD2Driver = NULL; - -static unsigned char buf[256]; -unsigned char stdpar[10] = { 0x00, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -unsigned char mousepar[8] = { 0x00, 0x12, 0x5a, 0xff, 0xff, 0xff, 0xff }; -unsigned char analogpar[9] = { 0x00, 0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - -static int bufcount, bufc; - -PadDataS padd1, padd2; - -unsigned char _PADstartPoll(PadDataS *pad) { - bufc = 0; - - switch (pad->controllerType) { - case PSE_PAD_TYPE_MOUSE: - mousepar[3] = pad->buttonStatus & 0xff; - mousepar[4] = pad->buttonStatus >> 8; - mousepar[5] = pad->moveX; - mousepar[6] = pad->moveY; - - memcpy(buf, mousepar, 7); - bufcount = 6; - break; - case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069) - analogpar[1] = 0x23; - analogpar[3] = pad->buttonStatus & 0xff; - analogpar[4] = pad->buttonStatus >> 8; - analogpar[5] = pad->rightJoyX; - analogpar[6] = pad->rightJoyY; - analogpar[7] = pad->leftJoyX; - analogpar[8] = pad->leftJoyY; - - memcpy(buf, analogpar, 9); - bufcount = 8; - break; - case PSE_PAD_TYPE_ANALOGPAD: // scph1150 - analogpar[1] = 0x73; - analogpar[3] = pad->buttonStatus & 0xff; - analogpar[4] = pad->buttonStatus >> 8; - analogpar[5] = pad->rightJoyX; - analogpar[6] = pad->rightJoyY; - analogpar[7] = pad->leftJoyX; - analogpar[8] = pad->leftJoyY; - - memcpy(buf, analogpar, 9); - bufcount = 8; - break; - case PSE_PAD_TYPE_ANALOGJOY: // scph1110 - analogpar[1] = 0x53; - analogpar[3] = pad->buttonStatus & 0xff; - analogpar[4] = pad->buttonStatus >> 8; - analogpar[5] = pad->rightJoyX; - analogpar[6] = pad->rightJoyY; - analogpar[7] = pad->leftJoyX; - analogpar[8] = pad->leftJoyY; - - memcpy(buf, analogpar, 9); - bufcount = 8; - break; - case PSE_PAD_TYPE_STANDARD: - default: - stdpar[3] = pad->buttonStatus & 0xff; - stdpar[4] = pad->buttonStatus >> 8; - - memcpy(buf, stdpar, 5); - bufcount = 4; - } - - return buf[bufc++]; -} - -unsigned char _PADpoll(unsigned char value) { - if (bufc > bufcount) return 0; - return buf[bufc++]; -} - -unsigned char CALLBACK PAD1__startPoll(int pad) { - PadDataS padd; - - PAD1_readPort1(&padd); - - return _PADstartPoll(&padd); -} - -unsigned char CALLBACK PAD1__poll(unsigned char value) { - return _PADpoll(value); -} - -long CALLBACK PAD1__configure(void) { return 0; } -void CALLBACK PAD1__about(void) {} -long CALLBACK PAD1__test(void) { return 0; } -long CALLBACK PAD1__query(void) { return 3; } -long CALLBACK PAD1__keypressed() { return 0; } -void CALLBACK PAD1__registerVibration(void (CALLBACK *callback)(unsigned long, unsigned long)) {} -void CALLBACK PAD1__registerCursor(void (CALLBACK *callback)(int, int, int)) {} - -#define LoadPad1Sym1(dest, name) \ - LoadSym(PAD1_##dest, PAD##dest, name, TRUE); - -#define LoadPad1SymN(dest, name) \ - LoadSym(PAD1_##dest, PAD##dest, name, FALSE); - -#define LoadPad1Sym0(dest, name) \ - LoadSym(PAD1_##dest, PAD##dest, name, FALSE); \ - if (PAD1_##dest == NULL) PAD1_##dest = (PAD##dest) PAD1__##dest; - -static int LoadPAD1plugin(const char *PAD1dll) { - void *drv; - - hPAD1Driver = SysLoadLibrary(PAD1dll); - if (hPAD1Driver == NULL) { - PAD1_configure = NULL; - SysMessage (_("Could not load Controller 1 plugin %s!"), PAD1dll); return -1; - } - drv = hPAD1Driver; - LoadPad1Sym1(init, "PADinit"); - LoadPad1Sym1(shutdown, "PADshutdown"); - LoadPad1Sym1(open, "PADopen"); - LoadPad1Sym1(close, "PADclose"); - LoadPad1Sym0(query, "PADquery"); - LoadPad1Sym1(readPort1, "PADreadPort1"); - LoadPad1Sym0(configure, "PADconfigure"); - LoadPad1Sym0(test, "PADtest"); - LoadPad1Sym0(about, "PADabout"); - LoadPad1Sym0(keypressed, "PADkeypressed"); - LoadPad1Sym0(startPoll, "PADstartPoll"); - LoadPad1Sym0(poll, "PADpoll"); - LoadPad1SymN(setSensitive, "PADsetSensitive"); - LoadPad1Sym0(registerVibration, "PADregisterVibration"); - LoadPad1Sym0(registerCursor, "PADregisterCursor"); - - return 0; -} - -unsigned char CALLBACK PAD2__startPoll(int pad) { - PadDataS padd; - - PAD2_readPort2(&padd); - - return _PADstartPoll(&padd); -} - -unsigned char CALLBACK PAD2__poll(unsigned char value) { - return _PADpoll(value); -} - -long CALLBACK PAD2__configure(void) { return 0; } -void CALLBACK PAD2__about(void) {} -long CALLBACK PAD2__test(void) { return 0; } -long CALLBACK PAD2__query(void) { return PSE_PAD_USE_PORT1 | PSE_PAD_USE_PORT2; } -long CALLBACK PAD2__keypressed() { return 0; } -void CALLBACK PAD2__registerVibration(void (CALLBACK *callback)(unsigned long, unsigned long)) {} -void CALLBACK PAD2__registerCursor(void (CALLBACK *callback)(int, int, int)) {} - -#define LoadPad2Sym1(dest, name) \ - LoadSym(PAD2_##dest, PAD##dest, name, TRUE); - -#define LoadPad2Sym0(dest, name) \ - LoadSym(PAD2_##dest, PAD##dest, name, FALSE); \ - if (PAD2_##dest == NULL) PAD2_##dest = (PAD##dest) PAD2__##dest; - -#define LoadPad2SymN(dest, name) \ - LoadSym(PAD2_##dest, PAD##dest, name, FALSE); - -static int LoadPAD2plugin(const char *PAD2dll) { - void *drv; - - hPAD2Driver = SysLoadLibrary(PAD2dll); - if (hPAD2Driver == NULL) { - PAD2_configure = NULL; - SysMessage (_("Could not load Controller 2 plugin %s!"), PAD2dll); return -1; - } - drv = hPAD2Driver; - LoadPad2Sym1(init, "PADinit"); - LoadPad2Sym1(shutdown, "PADshutdown"); - LoadPad2Sym1(open, "PADopen"); - LoadPad2Sym1(close, "PADclose"); - LoadPad2Sym0(query, "PADquery"); - LoadPad2Sym1(readPort2, "PADreadPort2"); - LoadPad2Sym0(configure, "PADconfigure"); - LoadPad2Sym0(test, "PADtest"); - LoadPad2Sym0(about, "PADabout"); - LoadPad2Sym0(keypressed, "PADkeypressed"); - LoadPad2Sym0(startPoll, "PADstartPoll"); - LoadPad2Sym0(poll, "PADpoll"); - LoadPad2SymN(setSensitive, "PADsetSensitive"); - LoadPad2Sym0(registerVibration, "PADregisterVibration"); - LoadPad2Sym0(registerCursor, "PADregisterCursor"); - - return 0; -} - -void *hNETDriver = NULL; - -void CALLBACK NET__setInfo(netInfo *info) {} -void CALLBACK NET__keypressed(int key) {} -long CALLBACK NET__configure(void) { return 0; } -long CALLBACK NET__test(void) { return 0; } -void CALLBACK NET__about(void) {} - -#define LoadNetSym1(dest, name) \ - LoadSym(NET_##dest, NET##dest, name, TRUE); - -#define LoadNetSymN(dest, name) \ - LoadSym(NET_##dest, NET##dest, name, FALSE); - -#define LoadNetSym0(dest, name) \ - LoadSym(NET_##dest, NET##dest, name, FALSE); \ - if (NET_##dest == NULL) NET_##dest = (NET##dest) NET__##dest; - -static int LoadNETplugin(const char *NETdll) { - void *drv; - - hNETDriver = SysLoadLibrary(NETdll); - if (hNETDriver == NULL) { - SysMessage (_("Could not load NetPlay plugin %s!"), NETdll); return -1; - } - drv = hNETDriver; - LoadNetSym1(init, "NETinit"); - LoadNetSym1(shutdown, "NETshutdown"); - LoadNetSym1(open, "NETopen"); - LoadNetSym1(close, "NETclose"); - LoadNetSymN(sendData, "NETsendData"); - LoadNetSymN(recvData, "NETrecvData"); - LoadNetSym1(sendPadData, "NETsendPadData"); - LoadNetSym1(recvPadData, "NETrecvPadData"); - LoadNetSym1(queryPlayer, "NETqueryPlayer"); - LoadNetSym1(pause, "NETpause"); - LoadNetSym1(resume, "NETresume"); - LoadNetSym0(setInfo, "NETsetInfo"); - LoadNetSym0(keypressed, "NETkeypressed"); - LoadNetSym0(configure, "NETconfigure"); - LoadNetSym0(test, "NETtest"); - LoadNetSym0(about, "NETabout"); - - return 0; -} - -#ifdef ENABLE_SIO1API - -void *hSIO1Driver = NULL; - -long CALLBACK SIO1__init(void) { return 0; } -long CALLBACK SIO1__shutdown(void) { return 0; } -long CALLBACK SIO1__open(void) { return 0; } -long CALLBACK SIO1__close(void) { return 0; } -long CALLBACK SIO1__configure(void) { return 0; } -long CALLBACK SIO1__test(void) { return 0; } -void CALLBACK SIO1__about(void) {} -void CALLBACK SIO1__pause(void) {} -void CALLBACK SIO1__resume(void) {} -long CALLBACK SIO1__keypressed(int key) { return 0; } -void CALLBACK SIO1__writeData8(unsigned char val) {} -void CALLBACK SIO1__writeData16(unsigned short val) {} -void CALLBACK SIO1__writeData32(unsigned long val) {} -void CALLBACK SIO1__writeStat16(unsigned short val) {} -void CALLBACK SIO1__writeStat32(unsigned long val) {} -void CALLBACK SIO1__writeMode16(unsigned short val) {} -void CALLBACK SIO1__writeMode32(unsigned long val) {} -void CALLBACK SIO1__writeCtrl16(unsigned short val) {} -void CALLBACK SIO1__writeCtrl32(unsigned long val) {} -void CALLBACK SIO1__writeBaud16(unsigned short val) {} -void CALLBACK SIO1__writeBaud32(unsigned long val) {} -unsigned char CALLBACK SIO1__readData8(void) { return 0; } -unsigned short CALLBACK SIO1__readData16(void) { return 0; } -unsigned long CALLBACK SIO1__readData32(void) { return 0; } -unsigned short CALLBACK SIO1__readStat16(void) { return 0; } -unsigned long CALLBACK SIO1__readStat32(void) { return 0; } -unsigned short CALLBACK SIO1__readMode16(void) { return 0; } -unsigned long CALLBACK SIO1__readMode32(void) { return 0; } -unsigned short CALLBACK SIO1__readCtrl16(void) { return 0; } -unsigned long CALLBACK SIO1__readCtrl32(void) { return 0; } -unsigned short CALLBACK SIO1__readBaud16(void) { return 0; } -unsigned long CALLBACK SIO1__readBaud32(void) { return 0; } -void CALLBACK SIO1__registerCallback(void (CALLBACK *callback)(void)) {}; - -void CALLBACK SIO1irq(void) { - psxHu32ref(0x1070) |= SWAPu32(0x100); -} - -#define LoadSio1Sym1(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, TRUE); - -#define LoadSio1SymN(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); - -#define LoadSio1Sym0(dest, name) \ - LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \ - if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest; - -static int LoadSIO1plugin(const char *SIO1dll) { - void *drv; - - hSIO1Driver = SysLoadLibrary(SIO1dll); - if (hSIO1Driver == NULL) { - SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1; - } - drv = hSIO1Driver; - - LoadSio1Sym0(init, "SIO1init"); - LoadSio1Sym0(shutdown, "SIO1shutdown"); - LoadSio1Sym0(open, "SIO1open"); - LoadSio1Sym0(close, "SIO1close"); - LoadSio1Sym0(pause, "SIO1pause"); - LoadSio1Sym0(resume, "SIO1resume"); - LoadSio1Sym0(keypressed, "SIO1keypressed"); - LoadSio1Sym0(configure, "SIO1configure"); - LoadSio1Sym0(test, "SIO1test"); - LoadSio1Sym0(about, "SIO1about"); - LoadSio1Sym0(writeData8, "SIO1writeData8"); - LoadSio1Sym0(writeData16, "SIO1writeData16"); - LoadSio1Sym0(writeData32, "SIO1writeData32"); - LoadSio1Sym0(writeStat16, "SIO1writeStat16"); - LoadSio1Sym0(writeStat32, "SIO1writeStat32"); - LoadSio1Sym0(writeMode16, "SIO1writeMode16"); - LoadSio1Sym0(writeMode32, "SIO1writeMode32"); - LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16"); - LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32"); - LoadSio1Sym0(writeBaud16, "SIO1writeBaud16"); - LoadSio1Sym0(writeBaud32, "SIO1writeBaud32"); - LoadSio1Sym0(readData16, "SIO1readData16"); - LoadSio1Sym0(readData32, "SIO1readData32"); - LoadSio1Sym0(readStat16, "SIO1readStat16"); - LoadSio1Sym0(readStat32, "SIO1readStat32"); - LoadSio1Sym0(readMode16, "SIO1readMode16"); - LoadSio1Sym0(readMode32, "SIO1readMode32"); - LoadSio1Sym0(readCtrl16, "SIO1readCtrl16"); - LoadSio1Sym0(readCtrl32, "SIO1readCtrl32"); - LoadSio1Sym0(readBaud16, "SIO1readBaud16"); - LoadSio1Sym0(readBaud32, "SIO1readBaud32"); - LoadSio1Sym0(registerCallback, "SIO1registerCallback"); - - return 0; -} - -#endif - -void CALLBACK clearDynarec(void) { - psxCpu->Reset(); -} - -int LoadPlugins() { - int ret; - char Plugin[MAXPATHLEN]; - - ReleasePlugins(); - - if (UsingIso()) { - LoadCDRplugin(NULL); - } else { - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr); - if (LoadCDRplugin(Plugin) == -1) return -1; - } - - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Gpu); - if (LoadGPUplugin(Plugin) == -1) return -1; - - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Spu); - if (LoadSPUplugin(Plugin) == -1) return -1; - - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad1); - if (LoadPAD1plugin(Plugin) == -1) return -1; - - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad2); - if (LoadPAD2plugin(Plugin) == -1) return -1; - - if (strcmp("Disabled", Config.Net) == 0 || strcmp("", Config.Net) == 0) - Config.UseNet = FALSE; - else { - Config.UseNet = TRUE; - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Net); - if (LoadNETplugin(Plugin) == -1) Config.UseNet = FALSE; - } - -#ifdef ENABLE_SIO1API - sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Sio1); - if (LoadSIO1plugin(Plugin) == -1) return -1; -#endif - - ret = CDR_init(); - if (ret < 0) { SysMessage (_("Error initializing CD-ROM plugin: %d"), ret); return -1; } - ret = GPU_init(); - if (ret < 0) { SysMessage (_("Error initializing GPU plugin: %d"), ret); return -1; } - ret = SPU_init(); - if (ret < 0) { SysMessage (_("Error initializing SPU plugin: %d"), ret); return -1; } - ret = PAD1_init(1); - if (ret < 0) { SysMessage (_("Error initializing Controller 1 plugin: %d"), ret); return -1; } - ret = PAD2_init(2); - if (ret < 0) { SysMessage (_("Error initializing Controller 2 plugin: %d"), ret); return -1; } - - if (Config.UseNet) { - ret = NET_init(); - if (ret < 0) { SysMessage (_("Error initializing NetPlay plugin: %d"), ret); return -1; } - } - -#ifdef ENABLE_SIO1API - ret = SIO1_init(); - if (ret < 0) { SysMessage (_("Error initializing SIO1 plugin: %d"), ret); return -1; } -#endif - - SysPrintf(_("Plugins loaded.\n")); - return 0; -} - -void ReleasePlugins() { - if (Config.UseNet) { - int ret = NET_close(); - if (ret < 0) Config.UseNet = FALSE; - } - NetOpened = FALSE; - - if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown(); - if (hGPUDriver != NULL) GPU_shutdown(); - if (hSPUDriver != NULL) SPU_shutdown(); - if (hPAD1Driver != NULL) PAD1_shutdown(); - if (hPAD2Driver != NULL) PAD2_shutdown(); - - if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); - - if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; - if (hGPUDriver != NULL) SysCloseLibrary(hGPUDriver); hGPUDriver = NULL; - if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; - if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; - if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; - - if (Config.UseNet && hNETDriver != NULL) { - SysCloseLibrary(hNETDriver); hNETDriver = NULL; - } - -#ifdef ENABLE_SIO1API - if (hSIO1Driver != NULL) { - SIO1_shutdown(); - SysCloseLibrary(hSIO1Driver); - hSIO1Driver = NULL; - } -#endif -} - -void SetIsoFile(const char *filename) { - if (filename == NULL) { - IsoFile[0] = '\0'; - return; - } - strncpy(IsoFile, filename, MAXPATHLEN); -} - -const char *GetIsoFile(void) { - return IsoFile; -} - -boolean UsingIso(void) { - return (IsoFile[0] != '\0'); -} - -void SetCdOpenCaseTime(s64 time) { - cdOpenCaseTime = time; -} +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +/* +* Plugin library callback/access functions. +*/ + +#include "plugins.h" +#include "cdriso.h" + +static char IsoFile[MAXPATHLEN] = ""; +static s64 cdOpenCaseTime = 0; + +GPUupdateLace GPU_updateLace; +GPUinit GPU_init; +GPUshutdown GPU_shutdown; +GPUconfigure GPU_configure; +GPUtest GPU_test; +GPUabout GPU_about; +GPUopen GPU_open; +GPUclose GPU_close; +GPUreadStatus GPU_readStatus; +GPUreadData GPU_readData; +GPUreadDataMem GPU_readDataMem; +GPUwriteStatus GPU_writeStatus; +GPUwriteData GPU_writeData; +GPUwriteDataMem GPU_writeDataMem; +GPUdmaChain GPU_dmaChain; +GPUkeypressed GPU_keypressed; +GPUdisplayText GPU_displayText; +GPUmakeSnapshot GPU_makeSnapshot; +GPUfreeze GPU_freeze; +GPUgetScreenPic GPU_getScreenPic; +GPUshowScreenPic GPU_showScreenPic; +GPUclearDynarec GPU_clearDynarec; +GPUvBlank GPU_vBlank; +GPUregisterCallback GPU_registerCallback; +GPUidle GPU_idle; +GPUvisualVibration GPU_visualVibration; +GPUcursor GPU_cursor; + +CDRinit CDR_init; +CDRshutdown CDR_shutdown; +CDRopen CDR_open; +CDRclose CDR_close; +CDRtest CDR_test; +CDRgetTN CDR_getTN; +CDRgetTD CDR_getTD; +CDRreadTrack CDR_readTrack; +CDRgetBuffer CDR_getBuffer; +CDRplay CDR_play; +CDRstop CDR_stop; +CDRgetStatus CDR_getStatus; +CDRgetDriveLetter CDR_getDriveLetter; +CDRgetBufferSub CDR_getBufferSub; +CDRconfigure CDR_configure; +CDRabout CDR_about; +CDRsetfilename CDR_setfilename; +CDRreadCDDA CDR_readCDDA; +CDRgetTE CDR_getTE; + +SPUconfigure SPU_configure; +SPUabout SPU_about; +SPUinit SPU_init; +SPUshutdown SPU_shutdown; +SPUtest SPU_test; +SPUopen SPU_open; +SPUclose SPU_close; +SPUplaySample SPU_playSample; +SPUwriteRegister SPU_writeRegister; +SPUreadRegister SPU_readRegister; +SPUwriteDMA SPU_writeDMA; +SPUreadDMA SPU_readDMA; +SPUwriteDMAMem SPU_writeDMAMem; +SPUreadDMAMem SPU_readDMAMem; +SPUplayADPCMchannel SPU_playADPCMchannel; +SPUfreeze SPU_freeze; +SPUregisterCallback SPU_registerCallback; +SPUasync SPU_async; +SPUplayCDDAchannel SPU_playCDDAchannel; + +PADconfigure PAD1_configure; +PADabout PAD1_about; +PADinit PAD1_init; +PADshutdown PAD1_shutdown; +PADtest PAD1_test; +PADopen PAD1_open; +PADclose PAD1_close; +PADquery PAD1_query; +PADreadPort1 PAD1_readPort1; +PADkeypressed PAD1_keypressed; +PADstartPoll PAD1_startPoll; +PADpoll PAD1_poll; +PADsetSensitive PAD1_setSensitive; +PADregisterVibration PAD1_registerVibration; +PADregisterCursor PAD1_registerCursor; + +PADconfigure PAD2_configure; +PADabout PAD2_about; +PADinit PAD2_init; +PADshutdown PAD2_shutdown; +PADtest PAD2_test; +PADopen PAD2_open; +PADclose PAD2_close; +PADquery PAD2_query; +PADreadPort2 PAD2_readPort2; +PADkeypressed PAD2_keypressed; +PADstartPoll PAD2_startPoll; +PADpoll PAD2_poll; +PADsetSensitive PAD2_setSensitive; +PADregisterVibration PAD2_registerVibration; +PADregisterCursor PAD2_registerCursor; + +NETinit NET_init; +NETshutdown NET_shutdown; +NETopen NET_open; +NETclose NET_close; +NETtest NET_test; +NETconfigure NET_configure; +NETabout NET_about; +NETpause NET_pause; +NETresume NET_resume; +NETqueryPlayer NET_queryPlayer; +NETsendData NET_sendData; +NETrecvData NET_recvData; +NETsendPadData NET_sendPadData; +NETrecvPadData NET_recvPadData; +NETsetInfo NET_setInfo; +NETkeypressed NET_keypressed; + +#ifdef ENABLE_SIO1API + +SIO1init SIO1_init; +SIO1shutdown SIO1_shutdown; +SIO1open SIO1_open; +SIO1close SIO1_close; +SIO1test SIO1_test; +SIO1configure SIO1_configure; +SIO1about SIO1_about; +SIO1pause SIO1_pause; +SIO1resume SIO1_resume; +SIO1keypressed SIO1_keypressed; +SIO1writeData8 SIO1_writeData8; +SIO1writeData16 SIO1_writeData16; +SIO1writeData32 SIO1_writeData32; +SIO1writeStat16 SIO1_writeStat16; +SIO1writeStat32 SIO1_writeStat32; +SIO1writeMode16 SIO1_writeMode16; +SIO1writeMode32 SIO1_writeMode32; +SIO1writeCtrl16 SIO1_writeCtrl16; +SIO1writeCtrl32 SIO1_writeCtrl32; +SIO1writeBaud16 SIO1_writeBaud16; +SIO1writeBaud32 SIO1_writeBaud32; +SIO1readData8 SIO1_readData8; +SIO1readData16 SIO1_readData16; +SIO1readData32 SIO1_readData32; +SIO1readStat16 SIO1_readStat16; +SIO1readStat32 SIO1_readStat32; +SIO1readMode16 SIO1_readMode16; +SIO1readMode32 SIO1_readMode32; +SIO1readCtrl16 SIO1_readCtrl16; +SIO1readCtrl32 SIO1_readCtrl32; +SIO1readBaud16 SIO1_readBaud16; +SIO1readBaud32 SIO1_readBaud32; +SIO1registerCallback SIO1_registerCallback; + +#endif + +static const char *err; + +#define CheckErr(func) { \ + err = SysLibError(); \ + if (err != NULL) { SysMessage(_("Error loading %s: %s"), func, err); return -1; } \ +} + +#define LoadSym(dest, src, name, checkerr) { \ + dest = (src)SysLoadSym(drv, name); \ + if (checkerr) { CheckErr(name); } else SysLibError(); \ +} + +void *hGPUDriver = NULL; + +static void CALLBACK GPU__displayText(char *pText) { + SysPrintf("%s\n", pText); +} + +void CALLBACK GPUbusy( int ticks ) +{ + //printf( "GPUbusy( %i )\n", ticks ); + //fflush( 0 ); + + psxRegs.interrupt |= (1 << PSXINT_GPUBUSY); + psxRegs.intCycle[PSXINT_GPUBUSY].cycle = ticks; + psxRegs.intCycle[PSXINT_GPUBUSY].sCycle = psxRegs.cycle; +} + +static long CALLBACK GPU__configure(void) { return 0; } +static long CALLBACK GPU__test(void) { return 0; } +static void CALLBACK GPU__about(void) {} +static void CALLBACK GPU__makeSnapshot(void) {} +static void CALLBACK GPU__keypressed(int key) {} +static long CALLBACK GPU__getScreenPic(unsigned char *pMem) { return -1; } +static long CALLBACK GPU__showScreenPic(unsigned char *pMem) { return -1; } +static void CALLBACK GPU__clearDynarec(void (CALLBACK *callback)(void)) {} +static void CALLBACK GPU__vBlank(int val) {} +static void CALLBACK GPU__registerCallback(void (CALLBACK *callback)(int)) {} +static void CALLBACK GPU__idle(void) {} +static void CALLBACK GPU__visualVibration(unsigned long iSmall, unsigned long iBig) {} +static void CALLBACK GPU__cursor(int player, int x, int y) {} + +#define LoadGpuSym1(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, TRUE); + +#define LoadGpuSym0(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, FALSE); \ + if (GPU_##dest == NULL) GPU_##dest = (GPU##dest) GPU__##dest; + +#define LoadGpuSymN(dest, name) \ + LoadSym(GPU_##dest, GPU##dest, name, FALSE); + +static int LoadGPUplugin(const char *GPUdll) { + void *drv; + + hGPUDriver = SysLoadLibrary(GPUdll); + if (hGPUDriver == NULL) { + GPU_configure = NULL; + SysMessage (_("Could not load GPU plugin %s!"), GPUdll); return -1; + } + drv = hGPUDriver; + LoadGpuSym1(init, "GPUinit"); + LoadGpuSym1(shutdown, "GPUshutdown"); + LoadGpuSym1(open, "GPUopen"); + LoadGpuSym1(close, "GPUclose"); + LoadGpuSym1(readData, "GPUreadData"); + LoadGpuSym1(readDataMem, "GPUreadDataMem"); + LoadGpuSym1(readStatus, "GPUreadStatus"); + LoadGpuSym1(writeData, "GPUwriteData"); + LoadGpuSym1(writeDataMem, "GPUwriteDataMem"); + LoadGpuSym1(writeStatus, "GPUwriteStatus"); + LoadGpuSym1(dmaChain, "GPUdmaChain"); + LoadGpuSym1(updateLace, "GPUupdateLace"); + LoadGpuSym0(keypressed, "GPUkeypressed"); + LoadGpuSym0(displayText, "GPUdisplayText"); + LoadGpuSym0(makeSnapshot, "GPUmakeSnapshot"); + LoadGpuSym1(freeze, "GPUfreeze"); + LoadGpuSym0(getScreenPic, "GPUgetScreenPic"); + LoadGpuSym0(showScreenPic, "GPUshowScreenPic"); + LoadGpuSym0(clearDynarec, "GPUclearDynarec"); + LoadGpuSym0(vBlank, "GPUvBlank"); + LoadGpuSym0(registerCallback, "GPUregisterCallback"); + LoadGpuSym0(idle, "GPUidle"); + LoadGpuSym0(visualVibration, "GPUvisualVibration"); + LoadGpuSym0(cursor, "GPUcursor"); + LoadGpuSym0(configure, "GPUconfigure"); + LoadGpuSym0(test, "GPUtest"); + LoadGpuSym0(about, "GPUabout"); + + return 0; +} + +void *hCDRDriver = NULL; + +static long CALLBACK CDR__play(unsigned char *sector) { return 0; } +static long CALLBACK CDR__stop(void) { return 0; } + +long CALLBACK CDR__getStatus(struct CdrStat *stat) { + if (cdOpenCaseTime < 0 || cdOpenCaseTime > (s64)time(NULL)) + stat->Status = 0x10; + else + stat->Status = 0; + + return 0; +} + +char* CALLBACK CDR__getDriveLetter(void) { return NULL; } +long CALLBACK CDR__configure(void) { return 0; } +long CALLBACK CDR__test(void) { return 0; } +void CALLBACK CDR__about(void) {} +long CALLBACK CDR__setfilename(char*filename) { return 0; } + +#define LoadCdrSym1(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, TRUE); + +#define LoadCdrSym0(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, FALSE); \ + if (CDR_##dest == NULL) CDR_##dest = (CDR##dest) CDR__##dest; + +#define LoadCdrSymN(dest, name) \ + LoadSym(CDR_##dest, CDR##dest, name, FALSE); + +static int LoadCDRplugin(const char *CDRdll) { + void *drv; + + if (CDRdll == NULL) { + cdrIsoInit(); + return 0; + } + + hCDRDriver = SysLoadLibrary(CDRdll); + if (hCDRDriver == NULL) { + CDR_configure = NULL; + SysMessage (_("Could not load CD-ROM plugin %s!"), CDRdll); return -1; + } + drv = hCDRDriver; + LoadCdrSym1(init, "CDRinit"); + LoadCdrSym1(shutdown, "CDRshutdown"); + LoadCdrSym1(open, "CDRopen"); + LoadCdrSym1(close, "CDRclose"); + LoadCdrSym1(getTN, "CDRgetTN"); + LoadCdrSym1(getTD, "CDRgetTD"); + LoadCdrSym1(readTrack, "CDRreadTrack"); + LoadCdrSym1(getBuffer, "CDRgetBuffer"); + LoadCdrSym1(getBufferSub, "CDRgetBufferSub"); + LoadCdrSym0(play, "CDRplay"); + LoadCdrSym0(stop, "CDRstop"); + LoadCdrSym0(getStatus, "CDRgetStatus"); + LoadCdrSym0(getDriveLetter, "CDRgetDriveLetter"); + LoadCdrSym0(configure, "CDRconfigure"); + LoadCdrSym0(test, "CDRtest"); + LoadCdrSym0(about, "CDRabout"); + LoadCdrSym0(setfilename, "CDRsetfilename"); + LoadCdrSymN(readCDDA, "CDRreadCDDA"); + LoadCdrSymN(getTE, "CDRgetTE"); + + return 0; +} + +void *hSPUDriver = NULL; + +static long CALLBACK SPU__configure(void) { return 0; } +static void CALLBACK SPU__about(void) {} +static long CALLBACK SPU__test(void) { return 0; } + +#define LoadSpuSym1(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, TRUE); + +#define LoadSpuSym0(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, FALSE); \ + if (SPU_##dest == NULL) SPU_##dest = (SPU##dest) SPU__##dest; + +#define LoadSpuSymN(dest, name) \ + LoadSym(SPU_##dest, SPU##dest, name, FALSE); + +static int LoadSPUplugin(const char *SPUdll) { + void *drv; + + hSPUDriver = SysLoadLibrary(SPUdll); + if (hSPUDriver == NULL) { + SPU_configure = NULL; + SysMessage (_("Could not load SPU plugin %s!"), SPUdll); return -1; + } + drv = hSPUDriver; + LoadSpuSym1(init, "SPUinit"); + LoadSpuSym1(shutdown, "SPUshutdown"); + LoadSpuSym1(open, "SPUopen"); + LoadSpuSym1(close, "SPUclose"); + LoadSpuSym0(configure, "SPUconfigure"); + LoadSpuSym0(about, "SPUabout"); + LoadSpuSym0(test, "SPUtest"); + LoadSpuSym1(writeRegister, "SPUwriteRegister"); + LoadSpuSym1(readRegister, "SPUreadRegister"); + LoadSpuSym1(writeDMA, "SPUwriteDMA"); + LoadSpuSym1(readDMA, "SPUreadDMA"); + LoadSpuSym1(writeDMAMem, "SPUwriteDMAMem"); + LoadSpuSym1(readDMAMem, "SPUreadDMAMem"); + LoadSpuSym1(playADPCMchannel, "SPUplayADPCMchannel"); + LoadSpuSym1(freeze, "SPUfreeze"); + LoadSpuSym1(registerCallback, "SPUregisterCallback"); + LoadSpuSymN(async, "SPUasync"); + LoadSpuSymN(playCDDAchannel, "SPUplayCDDAchannel"); + + return 0; +} + +void *hPAD1Driver = NULL; +void *hPAD2Driver = NULL; + +static unsigned char buf[256]; +unsigned char stdpar[10] = { 0x00, 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +unsigned char mousepar[8] = { 0x00, 0x12, 0x5a, 0xff, 0xff, 0xff, 0xff }; +unsigned char analogpar[9] = { 0x00, 0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + +static int bufcount, bufc; + +PadDataS padd1, padd2; + +static unsigned char _PADstartPoll(PadDataS *pad) { + bufc = 0; + + switch (pad->controllerType) { + case PSE_PAD_TYPE_MOUSE: + mousepar[3] = pad->buttonStatus & 0xff; + mousepar[4] = pad->buttonStatus >> 8; + mousepar[5] = pad->moveX; + mousepar[6] = pad->moveY; + + memcpy(buf, mousepar, 7); + bufcount = 6; + break; + case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069) + analogpar[1] = 0x23; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_ANALOGPAD: // scph1150 + analogpar[1] = 0x73; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_ANALOGJOY: // scph1110 + analogpar[1] = 0x53; + analogpar[3] = pad->buttonStatus & 0xff; + analogpar[4] = pad->buttonStatus >> 8; + analogpar[5] = pad->rightJoyX; + analogpar[6] = pad->rightJoyY; + analogpar[7] = pad->leftJoyX; + analogpar[8] = pad->leftJoyY; + + memcpy(buf, analogpar, 9); + bufcount = 8; + break; + case PSE_PAD_TYPE_STANDARD: + default: + stdpar[3] = pad->buttonStatus & 0xff; + stdpar[4] = pad->buttonStatus >> 8; + + memcpy(buf, stdpar, 5); + bufcount = 4; + } + + return buf[bufc++]; +} + +static unsigned char _PADpoll(unsigned char value) { + if (bufc > bufcount) return 0; + return buf[bufc++]; +} + +static unsigned char CALLBACK PAD1__startPoll(int pad) { + PadDataS padd; + + PAD1_readPort1(&padd); + + return _PADstartPoll(&padd); +} + +static unsigned char CALLBACK PAD1__poll(unsigned char value) { + return _PADpoll(value); +} + +static long CALLBACK PAD1__configure(void) { return 0; } +static void CALLBACK PAD1__about(void) {} +static long CALLBACK PAD1__test(void) { return 0; } +static long CALLBACK PAD1__query(void) { return 3; } +static long CALLBACK PAD1__keypressed() { return 0; } +static void CALLBACK PAD1__registerVibration(void (CALLBACK *callback)(unsigned long, unsigned long)) {} +static void CALLBACK PAD1__registerCursor(void (CALLBACK *callback)(int, int, int)) {} + +#define LoadPad1Sym1(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, TRUE); + +#define LoadPad1SymN(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, FALSE); + +#define LoadPad1Sym0(dest, name) \ + LoadSym(PAD1_##dest, PAD##dest, name, FALSE); \ + if (PAD1_##dest == NULL) PAD1_##dest = (PAD##dest) PAD1__##dest; + +static int LoadPAD1plugin(const char *PAD1dll) { + void *drv; + + hPAD1Driver = SysLoadLibrary(PAD1dll); + if (hPAD1Driver == NULL) { + PAD1_configure = NULL; + SysMessage (_("Could not load Controller 1 plugin %s!"), PAD1dll); return -1; + } + drv = hPAD1Driver; + LoadPad1Sym1(init, "PADinit"); + LoadPad1Sym1(shutdown, "PADshutdown"); + LoadPad1Sym1(open, "PADopen"); + LoadPad1Sym1(close, "PADclose"); + LoadPad1Sym0(query, "PADquery"); + LoadPad1Sym1(readPort1, "PADreadPort1"); + LoadPad1Sym0(configure, "PADconfigure"); + LoadPad1Sym0(test, "PADtest"); + LoadPad1Sym0(about, "PADabout"); + LoadPad1Sym0(keypressed, "PADkeypressed"); + LoadPad1Sym0(startPoll, "PADstartPoll"); + LoadPad1Sym0(poll, "PADpoll"); + LoadPad1SymN(setSensitive, "PADsetSensitive"); + LoadPad1Sym0(registerVibration, "PADregisterVibration"); + LoadPad1Sym0(registerCursor, "PADregisterCursor"); + + return 0; +} + +static unsigned char CALLBACK PAD2__startPoll(int pad) { + PadDataS padd; + + PAD2_readPort2(&padd); + + return _PADstartPoll(&padd); +} + +static unsigned char CALLBACK PAD2__poll(unsigned char value) { + return _PADpoll(value); +} + +static long CALLBACK PAD2__configure(void) { return 0; } +static void CALLBACK PAD2__about(void) {} +static long CALLBACK PAD2__test(void) { return 0; } +static long CALLBACK PAD2__query(void) { return PSE_PAD_USE_PORT1 | PSE_PAD_USE_PORT2; } +static long CALLBACK PAD2__keypressed() { return 0; } +static void CALLBACK PAD2__registerVibration(void (CALLBACK *callback)(unsigned long, unsigned long)) {} +static void CALLBACK PAD2__registerCursor(void (CALLBACK *callback)(int, int, int)) {} + +#define LoadPad2Sym1(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, TRUE); + +#define LoadPad2Sym0(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, FALSE); \ + if (PAD2_##dest == NULL) PAD2_##dest = (PAD##dest) PAD2__##dest; + +#define LoadPad2SymN(dest, name) \ + LoadSym(PAD2_##dest, PAD##dest, name, FALSE); + +static int LoadPAD2plugin(const char *PAD2dll) { + void *drv; + + hPAD2Driver = SysLoadLibrary(PAD2dll); + if (hPAD2Driver == NULL) { + PAD2_configure = NULL; + SysMessage (_("Could not load Controller 2 plugin %s!"), PAD2dll); return -1; + } + drv = hPAD2Driver; + LoadPad2Sym1(init, "PADinit"); + LoadPad2Sym1(shutdown, "PADshutdown"); + LoadPad2Sym1(open, "PADopen"); + LoadPad2Sym1(close, "PADclose"); + LoadPad2Sym0(query, "PADquery"); + LoadPad2Sym1(readPort2, "PADreadPort2"); + LoadPad2Sym0(configure, "PADconfigure"); + LoadPad2Sym0(test, "PADtest"); + LoadPad2Sym0(about, "PADabout"); + LoadPad2Sym0(keypressed, "PADkeypressed"); + LoadPad2Sym0(startPoll, "PADstartPoll"); + LoadPad2Sym0(poll, "PADpoll"); + LoadPad2SymN(setSensitive, "PADsetSensitive"); + LoadPad2Sym0(registerVibration, "PADregisterVibration"); + LoadPad2Sym0(registerCursor, "PADregisterCursor"); + + return 0; +} + +void *hNETDriver = NULL; + +static void CALLBACK NET__setInfo(netInfo *info) {} +static void CALLBACK NET__keypressed(int key) {} +static long CALLBACK NET__configure(void) { return 0; } +static long CALLBACK NET__test(void) { return 0; } +static void CALLBACK NET__about(void) {} + +#define LoadNetSym1(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, TRUE); + +#define LoadNetSymN(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, FALSE); + +#define LoadNetSym0(dest, name) \ + LoadSym(NET_##dest, NET##dest, name, FALSE); \ + if (NET_##dest == NULL) NET_##dest = (NET##dest) NET__##dest; + +static int LoadNETplugin(const char *NETdll) { + void *drv; + + hNETDriver = SysLoadLibrary(NETdll); + if (hNETDriver == NULL) { + SysMessage (_("Could not load NetPlay plugin %s!"), NETdll); return -1; + } + drv = hNETDriver; + LoadNetSym1(init, "NETinit"); + LoadNetSym1(shutdown, "NETshutdown"); + LoadNetSym1(open, "NETopen"); + LoadNetSym1(close, "NETclose"); + LoadNetSymN(sendData, "NETsendData"); + LoadNetSymN(recvData, "NETrecvData"); + LoadNetSym1(sendPadData, "NETsendPadData"); + LoadNetSym1(recvPadData, "NETrecvPadData"); + LoadNetSym1(queryPlayer, "NETqueryPlayer"); + LoadNetSym1(pause, "NETpause"); + LoadNetSym1(resume, "NETresume"); + LoadNetSym0(setInfo, "NETsetInfo"); + LoadNetSym0(keypressed, "NETkeypressed"); + LoadNetSym0(configure, "NETconfigure"); + LoadNetSym0(test, "NETtest"); + LoadNetSym0(about, "NETabout"); + + return 0; +} + +#ifdef ENABLE_SIO1API + +void *hSIO1Driver = NULL; + +static long CALLBACK SIO1__init(void) { return 0; } +static long CALLBACK SIO1__shutdown(void) { return 0; } +static long CALLBACK SIO1__open(void) { return 0; } +static long CALLBACK SIO1__close(void) { return 0; } +static long CALLBACK SIO1__configure(void) { return 0; } +static long CALLBACK SIO1__test(void) { return 0; } +static void CALLBACK SIO1__about(void) {} +static void CALLBACK SIO1__pause(void) {} +static void CALLBACK SIO1__resume(void) {} +static long CALLBACK SIO1__keypressed(int key) { return 0; } +static void CALLBACK SIO1__writeData8(unsigned char val) {} +static void CALLBACK SIO1__writeData16(unsigned short val) {} +static void CALLBACK SIO1__writeData32(unsigned long val) {} +static void CALLBACK SIO1__writeStat16(unsigned short val) {} +static void CALLBACK SIO1__writeStat32(unsigned long val) {} +static void CALLBACK SIO1__writeMode16(unsigned short val) {} +static void CALLBACK SIO1__writeMode32(unsigned long val) {} +static void CALLBACK SIO1__writeCtrl16(unsigned short val) {} +static void CALLBACK SIO1__writeCtrl32(unsigned long val) {} +static void CALLBACK SIO1__writeBaud16(unsigned short val) {} +static void CALLBACK SIO1__writeBaud32(unsigned long val) {} +static unsigned char CALLBACK SIO1__readData8(void) { return 0; } +static unsigned short CALLBACK SIO1__readData16(void) { return 0; } +static unsigned long CALLBACK SIO1__readData32(void) { return 0; } +static unsigned short CALLBACK SIO1__readStat16(void) { return 0; } +static unsigned long CALLBACK SIO1__readStat32(void) { return 0; } +static unsigned short CALLBACK SIO1__readMode16(void) { return 0; } +static unsigned long CALLBACK SIO1__readMode32(void) { return 0; } +static unsigned short CALLBACK SIO1__readCtrl16(void) { return 0; } +static unsigned long CALLBACK SIO1__readCtrl32(void) { return 0; } +static unsigned short CALLBACK SIO1__readBaud16(void) { return 0; } +static unsigned long CALLBACK SIO1__readBaud32(void) { return 0; } +static void CALLBACK SIO1__registerCallback(void (CALLBACK *callback)(void)) {}; + +#if 0 // unused by pcsxr +void CALLBACK SIO1irq(void) { + psxHu32ref(0x1070) |= SWAPu32(0x100); +} +#endif + +#define LoadSio1Sym1(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, TRUE); + +#define LoadSio1SymN(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); + +#define LoadSio1Sym0(dest, name) \ + LoadSym(SIO1_##dest, SIO1##dest, name, FALSE); \ + if (SIO1_##dest == NULL) SIO1_##dest = (SIO1##dest) SIO1__##dest; + +static int LoadSIO1plugin(const char *SIO1dll) { + void *drv; + + hSIO1Driver = SysLoadLibrary(SIO1dll); + if (hSIO1Driver == NULL) { + SysMessage (_("Could not load SIO1 plugin %s!"), SIO1dll); return -1; + } + drv = hSIO1Driver; + + LoadSio1Sym0(init, "SIO1init"); + LoadSio1Sym0(shutdown, "SIO1shutdown"); + LoadSio1Sym0(open, "SIO1open"); + LoadSio1Sym0(close, "SIO1close"); + LoadSio1Sym0(pause, "SIO1pause"); + LoadSio1Sym0(resume, "SIO1resume"); + LoadSio1Sym0(keypressed, "SIO1keypressed"); + LoadSio1Sym0(configure, "SIO1configure"); + LoadSio1Sym0(test, "SIO1test"); + LoadSio1Sym0(about, "SIO1about"); + LoadSio1Sym0(writeData8, "SIO1writeData8"); + LoadSio1Sym0(writeData16, "SIO1writeData16"); + LoadSio1Sym0(writeData32, "SIO1writeData32"); + LoadSio1Sym0(writeStat16, "SIO1writeStat16"); + LoadSio1Sym0(writeStat32, "SIO1writeStat32"); + LoadSio1Sym0(writeMode16, "SIO1writeMode16"); + LoadSio1Sym0(writeMode32, "SIO1writeMode32"); + LoadSio1Sym0(writeCtrl16, "SIO1writeCtrl16"); + LoadSio1Sym0(writeCtrl32, "SIO1writeCtrl32"); + LoadSio1Sym0(writeBaud16, "SIO1writeBaud16"); + LoadSio1Sym0(writeBaud32, "SIO1writeBaud32"); + LoadSio1Sym0(readData8, "SIO1readData8"); + LoadSio1Sym0(readData16, "SIO1readData16"); + LoadSio1Sym0(readData32, "SIO1readData32"); + LoadSio1Sym0(readStat16, "SIO1readStat16"); + LoadSio1Sym0(readStat32, "SIO1readStat32"); + LoadSio1Sym0(readMode16, "SIO1readMode16"); + LoadSio1Sym0(readMode32, "SIO1readMode32"); + LoadSio1Sym0(readCtrl16, "SIO1readCtrl16"); + LoadSio1Sym0(readCtrl32, "SIO1readCtrl32"); + LoadSio1Sym0(readBaud16, "SIO1readBaud16"); + LoadSio1Sym0(readBaud32, "SIO1readBaud32"); + LoadSio1Sym0(registerCallback, "SIO1registerCallback"); + + return 0; +} + +#endif + +void CALLBACK clearDynarec(void) { + psxCpu->Reset(); +} + +int LoadPlugins() { + int ret; + char Plugin[MAXPATHLEN]; + + ReleasePlugins(); + + if (UsingIso()) { + LoadCDRplugin(NULL); + } else { + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Cdr); + if (LoadCDRplugin(Plugin) == -1) return -1; + } + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Gpu); + if (LoadGPUplugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Spu); + if (LoadSPUplugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad1); + if (LoadPAD1plugin(Plugin) == -1) return -1; + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Pad2); + if (LoadPAD2plugin(Plugin) == -1) return -1; + + if (strcmp("Disabled", Config.Net) == 0 || strcmp("", Config.Net) == 0) + Config.UseNet = FALSE; + else { + Config.UseNet = TRUE; + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Net); + if (LoadNETplugin(Plugin) == -1) Config.UseNet = FALSE; + } + +#ifdef ENABLE_SIO1API + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Sio1); + if (LoadSIO1plugin(Plugin) == -1) return -1; +#endif + + ret = CDR_init(); + if (ret < 0) { SysMessage (_("Error initializing CD-ROM plugin: %d"), ret); return -1; } + ret = GPU_init(); + if (ret < 0) { SysMessage (_("Error initializing GPU plugin: %d"), ret); return -1; } + ret = SPU_init(); + if (ret < 0) { SysMessage (_("Error initializing SPU plugin: %d"), ret); return -1; } + ret = PAD1_init(1); + if (ret < 0) { SysMessage (_("Error initializing Controller 1 plugin: %d"), ret); return -1; } + ret = PAD2_init(2); + if (ret < 0) { SysMessage (_("Error initializing Controller 2 plugin: %d"), ret); return -1; } + + if (Config.UseNet) { + ret = NET_init(); + if (ret < 0) { SysMessage (_("Error initializing NetPlay plugin: %d"), ret); return -1; } + } + +#ifdef ENABLE_SIO1API + ret = SIO1_init(); + if (ret < 0) { SysMessage (_("Error initializing SIO1 plugin: %d"), ret); return -1; } +#endif + + SysPrintf(_("Plugins loaded.\n")); + return 0; +} + +void ReleasePlugins() { + if (Config.UseNet) { + int ret = NET_close(); + if (ret < 0) Config.UseNet = FALSE; + } + NetOpened = FALSE; + + if (hCDRDriver != NULL || cdrIsoActive()) CDR_shutdown(); + if (hGPUDriver != NULL) GPU_shutdown(); + if (hSPUDriver != NULL) SPU_shutdown(); + if (hPAD1Driver != NULL) PAD1_shutdown(); + if (hPAD2Driver != NULL) PAD2_shutdown(); + + if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); + + if (hCDRDriver != NULL) SysCloseLibrary(hCDRDriver); hCDRDriver = NULL; + if (hGPUDriver != NULL) SysCloseLibrary(hGPUDriver); hGPUDriver = NULL; + if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; + if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; + if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; + + if (Config.UseNet && hNETDriver != NULL) { + SysCloseLibrary(hNETDriver); hNETDriver = NULL; + } + +#ifdef ENABLE_SIO1API + if (hSIO1Driver != NULL) { + SIO1_shutdown(); + SysCloseLibrary(hSIO1Driver); + hSIO1Driver = NULL; + } +#endif +} + +void SetIsoFile(const char *filename) { + if (filename == NULL) { + IsoFile[0] = '\0'; + return; + } + strncpy(IsoFile, filename, MAXPATHLEN); +} + +const char *GetIsoFile(void) { + return IsoFile; +} + +boolean UsingIso(void) { + return (IsoFile[0] != '\0'); +} + +void SetCdOpenCaseTime(s64 time) { + cdOpenCaseTime = time; +} diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index 4a90c367..be188a4f 100644 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -1,426 +1,223 @@ -/*************************************************************************** - * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * - ***************************************************************************/ - -#ifndef __PLUGINS_H__ -#define __PLUGINS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "psxcommon.h" - -//#define ENABLE_SIO1API 1 - -#ifndef _WIN32 - -typedef void* HWND; -#define CALLBACK - -typedef long (*GPUopen)(unsigned long *, char *, char *); -typedef long (*SPUopen)(void); -typedef long (*PADopen)(unsigned long *); -typedef long (*NETopen)(unsigned long *); -typedef long (*SIO1open)(unsigned long *); - -#else - -#include - -typedef long (CALLBACK* GPUopen)(HWND); -typedef long (CALLBACK* SPUopen)(HWND); -typedef long (CALLBACK* PADopen)(HWND); -typedef long (CALLBACK* NETopen)(HWND); -typedef long (CALLBACK* SIO1open)(HWND); - -#endif - -#include "spu.h" - -#include "psemu_plugin_defs.h" -#include "decode_xa.h" - -int LoadPlugins(); -void ReleasePlugins(); -int OpenPlugins(); -void ClosePlugins(); - -typedef unsigned long (CALLBACK* PSEgetLibType)(void); -typedef unsigned long (CALLBACK* PSEgetLibVersion)(void); -typedef char *(CALLBACK* PSEgetLibName)(void); - -// GPU Functions -typedef long (CALLBACK* GPUinit)(void); -typedef long (CALLBACK* GPUshutdown)(void); -typedef long (CALLBACK* GPUclose)(void); -typedef void (CALLBACK* GPUwriteStatus)(uint32_t); -typedef void (CALLBACK* GPUwriteData)(uint32_t); -typedef void (CALLBACK* GPUwriteDataMem)(uint32_t *, int); -typedef uint32_t (CALLBACK* GPUreadStatus)(void); -typedef uint32_t (CALLBACK* GPUreadData)(void); -typedef void (CALLBACK* GPUreadDataMem)(uint32_t *, int); -typedef long (CALLBACK* GPUdmaChain)(uint32_t *,uint32_t); -typedef void (CALLBACK* GPUupdateLace)(void); -typedef long (CALLBACK* GPUconfigure)(void); -typedef long (CALLBACK* GPUtest)(void); -typedef void (CALLBACK* GPUabout)(void); -typedef void (CALLBACK* GPUmakeSnapshot)(void); -typedef void (CALLBACK* GPUkeypressed)(int); -typedef void (CALLBACK* GPUdisplayText)(char *); -typedef struct { - uint32_t ulFreezeVersion; - uint32_t ulStatus; - uint32_t ulControl[256]; - unsigned char psxVRam[1024*512*2]; -} GPUFreeze_t; -typedef long (CALLBACK* GPUfreeze)(uint32_t, GPUFreeze_t *); -typedef long (CALLBACK* GPUgetScreenPic)(unsigned char *); -typedef long (CALLBACK* GPUshowScreenPic)(unsigned char *); -typedef void (CALLBACK* GPUclearDynarec)(void (CALLBACK *callback)(void)); -typedef void (CALLBACK* GPUvBlank)(int); -typedef void (CALLBACK* GPUregisterCallback)(void (CALLBACK *callback)(int)); -typedef void (CALLBACK* GPUidle)(void); -typedef void (CALLBACK* GPUvisualVibration)(uint32_t, uint32_t); -typedef void (CALLBACK* GPUcursor)(int, int, int); - -// GPU function pointers -extern GPUupdateLace GPU_updateLace; -extern GPUinit GPU_init; -extern GPUshutdown GPU_shutdown; -extern GPUconfigure GPU_configure; -extern GPUtest GPU_test; -extern GPUabout GPU_about; -extern GPUopen GPU_open; -extern GPUclose GPU_close; -extern GPUreadStatus GPU_readStatus; -extern GPUreadData GPU_readData; -extern GPUreadDataMem GPU_readDataMem; -extern GPUwriteStatus GPU_writeStatus; -extern GPUwriteData GPU_writeData; -extern GPUwriteDataMem GPU_writeDataMem; -extern GPUdmaChain GPU_dmaChain; -extern GPUkeypressed GPU_keypressed; -extern GPUdisplayText GPU_displayText; -extern GPUmakeSnapshot GPU_makeSnapshot; -extern GPUfreeze GPU_freeze; -extern GPUgetScreenPic GPU_getScreenPic; -extern GPUshowScreenPic GPU_showScreenPic; -extern GPUclearDynarec GPU_clearDynarec; -extern GPUvBlank GPU_vBlank; -extern GPUregisterCallback GPU_registerCallback; -extern GPUidle GPU_idle; -extern GPUvisualVibration GPU_visualVibration; -extern GPUcursor GPU_cursor; - -// CD-ROM Functions -typedef long (CALLBACK* CDRinit)(void); -typedef long (CALLBACK* CDRshutdown)(void); -typedef long (CALLBACK* CDRopen)(void); -typedef long (CALLBACK* CDRclose)(void); -typedef long (CALLBACK* CDRgetTN)(unsigned char *); -typedef long (CALLBACK* CDRgetTD)(unsigned char, unsigned char *); -typedef long (CALLBACK* CDRreadTrack)(unsigned char *); -typedef unsigned char* (CALLBACK* CDRgetBuffer)(void); -typedef unsigned char* (CALLBACK* CDRgetBufferSub)(void); -typedef long (CALLBACK* CDRconfigure)(void); -typedef long (CALLBACK* CDRtest)(void); -typedef void (CALLBACK* CDRabout)(void); -typedef long (CALLBACK* CDRplay)(unsigned char *); -typedef long (CALLBACK* CDRstop)(void); -typedef long (CALLBACK* CDRsetfilename)(char *); -struct CdrStat { - uint32_t Type; - uint32_t Status; - unsigned char Time[3]; -}; -typedef long (CALLBACK* CDRgetStatus)(struct CdrStat *); -typedef char* (CALLBACK* CDRgetDriveLetter)(void); -struct SubQ { - char res0[12]; - unsigned char ControlAndADR; - unsigned char TrackNumber; - unsigned char IndexNumber; - unsigned char TrackRelativeAddress[3]; - unsigned char Filler; - unsigned char AbsoluteAddress[3]; - unsigned char CRC[2]; - char res1[72]; -}; -typedef long (CALLBACK* CDRreadCDDA)(unsigned char, unsigned char, unsigned char, unsigned char *); -typedef long (CALLBACK* CDRgetTE)(unsigned char, unsigned char *, unsigned char *, unsigned char *); - -// CD-ROM function pointers -extern CDRinit CDR_init; -extern CDRshutdown CDR_shutdown; -extern CDRopen CDR_open; -extern CDRclose CDR_close; -extern CDRtest CDR_test; -extern CDRgetTN CDR_getTN; -extern CDRgetTD CDR_getTD; -extern CDRreadTrack CDR_readTrack; -extern CDRgetBuffer CDR_getBuffer; -extern CDRgetBufferSub CDR_getBufferSub; -extern CDRplay CDR_play; -extern CDRstop CDR_stop; -extern CDRgetStatus CDR_getStatus; -extern CDRgetDriveLetter CDR_getDriveLetter; -extern CDRconfigure CDR_configure; -extern CDRabout CDR_about; -extern CDRsetfilename CDR_setfilename; -extern CDRreadCDDA CDR_readCDDA; -extern CDRgetTE CDR_getTE; - -// SPU Functions -typedef long (CALLBACK* SPUinit)(void); -typedef long (CALLBACK* SPUshutdown)(void); -typedef long (CALLBACK* SPUclose)(void); -typedef void (CALLBACK* SPUplaySample)(unsigned char); -typedef void (CALLBACK* SPUwriteRegister)(unsigned long, unsigned short); -typedef unsigned short (CALLBACK* SPUreadRegister)(unsigned long); -typedef void (CALLBACK* SPUwriteDMA)(unsigned short); -typedef unsigned short (CALLBACK* SPUreadDMA)(void); -typedef void (CALLBACK* SPUwriteDMAMem)(unsigned short *, int); -typedef void (CALLBACK* SPUreadDMAMem)(unsigned short *, int); -typedef void (CALLBACK* SPUplayADPCMchannel)(xa_decode_t *); -typedef void (CALLBACK* SPUregisterCallback)(void (CALLBACK *callback)(void)); -typedef long (CALLBACK* SPUconfigure)(void); -typedef long (CALLBACK* SPUtest)(void); -typedef void (CALLBACK* SPUabout)(void); -typedef struct { - unsigned char PluginName[8]; - uint32_t PluginVersion; - uint32_t Size; - unsigned char SPUPorts[0x200]; - unsigned char SPURam[0x80000]; - xa_decode_t xa; - unsigned char *SPUInfo; -} SPUFreeze_t; -typedef long (CALLBACK* SPUfreeze)(uint32_t, SPUFreeze_t *); -typedef void (CALLBACK* SPUasync)(uint32_t); -typedef void (CALLBACK* SPUplayCDDAchannel)(short *, int); - -// SPU function pointers -extern SPUconfigure SPU_configure; -extern SPUabout SPU_about; -extern SPUinit SPU_init; -extern SPUshutdown SPU_shutdown; -extern SPUtest SPU_test; -extern SPUopen SPU_open; -extern SPUclose SPU_close; -extern SPUplaySample SPU_playSample; -extern SPUwriteRegister SPU_writeRegister; -extern SPUreadRegister SPU_readRegister; -extern SPUwriteDMA SPU_writeDMA; -extern SPUreadDMA SPU_readDMA; -extern SPUwriteDMAMem SPU_writeDMAMem; -extern SPUreadDMAMem SPU_readDMAMem; -extern SPUplayADPCMchannel SPU_playADPCMchannel; -extern SPUfreeze SPU_freeze; -extern SPUregisterCallback SPU_registerCallback; -extern SPUasync SPU_async; -extern SPUplayCDDAchannel SPU_playCDDAchannel; - -// PAD Functions -typedef long (CALLBACK* PADconfigure)(void); -typedef void (CALLBACK* PADabout)(void); -typedef long (CALLBACK* PADinit)(long); -typedef long (CALLBACK* PADshutdown)(void); -typedef long (CALLBACK* PADtest)(void); -typedef long (CALLBACK* PADclose)(void); -typedef long (CALLBACK* PADquery)(void); -typedef long (CALLBACK* PADreadPort1)(PadDataS*); -typedef long (CALLBACK* PADreadPort2)(PadDataS*); -typedef long (CALLBACK* PADkeypressed)(void); -typedef unsigned char (CALLBACK* PADstartPoll)(int); -typedef unsigned char (CALLBACK* PADpoll)(unsigned char); -typedef void (CALLBACK* PADsetSensitive)(int); -typedef void (CALLBACK* PADregisterVibration)(void (CALLBACK *callback)(uint32_t, uint32_t)); -typedef void (CALLBACK* PADregisterCursor)(void (CALLBACK *callback)(int, int, int)); - -// PAD function pointers -extern PADconfigure PAD1_configure; -extern PADabout PAD1_about; -extern PADinit PAD1_init; -extern PADshutdown PAD1_shutdown; -extern PADtest PAD1_test; -extern PADopen PAD1_open; -extern PADclose PAD1_close; -extern PADquery PAD1_query; -extern PADreadPort1 PAD1_readPort1; -extern PADkeypressed PAD1_keypressed; -extern PADstartPoll PAD1_startPoll; -extern PADpoll PAD1_poll; -extern PADsetSensitive PAD1_setSensitive; -extern PADregisterVibration PAD1_registerVibration; -extern PADregisterCursor PAD1_registerCursor; -extern PADconfigure PAD2_configure; -extern PADabout PAD2_about; -extern PADinit PAD2_init; -extern PADshutdown PAD2_shutdown; -extern PADtest PAD2_test; -extern PADopen PAD2_open; -extern PADclose PAD2_close; -extern PADquery PAD2_query; -extern PADreadPort2 PAD2_readPort2; -extern PADkeypressed PAD2_keypressed; -extern PADstartPoll PAD2_startPoll; -extern PADpoll PAD2_poll; -extern PADsetSensitive PAD2_setSensitive; -extern PADregisterVibration PAD2_registerVibration; -extern PADregisterCursor PAD2_registerCursor; - -// NET Functions -typedef long (CALLBACK* NETinit)(void); -typedef long (CALLBACK* NETshutdown)(void); -typedef long (CALLBACK* NETclose)(void); -typedef long (CALLBACK* NETconfigure)(void); -typedef long (CALLBACK* NETtest)(void); -typedef void (CALLBACK* NETabout)(void); -typedef void (CALLBACK* NETpause)(void); -typedef void (CALLBACK* NETresume)(void); -typedef long (CALLBACK* NETqueryPlayer)(void); -typedef long (CALLBACK* NETsendData)(void *, int, int); -typedef long (CALLBACK* NETrecvData)(void *, int, int); -typedef long (CALLBACK* NETsendPadData)(void *, int); -typedef long (CALLBACK* NETrecvPadData)(void *, int); - -typedef struct { - char EmuName[32]; - char CdromID[9]; // ie. 'SCPH12345', no \0 trailing character - char CdromLabel[11]; - void *psxMem; - GPUshowScreenPic GPU_showScreenPic; - GPUdisplayText GPU_displayText; - PADsetSensitive PAD_setSensitive; - char GPUpath[256]; // paths must be absolute - char SPUpath[256]; - char CDRpath[256]; - char MCD1path[256]; - char MCD2path[256]; - char BIOSpath[256]; // 'HLE' for internal bios - char Unused[1024]; -} netInfo; - -typedef long (CALLBACK* NETsetInfo)(netInfo *); -typedef long (CALLBACK* NETkeypressed)(int); - -// NET function pointers -extern NETinit NET_init; -extern NETshutdown NET_shutdown; -extern NETopen NET_open; -extern NETclose NET_close; -extern NETtest NET_test; -extern NETconfigure NET_configure; -extern NETabout NET_about; -extern NETpause NET_pause; -extern NETresume NET_resume; -extern NETqueryPlayer NET_queryPlayer; -extern NETsendData NET_sendData; -extern NETrecvData NET_recvData; -extern NETsendPadData NET_sendPadData; -extern NETrecvPadData NET_recvPadData; -extern NETsetInfo NET_setInfo; -extern NETkeypressed NET_keypressed; - -#ifdef ENABLE_SIO1API - -// SIO1 Functions (link cable) -typedef long (CALLBACK* SIO1init)(void); -typedef long (CALLBACK* SIO1shutdown)(void); -typedef long (CALLBACK* SIO1close)(void); -typedef long (CALLBACK* SIO1configure)(void); -typedef long (CALLBACK* SIO1test)(void); -typedef void (CALLBACK* SIO1about)(void); -typedef void (CALLBACK* SIO1pause)(void); -typedef void (CALLBACK* SIO1resume)(void); -typedef long (CALLBACK* SIO1keypressed)(int); -typedef void (CALLBACK* SIO1writeData8)(unsigned char); -typedef void (CALLBACK* SIO1writeData16)(unsigned short); -typedef void (CALLBACK* SIO1writeData32)(unsigned long); -typedef void (CALLBACK* SIO1writeStat16)(unsigned short); -typedef void (CALLBACK* SIO1writeStat32)(unsigned long); -typedef void (CALLBACK* SIO1writeMode16)(unsigned short); -typedef void (CALLBACK* SIO1writeMode32)(unsigned long); -typedef void (CALLBACK* SIO1writeCtrl16)(unsigned short); -typedef void (CALLBACK* SIO1writeCtrl32)(unsigned long); -typedef void (CALLBACK* SIO1writeBaud16)(unsigned short); -typedef void (CALLBACK* SIO1writeBaud32)(unsigned long); -typedef unsigned char (CALLBACK* SIO1readData8)(void); -typedef unsigned short (CALLBACK* SIO1readData16)(void); -typedef unsigned long (CALLBACK* SIO1readData32)(void); -typedef unsigned short (CALLBACK* SIO1readStat16)(void); -typedef unsigned long (CALLBACK* SIO1readStat32)(void); -typedef unsigned short (CALLBACK* SIO1readMode16)(void); -typedef unsigned long (CALLBACK* SIO1readMode32)(void); -typedef unsigned short (CALLBACK* SIO1readCtrl16)(void); -typedef unsigned long (CALLBACK* SIO1readCtrl32)(void); -typedef unsigned short (CALLBACK* SIO1readBaud16)(void); -typedef unsigned long (CALLBACK* SIO1readBaud32)(void); -typedef void (CALLBACK* SIO1registerCallback)(void (CALLBACK *callback)(void)); - -// SIO1 function pointers -extern SIO1init SIO1_init; -extern SIO1shutdown SIO1_shutdown; -extern SIO1open SIO1_open; -extern SIO1close SIO1_close; -extern SIO1test SIO1_test; -extern SIO1configure SIO1_configure; -extern SIO1about SIO1_about; -extern SIO1pause SIO1_pause; -extern SIO1resume SIO1_resume; -extern SIO1keypressed SIO1_keypressed; -extern SIO1writeData8 SIO1_writeData8; -extern SIO1writeData16 SIO1_writeData16; -extern SIO1writeData32 SIO1_writeData32; -extern SIO1writeStat16 SIO1_writeStat16; -extern SIO1writeStat32 SIO1_writeStat32; -extern SIO1writeMode16 SIO1_writeMode16; -extern SIO1writeMode32 SIO1_writeMode32; -extern SIO1writeCtrl16 SIO1_writeCtrl16; -extern SIO1writeCtrl32 SIO1_writeCtrl32; -extern SIO1writeBaud16 SIO1_writeBaud16; -extern SIO1writeBaud32 SIO1_writeBaud32; -extern SIO1readData8 SIO1_readData8; -extern SIO1readData16 SIO1_readData16; -extern SIO1readData32 SIO1_readData32; -extern SIO1readStat16 SIO1_readStat16; -extern SIO1readStat32 SIO1_readStat32; -extern SIO1readMode16 SIO1_readMode16; -extern SIO1readMode32 SIO1_readMode32; -extern SIO1readCtrl16 SIO1_readCtrl16; -extern SIO1readCtrl32 SIO1_readCtrl32; -extern SIO1readBaud16 SIO1_readBaud16; -extern SIO1readBaud32 SIO1_readBaud32; -extern SIO1registerCallback SIO1_registerCallback; - -#endif - -void CALLBACK clearDynarec(void); - -void CALLBACK GPUbusy( int ticks ); - -void SetIsoFile(const char *filename); -const char *GetIsoFile(void); -boolean UsingIso(void); -void SetCdOpenCaseTime(s64 time); - -#ifdef __cplusplus -} -#endif -#endif +/*************************************************************************** + * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * + ***************************************************************************/ + +#ifndef __PLUGINS_H__ +#define __PLUGINS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "psxcommon.h" + +#include "plugin_common.h" + +#define PLUGINEXTERN typedef +#define PLUGINCALL(x) (CALLBACK* x) + +#include "psemu_plugin_defs.h" + +#include "spu.h" + +int LoadPlugins(); +void ReleasePlugins(); +int OpenPlugins(); +void ClosePlugins(); + +// GPU function pointers +extern GPUupdateLace GPU_updateLace; +extern GPUinit GPU_init; +extern GPUshutdown GPU_shutdown; +extern GPUconfigure GPU_configure; +extern GPUtest GPU_test; +extern GPUabout GPU_about; +extern GPUopen GPU_open; +extern GPUclose GPU_close; +extern GPUreadStatus GPU_readStatus; +extern GPUreadData GPU_readData; +extern GPUreadDataMem GPU_readDataMem; +extern GPUwriteStatus GPU_writeStatus; +extern GPUwriteData GPU_writeData; +extern GPUwriteDataMem GPU_writeDataMem; +extern GPUdmaChain GPU_dmaChain; +extern GPUkeypressed GPU_keypressed; +extern GPUdisplayText GPU_displayText; +extern GPUmakeSnapshot GPU_makeSnapshot; +extern GPUfreeze GPU_freeze; +extern GPUgetScreenPic GPU_getScreenPic; +extern GPUshowScreenPic GPU_showScreenPic; +extern GPUclearDynarec GPU_clearDynarec; +extern GPUvBlank GPU_vBlank; +extern GPUregisterCallback GPU_registerCallback; +extern GPUidle GPU_idle; +extern GPUvisualVibration GPU_visualVibration; +extern GPUcursor GPU_cursor; + +// CD-ROM function pointers +extern CDRinit CDR_init; +extern CDRshutdown CDR_shutdown; +extern CDRopen CDR_open; +extern CDRclose CDR_close; +extern CDRtest CDR_test; +extern CDRgetTN CDR_getTN; +extern CDRgetTD CDR_getTD; +extern CDRreadTrack CDR_readTrack; +extern CDRgetBuffer CDR_getBuffer; +extern CDRgetBufferSub CDR_getBufferSub; +extern CDRplay CDR_play; +extern CDRstop CDR_stop; +extern CDRgetStatus CDR_getStatus; +extern CDRgetDriveLetter CDR_getDriveLetter; +extern CDRconfigure CDR_configure; +extern CDRabout CDR_about; +extern CDRsetfilename CDR_setfilename; +extern CDRreadCDDA CDR_readCDDA; +extern CDRgetTE CDR_getTE; + +// SPU function pointers +extern SPUconfigure SPU_configure; +extern SPUabout SPU_about; +extern SPUinit SPU_init; +extern SPUshutdown SPU_shutdown; +extern SPUtest SPU_test; +extern SPUopen SPU_open; +extern SPUclose SPU_close; +extern SPUplaySample SPU_playSample; +extern SPUwriteRegister SPU_writeRegister; +extern SPUreadRegister SPU_readRegister; +extern SPUwriteDMA SPU_writeDMA; +extern SPUreadDMA SPU_readDMA; +extern SPUwriteDMAMem SPU_writeDMAMem; +extern SPUreadDMAMem SPU_readDMAMem; +extern SPUplayADPCMchannel SPU_playADPCMchannel; +extern SPUfreeze SPU_freeze; +extern SPUregisterCallback SPU_registerCallback; +extern SPUasync SPU_async; +extern SPUplayCDDAchannel SPU_playCDDAchannel; + +// PAD function pointers +extern PADconfigure PAD1_configure; +extern PADabout PAD1_about; +extern PADinit PAD1_init; +extern PADshutdown PAD1_shutdown; +extern PADtest PAD1_test; +extern PADopen PAD1_open; +extern PADclose PAD1_close; +extern PADquery PAD1_query; +extern PADreadPort1 PAD1_readPort1; +extern PADkeypressed PAD1_keypressed; +extern PADstartPoll PAD1_startPoll; +extern PADpoll PAD1_poll; +extern PADsetSensitive PAD1_setSensitive; +extern PADregisterVibration PAD1_registerVibration; +extern PADregisterCursor PAD1_registerCursor; +extern PADconfigure PAD2_configure; +extern PADabout PAD2_about; +extern PADinit PAD2_init; +extern PADshutdown PAD2_shutdown; +extern PADtest PAD2_test; +extern PADopen PAD2_open; +extern PADclose PAD2_close; +extern PADquery PAD2_query; +extern PADreadPort2 PAD2_readPort2; +extern PADkeypressed PAD2_keypressed; +extern PADstartPoll PAD2_startPoll; +extern PADpoll PAD2_poll; +extern PADsetSensitive PAD2_setSensitive; +extern PADregisterVibration PAD2_registerVibration; +extern PADregisterCursor PAD2_registerCursor; + +// NET function pointers +extern NETinit NET_init; +extern NETshutdown NET_shutdown; +extern NETopen NET_open; +extern NETclose NET_close; +extern NETtest NET_test; +extern NETconfigure NET_configure; +extern NETabout NET_about; +extern NETpause NET_pause; +extern NETresume NET_resume; +extern NETqueryPlayer NET_queryPlayer; +extern NETsendData NET_sendData; +extern NETrecvData NET_recvData; +extern NETsendPadData NET_sendPadData; +extern NETrecvPadData NET_recvPadData; +extern NETsetInfo NET_setInfo; +extern NETkeypressed NET_keypressed; + +#ifdef ENABLE_SIO1API + +// SIO1 function pointers +extern SIO1init SIO1_init; +extern SIO1shutdown SIO1_shutdown; +extern SIO1open SIO1_open; +extern SIO1close SIO1_close; +extern SIO1test SIO1_test; +extern SIO1configure SIO1_configure; +extern SIO1about SIO1_about; +extern SIO1pause SIO1_pause; +extern SIO1resume SIO1_resume; +extern SIO1keypressed SIO1_keypressed; +extern SIO1writeData8 SIO1_writeData8; +extern SIO1writeData16 SIO1_writeData16; +extern SIO1writeData32 SIO1_writeData32; +extern SIO1writeStat16 SIO1_writeStat16; +extern SIO1writeStat32 SIO1_writeStat32; +extern SIO1writeMode16 SIO1_writeMode16; +extern SIO1writeMode32 SIO1_writeMode32; +extern SIO1writeCtrl16 SIO1_writeCtrl16; +extern SIO1writeCtrl32 SIO1_writeCtrl32; +extern SIO1writeBaud16 SIO1_writeBaud16; +extern SIO1writeBaud32 SIO1_writeBaud32; +extern SIO1readData8 SIO1_readData8; +extern SIO1readData16 SIO1_readData16; +extern SIO1readData32 SIO1_readData32; +extern SIO1readStat16 SIO1_readStat16; +extern SIO1readStat32 SIO1_readStat32; +extern SIO1readMode16 SIO1_readMode16; +extern SIO1readMode32 SIO1_readMode32; +extern SIO1readCtrl16 SIO1_readCtrl16; +extern SIO1readCtrl32 SIO1_readCtrl32; +extern SIO1readBaud16 SIO1_readBaud16; +extern SIO1readBaud32 SIO1_readBaud32; +extern SIO1registerCallback SIO1_registerCallback; + +#endif + +void CALLBACK clearDynarec(void); + +void CALLBACK GPUbusy( int ticks ); + +void SetIsoFile(const char *filename); +const char *GetIsoFile(void); +boolean UsingIso(void); +void SetCdOpenCaseTime(s64 time); + +char* CALLBACK CDR__getDriveLetter(void); +long CALLBACK CDR__configure(void); +long CALLBACK CDR__test(void); +void CALLBACK CDR__about(void); +long CALLBACK CDR__setfilename(char *filename); +long CALLBACK CDR__getStatus(struct CdrStat *stat); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/libpcsxcore/ppc/pR3000A.c b/libpcsxcore/ppc/pR3000A.c index 1d6e3de7..da370e43 100644 --- a/libpcsxcore/ppc/pR3000A.c +++ b/libpcsxcore/ppc/pR3000A.c @@ -2130,9 +2130,7 @@ REC_FUNC(LWL); REC_FUNC(LWR); REC_FUNC(SWL); REC_FUNC(SWR); -/*extern u32 LWL_MASK[4]; -extern u32 LWL_SHIFT[4]; - +/* void iLWLk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -2279,9 +2277,6 @@ static void recLWBlock(int count) { resp = respsave; } -extern u32 LWR_MASK[4]; -extern u32 LWR_SHIFT[4]; - void iLWRk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -2580,9 +2575,6 @@ static void recSWBlock(int count) { resp = respsave; } -extern u32 SWL_MASK[4]; -extern u32 SWL_SHIFT[4]; - void iSWLk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); @@ -2659,9 +2651,6 @@ void recSWL() { resp+= 8; } -extern u32 SWR_MASK[4]; -extern u32 SWR_SHIFT[4]; - void iSWRk(u32 shift) { if (IsConst(_Rt_)) { MOV32ItoR(ECX, iRegs[_Rt_].k); diff --git a/libpcsxcore/ppf.c b/libpcsxcore/ppf.c index 44414a6c..59f4526f 100644 --- a/libpcsxcore/ppf.c +++ b/libpcsxcore/ppf.c @@ -210,10 +210,8 @@ void BuildPPFCache() { ppffile = fopen(szPPF, "rb"); if (ppffile == NULL) return; - memset(buffer, 0, 5); - fread(buffer, 3, 1, ppffile); - - if (strcmp(buffer, "PPF") != 0) { + if (fread(buffer, 3, 1, ppffile) != 1 || + strcmp(buffer, "PPF") != 0) { SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); fclose(ppffile); return; @@ -233,13 +231,21 @@ void BuildPPFCache() { case 1: // ppf2 fseek(ppffile, -8, SEEK_END); - memset(buffer, 0, 5); - fread(buffer, 4, 1, ppffile); + if(fread(buffer, 4, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } if (strcmp(".DIZ", buffer) != 0) { dizyn = 0; } else { - fread(&dizlen, 4, 1, ppffile); + if(fread(&dizlen, 4, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } + dizlen = SWAP32(dizlen); dizyn = 1; } @@ -265,12 +271,20 @@ void BuildPPFCache() { fseek(ppffile, -6, SEEK_END); memset(buffer, 0, 5); - fread(buffer, 4, 1, ppffile); + if(fread(buffer, 4, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } dizlen = 0; if (strcmp(".DIZ", buffer) == 0) { fseek(ppffile, -2, SEEK_END); - fread(&dizlen, 2, 1, ppffile); + if(fread(&dizlen, 4, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } dizlen = SWAP32(dizlen); dizlen += 36; } @@ -297,13 +311,21 @@ void BuildPPFCache() { // now do the data reading do { fseek(ppffile, seekpos, SEEK_SET); - fread(&pos, 4, 1, ppffile); + if(fread(&pos, 4, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } pos = SWAP32(pos); - if (method == 2) fread(buffer, 4, 1, ppffile); // skip 4 bytes on ppf3 (no int64 support here) + if (method == 2) fseek(ppffile, 4, SEEK_CUR); // skip 4 bytes on ppf3 (no int64 support here) anz = fgetc(ppffile); - fread(ppfmem, anz, 1, ppffile); + if(fread(ppfmem, anz, 1, ppffile) != 1) { + SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); + fclose(ppffile); + return; + } ladr = pos / CD_FRAMESIZE_RAW; off = pos % CD_FRAMESIZE_RAW; @@ -366,10 +388,15 @@ void LoadSBI() { if (sbihandle == NULL) return; // 4-byte SBI header - fread(buffer, 1, 4, sbihandle); + if(fread(buffer, 4, 1, sbihandle) != 1) { + fclose(sbihandle); + return; + } while (!feof(sbihandle)) { - fread(sbitime[sbicount++], 1, 3, sbihandle); - fread(buffer, 1, 11, sbihandle); + if(fread(sbitime[sbicount], 3, 1, sbihandle) != 1 || + fread(buffer, 11, 1, sbihandle) != 1) + break; + sbicount++; } fclose(sbihandle); diff --git a/libpcsxcore/psemu_plugin_defs.h b/libpcsxcore/psemu_plugin_defs.h index d1b05ac3..44cebf49 100644 --- a/libpcsxcore/psemu_plugin_defs.h +++ b/libpcsxcore/psemu_plugin_defs.h @@ -1,6 +1,12 @@ #ifndef _PSEMU_PLUGIN_DEFS_H #define _PSEMU_PLUGIN_DEFS_H +#include + +#include "psxcommon.h" + +#include "plugin_common.h" + #ifdef __cplusplus extern "C" { #endif @@ -10,6 +16,13 @@ extern "C" { #define PLUGIN_VERSION 1 +#ifndef PLUGINCALL +#define PLUGINCALL(x) CALLBACK x +#endif +#ifndef PLUGINEXTERN +#define PLUGINEXTERN +#endif + // plugin type returned by PSEgetLibType (types can be merged if plugin is multi type!) #define PSE_LT_CDR 1 #define PSE_LT_GPU 2 @@ -17,6 +30,10 @@ extern "C" { #define PSE_LT_PAD 8 #define PSE_LT_NET 16 +PLUGINEXTERN unsigned long PLUGINCALL(PSEgetLibType)(void); +PLUGINEXTERN unsigned long PLUGINCALL(PSEgetLibVersion)(void); +PLUGINEXTERN char *PLUGINCALL(PSEgetLibName)(void); + // DLL function return codes #define PSE_ERR_SUCCESS 0 // every function in DLL if completed sucessfully should return this value #define PSE_ERR_FATAL -1 // undefined error but fatal one, that kills all functionality @@ -29,6 +46,24 @@ extern "C" { #define PSE_INIT_ERR_NOTCONFIGURED -2 // this driver is not configured #define PSE_INIT_ERR_NOHARDWARE -3 // this driver can not operate properly on this hardware or hardware is not detected +#ifndef _WIN32 + +PLUGINEXTERN long PLUGINCALL(GPUopen)(unsigned long *, char *, char *); +PLUGINEXTERN long PLUGINCALL(SPUopen)(void); +PLUGINEXTERN long PLUGINCALL(PADopen)(unsigned long *); +PLUGINEXTERN long PLUGINCALL(NETopen)(unsigned long *); +PLUGINEXTERN long PLUGINCALL(SIO1open)(unsigned long *); + +#else + +PLUGINEXTERN long PLUGINCALL(GPUopen)(HWND); +PLUGINEXTERN long PLUGINCALL(SPUopen)(HWND); +PLUGINEXTERN long PLUGINCALL(PADopen)(HWND); +PLUGINEXTERN long PLUGINCALL(NETopen)(HWND); +PLUGINEXTERN long PLUGINCALL(SIO1open)(HWND); + +#endif + /* GPU PlugIn */ // GPU_Test return values @@ -70,6 +105,34 @@ typedef struct // GPU_Query End - will be implemented in v2 +// GPU Functions +PLUGINEXTERN long PLUGINCALL(GPUinit)(void); +PLUGINEXTERN long PLUGINCALL(GPUshutdown)(void); +PLUGINEXTERN long PLUGINCALL(GPUclose)(void); +PLUGINEXTERN void PLUGINCALL(GPUwriteStatus)(uint32_t); +PLUGINEXTERN void PLUGINCALL(GPUwriteData)(uint32_t); +PLUGINEXTERN void PLUGINCALL(GPUwriteDataMem)(uint32_t *, int); +PLUGINEXTERN uint32_t PLUGINCALL(GPUreadStatus)(void); +PLUGINEXTERN uint32_t PLUGINCALL(GPUreadData)(void); +PLUGINEXTERN void PLUGINCALL(GPUreadDataMem)(uint32_t *, int); +PLUGINEXTERN long PLUGINCALL(GPUdmaChain)(uint32_t *,uint32_t); +PLUGINEXTERN void PLUGINCALL(GPUupdateLace)(void); +PLUGINEXTERN long PLUGINCALL(GPUconfigure)(void); +PLUGINEXTERN long PLUGINCALL(GPUtest)(void); +PLUGINEXTERN void PLUGINCALL(GPUabout)(void); +PLUGINEXTERN void PLUGINCALL(GPUmakeSnapshot)(void); +PLUGINEXTERN void PLUGINCALL(GPUkeypressed)(int); +PLUGINEXTERN void PLUGINCALL(GPUdisplayText)(char *); +PLUGINEXTERN long PLUGINCALL(GPUfreeze)(uint32_t, GPUFreeze_t *); +PLUGINEXTERN long PLUGINCALL(GPUgetScreenPic)(unsigned char *); +PLUGINEXTERN long PLUGINCALL(GPUshowScreenPic)(unsigned char *); +PLUGINEXTERN void PLUGINCALL(GPUclearDynarec)(void (CALLBACK *callback)(void)); +PLUGINEXTERN void PLUGINCALL(GPUvBlank)(int); +PLUGINEXTERN void PLUGINCALL(GPUregisterCallback)(void (CALLBACK *callback)(int)); +PLUGINEXTERN void PLUGINCALL(GPUidle)(void); +PLUGINEXTERN void PLUGINCALL(GPUvisualVibration)(uint32_t, uint32_t); +PLUGINEXTERN void PLUGINCALL(GPUcursor)(int, int, int); + /* CDR PlugIn */ @@ -94,6 +157,26 @@ typedef struct // this might happen to CDROMS that do not support RAW mode reading - surelly it will kill many games #define PSE_CDR_WARN_LAMECD PSE_CDR_WARN + 0 +// CD-ROM Functions +PLUGINEXTERN long PLUGINCALL(CDRinit)(void); +PLUGINEXTERN long PLUGINCALL(CDRshutdown)(void); +PLUGINEXTERN long PLUGINCALL(CDRopen)(void); +PLUGINEXTERN long PLUGINCALL(CDRclose)(void); +PLUGINEXTERN long PLUGINCALL(CDRgetTN)(unsigned char *); +PLUGINEXTERN long PLUGINCALL(CDRgetTD)(unsigned char, unsigned char *); +PLUGINEXTERN long PLUGINCALL(CDRreadTrack)(unsigned char *); +PLUGINEXTERN unsigned char* PLUGINCALL(CDRgetBuffer)(void); +PLUGINEXTERN unsigned char* PLUGINCALL(CDRgetBufferSub)(void); +PLUGINEXTERN long PLUGINCALL(CDRconfigure)(void); +PLUGINEXTERN long PLUGINCALL(CDRtest)(void); +PLUGINEXTERN void PLUGINCALL(CDRabout)(void); +PLUGINEXTERN long PLUGINCALL(CDRplay)(unsigned char *); +PLUGINEXTERN long PLUGINCALL(CDRstop)(void); +PLUGINEXTERN long PLUGINCALL(CDRsetfilename)(char *); +PLUGINEXTERN long PLUGINCALL(CDRgetStatus)(struct CdrStat *); +PLUGINEXTERN char* PLUGINCALL(CDRgetDriveLetter)(void); +PLUGINEXTERN long PLUGINCALL(CDRreadCDDA)(unsigned char, unsigned char, unsigned char, unsigned char *); +PLUGINEXTERN long PLUGINCALL(CDRgetTE)(unsigned char, unsigned char *, unsigned char *, unsigned char *); @@ -119,6 +202,25 @@ typedef struct #define PSE_SPU_WARN 60 +// SPU Functions +PLUGINEXTERN long PLUGINCALL(SPUinit)(void); +PLUGINEXTERN long PLUGINCALL(SPUshutdown)(void); +PLUGINEXTERN long PLUGINCALL(SPUclose)(void); +PLUGINEXTERN void PLUGINCALL(SPUplaySample)(unsigned char); +PLUGINEXTERN void PLUGINCALL(SPUwriteRegister)(unsigned long, unsigned short); +PLUGINEXTERN unsigned short PLUGINCALL(SPUreadRegister)(unsigned long); +PLUGINEXTERN void PLUGINCALL(SPUwriteDMA)(unsigned short); +PLUGINEXTERN unsigned short PLUGINCALL(SPUreadDMA)(void); +PLUGINEXTERN void PLUGINCALL(SPUwriteDMAMem)(unsigned short *, int); +PLUGINEXTERN void PLUGINCALL(SPUreadDMAMem)(unsigned short *, int); +PLUGINEXTERN void PLUGINCALL(SPUplayADPCMchannel)(xa_decode_t *); +PLUGINEXTERN void PLUGINCALL(SPUregisterCallback)(void (CALLBACK *callback)(void)); +PLUGINEXTERN long PLUGINCALL(SPUconfigure)(void); +PLUGINEXTERN long PLUGINCALL(SPUtest)(void); +PLUGINEXTERN void PLUGINCALL(SPUabout)(void); +PLUGINEXTERN long PLUGINCALL(SPUfreeze)(uint32_t, SPUFreeze_t *); +PLUGINEXTERN void PLUGINCALL(SPUasync)(uint32_t); +PLUGINEXTERN void PLUGINCALL(SPUplayCDDAchannel)(short *, int); /* PAD PlugIn */ @@ -126,6 +228,7 @@ typedef struct /* functions that must be exported from PAD Plugin + (see below for actual prototypes) long PADinit(long flags); // called only once when PSEmu Starts void PADshutdown(void); // called when PSEmu exits @@ -209,6 +312,24 @@ typedef struct } PadDataS; +// PAD Functions +PLUGINEXTERN long PLUGINCALL(PADconfigure)(void); +PLUGINEXTERN void PLUGINCALL(PADabout)(void); +PLUGINEXTERN long PLUGINCALL(PADinit)(long); +PLUGINEXTERN long PLUGINCALL(PADshutdown)(void); +PLUGINEXTERN long PLUGINCALL(PADtest)(void); +PLUGINEXTERN long PLUGINCALL(PADclose)(void); +PLUGINEXTERN long PLUGINCALL(PADquery)(void); +PLUGINEXTERN long PLUGINCALL(PADreadPort1)(PadDataS*); +PLUGINEXTERN long PLUGINCALL(PADreadPort2)(PadDataS*); +PLUGINEXTERN long PLUGINCALL(PADkeypressed)(void); +PLUGINEXTERN unsigned char PLUGINCALL(PADstartPoll)(int); +PLUGINEXTERN unsigned char PLUGINCALL(PADpoll)(unsigned char); +PLUGINEXTERN void PLUGINCALL(PADsetSensitive)(int); +PLUGINEXTERN void PLUGINCALL(PADregisterVibration)(void (CALLBACK *callback)(uint32_t, uint32_t)); +PLUGINEXTERN void PLUGINCALL(PADregisterCursor)(void (CALLBACK *callback)(int, int, int)); + + /* NET PlugIn v2 */ /* Added by linuzappz@pcsx.net */ @@ -278,6 +399,60 @@ typedef struct { void NETkeypressed(int key) (linux only) key is a XK_?? (X11) keycode. */ +// NET Functions +PLUGINEXTERN long PLUGINCALL(NETinit)(void); +PLUGINEXTERN long PLUGINCALL(NETshutdown)(void); +PLUGINEXTERN long PLUGINCALL(NETclose)(void); +PLUGINEXTERN long PLUGINCALL(NETconfigure)(void); +PLUGINEXTERN long PLUGINCALL(NETtest)(void); +PLUGINEXTERN void PLUGINCALL(NETabout)(void); +PLUGINEXTERN void PLUGINCALL(NETpause)(void); +PLUGINEXTERN void PLUGINCALL(NETresume)(void); +PLUGINEXTERN long PLUGINCALL(NETqueryPlayer)(void); +PLUGINEXTERN long PLUGINCALL(NETsendData)(void *, int, int); +PLUGINEXTERN long PLUGINCALL(NETrecvData)(void *, int, int); +PLUGINEXTERN long PLUGINCALL(NETsendPadData)(void *, int); +PLUGINEXTERN long PLUGINCALL(NETrecvPadData)(void *, int); +PLUGINEXTERN long PLUGINCALL(NETsetInfo)(netInfo *); +PLUGINEXTERN long PLUGINCALL(NETkeypressed)(int); + +#ifdef ENABLE_SIO1API + +// SIO1 Functions (link cable) +PLUGINEXTERN long PLUGINCALL(SIO1init)(void); +PLUGINEXTERN long PLUGINCALL(SIO1shutdown)(void); +PLUGINEXTERN long PLUGINCALL(SIO1close)(void); +PLUGINEXTERN long PLUGINCALL(SIO1configure)(void); +PLUGINEXTERN long PLUGINCALL(SIO1test)(void); +PLUGINEXTERN void PLUGINCALL(SIO1about)(void); +PLUGINEXTERN void PLUGINCALL(SIO1pause)(void); +PLUGINEXTERN void PLUGINCALL(SIO1resume)(void); +PLUGINEXTERN long PLUGINCALL(SIO1keypressed)(int); +PLUGINEXTERN void PLUGINCALL(SIO1writeData8)(unsigned char); +PLUGINEXTERN void PLUGINCALL(SIO1writeData16)(unsigned short); +PLUGINEXTERN void PLUGINCALL(SIO1writeData32)(unsigned long); +PLUGINEXTERN void PLUGINCALL(SIO1writeStat16)(unsigned short); +PLUGINEXTERN void PLUGINCALL(SIO1writeStat32)(unsigned long); +PLUGINEXTERN void PLUGINCALL(SIO1writeMode16)(unsigned short); +PLUGINEXTERN void PLUGINCALL(SIO1writeMode32)(unsigned long); +PLUGINEXTERN void PLUGINCALL(SIO1writeCtrl16)(unsigned short); +PLUGINEXTERN void PLUGINCALL(SIO1writeCtrl32)(unsigned long); +PLUGINEXTERN void PLUGINCALL(SIO1writeBaud16)(unsigned short); +PLUGINEXTERN void PLUGINCALL(SIO1writeBaud32)(unsigned long); +PLUGINEXTERN unsigned char PLUGINCALL(SIO1readData8)(void); +PLUGINEXTERN unsigned short PLUGINCALL(SIO1readData16)(void); +PLUGINEXTERN unsigned long PLUGINCALL(SIO1readData32)(void); +PLUGINEXTERN unsigned short PLUGINCALL(SIO1readStat16)(void); +PLUGINEXTERN unsigned long PLUGINCALL(SIO1readStat32)(void); +PLUGINEXTERN unsigned short PLUGINCALL(SIO1readMode16)(void); +PLUGINEXTERN unsigned long PLUGINCALL(SIO1readMode32)(void); +PLUGINEXTERN unsigned short PLUGINCALL(SIO1readCtrl16)(void); +PLUGINEXTERN unsigned long PLUGINCALL(SIO1readCtrl32)(void); +PLUGINEXTERN unsigned short PLUGINCALL(SIO1readBaud16)(void); +PLUGINEXTERN unsigned long PLUGINCALL(SIO1readBaud32)(void); +PLUGINEXTERN void PLUGINCALL(SIO1registerCallback)(void (CALLBACK *callback)(void)); + +#endif #ifdef __cplusplus } diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c index 68163d5a..277f33a9 100644 --- a/libpcsxcore/psxbios.c +++ b/libpcsxcore/psxbios.c @@ -72,7 +72,7 @@ char *biosA0n[256] = { "sys_a0_8c", "sys_a0_8d", "sys_a0_8e", "sys_a0_8f", // 0x90 "sys_a0_90", "sys_a0_91", "sys_a0_92", "sys_a0_93", - "sys_a0_94", "sys_a0_95", "AddCDROMDevice", "AddMemCardDevide", + "sys_a0_94", "sys_a0_95", "AddCDROMDevice", "AddMemCardDevice", "DisableKernelIORedirection", "EnableKernelIORedirection", "sys_a0_9a", "sys_a0_9b", "SetConf", "GetConf", "sys_a0_9e", "SetMem", // 0xa0 @@ -93,7 +93,7 @@ char *biosB0n[256] = { "EnableEvent", "DisableEvent", "OpenTh", "CloseTh", // 0x10 "ChangeTh", "sys_b0_11", "InitPAD", "StartPAD", - "StopPAD", "PAD_init", "PAD_dr", "ReturnFromExecption", + "StopPAD", "PAD_init", "PAD_dr", "ReturnFromException", "ResetEntryInt", "HookEntryInt", "sys_b0_1a", "sys_b0_1b", "sys_b0_1c", "sys_b0_1d", "sys_b0_1e", "sys_b0_1f", // 0x20 @@ -310,17 +310,17 @@ static inline void LoadRegs() { // System calls A0 */ -void psxBios_abs() { // 0x0e +static void psxBios_abs() { // 0x0e if ((s32)a0 < 0) v0 = -(s32)a0; else v0 = a0; pc0 = ra; } -void psxBios_labs() { // 0x0f +static void psxBios_labs() { // 0x0f psxBios_abs(); } -void psxBios_atoi() { // 0x10 +static void psxBios_atoi() { // 0x10 s32 n = 0, f = 0; char *p = (char *)Ra0; @@ -341,11 +341,11 @@ void psxBios_atoi() { // 0x10 pc0 = ra; } -void psxBios_atol() { // 0x11 +static void psxBios_atol() { // 0x11 psxBios_atoi(); } -void psxBios_setjmp() { // 0x13 +static void psxBios_setjmp() { // 0x13 u32 *jmp_buf = (u32 *)Ra0; int i; @@ -363,7 +363,7 @@ void psxBios_setjmp() { // 0x13 v0 = 0; pc0 = ra; } -void psxBios_longjmp() { // 0x14 +static void psxBios_longjmp() { // 0x14 u32 *jmp_buf = (u32 *)Ra0; int i; @@ -381,7 +381,7 @@ void psxBios_longjmp() { // 0x14 v0 = a1; pc0 = ra; } -void psxBios_strcat() { // 0x15 +static void psxBios_strcat() { // 0x15 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; #ifdef PSXBIOS_LOG @@ -395,7 +395,7 @@ void psxBios_strcat() { // 0x15 v0 = a0; pc0 = ra; } -void psxBios_strncat() { // 0x16 +static void psxBios_strncat() { // 0x16 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; s32 n = a2; @@ -415,7 +415,7 @@ void psxBios_strncat() { // 0x16 v0 = a0; pc0 = ra; } -void psxBios_strcmp() { // 0x17 +static void psxBios_strcmp() { // 0x17 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; #ifdef PSXBIOS_LOG @@ -434,7 +434,7 @@ void psxBios_strcmp() { // 0x17 pc0 = ra; } -void psxBios_strncmp() { // 0x18 +static void psxBios_strncmp() { // 0x18 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; s32 n = a2; @@ -454,14 +454,14 @@ void psxBios_strncmp() { // 0x18 pc0 = ra; } -void psxBios_strcpy() { // 0x19 +static void psxBios_strcpy() { // 0x19 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; while ((*p1++ = *p2++) != '\0'); v0 = a0; pc0 = ra; } -void psxBios_strncpy() { // 0x1a +static void psxBios_strncpy() { // 0x1a char *p1 = (char *)Ra0, *p2 = (char *)Ra1; s32 n = a2, i; @@ -478,14 +478,14 @@ void psxBios_strncpy() { // 0x1a v0 = a0; pc0 = ra; } -void psxBios_strlen() { // 0x1b +static void psxBios_strlen() { // 0x1b char *p = (char *)Ra0; v0 = 0; while (*p++) v0++; pc0 = ra; } -void psxBios_index() { // 0x1c +static void psxBios_index() { // 0x1c char *p = (char *)Ra0; do { @@ -499,7 +499,7 @@ void psxBios_index() { // 0x1c v0 = 0; pc0 = ra; } -void psxBios_rindex() { // 0x1d +static void psxBios_rindex() { // 0x1d char *p = (char *)Ra0; v0 = 0; @@ -512,15 +512,15 @@ void psxBios_rindex() { // 0x1d pc0 = ra; } -void psxBios_strchr() { // 0x1e +static void psxBios_strchr() { // 0x1e psxBios_index(); } -void psxBios_strrchr() { // 0x1f +static void psxBios_strrchr() { // 0x1f psxBios_rindex(); } -void psxBios_strpbrk() { // 0x20 +static void psxBios_strpbrk() { // 0x20 char *p1 = (char *)Ra0, *p2 = (char *)Ra1, *scanp, c, sc; while ((c = *p1++) != '\0') { @@ -537,7 +537,7 @@ void psxBios_strpbrk() { // 0x20 v0 = a0; pc0 = ra; } -void psxBios_strspn() { // 0x21 +static void psxBios_strspn() { // 0x21 char *p1, *p2; for (p1 = (char *)Ra0; *p1 != '\0'; p1++) { @@ -548,7 +548,7 @@ void psxBios_strspn() { // 0x21 v0 = p1 - (char *)Ra0; pc0 = ra; } -void psxBios_strcspn() { // 0x22 +static void psxBios_strcspn() { // 0x22 char *p1, *p2; for (p1 = (char *)Ra0; *p1 != '\0'; p1++) { @@ -559,7 +559,7 @@ void psxBios_strcspn() { // 0x22 v0 = p1 - (char *)Ra0; pc0 = ra; } -void psxBios_strtok() { // 0x23 +static void psxBios_strtok() { // 0x23 char *pcA0 = (char *)Ra0; char *pcRet = strtok(pcA0, (char *)Ra1); if (pcRet) @@ -569,7 +569,7 @@ void psxBios_strtok() { // 0x23 pc0 = ra; } -void psxBios_strstr() { // 0x24 +static void psxBios_strstr() { // 0x24 char *p = (char *)Ra0, *p1, *p2; while (*p != '\0') { @@ -592,33 +592,33 @@ void psxBios_strstr() { // 0x24 v0 = 0; pc0 = ra; } -void psxBios_toupper() { // 0x25 +static void psxBios_toupper() { // 0x25 v0 = (s8)(a0 & 0xff); if (v0 >= 'a' && v0 <= 'z') v0 -= 'a' - 'A'; pc0 = ra; } -void psxBios_tolower() { // 0x26 +static void psxBios_tolower() { // 0x26 v0 = (s8)(a0 & 0xff); if (v0 >= 'A' && v0 <= 'Z') v0 += 'a' - 'A'; pc0 = ra; } -void psxBios_bcopy() { // 0x27 +static void psxBios_bcopy() { // 0x27 char *p1 = (char *)Ra1, *p2 = (char *)Ra0; while (a2-- > 0) *p1++ = *p2++; pc0 = ra; } -void psxBios_bzero() { // 0x28 +static void psxBios_bzero() { // 0x28 char *p = (char *)Ra0; while (a1-- > 0) *p++ = '\0'; pc0 = ra; } -void psxBios_bcmp() { // 0x29 +static void psxBios_bcmp() { // 0x29 char *p1 = (char *)Ra0, *p2 = (char *)Ra1; if (a0 == 0 || a1 == 0) { v0 = 0; pc0 = ra; return; } @@ -634,21 +634,21 @@ void psxBios_bcmp() { // 0x29 v0 = 0; pc0 = ra; } -void psxBios_memcpy() { // 0x2a +static void psxBios_memcpy() { // 0x2a char *p1 = (char *)Ra0, *p2 = (char *)Ra1; while (a2-- > 0) *p1++ = *p2++; v0 = a0; pc0 = ra; } -void psxBios_memset() { // 0x2b +static void psxBios_memset() { // 0x2b char *p = (char *)Ra0; while (a2-- > 0) *p++ = (char)a1; v0 = a0; pc0 = ra; } -void psxBios_memmove() { // 0x2c +static void psxBios_memmove() { // 0x2c char *p1 = (char *)Ra0, *p2 = (char *)Ra1; if (p2 <= p1 && p2 + a2 > p1) { @@ -663,11 +663,11 @@ void psxBios_memmove() { // 0x2c v0 = a0; pc0 = ra; } -void psxBios_memcmp() { // 0x2d +static void psxBios_memcmp() { // 0x2d psxBios_bcmp(); } -void psxBios_memchr() { // 0x2e +static void psxBios_memchr() { // 0x2e char *p = (char *)Ra0; while (a2-- > 0) { @@ -680,14 +680,14 @@ void psxBios_memchr() { // 0x2e v0 = 0; pc0 = ra; } -void psxBios_rand() { // 0x2f +static void psxBios_rand() { // 0x2f u32 s = psxMu32(0x9010) * 1103515245 + 12345; v0 = (s >> 16) & 0x7fff; psxMu32ref(0x9010) = SWAPu32(s); pc0 = ra; } -void psxBios_srand() { // 0x30 +static void psxBios_srand() { // 0x30 psxMu32ref(0x9010) = SWAPu32(a0); pc0 = ra; } @@ -790,7 +790,7 @@ loop: } } -void psxBios_qsort() { // 0x31 +static void psxBios_qsort() { // 0x31 qswidth = a2; qscmpfunc = a3; qsort_main((char *)Ra0, (char *)Ra0 + a1 * a2); @@ -798,9 +798,9 @@ void psxBios_qsort() { // 0x31 pc0 = ra; } -void psxBios_malloc() { // 0x33 - unsigned int *chunk, *newchunk; - unsigned int dsize, csize, cstat; +static void psxBios_malloc() { // 0x33 + unsigned int *chunk, *newchunk = NULL; + unsigned int dsize = 0, csize, cstat; int colflag; #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]); @@ -870,7 +870,7 @@ void psxBios_malloc() { // 0x33 // split free chunk *chunk = SWAP32(dsize); newchunk = (u32*)((uptr)chunk + dsize + 4); - *newchunk = SWAP32((csize - dsize - 4) & 0xfffffffc | 1); + *newchunk = SWAP32(((csize - dsize - 4) & 0xfffffffc) | 1); } // return pointer to allocated memory @@ -880,7 +880,7 @@ void psxBios_malloc() { // 0x33 pc0 = ra; } -void psxBios_free() { // 0x34 +static void psxBios_free() { // 0x34 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x34]); @@ -892,7 +892,7 @@ void psxBios_free() { // 0x34 pc0 = ra; } -void psxBios_calloc() { // 0x37 +static void psxBios_calloc() { // 0x37 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x37]); #endif @@ -902,7 +902,7 @@ void psxBios_calloc() { // 0x37 memset(Rv0, 0, a0); } -void psxBios_realloc() { // 0x38 +static void psxBios_realloc() { // 0x38 u32 block = a0; u32 size = a1; #ifdef PSXBIOS_LOG @@ -917,7 +917,7 @@ void psxBios_realloc() { // 0x38 /* InitHeap(void *block , int n) */ -void psxBios_InitHeap() { // 0x39 +static void psxBios_InitHeap() { // 0x39 unsigned int size; #ifdef PSXBIOS_LOG @@ -938,11 +938,11 @@ void psxBios_InitHeap() { // 0x39 pc0 = ra; } -void psxBios_getchar() { //0x3b +static void psxBios_getchar() { //0x3b v0 = getchar(); pc0 = ra; } -void psxBios_printf() { // 0x3f +static void psxBios_printf() { // 0x3f char tmp[1024]; char tmp2[1024]; u32 save[4]; @@ -1014,7 +1014,7 @@ _start: * long Load(char *name, struct EXEC *header); */ -void psxBios_Load() { // 0x42 +static void psxBios_Load() { // 0x42 EXE_HEADER eheader; #ifdef PSXBIOS_LOG @@ -1033,7 +1033,7 @@ void psxBios_Load() { // 0x42 * int Exec(struct EXEC *header , int argc , char **argv); */ -void psxBios_Exec() { // 43 +static void psxBios_Exec() { // 43 EXEC *header = (EXEC*)Ra0; u32 tmp; @@ -1065,17 +1065,17 @@ void psxBios_Exec() { // 43 pc0 = header->_pc0; } -void psxBios_FlushCache() { // 44 +static void psxBios_FlushCache() { // 44 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x44]); #endif - - psxRegs.ICache_valid = 0; + + psxRegs.ICache_valid = 0; pc0 = ra; } -void psxBios_GPU_dw() { // 0x46 +static void psxBios_GPU_dw() { // 0x46 int size; s32 *ptr; @@ -1096,7 +1096,7 @@ void psxBios_GPU_dw() { // 0x46 pc0 = ra; } -void psxBios_mem2vram() { // 0x47 +static void psxBios_mem2vram() { // 0x47 int size; GPU_writeData(0xa0000000); @@ -1113,17 +1113,17 @@ void psxBios_mem2vram() { // 0x47 pc0 = ra; } -void psxBios_SendGPU() { // 0x48 +static void psxBios_SendGPU() { // 0x48 GPU_writeStatus(a0); pc0 = ra; } -void psxBios_GPU_cw() { // 0x49 +static void psxBios_GPU_cw() { // 0x49 GPU_writeData(a0); pc0 = ra; } -void psxBios_GPU_cwb() { // 0x4a +static void psxBios_GPU_cwb() { // 0x4a s32 *ptr = (s32*)Ra0; int size = a1; while(size--) { @@ -1134,7 +1134,7 @@ void psxBios_GPU_cwb() { // 0x4a pc0 = ra; } -void psxBios_GPU_SendPackets() { //4b: +static void psxBios_GPU_SendPackets() { //4b: GPU_writeStatus(0x04000002); psxHwWrite32(0x1f8010f4,0); psxHwWrite32(0x1f8010f0,psxHwRead32(0x1f8010f0)|0x800); @@ -1144,7 +1144,7 @@ void psxBios_GPU_SendPackets() { //4b: pc0 = ra; } -void psxBios_sys_a0_4c() { // 0x4c GPU relate +static void psxBios_sys_a0_4c() { // 0x4c GPU relate psxHwWrite32(0x1f8010a8,0x00000401); GPU_writeData(0x0400000); GPU_writeData(0x0200000); @@ -1153,14 +1153,14 @@ void psxBios_sys_a0_4c() { // 0x4c GPU relate pc0 = ra; } -void psxBios_GPU_GetGPUStatus() { // 0x4d +static void psxBios_GPU_GetGPUStatus() { // 0x4d v0 = GPU_readStatus(); pc0 = ra; } #undef s_addr -void psxBios_LoadExec() { // 51 +static void psxBios_LoadExec() { // 51 EXEC *header = (EXEC*)PSXM(0xf000); u32 s_addr, s_size; @@ -1179,7 +1179,7 @@ void psxBios_LoadExec() { // 51 psxBios_Exec(); } -void psxBios__bu_init() { // 70 +static void psxBios__bu_init() { // 70 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x70]); #endif @@ -1190,7 +1190,7 @@ void psxBios__bu_init() { // 70 pc0 = ra; } -void psxBios__96_init() { // 71 +static void psxBios__96_init() { // 71 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x71]); #endif @@ -1198,7 +1198,7 @@ void psxBios__96_init() { // 71 pc0 = ra; } -void psxBios__96_remove() { // 72 +static void psxBios__96_remove() { // 72 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x72]); #endif @@ -1206,7 +1206,7 @@ void psxBios__96_remove() { // 72 pc0 = ra; } -void psxBios_SetMem() { // 9f +static void psxBios_SetMem() { // 9f u32 new = psxHu32(0x1060); #ifdef PSXBIOS_LOG @@ -1233,7 +1233,7 @@ void psxBios_SetMem() { // 9f pc0 = ra; } -void psxBios__card_info() { // ab +static void psxBios__card_info() { // ab #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0); #endif @@ -1246,7 +1246,7 @@ void psxBios__card_info() { // ab v0 = 1; pc0 = ra; } -void psxBios__card_load() { // ac +static void psxBios__card_load() { // ac #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xac], a0); #endif @@ -1261,7 +1261,7 @@ void psxBios__card_load() { // ac /* System calls B0 */ -void psxBios_SetRCnt() { // 02 +static void psxBios_SetRCnt() { // 02 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x02]); #endif @@ -1282,7 +1282,7 @@ void psxBios_SetRCnt() { // 02 pc0 = ra; } -void psxBios_GetRCnt() { // 03 +static void psxBios_GetRCnt() { // 03 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x03]); #endif @@ -1293,7 +1293,7 @@ void psxBios_GetRCnt() { // 03 pc0 = ra; } -void psxBios_StartRCnt() { // 04 +static void psxBios_StartRCnt() { // 04 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x04]); #endif @@ -1304,7 +1304,7 @@ void psxBios_StartRCnt() { // 04 v0 = 1; pc0 = ra; } -void psxBios_StopRCnt() { // 05 +static void psxBios_StopRCnt() { // 05 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x05]); #endif @@ -1315,7 +1315,7 @@ void psxBios_StopRCnt() { // 05 pc0 = ra; } -void psxBios_ResetRCnt() { // 06 +static void psxBios_ResetRCnt() { // 06 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x06]); #endif @@ -1348,7 +1348,7 @@ void psxBios_ResetRCnt() { // 06 break; \ } -void psxBios_DeliverEvent() { // 07 +static void psxBios_DeliverEvent() { // 07 int ev, spec; int i; @@ -1364,7 +1364,7 @@ void psxBios_DeliverEvent() { // 07 pc0 = ra; } -void psxBios_OpenEvent() { // 08 +static void psxBios_OpenEvent() { // 08 int ev, spec; int i; @@ -1383,7 +1383,7 @@ void psxBios_OpenEvent() { // 08 pc0 = ra; } -void psxBios_CloseEvent() { // 09 +static void psxBios_CloseEvent() { // 09 int ev, spec; ev = a0 & 0xff; @@ -1398,7 +1398,7 @@ void psxBios_CloseEvent() { // 09 v0 = 1; pc0 = ra; } -void psxBios_WaitEvent() { // 0a +static void psxBios_WaitEvent() { // 0a int ev, spec; ev = a0 & 0xff; @@ -1413,7 +1413,7 @@ void psxBios_WaitEvent() { // 0a v0 = 1; pc0 = ra; } -void psxBios_TestEvent() { // 0b +static void psxBios_TestEvent() { // 0b int ev, spec; ev = a0 & 0xff; @@ -1430,7 +1430,7 @@ void psxBios_TestEvent() { // 0b pc0 = ra; } -void psxBios_EnableEvent() { // 0c +static void psxBios_EnableEvent() { // 0c int ev, spec; ev = a0 & 0xff; @@ -1445,7 +1445,7 @@ void psxBios_EnableEvent() { // 0c v0 = 1; pc0 = ra; } -void psxBios_DisableEvent() { // 0d +static void psxBios_DisableEvent() { // 0d int ev, spec; ev = a0 & 0xff; @@ -1464,7 +1464,7 @@ void psxBios_DisableEvent() { // 0d * long OpenTh(long (*func)(), unsigned long sp, unsigned long gp); */ -void psxBios_OpenTh() { // 0e +static void psxBios_OpenTh() { // 0e int th; for (th=1; th<8; th++) @@ -1486,7 +1486,7 @@ void psxBios_OpenTh() { // 0e * int CloseTh(long thread); */ -void psxBios_CloseTh() { // 0f +static void psxBios_CloseTh() { // 0f int th = a0 & 0xff; #ifdef PSXBIOS_LOG @@ -1507,7 +1507,7 @@ void psxBios_CloseTh() { // 0f * int ChangeTh(long thread); */ -void psxBios_ChangeTh() { // 10 +static void psxBios_ChangeTh() { // 10 int th = a0 & 0xff; #ifdef PSXBIOS_LOG @@ -1534,7 +1534,7 @@ void psxBios_ChangeTh() { // 10 } } -void psxBios_InitPAD() { // 0x12 +static void psxBios_InitPAD() { // 0x12 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x12]); #endif @@ -1547,7 +1547,7 @@ void psxBios_InitPAD() { // 0x12 v0 = 1; pc0 = ra; } -void psxBios_StartPAD() { // 13 +static void psxBios_StartPAD() { // 13 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x13]); #endif @@ -1557,7 +1557,7 @@ void psxBios_StartPAD() { // 13 pc0 = ra; } -void psxBios_StopPAD() { // 14 +static void psxBios_StopPAD() { // 14 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x14]); #endif @@ -1567,7 +1567,7 @@ void psxBios_StopPAD() { // 14 pc0 = ra; } -void psxBios_PAD_init() { // 15 +static void psxBios_PAD_init() { // 15 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x15]); #endif @@ -1578,7 +1578,7 @@ void psxBios_PAD_init() { // 15 pc0 = ra; } -void psxBios_PAD_dr() { // 16 +static void psxBios_PAD_dr() { // 16 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x16]); #endif @@ -1586,7 +1586,7 @@ void psxBios_PAD_dr() { // 16 v0 = -1; pc0 = ra; } -void psxBios_ReturnFromException() { // 17 +static void psxBios_ReturnFromException() { // 17 LoadRegs(); pc0 = psxRegs.CP0.n.EPC; @@ -1596,7 +1596,7 @@ void psxBios_ReturnFromException() { // 17 ((psxRegs.CP0.n.Status & 0x3c) >> 2); } -void psxBios_ResetEntryInt() { // 18 +static void psxBios_ResetEntryInt() { // 18 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x18]); #endif @@ -1605,7 +1605,7 @@ void psxBios_ResetEntryInt() { // 18 pc0 = ra; } -void psxBios_HookEntryInt() { // 19 +static void psxBios_HookEntryInt() { // 19 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x19]); #endif @@ -1614,7 +1614,7 @@ void psxBios_HookEntryInt() { // 19 pc0 = ra; } -void psxBios_UnDeliverEvent() { // 0x20 +static void psxBios_UnDeliverEvent() { // 0x20 int ev, spec; int i; @@ -1675,7 +1675,7 @@ void psxBios_UnDeliverEvent() { // 0x20 * int open(char *name , int mode); */ -void psxBios_open() { // 0x32 +static void psxBios_open() { // 0x32 int i; char *ptr; @@ -1700,7 +1700,7 @@ void psxBios_open() { // 0x32 * int lseek(int fd , int offset , int whence); */ -void psxBios_lseek() { // 0x33 +static void psxBios_lseek() { // 0x33 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x, %x, %x\n", biosB0n[0x33], a0, a1, a2); #endif @@ -1737,7 +1737,7 @@ void psxBios_lseek() { // 0x33 * int read(int fd , void *buf , int nbytes); */ -void psxBios_read() { // 0x34 +static void psxBios_read() { // 0x34 char *ptr; #ifdef PSXBIOS_LOG @@ -1771,7 +1771,7 @@ void psxBios_read() { // 0x34 * int write(int fd , void *buf , int nbytes); */ -void psxBios_write() { // 0x35/0x03 +static void psxBios_write() { // 0x35/0x03 char *ptr; if (a0 == 1) { // stdout @@ -1800,7 +1800,7 @@ void psxBios_write() { // 0x35/0x03 * int close(int fd); */ -void psxBios_close() { // 0x36 +static void psxBios_close() { // 0x36 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x36], a0); #endif @@ -1809,12 +1809,12 @@ void psxBios_close() { // 0x36 pc0 = ra; } -void psxBios_putchar() { // 3d +static void psxBios_putchar() { // 3d SysPrintf("%c", (char)a0); pc0 = ra; } -void psxBios_puts() { // 3e/3f +static void psxBios_puts() { // 3e/3f SysPrintf(Ra0); pc0 = ra; } @@ -1854,7 +1854,7 @@ int nfile; * struct DIRENTRY* firstfile(char *name,struct DIRENTRY *dir); */ -void psxBios_firstfile() { // 42 +static void psxBios_firstfile() { // 42 struct DIRENTRY *dir = (struct DIRENTRY *)Ra1; u32 _dir = a1; char *ptr; @@ -1885,7 +1885,7 @@ void psxBios_firstfile() { // 42 * struct DIRENTRY* nextfile(struct DIRENTRY *dir); */ -void psxBios_nextfile() { // 43 +static void psxBios_nextfile() { // 43 struct DIRENTRY *dir = (struct DIRENTRY *)Ra0; u32 _dir = a0; char *ptr; @@ -1929,7 +1929,7 @@ void psxBios_nextfile() { // 43 * int rename(char *old, char *new); */ -void psxBios_rename() { // 44 +static void psxBios_rename() { // 44 char *ptr; int i; @@ -1968,7 +1968,7 @@ void psxBios_rename() { // 44 * int delete(char *name); */ -void psxBios_delete() { // 45 +static void psxBios_delete() { // 45 char *ptr; int i; @@ -1989,7 +1989,7 @@ void psxBios_delete() { // 45 pc0 = ra; } -void psxBios_InitCARD() { // 4a +static void psxBios_InitCARD() { // 4a #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x4a], a0); #endif @@ -1999,7 +1999,7 @@ void psxBios_InitCARD() { // 4a pc0 = ra; } -void psxBios_StartCARD() { // 4b +static void psxBios_StartCARD() { // 4b #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4b]); #endif @@ -2009,7 +2009,7 @@ void psxBios_StartCARD() { // 4b pc0 = ra; } -void psxBios_StopCARD() { // 4c +static void psxBios_StopCARD() { // 4c #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4c]); #endif @@ -2019,7 +2019,7 @@ void psxBios_StopCARD() { // 4c pc0 = ra; } -void psxBios__card_write() { // 0x4e +static void psxBios__card_write() { // 0x4e int port; #ifdef PSXBIOS_LOG @@ -2043,7 +2043,7 @@ void psxBios__card_write() { // 0x4e v0 = 1; pc0 = ra; } -void psxBios__card_read() { // 0x4f +static void psxBios__card_read() { // 0x4f int port; #ifdef PSXBIOS_LOG @@ -2065,7 +2065,7 @@ void psxBios__card_read() { // 0x4f v0 = 1; pc0 = ra; } -void psxBios__new_card() { // 0x50 +static void psxBios__new_card() { // 0x50 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x50]); #endif @@ -2073,7 +2073,7 @@ void psxBios__new_card() { // 0x50 pc0 = ra; } -void psxBios_Krom2RawAdd() { // 0x51 +static void psxBios_Krom2RawAdd() { // 0x51 int i = 0; const u32 table_8140[][2] = { @@ -2116,7 +2116,7 @@ void psxBios_Krom2RawAdd() { // 0x51 pc0 = ra; } -void psxBios_GetC0Table() { // 56 +static void psxBios_GetC0Table() { // 56 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x56]); #endif @@ -2124,7 +2124,7 @@ void psxBios_GetC0Table() { // 56 v0 = 0x674; pc0 = ra; } -void psxBios_GetB0Table() { // 57 +static void psxBios_GetB0Table() { // 57 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x57]); #endif @@ -2132,7 +2132,7 @@ void psxBios_GetB0Table() { // 57 v0 = 0x874; pc0 = ra; } -void psxBios__card_chan() { // 0x58 +static void psxBios__card_chan() { // 0x58 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x58]); #endif @@ -2141,7 +2141,7 @@ void psxBios__card_chan() { // 0x58 pc0 = ra; } -void psxBios_ChangeClearPad() { // 5b +static void psxBios_ChangeClearPad() { // 5b #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5b], a0); #endif @@ -2155,7 +2155,7 @@ void psxBios_ChangeClearPad() { // 5b * int SysEnqIntRP(int index , long *queue); */ -void psxBios_SysEnqIntRP() { // 02 +static void psxBios_SysEnqIntRP() { // 02 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosC0n[0x02] ,a0); #endif @@ -2169,7 +2169,7 @@ void psxBios_SysEnqIntRP() { // 02 * int SysDeqIntRP(int index , long *queue); */ -void psxBios_SysDeqIntRP() { // 03 +static void psxBios_SysDeqIntRP() { // 03 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x\n", biosC0n[0x03], a0); #endif @@ -2179,7 +2179,7 @@ void psxBios_SysDeqIntRP() { // 03 v0 = 0; pc0 = ra; } -void psxBios_ChangeClearRCnt() { // 0a +static void psxBios_ChangeClearRCnt() { // 0a u32 *ptr; #ifdef PSXBIOS_LOG @@ -2194,7 +2194,7 @@ void psxBios_ChangeClearRCnt() { // 0a pc0 = ra; } -void psxBios_dummy() { +static void psxBios_dummy() { #ifdef PSXBIOS_LOG PSXBIOS_LOG("unk %x call: %x\n", pc0 & 0x1fffff, t1); #endif @@ -2628,7 +2628,7 @@ void psxBiosShutdown() { } \ } -void biosInterrupt() { +static void biosInterrupt() { int i, bufcount; // if (psxHu32(0x1070) & 0x1) { // Vsync diff --git a/libpcsxcore/psxbios.h b/libpcsxcore/psxbios.h index 635b35a5..ab7b0370 100644 --- a/libpcsxcore/psxbios.h +++ b/libpcsxcore/psxbios.h @@ -34,9 +34,9 @@ extern char *biosA0n[256]; extern char *biosB0n[256]; extern char *biosC0n[256]; -void psxBiosInit(); -void psxBiosShutdown(); -void psxBiosException(); +void psxBiosInit(void); +void psxBiosShutdown(void); +void psxBiosException(void); void psxBiosFreeze(int Mode); extern void (*biosA0[256])(); diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h index 73d130ba..baede5a7 100644 --- a/libpcsxcore/psxcommon.h +++ b/libpcsxcore/psxcommon.h @@ -77,6 +77,7 @@ typedef uint8_t boolean; #define __inline inline // Enables NLS/internationalization if active +#include #ifdef ENABLE_NLS #include diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c index 70d16f85..a1a36748 100644 --- a/libpcsxcore/psxcounters.c +++ b/libpcsxcore/psxcounters.c @@ -65,7 +65,7 @@ static const u32 CountToOverflow = 0; static const u32 CountToTarget = 1; static const u32 FrameRate[] = { 60, 50 }; -//static const u32 VBlankStart[] = { 240, 256 }; +//static const u32 VBlankStart[] = { 240, 256 }; static const u32 VBlankStart[] = { 243, 256 }; static const u32 HSyncTotal[] = { 263, 313 }; static const u32 SpuUpdInterval[] = { 23, 22 }; @@ -95,13 +95,11 @@ void verboseLog( s32 level, const char *str, ... ) if( level <= VerboseLevel ) { va_list va; - char buf[ 4096 ]; va_start( va, str ); - vsprintf( buf, str, va ); + vprintf( str, va ); va_end( va ); - printf( buf ); fflush( stdout ); } } diff --git a/libpcsxcore/psxinterpreter.c b/libpcsxcore/psxinterpreter.c index 69d0061f..eedb7452 100644 --- a/libpcsxcore/psxinterpreter.c +++ b/libpcsxcore/psxinterpreter.c @@ -47,7 +47,7 @@ void (*psxREG[32])(); void (*psxCP0[32])(); void (*psxCP2[64])(); void (*psxCP2BSC[32])(); - + static void delayRead(int reg, u32 bpc) { u32 rold, rnew; @@ -155,10 +155,10 @@ int psxTestLoadDelay(int reg, u32 tmp) { switch (_tRt_) { case 0x00: case 0x01: case 0x10: case 0x11: // BLTZ/BGEZ... - // Xenogears - lbu v0 / beq v0 - // - no load delay (fixes battle loading) - break; - + // Xenogears - lbu v0 / beq v0 + // - no load delay (fixes battle loading) + break; + if (_tRs_ == reg) return 2; break; } @@ -170,18 +170,18 @@ int psxTestLoadDelay(int reg, u32 tmp) { break; case 0x04: case 0x05: // BEQ/BNE - // Xenogears - lbu v0 / beq v0 - // - no load delay (fixes battle loading) - break; - + // Xenogears - lbu v0 / beq v0 + // - no load delay (fixes battle loading) + break; + if (_tRs_ == reg || _tRt_ == reg) return 2; break; case 0x06: case 0x07: // BLEZ/BGTZ - // Xenogears - lbu v0 / beq v0 - // - no load delay (fixes battle loading) - break; - + // Xenogears - lbu v0 / beq v0 + // - no load delay (fixes battle loading) + break; + if (_tRs_ == reg) return 2; break; @@ -265,9 +265,9 @@ void psxDelayTest(int reg, u32 bpc) { u32 *code; u32 tmp; - // Don't execute yet - just peek - code = Read_ICache(bpc, TRUE); - + // Don't execute yet - just peek + code = Read_ICache(bpc, TRUE); + tmp = ((code == NULL) ? 0 : SWAP32(*code)); branch = 1; @@ -409,7 +409,7 @@ static int psxDelayBranchTest(u32 tar1) { return psxDelayBranchExec(tmp2); } -__inline void doBranch(u32 tar) { +static __inline void doBranch(u32 tar) { u32 *code; u32 tmp; @@ -420,9 +420,9 @@ __inline void doBranch(u32 tar) { if (psxDelayBranchTest(tar)) return; - // branch delay slot - code = Read_ICache(psxRegs.pc, TRUE); - + // branch delay slot + code = Read_ICache(psxRegs.pc, TRUE); + psxRegs.code = ((code == NULL) ? 0 : SWAP32(*code)); debugI(); @@ -508,10 +508,10 @@ void psxDIV() { _i32(_rLo_) = _i32(_rRs_) / _i32(_rRt_); _i32(_rHi_) = _i32(_rRs_) % _i32(_rRt_); } - else { - _i32(_rLo_) = 0xffffffff; - _i32(_rHi_) = _i32(_rRs_); - } + else { + _i32(_rLo_) = 0xffffffff; + _i32(_rHi_) = _i32(_rRs_); + } } void psxDIVU() { @@ -519,10 +519,10 @@ void psxDIVU() { _rLo_ = _rRs_ / _rRt_; _rHi_ = _rRs_ % _rRt_; } - else { - _rLo_ = 0xffffffff; - _rHi_ = _rRs_; - } + else { + _rLo_ = 0xffffffff; + _rHi_ = _rRs_; + } } void psxMULT() { @@ -647,18 +647,18 @@ void psxJALR() { #define _oB_ (_u32(_rRs_) + _Imm_) void psxLB() { - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (_Rt_) { _i32(_rRt_) = (signed char)psxMemRead8(_oB_); } else { @@ -667,18 +667,18 @@ void psxLB() { } void psxLBU() { - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (_Rt_) { _u32(_rRt_) = psxMemRead8(_oB_); } else { @@ -687,18 +687,18 @@ void psxLBU() { } void psxLH() { - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (_Rt_) { _i32(_rRt_) = (short)psxMemRead16(_oB_); } else { @@ -707,18 +707,18 @@ void psxLH() { } void psxLHU() { - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (_Rt_) { _u32(_rRt_) = psxMemRead16(_oB_); } else { @@ -727,18 +727,18 @@ void psxLHU() { } void psxLW() { - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (_Rt_) { _u32(_rRt_) = psxMemRead32(_oB_); } else { @@ -753,19 +753,19 @@ void psxLWL() { u32 addr = _oB_; u32 shift = addr & 3; u32 mem = psxMemRead32(addr & ~3); - - - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - + + + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + if (!_Rt_) return; _u32(_rRt_) = ( _u32(_rRt_) & LWL_MASK[shift]) | ( mem << LWL_SHIFT[shift]); @@ -788,20 +788,20 @@ void psxLWR() { u32 shift = addr & 3; u32 mem = psxMemRead32(addr & ~3); - - - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - + + + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (!_Rt_) return; _u32(_rRt_) = ( _u32(_rRt_) & LWR_MASK[shift]) | ( mem >> LWR_SHIFT[shift]); @@ -865,40 +865,40 @@ void psxSWR() { * Moves between GPR and COPx * * Format: OP rt, fs * *********************************************************/ -void psxMFC0() -{ - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - if (!_Rt_) return; - - _i32(_rRt_) = (int)_rFs_; -} - -void psxCFC0() -{ - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - - if (!_Rt_) return; - - _i32(_rRt_) = (int)_rFs_; +void psxMFC0() +{ + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (!_Rt_) return; + + _i32(_rRt_) = (int)_rFs_; +} + +void psxCFC0() +{ + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + + if (!_Rt_) return; + + _i32(_rRt_) = (int)_rFs_; } void psxTestSWInts() { @@ -932,40 +932,40 @@ __inline void MTC0(int reg, u32 val) { void psxMTC0() { MTC0(_Rd_, _u32(_rRt_)); } void psxCTC0() { MTC0(_Rd_, _u32(_rRt_)); } - - -void psxMFC2() -{ - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - gteMFC2(); -} - - -void psxCFC2() -{ - // load delay = 1 latency - if( branch == 0 ) - { - // simulate: beq r0,r0,lw+4 / lw / (delay slot) - psxRegs.pc -= 4; - doBranch( psxRegs.pc + 4 ); - - return; - } - - gteCFC2(); -} - - + + +void psxMFC2() +{ + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + gteMFC2(); +} + + +void psxCFC2() +{ + // load delay = 1 latency + if( branch == 0 ) + { + // simulate: beq r0,r0,lw+4 / lw / (delay slot) + psxRegs.pc -= 4; + doBranch( psxRegs.pc + 4 ); + + return; + } + + gteCFC2(); +} + + /********************************************************* * Unknow instruction (would generate an exception) * * Format: ? * @@ -989,13 +989,13 @@ void psxCOP0() { } void psxCOP2() { - if ((psxRegs.CP0.n.Status & 0x40000000) == 0 ) - return; - + if ((psxRegs.CP0.n.Status & 0x40000000) == 0 ) + return; + psxCP2[_Funct_](); } -void psxBASIC() { +void psxBASIC() { psxCP2BSC[_Rs_](); } @@ -1067,7 +1067,7 @@ static int intInit() { } static void intReset() { - psxRegs.ICache_valid = FALSE; + psxRegs.ICache_valid = FALSE; } static void intExecute() { @@ -1087,8 +1087,8 @@ static void intShutdown() { } // interpreter execution -inline void execI() { - u32 *code = Read_ICache(psxRegs.pc, FALSE); +inline void execI() { + u32 *code = Read_ICache(psxRegs.pc, FALSE); psxRegs.code = ((code == NULL) ? 0 : SWAP32(*code)); debugI(); diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index ba3f8a19..28e25e1e 100644 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -31,9 +31,9 @@ #endif s8 *psxM = NULL; // Kernel & User Memory (2 Meg) -s8 *psxP = NULL; // Parallel Port (64K) s8 *psxR = NULL; // BIOS ROM (512K) -s8 *psxH = NULL; // Scratch Pad (1K) & Hardware Registers (8K) +// Parallel Port (64K) is attached to psxM +// Scratch Pad (1K) & Hardware Registers (8K) are attached to psxM u8 **psxMemWLUT = NULL; u8 **psxMemRLUT = NULL; @@ -65,13 +65,10 @@ int psxMemInit() { memset(psxMemRLUT, 0, 0x10000 * sizeof(void *)); memset(psxMemWLUT, 0, 0x10000 * sizeof(void *)); - psxM = mmap(0, 0x00220000, + psxM = mmap(0, PSXM_SIZE + PSXP_SIZE + PSXH_SIZE, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - psxP = &psxM[0x200000]; - psxH = &psxM[0x210000]; - - psxR = (s8 *)malloc(0x00080000); + psxR = (s8 *)malloc(PSXR_SIZE); if (psxMemRLUT == NULL || psxMemWLUT == NULL || psxM == NULL || psxP == NULL || psxH == NULL) { @@ -109,8 +106,8 @@ void psxMemReset() { FILE *f = NULL; char bios[1024]; - memset(psxM, 0, 0x00200000); - memset(psxP, 0, 0x00010000); + memset(psxM, 0, PSXM_SIZE); + memset(psxP, 0, PSXP_SIZE); // Load BIOS if (strcmp(Config.Bios, "HLE") != 0) { @@ -119,10 +116,11 @@ void psxMemReset() { if (f == NULL) { SysMessage(_("Could not open BIOS:\"%s\". Enabling HLE Bios!\n"), bios); - memset(psxR, 0, 0x80000); + memset(psxR, 0, PSXR_SIZE); Config.HLE = TRUE; } else { - fread(psxR, 1, 0x80000, f); + if(fread(psxR, PSXR_SIZE, 1, f) != 1) + perror(bios); fclose(f); Config.HLE = FALSE; } @@ -130,7 +128,7 @@ void psxMemReset() { } void psxMemShutdown() { - munmap(psxM, 0x00220000); + munmap(psxM, PSXM_SIZE + PSXP_SIZE + PSXH_SIZE); free(psxR); free(psxMemRLUT); @@ -325,15 +323,15 @@ void psxMemWrite32(u32 mem, u32 value) { } else { int i; - // a0-44: used for cache flushing + // a0-44: used for cache flushing switch (value) { case 0x800: case 0x804: if (writeok == 0) break; writeok = 0; memset(psxMemWLUT + 0x0000, 0, 0x80 * sizeof(void *)); memset(psxMemWLUT + 0x8000, 0, 0x80 * sizeof(void *)); - memset(psxMemWLUT + 0xa000, 0, 0x80 * sizeof(void *)); - + memset(psxMemWLUT + 0xa000, 0, 0x80 * sizeof(void *)); + psxRegs.ICache_valid = 0; break; case 0x00: case 0x1e988: diff --git a/libpcsxcore/psxmem.h b/libpcsxcore/psxmem.h index d9fee002..a41604b7 100644 --- a/libpcsxcore/psxmem.h +++ b/libpcsxcore/psxmem.h @@ -50,75 +50,83 @@ extern "C" { #endif extern s8 *psxM; -#define psxMs8(mem) psxM[(mem) & 0x1fffff] -#define psxMs16(mem) (SWAP16(*(s16 *)&psxM[(mem) & 0x1fffff])) -#define psxMs32(mem) (SWAP32(*(s32 *)&psxM[(mem) & 0x1fffff])) -#define psxMu8(mem) (*(u8 *)&psxM[(mem) & 0x1fffff]) -#define psxMu16(mem) (SWAP16(*(u16 *)&psxM[(mem) & 0x1fffff])) -#define psxMu32(mem) (SWAP32(*(u32 *)&psxM[(mem) & 0x1fffff])) - -#define psxMs8ref(mem) psxM[(mem) & 0x1fffff] -#define psxMs16ref(mem) (*(s16 *)&psxM[(mem) & 0x1fffff]) -#define psxMs32ref(mem) (*(s32 *)&psxM[(mem) & 0x1fffff]) -#define psxMu8ref(mem) (*(u8 *)&psxM[(mem) & 0x1fffff]) -#define psxMu16ref(mem) (*(u16 *)&psxM[(mem) & 0x1fffff]) -#define psxMu32ref(mem) (*(u32 *)&psxM[(mem) & 0x1fffff]) - -extern s8 *psxP; -#define psxPs8(mem) psxP[(mem) & 0xffff] -#define psxPs16(mem) (SWAP16(*(s16 *)&psxP[(mem) & 0xffff])) -#define psxPs32(mem) (SWAP32(*(s32 *)&psxP[(mem) & 0xffff])) -#define psxPu8(mem) (*(u8 *)&psxP[(mem) & 0xffff]) -#define psxPu16(mem) (SWAP16(*(u16 *)&psxP[(mem) & 0xffff])) -#define psxPu32(mem) (SWAP32(*(u32 *)&psxP[(mem) & 0xffff])) - -#define psxPs8ref(mem) psxP[(mem) & 0xffff] -#define psxPs16ref(mem) (*(s16 *)&psxP[(mem) & 0xffff]) -#define psxPs32ref(mem) (*(s32 *)&psxP[(mem) & 0xffff]) -#define psxPu8ref(mem) (*(u8 *)&psxP[(mem) & 0xffff]) -#define psxPu16ref(mem) (*(u16 *)&psxP[(mem) & 0xffff]) -#define psxPu32ref(mem) (*(u32 *)&psxP[(mem) & 0xffff]) - +#define PSXM_SIZE 0x200000 +#define psxMs8(mem) psxM[(mem) & (PSXM_SIZE - 1)] +#define psxMs16(mem) (SWAP16(*(s16 *)&psxM[(mem) & (PSXM_SIZE - 1)])) +#define psxMs32(mem) (SWAP32(*(s32 *)&psxM[(mem) & (PSXM_SIZE - 1)])) +#define psxMu8(mem) (*(u8 *)&psxM[(mem) & (PSXM_SIZE - 1)]) +#define psxMu16(mem) (SWAP16(*(u16 *)&psxM[(mem) & (PSXM_SIZE - 1)])) +#define psxMu32(mem) (SWAP32(*(u32 *)&psxM[(mem) & (PSXM_SIZE - 1)])) + +#define psxMs8ref(mem) psxM[(mem) & (PSXM_SIZE - 1)] +#define psxMs16ref(mem) (*(s16 *)&psxM[(mem) & (PSXM_SIZE - 1)]) +#define psxMs32ref(mem) (*(s32 *)&psxM[(mem) & (PSXM_SIZE - 1)]) +#define psxMu8ref(mem) (*(u8 *)&psxM[(mem) & (PSXM_SIZE - 1)]) +#define psxMu16ref(mem) (*(u16 *)&psxM[(mem) & (PSXM_SIZE - 1)]) +#define psxMu32ref(mem) (*(u32 *)&psxM[(mem) & (PSXM_SIZE - 1)]) + +#define PSXP_OFFSET PSXM_SIZE +#define PSXP_SIZE 0x10000 +#define psxP (&psxM[PSXP_OFFSET]) +#define psxPs8(mem) psxP[(mem) & (PSXP_SIZE - 1)] +#define psxPs16(mem) (SWAP16(*(s16 *)&psxP[(mem) & (PSXP_SIZE - 1)])) +#define psxPs32(mem) (SWAP32(*(s32 *)&psxP[(mem) & (PSXP_SIZE - 1)])) +#define psxPu8(mem) (*(u8 *)&psxP[(mem) & (PSXP_SIZE - 1)]) +#define psxPu16(mem) (SWAP16(*(u16 *)&psxP[(mem) & (PSXP_SIZE - 1)])) +#define psxPu32(mem) (SWAP32(*(u32 *)&psxP[(mem) & (PSXP_SIZE - 1)])) + +#define psxPs8ref(mem) psxP[(mem) & (PSXP_SIZE - 1)] +#define psxPs16ref(mem) (*(s16 *)&psxP[(mem) & (PSXP_SIZE - 1)]) +#define psxPs32ref(mem) (*(s32 *)&psxP[(mem) & (PSXP_SIZE - 1)]) +#define psxPu8ref(mem) (*(u8 *)&psxP[(mem) & (PSXP_SIZE - 1)]) +#define psxPu16ref(mem) (*(u16 *)&psxP[(mem) & (PSXP_SIZE - 1)]) +#define psxPu32ref(mem) (*(u32 *)&psxP[(mem) & (PSXP_SIZE - 1)]) + +#define PSXR_SIZE 0x80000 extern s8 *psxR; -#define psxRs8(mem) psxR[(mem) & 0x7ffff] -#define psxRs16(mem) (SWAP16(*(s16 *)&psxR[(mem) & 0x7ffff])) -#define psxRs32(mem) (SWAP32(*(s32 *)&psxR[(mem) & 0x7ffff])) -#define psxRu8(mem) (*(u8* )&psxR[(mem) & 0x7ffff]) -#define psxRu16(mem) (SWAP16(*(u16 *)&psxR[(mem) & 0x7ffff])) -#define psxRu32(mem) (SWAP32(*(u32 *)&psxR[(mem) & 0x7ffff])) - -#define psxRs8ref(mem) psxR[(mem) & 0x7ffff] -#define psxRs16ref(mem) (*(s16*)&psxR[(mem) & 0x7ffff]) -#define psxRs32ref(mem) (*(s32*)&psxR[(mem) & 0x7ffff]) -#define psxRu8ref(mem) (*(u8 *)&psxR[(mem) & 0x7ffff]) -#define psxRu16ref(mem) (*(u16*)&psxR[(mem) & 0x7ffff]) -#define psxRu32ref(mem) (*(u32*)&psxR[(mem) & 0x7ffff]) - -extern s8 *psxH; -#define psxHs8(mem) psxH[(mem) & 0xffff] -#define psxHs16(mem) (SWAP16(*(s16 *)&psxH[(mem) & 0xffff])) -#define psxHs32(mem) (SWAP32(*(s32 *)&psxH[(mem) & 0xffff])) -#define psxHu8(mem) (*(u8 *)&psxH[(mem) & 0xffff]) -#define psxHu16(mem) (SWAP16(*(u16 *)&psxH[(mem) & 0xffff])) -#define psxHu32(mem) (SWAP32(*(u32 *)&psxH[(mem) & 0xffff])) - -#define psxHs8ref(mem) psxH[(mem) & 0xffff] -#define psxHs16ref(mem) (*(s16 *)&psxH[(mem) & 0xffff]) -#define psxHs32ref(mem) (*(s32 *)&psxH[(mem) & 0xffff]) -#define psxHu8ref(mem) (*(u8 *)&psxH[(mem) & 0xffff]) -#define psxHu16ref(mem) (*(u16 *)&psxH[(mem) & 0xffff]) -#define psxHu32ref(mem) (*(u32 *)&psxH[(mem) & 0xffff]) +#define psxRs8(mem) psxR[(mem) & (PSXR_SIZE - 1)] +#define psxRs16(mem) (SWAP16(*(s16 *)&psxR[(mem) & (PSXR_SIZE - 1)])) +#define psxRs32(mem) (SWAP32(*(s32 *)&psxR[(mem) & (PSXR_SIZE - 1)])) +#define psxRu8(mem) (*(u8* )&psxR[(mem) & (PSXR_SIZE - 1)]) +#define psxRu16(mem) (SWAP16(*(u16 *)&psxR[(mem) & (PSXR_SIZE - 1)])) +#define psxRu32(mem) (SWAP32(*(u32 *)&psxR[(mem) & (PSXR_SIZE - 1)])) + +#define psxRs8ref(mem) psxR[(mem) & (PSXR_SIZE - 1)] +#define psxRs16ref(mem) (*(s16*)&psxR[(mem) & (PSXR_SIZE - 1)]) +#define psxRs32ref(mem) (*(s32*)&psxR[(mem) & (PSXR_SIZE - 1)]) +#define psxRu8ref(mem) (*(u8 *)&psxR[(mem) & (PSXR_SIZE - 1)]) +#define psxRu16ref(mem) (*(u16*)&psxR[(mem) & (PSXR_SIZE - 1)]) +#define psxRu32ref(mem) (*(u32*)&psxR[(mem) & (PSXR_SIZE - 1)]) + +#define PSXH_SIZE 0x10000 +#define PSXH_OFFSET (PSXP_OFFSET + PSXP_SIZE) +#define psxH (&psxM[PSXH_OFFSET]) +#define psxHs8(mem) psxH[(mem) & (PSXH_SIZE - 1)] +#define psxHs16(mem) (SWAP16(*(s16 *)&psxH[(mem) & (PSXH_SIZE - 1)])) +#define psxHs32(mem) (SWAP32(*(s32 *)&psxH[(mem) & (PSXH_SIZE - 1)])) +#define psxHu8(mem) (*(u8 *)&psxH[(mem) & (PSXH_SIZE - 1)]) +#define psxHu16(mem) (SWAP16(*(u16 *)&psxH[(mem) & (PSXH_SIZE - 1)])) +#define psxHu32(mem) (SWAP32(*(u32 *)&psxH[(mem) & (PSXH_SIZE - 1)])) + +#define psxHs8ref(mem) psxH[(mem) & (PSXH_SIZE - 1)] +#define psxHs16ref(mem) (*(s16 *)&psxH[(mem) & (PSXH_SIZE - 1)]) +#define psxHs32ref(mem) (*(s32 *)&psxH[(mem) & (PSXH_SIZE - 1)]) +#define psxHu8ref(mem) (*(u8 *)&psxH[(mem) & (PSXH_SIZE - 1)]) +#define psxHu16ref(mem) (*(u16 *)&psxH[(mem) & (PSXH_SIZE - 1)]) +#define psxHu32ref(mem) (*(u32 *)&psxH[(mem) & (PSXH_SIZE - 1)]) extern u8 **psxMemWLUT; extern u8 **psxMemRLUT; #define PSXM(mem) (psxMemRLUT[(mem) >> 16] == 0 ? NULL : (u8*)(psxMemRLUT[(mem) >> 16] + ((mem) & 0xffff))) -#define PSXMs8(mem) (*(s8 *)PSXM(mem)) -#define PSXMs16(mem) (SWAP16(*(s16 *)PSXM(mem))) -#define PSXMs32(mem) (SWAP32(*(s32 *)PSXM(mem))) -#define PSXMu8(mem) (*(u8 *)PSXM(mem)) -#define PSXMu16(mem) (SWAP16(*(u16 *)PSXM(mem))) -#define PSXMu32(mem) (SWAP32(*(u32 *)PSXM(mem))) +/* prevent crashes */ +#define PSXMt(t, mem) (psxMemRLUT[(mem) >> 16] == 0 ? (t)0 : *(t*)(psxMemRLUT[(mem) >> 16] + ((mem) & 0xffff))) +#define PSXMs8(mem) PSXMt(s8, mem) +#define PSXMs16(mem) (SWAP16(PSXMt(s16, mem))) +#define PSXMs32(mem) (SWAP32(PSXMt(s32, mem))) +#define PSXMu8(mem) PSXMt(u8, mem) +#define PSXMu16(mem) (SWAP16(PSXMt(u16, mem))) +#define PSXMu32(mem) (SWAP32(PSXMt(u32, mem))) #define PSXMu32ref(mem) (*(u32 *)PSXM(mem)) diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index f2bdecd7..2c4e57f5 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -333,6 +333,123 @@ void psxDelayTest(int reg, u32 bpc); void psxTestSWInts(); void psxJumpTest(); +/* psxinterpreter for rec fallbacks */ +void psxNULL(void); +void psxSPECIAL(void); +void psxREGIMM(void); +void psxJ(void); +void psxJAL(void); +void psxBEQ(void); +void psxBNE(void); +void psxBLEZ(void); +void psxBGTZ(void); +void psxADDI(void); +void psxADDIU(void); +void psxSLTI(void); +void psxSLTIU(void); +void psxANDI(void); +void psxORI(void); +void psxXORI(void); +void psxLUI(void); +void psxCOP0(void); +void psxCOP2(void); +void psxLB(void); +void psxLH(void); +void psxLWL(void); +void psxLW(void); +void psxLBU(void); +void psxLHU(void); +void psxLWR(void); +void psxSB(void); +void psxSH(void); +void psxSWL(void); +void psxSW(void); +void psxSWR(void); +void psxNULL(void); +void gteLWC2(void); +void psxNULL(void); +void gteSWC2(void); +void psxHLE(void); +void psxSLL(void); +void psxSRL(void); +void psxSRA(void); +void psxSLLV(void); +void psxSRLV(void); +void psxSRAV(void); +void psxJR(void); +void psxJALR(void); +void psxSYSCALL(void); +void psxBREAK(void); +void psxMFHI(void); +void psxMTHI(void); +void psxMFLO(void); +void psxMTLO(void); +void psxMULT(void); +void psxMULTU(void); +void psxDIV(void); +void psxDIVU(void); +void psxADD(void); +void psxADDU(void); +void psxSUB(void); +void psxSUBU(void); +void psxAND(void); +void psxOR(void); +void psxXOR(void); +void psxNOR(void); +void psxNULL(void); +void psxSLT(void); +void psxSLTU(void); +void psxBLTZ(void); +void psxBGEZ(void); +void psxBLTZAL(void); +void psxBGEZAL(void); +void psxMFC0(void); +void psxCFC0(void); +void psxMTC0(void); +void psxCTC0(void); +void psxRFE(void); +void psxBASIC(void); +void gteRTPS(void); +void gteNCLIP(void); +void psxNULL(void); +void gteOP(void); +void gteDPCS(void); +void gteINTPL(void); +void gteMVMVA(void); +void gteNCDS(void); +void gteCDP(void); +void gteNCDT(void); +void psxNULL(void); +void gteNCCS(void); +void gteCC(void); +void gteNCS(void); +void gteNCT(void); +void gteSQR(void); +void gteDCPL(void); +void gteDPCT(void); +void gteAVSZ3(void); +void gteAVSZ4(void); +void gteRTPT(void); +void psxNULL(void); +void gteGPF(void); +void gteGPL(void); +void gteNCCT(void); +void psxMFC2(void); +void psxCFC2(void); +void gteMTC2(void); +void gteCTC2(void); +extern void (*psxBSC[])(); + +/* for table-based unaligned access implementations */ +extern u32 LWL_MASK[4]; +extern u32 LWL_SHIFT[4]; +extern u32 LWR_MASK[4]; +extern u32 LWR_SHIFT[4]; +extern u32 SWL_MASK[4]; +extern u32 SWL_SHIFT[4]; +extern u32 SWR_MASK[4]; +extern u32 SWR_SHIFT[4]; + #ifdef __cplusplus } #endif diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index e1b8a3e1..1659b73a 100644 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -38,12 +38,16 @@ // Control Flags #define TX_PERM 0x0001 -#define DTR 0x0002 +#define DTR_PERM 0x0002 #define RX_PERM 0x0004 #define BREAK 0x0008 #define RESET_ERR 0x0010 #define RTS 0x0020 #define SIO_RESET 0x0040 +#define TX_INTEN 0x0400 +#define RX_INTEN 0x0800 +#define DSR_INTEN 0x1000 +#define DTR 0x2000 // *** FOR WORKS ON PADS AND MEMORY CARDS ***** @@ -121,21 +125,12 @@ static int DongleInit; // ePSXe 1.7.0 //#define SIO_CYCLES 635 -unsigned char reverse_8( unsigned char bits ) +static unsigned char reverse_8( unsigned char bits ) { - unsigned char tmp; - int lcv; - - tmp = 0; - for( lcv = 0; lcv < 8; lcv++ ) - { - tmp >>= 1; - tmp |= (bits & 0x80); - - bits <<= 1; - } - - return tmp; + bits = ((bits & 0xaa) >> 1) | ((bits & 0x55) << 1); + bits = ((bits & 0xcc) >> 2) | ((bits & 0x33) << 2); + bits = ((bits & 0xf0) >> 4) | ((bits & 0x0f) << 4); + return bits; } @@ -145,75 +140,75 @@ void sioWrite8(unsigned char value) { #endif switch (padst) { case 1: SIO_INT(SIO_CYCLES); - /* - $41-4F - $41 = Find bits in poll respones - $42 = Polling command - $43 = Config mode (Dual shock?) - $44 = Digital / Analog (after $F3) - $45 = Get status info (Dual shock?) - - ID: - $41 = Digital - $73 = Analogue Red LED - $53 = Analogue Green LED - - $23 = NegCon - $12 = Mouse - */ - + /* + $41-4F + $41 = Find bits in poll respones + $42 = Polling command + $43 = Config mode (Dual shock?) + $44 = Digital / Analog (after $F3) + $45 = Get status info (Dual shock?) + + ID: + $41 = Digital + $73 = Analogue Red LED + $53 = Analogue Green LED + + $23 = NegCon + $12 = Mouse + */ + if ((value & 0x40) == 0x40) { padst = 2; parp = 1; if (!Config.UseNet) { - switch (CtrlReg & 0x2002) { - case 0x0002: + switch (CtrlReg & (DTR_PERM|DTR)) { + case DTR_PERM: buf[parp] = PAD1_poll(value); break; - case 0x2002: + case (DTR_PERM|DTR): buf[parp] = PAD2_poll(value); break; } }/* else { -// SysPrintf("%x: %x, %x, %x, %x\n", CtrlReg&0x2002, buf[2], buf[3], buf[4], buf[5]); +// SysPrintf("%x: %x, %x, %x, %x\n", CtrlReg&(DTR_PERM|DTR), buf[2], buf[3], buf[4], buf[5]); }*/ if (!(buf[parp] & 0x0f)) { bufcount = 2 + 32; } else { bufcount = 2 + (buf[parp] & 0x0f) * 2; - } - - - // Digital / Dual Shock Controller - if (buf[parp] == 0x41) { - switch (value) { - // enter config mode - case 0x43: - buf[1] = 0x43; - break; - - // get status - case 0x45: - buf[1] = 0xf3; - break; - } - } - - - // NegCon - Wipeout 3 - if( buf[parp] == 0x23 ) { - switch (value) { - // enter config mode - case 0x43: - buf[1] = 0x79; - break; - - // get status - case 0x45: - buf[1] = 0xf3; - break; - } - } + } + + + // Digital / Dual Shock Controller + if (buf[parp] == 0x41) { + switch (value) { + // enter config mode + case 0x43: + buf[1] = 0x43; + break; + + // get status + case 0x45: + buf[1] = 0xf3; + break; + } + } + + + // NegCon - Wipeout 3 + if( buf[parp] == 0x23 ) { + switch (value) { + // enter config mode + case 0x43: + buf[1] = 0x79; + break; + + // get status + case 0x45: + buf[1] = 0xf3; + break; + } + } } else padst = 0; return; @@ -225,9 +220,9 @@ void sioWrite8(unsigned char value) { return; }*/ if (!Config.UseNet) { - switch (CtrlReg & 0x2002) { - case 0x0002: buf[parp] = PAD1_poll(value); break; - case 0x2002: buf[parp] = PAD2_poll(value); break; + switch (CtrlReg & (DTR_PERM|DTR)) { + case DTR_PERM: buf[parp] = PAD1_poll(value); break; + case (DTR_PERM|DTR): buf[parp] = PAD2_poll(value); break; } } @@ -272,11 +267,11 @@ void sioWrite8(unsigned char value) { buf[1] = 0x5d; buf[2] = adrH; buf[3] = adrL; - switch (CtrlReg & 0x2002) { - case 0x0002: + switch (CtrlReg & (DTR_PERM|DTR)) { + case DTR_PERM: memcpy(&buf[4], Mcd1Data + (adrL | (adrH << 8)) * 128, 128); break; - case 0x2002: + case (DTR_PERM|DTR): memcpy(&buf[4], Mcd2Data + (adrL | (adrH << 8)) * 128, 128); break; } @@ -672,12 +667,12 @@ void sioWrite8(unsigned char value) { StatReg |= RX_RDY; // Transfer is Ready if (!Config.UseNet) { - switch (CtrlReg & 0x2002) { - case 0x0002: buf[0] = PAD1_startPoll(1); break; - case 0x2002: buf[0] = PAD2_startPoll(2); break; + switch (CtrlReg & (DTR_PERM|DTR)) { + case DTR_PERM: buf[0] = PAD1_startPoll(1); break; + case (DTR_PERM|DTR): buf[0] = PAD2_startPoll(2); break; } } else { - if ((CtrlReg & 0x2002) == 0x0002) { + if ((CtrlReg & (DTR_PERM|DTR)) == DTR_PERM) { int i, j; PAD1_startPoll(1); @@ -778,12 +773,12 @@ unsigned char sioRead8() { if (mcdst == 5) { mcdst = 0; if (rdwr == 2) { - switch (CtrlReg & 0x2002) { - case 0x0002: + switch (CtrlReg & (DTR_PERM|DTR)) { + case DTR_PERM: memcpy(Mcd1Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); SaveMcd(Config.Mcd1, Mcd1Data, (adrL | (adrH << 8)) * 128, 128); break; - case 0x2002: + case (DTR_PERM|DTR): memcpy(Mcd2Data + (adrL | (adrH << 8)) * 128, &buf[1], 128); SaveMcd(Config.Mcd2, Mcd2Data, (adrL | (adrH << 8)) * 128, 128); break; @@ -805,20 +800,20 @@ unsigned char sioRead8() { } unsigned short sioReadStat16() { - u16 hard; - - hard = StatReg; - -#if 0 - // wait for IRQ first - if( psxRegs.interrupt & (1 << PSXINT_SIO) ) - { - hard &= ~TX_RDY; - hard &= ~RX_RDY; - hard &= ~TX_EMPTY; - } -#endif - + u16 hard; + + hard = StatReg; + +#if 0 + // wait for IRQ first + if( psxRegs.interrupt & (1 << PSXINT_SIO) ) + { + hard &= ~TX_RDY; + hard &= ~RX_RDY; + hard &= ~TX_EMPTY; + } +#endif + return hard; } @@ -885,7 +880,8 @@ void LoadMcd(int mcd, char *str) { else if(buf.st_size == MCD_SIZE + 3904) fseek(f, 3904, SEEK_SET); } - fread(data, 1, MCD_SIZE, f); + if(fread(data, 1, MCD_SIZE, f) != MCD_SIZE) + perror(str); fclose(f); } else @@ -900,7 +896,8 @@ void LoadMcd(int mcd, char *str) { else if(buf.st_size == MCD_SIZE + 3904) fseek(f, 3904, SEEK_SET); } - fread(data, 1, MCD_SIZE, f); + if(fread(data, 1, MCD_SIZE, f) != MCD_SIZE) + perror(str); fclose(f); } } @@ -927,8 +924,10 @@ void SaveMcd(char *mcd, char *data, uint32_t adr, int size) { } else fseek(f, adr, SEEK_SET); - fwrite(data + adr, 1, size, f); - fclose(f); + if(fwrite(data + adr, 1, size, f) != size) + perror(mcd); + if(fclose(f) != 0) + perror(mcd); return; } @@ -1108,7 +1107,8 @@ void ConvertMcd(char *mcd, char *data) { if (strstr(mcd, ".gme")) { f = fopen(mcd, "wb"); if (f != NULL) { - fwrite(data - 3904, 1, MCD_SIZE + 3904, f); + if(fwrite(data - 3904, MCD_SIZE + 3904, 1, f) != 1) + perror(mcd); fclose(f); } f = fopen(mcd, "r+"); @@ -1142,8 +1142,10 @@ void ConvertMcd(char *mcd, char *data) { } else if(strstr(mcd, ".mem") || strstr(mcd,".vgs")) { f = fopen(mcd, "wb"); if (f != NULL) { - fwrite(data-64, 1, MCD_SIZE+64, f); - fclose(f); + if(fwrite(data-64, MCD_SIZE+64, 1, f) != 1) + perror(mcd); + if(fclose(f) != 0) + perror(mcd);; } f = fopen(mcd, "r+"); s = s + 64; @@ -1164,14 +1166,16 @@ void ConvertMcd(char *mcd, char *data) { } else { f = fopen(mcd, "wb"); if (f != NULL) { - fwrite(data, 1, MCD_SIZE, f); - fclose(f); + if(fwrite(data, 1, MCD_SIZE, f) != MCD_SIZE) + perror(mcd); + if(fclose(f) != 0) + perror(mcd); } } } void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) { - unsigned char *data = NULL, *ptr, *str, *sstr; + char *data = NULL, *ptr, *str, *sstr; unsigned short clut[16]; unsigned short c; int i, x; @@ -1282,7 +1286,8 @@ void LoadDongle( char *str ) f = fopen(str, "r+b"); if (f != NULL) { - fread( DongleData, 1, DONGLE_SIZE, f ); + if(fread( DongleData, 1, DONGLE_SIZE, f ) != DONGLE_SIZE) + perror(str); fclose( f ); } else { @@ -1318,7 +1323,9 @@ void SaveDongle( char *str ) f = fopen(str, "wb"); if (f != NULL) { - fwrite( DongleData, 1, DONGLE_SIZE, f ); - fclose( f ); + if(fwrite( DongleData, 1, DONGLE_SIZE, f ) != DONGLE_SIZE) + perror(str); + if(fclose( f ) != 0) + perror(str); } } diff --git a/libpcsxcore/socket.c b/libpcsxcore/socket.c index 2e0dc870..31f82e25 100644 --- a/libpcsxcore/socket.c +++ b/libpcsxcore/socket.c @@ -190,7 +190,7 @@ int ReadSocket(char * buffer, int len) { } int RawReadSocket(char * buffer, int len) { - int r; + int r = 0; int mlen = len < ptr ? len : ptr; if (!client_socket) -- cgit v1.2.3