summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-03-12 18:54:28 +0000
committerSND\dario86_cp <SND\dario86_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2011-03-12 18:54:28 +0000
commita58cfdac407bc1d8fedc11acd924b275ba28cc51 (patch)
treeb4c2e08c34ef1bfe0ba947ef8eed931c9a43fc0e /libpcsxcore
parent9bdd06684bcc627c06ddcf4c406f6b48f0dfe389 (diff)
downloadpcsxr-a58cfdac407bc1d8fedc11acd924b275ba28cc51.tar.gz
Commited patch in issue #8171 (by darktjm).
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@64524 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/cdriso.c215
-rw-r--r--libpcsxcore/cdriso.h8
-rw-r--r--libpcsxcore/cdrom.c1509
-rw-r--r--libpcsxcore/cdrom.h21
-rw-r--r--libpcsxcore/debug.c12
-rw-r--r--libpcsxcore/decode_xa.c2
-rw-r--r--libpcsxcore/disr3000a.c674
-rw-r--r--libpcsxcore/ix86/iR3000A.c17
-rw-r--r--libpcsxcore/ix86/ix86.c2
-rw-r--r--libpcsxcore/ix86_64/iR3000A-64.c31
-rw-r--r--libpcsxcore/ix86_64/ix86-64.c16
-rw-r--r--libpcsxcore/ix86_64/ix86-64.h22
-rw-r--r--libpcsxcore/ix86_64/ix86_cpudetect.c984
-rw-r--r--libpcsxcore/ix86_64/ix86_mmx.c3
-rw-r--r--libpcsxcore/ix86_64/ix86_sse.c34
-rw-r--r--libpcsxcore/mdec.c28
-rw-r--r--libpcsxcore/misc.c84
-rw-r--r--libpcsxcore/plugin_common.h99
-rw-r--r--libpcsxcore/plugins.c1701
-rw-r--r--libpcsxcore/plugins.h649
-rw-r--r--libpcsxcore/ppc/pR3000A.c13
-rw-r--r--libpcsxcore/ppf.c57
-rw-r--r--libpcsxcore/psemu_plugin_defs.h175
-rw-r--r--libpcsxcore/psxbios.c236
-rw-r--r--libpcsxcore/psxbios.h6
-rw-r--r--libpcsxcore/psxcommon.h1
-rw-r--r--libpcsxcore/psxcounters.c6
-rw-r--r--libpcsxcore/psxinterpreter.c380
-rw-r--r--libpcsxcore/psxmem.c28
-rw-r--r--libpcsxcore/psxmem.h134
-rw-r--r--libpcsxcore/r3000a.h117
-rw-r--r--libpcsxcore/sio.c225
-rw-r--r--libpcsxcore/socket.c2
33 files changed, 3873 insertions, 3618 deletions
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 <windows.h>
-#endif
-
-#include <string.h>
-#include <stdio.h>
-
-#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 <sys/time.h>
-#include <errno.h>
-//*
-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 <windows.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+
+#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 <sys/time.h>
+#include <errno.h>
+//*
+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(&section_address, 4, 1, tmpFile);
- fread(&section_size, 4, 1, tmpFile);
+ if(fread(&section_address, 4, 1, tmpFile) != 1 ||
+ fread(&section_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(&section, sizeof(section), 1, tmpFile);
+ if(fseek(tmpFile, sizeof(FILHDR) + SWAP16(coffHead.f_opthdr) + sizeof(section) * i, SEEK_SET) < 0 ||
+ fread(&section, 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 <windows.h>
+
+#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 <windows.h>
-
-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 <stdint.h>
+
+#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 <locale.h>
#ifdef ENABLE_NLS
#include <libintl.h>
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)