From 3b1ff2df66d0fb19f0a6b7542ede5543c0d0486f Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 11 Dec 2014 07:27:21 +0000 Subject: [PATCH] psx - substantially revise original 'frontio' peripheral management code to reduce mednafenisms and support future flexibility. but for now: memory card is automatically mounted on slot 1 and tied to game name, same type of sram as other platforms. --- .../Consoles/Sony/PSX/Octoshock.cs | 40 +- .../Consoles/Sony/PSX/OctoshockDll.cs | 22 + output/dll/octoshock.dll | Bin 978432 -> 974848 bytes psx/octoshock/psx/frontio.cpp | 406 ++++------------- psx/octoshock/psx/frontio.h | 37 +- psx/octoshock/psx/psx.cpp | 429 ++---------------- psx/octoshock/psx/psx.h | 25 +- 7 files changed, 243 insertions(+), 716 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index a46c8f6717..292801aad1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX isPorted: true, isReleased: false )] - public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains + public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains, ISaveRam { public string SystemId { get { return "NULL"; } } @@ -396,5 +396,43 @@ namespace BizHawk.Emulation.Cores.Sony.PSX #endregion + #region ISaveRam + + public byte[] CloneSaveRam() + { + var buf = new byte[128 * 1024]; + fixed (byte* pbuf = buf) + { + var transaction = new OctoshockDll.ShockMemcardTransaction(); + transaction.buffer128k = pbuf; + transaction.transaction = OctoshockDll.eShockMemcardTransaction.Read; + OctoshockDll.shock_Peripheral_MemcardTransact(psx, 0x01, ref transaction); + } + return buf; + } + + public void StoreSaveRam(byte[] data) + { + fixed (byte* pbuf = data) + { + var transaction = new OctoshockDll.ShockMemcardTransaction(); + transaction.buffer128k = pbuf; + transaction.transaction = OctoshockDll.eShockMemcardTransaction.Write; + OctoshockDll.shock_Peripheral_MemcardTransact(psx, 0x01, ref transaction); + } + } + + public bool SaveRamModified + { + get + { + var transaction = new OctoshockDll.ShockMemcardTransaction(); + transaction.transaction = OctoshockDll.eShockMemcardTransaction.CheckDirty; + return OctoshockDll.shock_Peripheral_MemcardTransact(psx, 0x01, ref transaction) == OctoshockDll.SHOCK_TRUE; + } + } + + #endregion //ISaveRam + } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs index 8ff527ac18..95ee653cca 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs @@ -31,6 +31,15 @@ public unsafe static class OctoshockDll PIOMem = 2, //64K GPURAM = 3, //512K SPURAM = 4 //512K + }; + + public enum eShockMemcardTransaction + { + Connect = 0, //connects it to the addressed port (not supported yet) + Disconnect = 1, //disconnects it from the addressed port (not supported yet) + Write = 2, //writes from the frontend to the memcard + Read = 3, //reads from the memcard to the frontend. Also clears the dirty flag + CheckDirty = 4, //checks whether the memcard is dirty }; @@ -46,6 +55,8 @@ public unsafe static class OctoshockDll }; public const int SHOCK_OK = 0; + public const int SHOCK_FALSE = 0; + public const int SHOCK_TRUE = 1; public const int SHOCK_ERROR = -1; public const int SHOCK_NOCANDO = -2; public const int SHOCK_INVALID_ADDRESS = -3; @@ -82,6 +93,14 @@ public unsafe static class OctoshockDll public void* ptr; }; + [StructLayout(LayoutKind.Sequential)] + public struct ShockMemcardTransaction + { + [MarshalAs(UnmanagedType.I4)] + public eShockMemcardTransaction transaction; + public void* buffer128k; + }; + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int ShockDisc_ReadTOC(IntPtr opaque, ShockTOC* read_target, ShockTOCTrack* tracks101); @@ -114,6 +133,9 @@ public unsafe static class OctoshockDll [DllImport("octoshock.dll")] public static extern int shock_Peripheral_SetPadInput(IntPtr psx, int address, uint buttons, byte left_x, byte left_y, byte right_x, byte right_y); + [DllImport("octoshock.dll")] + public static extern int shock_Peripheral_MemcardTransact(IntPtr psx, int address, ref ShockMemcardTransaction transaction); + [DllImport("octoshock.dll")] public static extern int shock_PowerOn(IntPtr psx); diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll index 68229d49799de553c4adee3e8951f0d938bac2be..76ea6a2e24c7a0be08b37a42e89b53403002a156 100644 GIT binary patch delta 100100 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%0DGy(b~zF@DV^eRR^8^Vl} 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 E0we)@Bme*a diff --git a/psx/octoshock/psx/frontio.cpp b/psx/octoshock/psx/frontio.cpp index a6c71a236f..9e6666ecd4 100644 --- a/psx/octoshock/psx/frontio.cpp +++ b/psx/octoshock/psx/frontio.cpp @@ -63,61 +63,6 @@ void InputDevice::ResetTS(void) } -void InputDevice::SetCrosshairsColor(uint32 color) -{ - chair_r = (color >> 16) & 0xFF; - chair_g = (color >> 8) & 0xFF; - chair_b = (color >> 0) & 0xFF; - - draw_chair = (color != (1 << 24)); -} - -INLINE void InputDevice::DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock) -{ - if(draw_chair && chair_y >= -8 && chair_y <= 8) - { - int32 ic; - int32 x_start, x_bound; - - if(chair_y == 0) - ic = pix_clock / 762925; - else - ic = 0; - - x_start = std::max(0, chair_x - ic); - x_bound = std::min(width, chair_x + ic + 1); - - for(int32 x = x_start; x < x_bound; x++) - { - int r, g, b, a; - int nr, ng, nb; - - format->DecodeColor(pixels[x], r, g, b, a); - - nr = (r + chair_r * 3) >> 2; - ng = (g + chair_g * 3) >> 2; - nb = (b + chair_b * 3) >> 2; - - if((int)((abs(r - nr) - 0x40) & (abs(g - ng) - 0x40) & (abs(b - nb) - 0x40)) < 0) - { - if((nr | ng | nb) & 0x80) - { - nr >>= 1; - ng >>= 1; - nb >>= 1; - } - else - { - nr ^= 0x80; - ng ^= 0x80; - nb ^= 0x80; - } - } - - pixels[x] = format->MakeColor(nr, ng, nb, a); - } - } -} bool InputDevice::RequireNoFrameskip(void) { @@ -177,146 +122,38 @@ void InputDevice::ResetNVDirtyCount(void) } -static unsigned EP_to_MP(bool emulate_multitap[2], unsigned ep) +//an old snippet tha showshow to set up a multitap device + //if(emulate_multitap[mp]) + // DevicesTap[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), Devices[i], emulate_memcards[i] ? DevicesMC[i] : DummyDevice); + //else + // DevicesTap[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), DummyDevice, DummyDevice); + + +FrontIO::FrontIO() { - if(!emulate_multitap[0] && emulate_multitap[1]) - { - if(ep == 0 || ep >= 5) - return(0); - else - return(1); - } - else - return(ep >= 4); + //a dummy device used for memcards (please rename me) + DummyDevice = new InputDevice(); + + for(int i=0;i<2;i++) + { + Ports[i] = new InputDevice(); + PortData[i] = NULL; + MCPorts[i] = new InputDevice(); + } + + //always add one memory device for now + MCPorts[0] = Device_Memcard_Create(); } -static INLINE unsigned EP_to_SP(bool emulate_multitap[2], unsigned ep) -{ - if(!emulate_multitap[0] && emulate_multitap[1]) - { - if(ep == 0) - return(0); - else if(ep < 5) - return(ep - 1); - else - return(ep - 4); - } - else - return(ep & 0x3); -} - -void FrontIO::MapDevicesToPorts(void) -{ - if(emulate_multitap[0] && emulate_multitap[1]) - { - for(unsigned i = 0; i < 2; i++) - { - Ports[i] = DevicesTap[i]; - MCPorts[i] = DummyDevice; - } - } - else if(!emulate_multitap[0] && emulate_multitap[1]) - { - Ports[0] = Devices[0]; - MCPorts[0] = emulate_memcards[0] ? DevicesMC[0] : DummyDevice; - - Ports[1] = DevicesTap[1]; - MCPorts[1] = DummyDevice; - } - else if(emulate_multitap[0] && !emulate_multitap[1]) - { - Ports[0] = DevicesTap[0]; - MCPorts[0] = DummyDevice; - - Ports[1] = Devices[4]; - MCPorts[1] = emulate_memcards[4] ? DevicesMC[4] : DummyDevice; - } - else - { - for(unsigned i = 0; i < 2; i++) - { - Ports[i] = Devices[i]; - MCPorts[i] = emulate_memcards[i] ? DevicesMC[i] : DummyDevice; - } - } - - //printf("\n"); - for(unsigned i = 0; i < 8; i++) - { - unsigned mp = EP_to_MP(emulate_multitap, i); - - if(emulate_multitap[mp]) - DevicesTap[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), Devices[i], emulate_memcards[i] ? DevicesMC[i] : DummyDevice); - else - DevicesTap[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), DummyDevice, DummyDevice); - - //printf("%d-> multitap: %d, sub-port: %d\n", i, mp, EP_to_SP(emulate_multitap, i)); - } -} - -FrontIO::FrontIO(bool emulate_memcards_[8], bool emulate_multitap_[2]) -{ - memcpy(emulate_memcards, emulate_memcards_, sizeof(emulate_memcards)); - memcpy(emulate_multitap, emulate_multitap_, sizeof(emulate_multitap)); - - DummyDevice = new InputDevice(); - - for(unsigned i = 0; i < 8; i++) - { - DeviceData[i] = NULL; - Devices[i] = new InputDevice(); - DevicesMC[i] = Device_Memcard_Create(); - chair_colors[i] = 1 << 24; - Devices[i]->SetCrosshairsColor(chair_colors[i]); - } - - for(unsigned i = 0; i < 2; i++) - { - DevicesTap[i] = new InputDevice_Multitap(); - } - - MapDevicesToPorts(); -} - - -void FrontIO::SetCrosshairsColor(unsigned port, uint32 color) -{ - assert(port >= 0 && port < 8); - - chair_colors[port] = color; - Devices[port]->SetCrosshairsColor(color); -} FrontIO::~FrontIO() { - for(int i = 0; i < 8; i++) - { - if(Devices[i]) - { - delete Devices[i]; - Devices[i] = NULL; - } - if(DevicesMC[i]) - { - delete DevicesMC[i]; - DevicesMC[i] = NULL; - } - } - - for(unsigned i = 0; i < 2; i++) - { - if(DevicesTap[i]) - { - delete DevicesTap[i]; - DevicesTap[i] = NULL; - } - } - - if(DummyDevice) - { - delete DummyDevice; - DummyDevice = NULL; - } + for(int i=0;i<2;i++) + { + delete Ports[i]; + delete MCPorts[i]; + } + delete DummyDevice; } pscpu_timestamp_t FrontIO::CalcNextEventTS(pscpu_timestamp_t timestamp, int32 next_event) @@ -655,20 +492,20 @@ pscpu_timestamp_t FrontIO::Update(pscpu_timestamp_t timestamp) void FrontIO::ResetTS(void) { - for(int i = 0; i < 8; i++) - { - Devices[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? - Devices[i]->ResetTS(); + for(int i=0;i<2;i++) + { + if(Ports[i] != NULL) + { + Ports[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? + Ports[i]->ResetTS(); + } - DevicesMC[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? - DevicesMC[i]->ResetTS(); - } - - for(int i = 0; i < 2; i++) - { - DevicesTap[i]->Update(lastts); - DevicesTap[i]->ResetTS(); - } + if(MCPorts[i] != NULL) + { + MCPorts[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? + MCPorts[i]->ResetTS(); + } + } for(int i = 0; i < 2; i++) { @@ -726,10 +563,11 @@ void FrontIO::Power(void) Control = 0; Baudrate = 0; - for(int i = 0; i < 8; i++) + //power on all plugged devices (are we doing this when attaching them?) + for(int i=0;i<2;i++) { - Devices[i]->Power(); - DevicesMC[i]->Power(); + if(Ports[i] != NULL) Ports[i]->Power(); + if(MCPorts[i] != NULL) MCPorts[i]->Power(); } istatus = false; @@ -737,102 +575,54 @@ void FrontIO::Power(void) void FrontIO::UpdateInput(void) { - for(int i = 0; i < 8; i++) - Devices[i]->UpdateInput(DeviceData[i]); + for(int i=0;i<2;i++) + { + if(Ports[i] != NULL) Ports[i]->UpdateInput(PortData[i]); + } } void FrontIO::SetInput(unsigned int port, const char *type, void *ptr) { - delete Devices[port]; - Devices[port] = NULL; + //clean up the old device + delete Ports[port]; + Ports[port] = NULL; + //OCTOSHOCK TODO - not sure I understand this if(port < 2) irq10_pulse_ts[port] = PSX_EVENT_MAXTS; - //DAW if(!strcmp(type, "gamepad") || !strcmp(type, "dancepad")) - Devices[port] = Device_Gamepad_Create(); + Ports[port] = Device_Gamepad_Create(); else if(!strcmp(type, "dualanalog")) - Devices[port] = Device_DualAnalog_Create(false); + Ports[port] = Device_DualAnalog_Create(false); else if(!strcmp(type, "analogjoy")) - Devices[port] = Device_DualAnalog_Create(true); + Ports[port] = Device_DualAnalog_Create(true); else if(!strcmp(type, "dualshock")) { char name[256]; snprintf(name, 256, "DualShock on port %u", port + 1); - Devices[port] = Device_DualShock_Create(std::string(name)); + Ports[port] = Device_DualShock_Create(std::string(name)); } else if(!strcmp(type, "mouse")) - Devices[port] = Device_Mouse_Create(); + Ports[port] = Device_Mouse_Create(); else if(!strcmp(type, "negcon")) - Devices[port] = Device_neGcon_Create(); + Ports[port] = Device_neGcon_Create(); else if(!strcmp(type, "guncon")) - Devices[port] = Device_GunCon_Create(); + Ports[port] = Device_GunCon_Create(); else if(!strcmp(type, "justifier")) - Devices[port] = Device_Justifier_Create(); + Ports[port] = Device_Justifier_Create(); else - Devices[port] = new InputDevice(); + Ports[port] = new InputDevice(); //Devices[port]->SetCrosshairsColor(chair_colors[port]); - DeviceData[port] = ptr; - - MapDevicesToPorts(); + PortData[port] = ptr; } uint64 FrontIO::GetMemcardDirtyCount(unsigned int which) { - assert(which < 8); - - return(DevicesMC[which]->GetNVDirtyCount()); -} - -void FrontIO::LoadMemcard(unsigned int which, const char *path) -{ - //assert(which < 8); - - //try - //{ - // if(DevicesMC[which]->GetNVSize()) - // { - // FileStream mf(path, FileStream::MODE_READ); - // std::vector tmpbuf; - - // tmpbuf.resize(DevicesMC[which]->GetNVSize()); - - // if(mf.size() != (int64)tmpbuf.size()) - // throw(MDFN_Error(0, _("Memory card file \"%s\" is an incorrect size(%d bytes). The correct size is %d bytes."), path, (int)mf.size(), (int)tmpbuf.size())); - - // mf.read(&tmpbuf[0], tmpbuf.size()); - - // DevicesMC[which]->WriteNV(&tmpbuf[0], 0, tmpbuf.size()); - // DevicesMC[which]->ResetNVDirtyCount(); // There's no need to rewrite the file if it's the same data. - // } - //} - //catch(MDFN_Error &e) - //{ - // if(e.GetErrno() != ENOENT) - // throw(e); - //} -} - -void FrontIO::SaveMemcard(unsigned int which, const char *path) -{ - //assert(which < 8); - - //if(DevicesMC[which]->GetNVSize() && DevicesMC[which]->GetNVDirtyCount()) - //{ - // FileStream mf(path, FileStream::MODE_WRITE); // TODO: MODE_WRITE_ATOMIC_OVERWRITE - // std::vector tmpbuf; - - // tmpbuf.resize(DevicesMC[which]->GetNVSize()); - - // DevicesMC[which]->ReadNV(&tmpbuf[0], 0, tmpbuf.size()); - // mf.write(&tmpbuf[0], tmpbuf.size()); - - // mf.close(); // Call before resetting the NV dirty count! - - // DevicesMC[which]->ResetNVDirtyCount(); - //} + assert(which < 2); + + return(MCPorts[which]->GetNVDirtyCount()); } int FrontIO::StateAction(StateMem* sm, int load, int data_only) @@ -871,33 +661,35 @@ int FrontIO::StateAction(StateMem* sm, int load, int data_only) int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "FIO"); - for(unsigned i = 0; i < 8; i++) - { - static const char* labels[] = { - "FIODEV0","FIODEV1","FIODEV2","FIODEV3","FIODEV4","FIODEV5","FIODEV6","FIODEV7" - }; + //TODO - SAVESTATES - ret &= Devices[i]->StateAction(sm, load, data_only, labels[i]); - } + //for(unsigned i = 0; i < 8; i++) + //{ + //static const char* labels[] = { + // "FIODEV0","FIODEV1","FIODEV2","FIODEV3","FIODEV4","FIODEV5","FIODEV6","FIODEV7" + //}; - for(unsigned i = 0; i < 8; i++) - { - static const char* labels[] = { - "FIOMC0","FIOMC1","FIOMC2","FIOMC3","FIOMC4","FIOMC5","FIOMC6","FIOMC7" - }; + // ret &= Devices[i]->StateAction(sm, load, data_only, labels[i]); + //} + + //for(unsigned i = 0; i < 8; i++) + //{ + //static const char* labels[] = { + // "FIOMC0","FIOMC1","FIOMC2","FIOMC3","FIOMC4","FIOMC5","FIOMC6","FIOMC7" + //}; - ret &= DevicesMC[i]->StateAction(sm, load, data_only, labels[i]); - } + // ret &= DevicesMC[i]->StateAction(sm, load, data_only, labels[i]); + //} - for(unsigned i = 0; i < 2; i++) - { - static const char* labels[] = { - "FIOTAP0","FIOTAP1", - }; + //for(unsigned i = 0; i < 2; i++) + //{ + //static const char* labels[] = { + // "FIOTAP0","FIOTAP1", + //}; - ret &= DevicesTap[i]->StateAction(sm, load, data_only, labels[i]); - } + // ret &= DevicesTap[i]->StateAction(sm, load, data_only, labels[i]); + //} if(load) { @@ -909,10 +701,7 @@ int FrontIO::StateAction(StateMem* sm, int load, int data_only) bool FrontIO::RequireNoFrameskip(void) { - for(unsigned i = 0; i < 8; i++) - if(Devices[i]->RequireNoFrameskip()) - return(true); - + //this whole function is nonsense. frontend should know what it has attached return(false); } @@ -920,9 +709,13 @@ void FrontIO::GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timesta { Update(timestamp); - for(unsigned i = 0; i < 8; i++) + for(int i = 0; i < 2; i++) { - pscpu_timestamp_t plts = Devices[i]->GPULineHook(line_timestamp, vsync, pixels, format, width, pix_clock_offset, pix_clock, pix_clock_divider); + //octoshock edits.. not sure how safe it is + if(Ports[i] == NULL) + continue; + + pscpu_timestamp_t plts = Ports[i]->GPULineHook(line_timestamp, vsync, pixels, format, width, pix_clock_offset, pix_clock, pix_clock_divider); if(i < 2) { @@ -937,17 +730,6 @@ void FrontIO::GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timesta } } - // - // Draw crosshairs in a separate pass so the crosshairs won't mess up the color evaluation of later lightun GPULineHook()s. - // - if(pixels && pix_clock) - { - for(unsigned i = 0; i < 8; i++) - { - Devices[i]->DrawCrosshairs(pixels, format, width, pix_clock); - } - } - PSX_SetEventNT(PSX_EVENT_FIO, CalcNextEventTS(timestamp, 0x10000000)); } diff --git a/psx/octoshock/psx/frontio.h b/psx/octoshock/psx/frontio.h index c02ecbd3f8..cc7423a779 100644 --- a/psx/octoshock/psx/frontio.h +++ b/psx/octoshock/psx/frontio.h @@ -25,12 +25,7 @@ class InputDevice virtual void Update(const pscpu_timestamp_t timestamp); // Partially-implemented, don't rely on for timing any more fine-grained than a video frame for now. virtual void ResetTS(void); - void DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock); - // - // - // - virtual void SetCrosshairsColor(uint32 color); - + // // // @@ -63,7 +58,7 @@ class FrontIO { public: - FrontIO(bool emulate_memcards_[8], bool emulate_multitap_[2]); + FrontIO(); ~FrontIO(); void Power(void); @@ -81,31 +76,31 @@ class FrontIO void SetCrosshairsColor(unsigned port, uint32 color); uint64 GetMemcardDirtyCount(unsigned int which); - void LoadMemcard(unsigned int which, const char *path); - void SaveMemcard(unsigned int which, const char *path); //, bool force_save = false); + int StateAction(StateMem* sm, int load, int data_only); + + InputDevice *Ports[2]; + void *PortData[2]; + InputDevice *MCPorts[2]; + InputDevice *DummyDevice; private: void DoDSRIRQ(void); void CheckStartStopPending(pscpu_timestamp_t timestamp, bool skip_event_set = false); - void MapDevicesToPorts(void); - bool emulate_memcards[8]; - bool emulate_multitap[2]; - InputDevice *Ports[2]; - InputDevice *MCPorts[2]; - InputDevice *DummyDevice; - InputDevice_Multitap *DevicesTap[2]; - - InputDevice *Devices[8]; - void *DeviceData[8]; - - InputDevice *DevicesMC[8]; + //OLD + //bool emulate_memcards[8]; + //void MapDevicesToPorts(void); + //bool emulate_multitap[2]; + //InputDevice_Multitap *DevicesTap[2]; + //InputDevice *Devices[8]; + //void *DeviceData[8]; + //InputDevice *DevicesMC[8]; // // diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp index 275aeb25f7..d6441d8e5b 100644 --- a/psx/octoshock/psx/psx.cpp +++ b/psx/octoshock/psx/psx.cpp @@ -1051,231 +1051,7 @@ static void Emulate(EmulateSpecStruct *espec) } } - //DAW!! - // Save memcards if dirty. - //for(int i = 0; i < 8; i++) - //{ - // uint64 new_dc = FIO->GetMemcardDirtyCount(i); - - // if(new_dc > Memcard_PrevDC[i]) - // { - // Memcard_PrevDC[i] = new_dc; - // Memcard_SaveDelay[i] = 0; - // } - - // if(Memcard_SaveDelay[i] >= 0) - // { - // Memcard_SaveDelay[i] += timestamp; - // if(Memcard_SaveDelay[i] >= (33868800 * 2)) // Wait until about 2 seconds of no new writes. - // { - // PSX_DBG(PSX_DBG_SPARSE, "Saving memcard %d...\n", i); - // try - // { - // char ext[64]; - // trio_snprintf(ext, sizeof(ext), "%d.mcr", i); - // FIO->SaveMemcard(i, MDFN_MakeFName(MDFNMKF_SAV, 0, ext).c_str()); - // Memcard_SaveDelay[i] = -1; - // Memcard_PrevDC[i] = 0; - // } - // catch(std::exception &e) - // { - // MDFN_PrintError("Memcard %d save error: %s", i, e.what()); - // MDFN_DispMessage("Memcard %d save error: %s", i, e.what()); - // } - // //MDFN_DispMessage("Memcard %d saved.", i); - // } - // } - //} } -// -//static bool TestMagic(MDFNFILE *fp) -//{ -//#ifdef WANT_PSF -// if(PSFLoader::TestMagic(0x01, fp)) -// return(true); -//#endif -// -// if(fp->size < 0x800) -// return(false); -// -// if(memcmp(fp->data, "PS-X EXE", 8)) -// return(false); -// -// return(true); -//} -// -//static bool TestMagicCD(std::vector *CDInterfaces) -//{ -// uint8 buf[2048]; -// CDUtility::TOC toc; -// int dt; -// -// (*CDInterfaces)[0]->ReadTOC(&toc); -// -// dt = toc.FindTrackByLBA(4); -// if(dt > 0 && !(toc.tracks[dt].control & 0x4)) -// return(false); -// -// if((*CDInterfaces)[0]->ReadSector(buf, 4, 1) != 0x2) -// return(false); -// -// if(strncmp((char *)buf + 10, "Licensed by", strlen("Licensed by"))) -// return(false); -// -// //if(strncmp((char *)buf + 32, "Sony", 4)) -// // return(false); -// -// //for(int i = 0; i < 2048; i++) -// // printf("%d, %02x %c\n", i, buf[i], buf[i]); -// //exit(1); -// -//#if 0 -// { -// uint8 buf[2048 * 7]; -// -// if((*cdifs)[0]->ReadSector(buf, 5, 7) == 0x2) -// { -// printf("CRC32: 0x%08x\n", (uint32)crc32(0, &buf[0], 0x3278)); -// } -// } -//#endif -// -// return(true); -//} - -// -// -//static const char *CalcDiscSCEx_BySYSTEMCNF(CDIF *c, unsigned *rr) -//{ -// const char *ret = NULL; -// Stream *fp = NULL; -// CDUtility::TOC toc; -// -// //(*CDInterfaces)[disc]->ReadTOC(&toc); -// -// //if(toc.first_track > 1 || toc. -// -// try -// { -// uint8 pvd[2048]; -// unsigned pvd_search_count = 0; -// -// fp = c->MakeStream(0, ~0U); -// fp->seek(0x8000, SEEK_SET); -// -// do -// { -// if((pvd_search_count++) == 32) -// throw MDFN_Error(0, "PVD search count limit met."); -// -// fp->read(pvd, 2048); -// -// if(memcmp(&pvd[1], "CD001", 5)) -// throw MDFN_Error(0, "Not ISO-9660"); -// -// if(pvd[0] == 0xFF) -// throw MDFN_Error(0, "Missing Primary Volume Descriptor"); -// } while(pvd[0] != 0x01); -// //[156 ... 189], 34 bytes -// uint32 rdel = MDFN_de32lsb(&pvd[0x9E]); -// uint32 rdel_len = MDFN_de32lsb(&pvd[0xA6]); -// -// if(rdel_len >= (1024 * 1024 * 10)) // Arbitrary sanity check. -// throw MDFN_Error(0, "Root directory table too large"); -// -// fp->seek((int64)rdel * 2048, SEEK_SET); -// //printf("%08x, %08x\n", rdel * 2048, rdel_len); -// while(fp->tell() < (((int64)rdel * 2048) + rdel_len)) -// { -// uint8 len_dr = fp->get_u8(); -// uint8 dr[256 + 1]; -// -// memset(dr, 0xFF, sizeof(dr)); -// -// if(!len_dr) -// break; -// -// memset(dr, 0, sizeof(dr)); -// dr[0] = len_dr; -// fp->read(dr + 1, len_dr - 1); -// -// uint8 len_fi = dr[0x20]; -// -// if(len_fi == 12 && !memcmp(&dr[0x21], "SYSTEM.CNF;1", 12)) -// { -// uint32 file_lba = MDFN_de32lsb(&dr[0x02]); -// //uint32 file_len = MDFN_de32lsb(&dr[0x0A]); -// uint8 fb[2048 + 1]; -// char *bootpos; -// -// memset(fb, 0, sizeof(fb)); -// fp->seek(file_lba * 2048, SEEK_SET); -// fp->read(fb, 2048); -// -// bootpos = strstr((char*)fb, "BOOT") + 4; -// while(*bootpos == ' ' || *bootpos == '\t') bootpos++; -// if(*bootpos == '=') -// { -// bootpos++; -// while(*bootpos == ' ' || *bootpos == '\t') bootpos++; -// if(!strncasecmp(bootpos, "cdrom:\\", 7)) -// { -// bootpos += 7; -// char *tmp; -// -// if((tmp = strchr(bootpos, '_'))) *tmp = 0; -// if((tmp = strchr(bootpos, '.'))) *tmp = 0; -// if((tmp = strchr(bootpos, ';'))) *tmp = 0; -// //puts(bootpos); -// -// if(strlen(bootpos) == 4 && bootpos[0] == 'S' && (bootpos[1] == 'C' || bootpos[1] == 'L' || bootpos[1] == 'I')) -// { -// switch(bootpos[2]) -// { -// case 'E': if(rr) -// *rr = REGION_EU; -// ret = "SCEE"; -// goto Breakout; -// -// case 'U': if(rr) -// *rr = REGION_NA; -// ret = "SCEA"; -// goto Breakout; -// -// case 'K': // Korea? -// case 'B': -// case 'P': if(rr) -// *rr = REGION_JP; -// ret = "SCEI"; -// goto Breakout; -// } -// } -// } -// } -// -// //puts((char*)fb); -// //puts("ASOFKOASDFKO"); -// } -// } -// } -// catch(std::exception &e) -// { -// //puts(e.what()); -// } -// catch(...) -// { -// -// } -// -// Breakout: -// if(fp != NULL) -// { -// delete fp; -// fp = NULL; -// } -// -// return(ret); -//} struct ShockConfig { @@ -1311,6 +1087,8 @@ struct ShockPeripheral struct { + //This is kind of redundant with the frontIO code, and should be merged with it eventually, when the configurability gets more advanced + ShockPeripheral ports[2]; void Initialize() @@ -1378,7 +1156,43 @@ struct { buf[4] = right_y; buf[5] = left_x; buf[6] = left_y; - break; + return SHOCK_OK; + + default: + return SHOCK_ERROR; + } + } + + s32 MemcardTransact(s32 address, ShockMemcardTransaction* transaction) + { + //check the port address + int portnum = address&1; + if(portnum != 1 && portnum != 2) + return SHOCK_INVALID_ADDRESS; + portnum--; + + //TODO - once we get flexible here, do some extra condition checks.. whether memcards exist, etc. much like devices. + switch(transaction->transaction) + { + case eShockMemcardTransaction_Connect: return SHOCK_ERROR; //not supported yet + case eShockMemcardTransaction_Disconnect: return SHOCK_ERROR; //not supported yet + + case eShockMemcardTransaction_Write: + FIO->MCPorts[portnum]->WriteNV((uint8*)transaction->buffer128k,0,128*1024); + return SHOCK_OK; + + case eShockMemcardTransaction_Read: + FIO->MCPorts[portnum]->ReadNV((uint8*)transaction->buffer128k,0,128*1024); + FIO->MCPorts[portnum]->ResetNVDirtyCount(); + return SHOCK_OK; + + case eShockMemcardTransaction_CheckDirty: + if(FIO->GetMemcardDirtyCount(portnum)) + return SHOCK_TRUE; + else return SHOCK_FALSE; + + default: + return SHOCK_ERROR; } } @@ -1394,6 +1208,11 @@ EW_EXPORT s32 shock_Peripheral_SetPadInput(void* psx, s32 address, u32 buttons, return s_ShockPeripheralState.SetPadInput(address, buttons, left_x, left_y, right_x, right_y); } +EW_EXPORT s32 shock_Peripheral_MemcardTransact(void* psx, s32 address, ShockMemcardTransaction* transaction) +{ + return s_ShockPeripheralState.MemcardTransact(address, transaction); +} + static void MountCPUAddressSpace() { for(uint32 ma = 0x00000000; ma < 0x00800000; ma += 2048 * 1024) @@ -1423,7 +1242,10 @@ static int s_FramebufferCurrentWidth; EW_EXPORT s32 shock_Create(void** psx, s32 region, void* firmware512k) { - //NEW + //TODO + //psx_dbg_level = MDFN_GetSettingUI("psx.dbg_level"); + //DBG_Init(); + *psx = NULL; //PIO Mem: why wouldn't we want this? @@ -1480,11 +1302,7 @@ EW_EXPORT s32 shock_Create(void** psx, s32 region, void* firmware512k) VTLineWidths[i] = (int *)calloc(s_ShockConfig.fb_height, sizeof(int)); } - - //TODO - configuration - static bool emulate_memcard[8] = {0}; - static bool emulate_multitap[2] = {0}; - FIO = new FrontIO(emulate_memcard, emulate_multitap); + FIO = new FrontIO(); s_ShockPeripheralState.Initialize(); MountCPUAddressSpace(); @@ -1793,155 +1611,6 @@ EW_EXPORT s32 shock_GetFramebuffer(void* psx, ShockFramebufferInfo* fb) return SHOCK_OK; } -static void InitCommon(std::vector *CDInterfaces, const bool EmulateMemcards = true, const bool WantPIOMem = false) -{ - //OLD - unsigned region; - bool emulate_memcard[8]; - bool emulate_multitap[2]; - int sls, sle; - -#if PSX_DBGPRINT_ENABLE - psx_dbg_level = MDFN_GetSettingUI("psx.dbg_level"); -#endif - - //DAW - /*for(unsigned i = 0; i < 8; i++) - { - char buf[64]; - trio_snprintf(buf, sizeof(buf), "psx.input.port%u.memcard", i + 1); - emulate_memcard[i] = EmulateMemcards && MDFN_GetSettingB(buf); - } - - for(unsigned i = 0; i < 2; i++) - { - char buf[64]; - trio_snprintf(buf, sizeof(buf), "psx.input.pport%u.multitap", i + 1); - emulate_multitap[i] = MDFN_GetSettingB(buf); - }*/ - - - //cdifs = CDInterfaces; - //region = CalcDiscSCEx(); - - if(shock_GetSetting(REGION_AUTODETECT)==0) - region = shock_GetSetting(REGION_DEFAULT); - - sls = shock_GetSetting((region == REGION_EU) ? SLSTARTP : SLSTART); - sle = shock_GetSetting((region == REGION_EU) ? SLENDP : SLEND); - - if(sls > sle) - { - int tmp = sls; - sls = sle; - sle = tmp; - } - - CPU = new PS_CPU(); - SPU = new PS_SPU(); - GPU = new PS_GPU(region == REGION_EU, sls, sle); - CDC = new PS_CDC(); - FIO = new FrontIO(emulate_memcard, emulate_multitap); - - //dont think we want the crosshair drawing to be done here - //FIO->SetCrosshairsColor(i, MDFN_GetSettingUI(buf)); - - DMA_Init(); - - //DAW - //GPU->FillVideoParams(&EmulatedPSX); - - if(cdifs) - { - CD_TrayOpen = false; - CD_SelectedDisc = 0; - } - else - { - CD_TrayOpen = true; - CD_SelectedDisc = -1; - } - - //CDC->SetDisc(true, NULL, NULL); - //CDC->SetDisc(CD_TrayOpen, (CD_SelectedDisc >= 0 && !CD_TrayOpen) ? (*cdifs)[CD_SelectedDisc] : NULL, - //(CD_SelectedDisc >= 0 && !CD_TrayOpen) ? cdifs_scex_ids[CD_SelectedDisc] : NULL); - - - BIOSROM = new MultiAccessSizeMem<512 * 1024, uint32, false>(); - - if(WantPIOMem) - PIOMem = new MultiAccessSizeMem<65536, uint32, false>(); - else - PIOMem = NULL; - - for(uint32 ma = 0x00000000; ma < 0x00800000; ma += 2048 * 1024) - { - CPU->SetFastMap(MainRAM.data32, 0x00000000 + ma, 2048 * 1024); - CPU->SetFastMap(MainRAM.data32, 0x80000000 + ma, 2048 * 1024); - CPU->SetFastMap(MainRAM.data32, 0xA0000000 + ma, 2048 * 1024); - } - - CPU->SetFastMap(BIOSROM->data32, 0x1FC00000, 512 * 1024); - CPU->SetFastMap(BIOSROM->data32, 0x9FC00000, 512 * 1024); - CPU->SetFastMap(BIOSROM->data32, 0xBFC00000, 512 * 1024); - - if(PIOMem) - { - CPU->SetFastMap(PIOMem->data32, 0x1F000000, 65536); - CPU->SetFastMap(PIOMem->data32, 0x9F000000, 65536); - CPU->SetFastMap(PIOMem->data32, 0xBF000000, 65536); - } - - - //MDFNMP_Init(1024, ((uint64)1 << 29) / 1024); - //MDFNMP_AddRAM(2048 * 1024, 0x00000000, MainRAM.data8); - - //DAW- - //TODO - load bios - // - // - // - //const char *biospath_sname; - - //if(region == REGION_JP) - // biospath_sname = "psx.bios_jp"; - //else if(region == REGION_EU) - // biospath_sname = "psx.bios_eu"; - //else if(region == REGION_NA) - // biospath_sname = "psx.bios_na"; - //else - // abort(); - - //{ - // std::string biospath = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS(biospath_sname).c_str()); - // FileStream BIOSFile(biospath.c_str(), FileStream::MODE_READ); - - // BIOSFile.read(BIOSROM->data8, 512 * 1024); - //} - - //todo - load memcard - //DAW - //for(int i = 0; i < 8; i++) - //{ - // char ext[64]; - // trio_snprintf(ext, sizeof(ext), "%d.mcr", i); - // FIO->LoadMemcard(i, MDFN_MakeFName(MDFNMKF_SAV, 0, ext).c_str()); - //} - - for(int i = 0; i < 8; i++) - { - Memcard_PrevDC[i] = FIO->GetMemcardDirtyCount(i); - Memcard_SaveDelay[i] = -1; - } - - - #ifdef WANT_DEBUGGER - DBG_Init(); - #endif - - PSX_Power(); -} - static void LoadEXE(const uint8 *data, const uint32 size, bool ignore_pcsp = false) { // uint32 PC; diff --git a/psx/octoshock/psx/psx.h b/psx/octoshock/psx/psx.h index 3bcb52ea1f..f599270f65 100644 --- a/psx/octoshock/psx/psx.h +++ b/psx/octoshock/psx/psx.h @@ -147,10 +147,19 @@ enum ePeripheralType ePeripheralType_Pad = 1, //SCPH-1080 ePeripheralType_DualShock = 2, //SCPH-1200 ePeripheralType_DualAnalog = 3, //SCPH-1180 - + ePeripheralType_Multitap = 10, }; +enum eShockMemcardTransaction +{ + eShockMemcardTransaction_Connect = 0, //connects it to the addressed port (not supported yet) + eShockMemcardTransaction_Disconnect = 1, //disconnects it from the addressed port (not supported yet) + eShockMemcardTransaction_Write = 2, //writes from the frontend to the memcard + eShockMemcardTransaction_Read = 3, //reads from the memcard to the frontend. Also clears the dirty flag + eShockMemcardTransaction_CheckDirty = 4, //checks whether the memcard is dirty +}; + enum eShockSetting { REGION_AUTODETECT = 0, @@ -170,6 +179,8 @@ int shock_GetSetting(eShockSetting setting); #define MDFN_MSC_EJECT_DISK 4 #define SHOCK_OK 0 +#define SHOCK_FALSE 0 +#define SHOCK_TRUE 1 #define SHOCK_ERROR -1 #define SHOCK_NOCANDO -2 #define SHOCK_INVALID_ADDRESS -3 @@ -234,7 +245,14 @@ struct ShockFramebufferInfo s32 width, height; s32 flags; void* ptr; -}; +}; + +struct ShockMemcardTransaction +{ + eShockMemcardTransaction transaction; + void* buffer128k; +}; + //Creates a ShockDiscRef (representing a disc) with the given properties. Returns it in the specified output pointer. //The ReadLBA2048 function should return 0x01 or 0x02 depending on which mode was there. @@ -268,6 +286,9 @@ EW_EXPORT s32 shock_Peripheral_Connect(void* psx, s32 address, s32 type); //Read more about the input format (buttons, analog range) here: TBD EW_EXPORT s32 shock_Peripheral_SetPadInput(void* psx, s32 address, u32 buttons, u8 left_x, u8 left_y, u8 right_x, u8 right_y); +//Performs one of several transactions on an attached memory card. +EW_EXPORT s32 shock_Peripheral_MemcardTransact(void* psx, s32 address, ShockMemcardTransaction* transaction); + //Sets the power to ON. Returns SHOCK_NOCANDO if already on. EW_EXPORT s32 shock_PowerOn(void* psx);