From 8410fc0c2eed060e79d5801a37583b6c729b85f6 Mon Sep 17 00:00:00 2001 From: "SND\\edgbla_cp" Date: Fri, 2 Jul 2010 21:58:25 +0000 Subject: Sio1 interface (link cable). git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@54110 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/plugins.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++- libpcsxcore/plugins.h | 79 +++++++++++++++++++++++++-- libpcsxcore/psxcommon.h | 1 + libpcsxcore/psxhw.c | 51 +++++++++++------- 4 files changed, 247 insertions(+), 25 deletions(-) (limited to 'libpcsxcore') diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index ca62cf2f..32a3de0a 100644 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -67,8 +67,8 @@ CDRgetBufferSub CDR_getBufferSub; CDRconfigure CDR_configure; CDRabout CDR_about; CDRsetfilename CDR_setfilename; -CDRreadCDDA CDR_readCDDA; -CDRgetTE CDR_getTE; +CDRreadCDDA CDR_readCDDA; +CDRgetTE CDR_getTE; SPUconfigure SPU_configure; SPUabout SPU_about; @@ -135,6 +135,40 @@ NETrecvPadData NET_recvPadData; NETsetInfo NET_setInfo; NETkeypressed NET_keypressed; +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; + static const char *err; #define CheckErr(func) { \ @@ -559,6 +593,101 @@ static int LoadNETplugin(const char *NETdll) { return 0; } +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; +} + void CALLBACK clearDynarec(void) { psxCpu->Reset(); } @@ -595,6 +724,9 @@ int LoadPlugins() { sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Net); if (LoadNETplugin(Plugin) == -1) Config.UseNet = FALSE; } + + sprintf(Plugin, "%s/%s", Config.PluginsDir, Config.Sio1); + if (LoadSIO1plugin(Plugin) == -1) return -1; ret = CDR_init(); if (ret < 0) { SysMessage (_("Error initializing CD-ROM plugin: %d"), ret); return -1; } @@ -611,6 +743,9 @@ int LoadPlugins() { ret = NET_init(); if (ret < 0) { SysMessage (_("Error initializing NetPlay plugin: %d"), ret); return -1; } } + + ret = SIO1_init(); + if (ret < 0) { SysMessage (_("Error initializing SIO1 plugin: %d"), ret); return -1; } SysPrintf(_("Plugins loaded.\n")); return 0; @@ -628,6 +763,7 @@ void ReleasePlugins() { if (hSPUDriver != NULL) SPU_shutdown(); if (hPAD1Driver != NULL) PAD1_shutdown(); if (hPAD2Driver != NULL) PAD2_shutdown(); + if (hSIO1Driver != NULL) SIO1_shutdown(); if (Config.UseNet && hNETDriver != NULL) NET_shutdown(); @@ -636,6 +772,7 @@ void ReleasePlugins() { if (hSPUDriver != NULL) SysCloseLibrary(hSPUDriver); hSPUDriver = NULL; if (hPAD1Driver != NULL) SysCloseLibrary(hPAD1Driver); hPAD1Driver = NULL; if (hPAD2Driver != NULL) SysCloseLibrary(hPAD2Driver); hPAD2Driver = NULL; + if (hSIO1Driver != NULL) SysCloseLibrary(hSIO1Driver); hSIO1Driver = NULL; if (Config.UseNet && hNETDriver != NULL) { SysCloseLibrary(hNETDriver); hNETDriver = NULL; diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index 7039e68f..470985cd 100644 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -35,6 +35,7 @@ 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 @@ -44,6 +45,7 @@ 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 @@ -147,8 +149,8 @@ struct SubQ { unsigned char AbsoluteAddress[3]; 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 *); +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; @@ -168,8 +170,8 @@ extern CDRgetDriveLetter CDR_getDriveLetter; extern CDRconfigure CDR_configure; extern CDRabout CDR_about; extern CDRsetfilename CDR_setfilename; -extern CDRreadCDDA CDR_readCDDA; -extern CDRgetTE CDR_getTE; +extern CDRreadCDDA CDR_readCDDA; +extern CDRgetTE CDR_getTE; // SPU Functions typedef long (CALLBACK* SPUinit)(void); @@ -318,6 +320,75 @@ extern NETrecvPadData NET_recvPadData; extern NETsetInfo NET_setInfo; extern NETkeypressed NET_keypressed; +// 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 uint32_t (CALLBACK* SIO1readData8)(void); +typedef uint32_t (CALLBACK* SIO1readData16)(void); +typedef uint32_t (CALLBACK* SIO1readData32)(void); +typedef uint32_t (CALLBACK* SIO1readStat16)(void); +typedef uint32_t (CALLBACK* SIO1readStat32)(void); +typedef uint32_t (CALLBACK* SIO1readMode16)(void); +typedef uint32_t (CALLBACK* SIO1readMode32)(void); +typedef uint32_t (CALLBACK* SIO1readCtrl16)(void); +typedef uint32_t (CALLBACK* SIO1readCtrl32)(void); +typedef uint32_t (CALLBACK* SIO1readBaud16)(void); +typedef uint32_t (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; + void CALLBACK clearDynarec(void); void SetIsoFile(const char *filename); diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h index 90153ec5..500c44ad 100644 --- a/libpcsxcore/psxcommon.h +++ b/libpcsxcore/psxcommon.h @@ -108,6 +108,7 @@ typedef struct { char Pad1[MAXPATHLEN]; char Pad2[MAXPATHLEN]; char Net[MAXPATHLEN]; + char Sio1[MAXPATHLEN]; char Mcd1[MAXPATHLEN]; char Mcd2[MAXPATHLEN]; char Bios[MAXPATHLEN]; diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c index 9f48dad0..b07b035e 100644 --- a/libpcsxcore/psxhw.c +++ b/libpcsxcore/psxhw.c @@ -41,7 +41,7 @@ u8 psxHwRead8(u32 add) { switch (add) { case 0x1f801040: hard = sioRead8();break; - // case 0x1f801050: hard = serial_read8(); break;//for use of serial port ignore for now + case 0x1f801050: hard = SIO1_readData8(); break; case 0x1f801800: hard = cdrRead0(); break; case 0x1f801801: hard = cdrRead1(); break; case 0x1f801802: hard = cdrRead2(); break; @@ -104,13 +104,18 @@ u16 psxHwRead16(u32 add) { PAD_LOG("sio read16 %x; ret = %x\n", add&0xf, hard); #endif return hard; - - //Serial port stuff not support now ;P - // case 0x1f801050: hard = serial_read16(); break; - // case 0x1f801054: hard = serial_status_read(); break; - // case 0x1f80105a: hard = serial_control_read(); break; - // case 0x1f80105e: hard = serial_baud_read(); break; - + case 0x1f801050: + hard = SIO1_readData16(); + return hard; + case 0x1f801054: + hard = SIO1_readStat16(); + return hard; + case 0x1f80105a: + hard = SIO1_readCtrl16(); + return hard; + case 0x1f80105e: + hard = SIO1_readBaud16(); + return hard; case 0x1f801100: hard = psxRcntRcount(0); #ifdef PSXHW_LOG @@ -200,8 +205,9 @@ u32 psxHwRead32(u32 add) { PAD_LOG("sio read32 ;ret = %x\n", hard); #endif return hard; - - // case 0x1f801050: hard = serial_read32(); break;//serial port + case 0x1f801050: + hard = SIO1_readData32(); + return hard; #ifdef PSXHW_LOG case 0x1f801060: PSXHW_LOG("RAM size read %x\n", psxHu32(0x1060)); @@ -337,7 +343,7 @@ u32 psxHwRead32(u32 add) { void psxHwWrite8(u32 add, u8 value) { switch (add) { case 0x1f801040: sioWrite8(value); break; - // case 0x1f801050: serial_write8(value); break;//serial port + case 0x1f801050: SIO1_writeData8(value); break; case 0x1f801800: cdrWrite0(value); break; case 0x1f801801: cdrWrite1(value); break; case 0x1f801802: cdrWrite2(value); break; @@ -389,13 +395,18 @@ void psxHwWrite16(u32 add, u16 value) { PAD_LOG ("sio write16 %x, %x\n", add&0xf, value); #endif return; - - //serial port ;P - // case 0x1f801050: serial_write16(value); break; - // case 0x1f80105a: serial_control_write(value);break; - // case 0x1f80105e: serial_baud_write(value); break; - // case 0x1f801054: serial_status_write(value); break; - + case 0x1f801050: + SIO1_writeData16(value); + return; + case 0x1f801054: + SIO1_writeStat16(value); + return; + case 0x1f80105a: + SIO1_writeCtrl16(value); + return; + case 0x1f80105e: + SIO1_writeBaud16(value); + return; case 0x1f801070: #ifdef PSXHW_LOG PSXHW_LOG("IREG 16bit write %x\n", value); @@ -497,7 +508,9 @@ void psxHwWrite32(u32 add, u32 value) { PAD_LOG("sio write32 %x\n", value); #endif return; - // case 0x1f801050: serial_write32(value); break;//serial port + case 0x1f801050: + SIO1_writeData32(value); + return; #ifdef PSXHW_LOG case 0x1f801060: PSXHW_LOG("RAM size write %x\n", value); -- cgit v1.2.3