From b7d743e28069e71b7a3fd7f4b78e040452e8376a Mon Sep 17 00:00:00 2001 From: nattthebear Date: Mon, 10 Jul 2017 20:35:26 -0400 Subject: [PATCH] TSTHawk: Lag flag detection and InputCallbacks --- waterbox/pcfx/io-handler.inc | 549 ++++++++++++++++++----------------- waterbox/pcfx/pcfx.cpp | 8 +- 2 files changed, 290 insertions(+), 267 deletions(-) diff --git a/waterbox/pcfx/io-handler.inc b/waterbox/pcfx/io-handler.inc index 58bd16790d..808114f9bb 100644 --- a/waterbox/pcfx/io-handler.inc +++ b/waterbox/pcfx/io-handler.inc @@ -1,290 +1,309 @@ static uint8 MDFN_FASTCALL port_rbyte(v810_timestamp_t ×tamp, uint32 A) { - if(A >= 0x000 && A <= 0x0FF) - return(FXINPUT_Read8(A, timestamp)); - else if(A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy - { - timestamp += 4; - } - else if(A >= 0x200 && A <= 0x2FF) // RAINBOW dummy - { - timestamp += 4; - } - else if(A >= 0x300 && A <= 0x3FF) // FXVCE - { - timestamp += 4; - return(FXVCE_Read16(A)); - } - else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 4; - return(fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); - } - else if(A >= 0x600 && A <= 0x6FF) - { - timestamp += 4; - return(KING_Read8(timestamp, A)); - } - else if(A >= 0x700 && A <= 0x7FF) - { - if(!(A & 1)) - { - FXDBG("ExBusReset B Read"); - return(ExBusReset); - } - return(0); - } - else if(A >= 0xc00 && A <= 0xCFF) // Backup memory control - { - switch(A & 0xC0) - { - case 0x80: return(BackupControl); - case 0x00: return(Last_VDC_AR[0]); - case 0x40: return(Last_VDC_AR[1]); - } - } - else if(A >= 0xe00 && A <= 0xeff) - { - return(PCFXIRQ_Read8(A)); - } - else if(A >= 0xf00 && A <= 0xfff) - { - return(FXTIMER_Read8(A, timestamp)); - } - else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if(WantHuC6273) - return(HuC6273_Read8(A)); - } - else if(FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) - { - return(FXSCSIROM[A & 0x7FFFF]); - } - else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - return(FXSCSI_CtrlRead(A)); - } - FXDBG("Unknown 8-bit port read: %08x", A); + if (A >= 0x000 && A <= 0x0FF) + { + Lagged = false; + if (InputCallback) + InputCallback(); + return (FXINPUT_Read8(A, timestamp)); + } + else if (A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy + { + timestamp += 4; + } + else if (A >= 0x200 && A <= 0x2FF) // RAINBOW dummy + { + timestamp += 4; + } + else if (A >= 0x300 && A <= 0x3FF) // FXVCE + { + timestamp += 4; + return (FXVCE_Read16(A)); + } + else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 4; + return (fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); + } + else if (A >= 0x600 && A <= 0x6FF) + { + timestamp += 4; + return (KING_Read8(timestamp, A)); + } + else if (A >= 0x700 && A <= 0x7FF) + { + if (!(A & 1)) + { + FXDBG("ExBusReset B Read"); + return (ExBusReset); + } + return (0); + } + else if (A >= 0xc00 && A <= 0xCFF) // Backup memory control + { + switch (A & 0xC0) + { + case 0x80: + return (BackupControl); + case 0x00: + return (Last_VDC_AR[0]); + case 0x40: + return (Last_VDC_AR[1]); + } + } + else if (A >= 0xe00 && A <= 0xeff) + { + return (PCFXIRQ_Read8(A)); + } + else if (A >= 0xf00 && A <= 0xfff) + { + return (FXTIMER_Read8(A, timestamp)); + } + else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if (WantHuC6273) + return (HuC6273_Read8(A)); + } + else if (FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) + { + return (FXSCSIROM[A & 0x7FFFF]); + } + else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + return (FXSCSI_CtrlRead(A)); + } + FXDBG("Unknown 8-bit port read: %08x", A); - return(0x00); + return (0x00); } static uint16 MDFN_FASTCALL port_rhword(v810_timestamp_t ×tamp, uint32 A) { - if(A >= 0x000 && A <= 0x0FF) - return(FXINPUT_Read16(A, timestamp)); - else if(A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy - { - timestamp += 4; - } - else if(A >= 0x200 && A <= 0x2FF) // RAINBOW dummy - { - timestamp += 4; - } - else if(A >= 0x300 && A <= 0x3FF) - { - timestamp += 4; - return(FXVCE_Read16(A)); - } - else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 4; - return(fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); - } - else if(A >= 0x600 && A <= 0x6FF) - { - timestamp += 4; - return(KING_Read16(timestamp, A)); - } - else if(A >= 0x700 && A <= 0x7FF) - { - FXDBG("ExBusReset H Read"); + if (A >= 0x000 && A <= 0x0FF) + { + Lagged = false; + if (InputCallback) + InputCallback(); + return (FXINPUT_Read16(A, timestamp)); + } + else if (A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy + { + timestamp += 4; + } + else if (A >= 0x200 && A <= 0x2FF) // RAINBOW dummy + { + timestamp += 4; + } + else if (A >= 0x300 && A <= 0x3FF) + { + timestamp += 4; + return (FXVCE_Read16(A)); + } + else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 4; + return (fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); + } + else if (A >= 0x600 && A <= 0x6FF) + { + timestamp += 4; + return (KING_Read16(timestamp, A)); + } + else if (A >= 0x700 && A <= 0x7FF) + { + FXDBG("ExBusReset H Read"); - return(ExBusReset); - } - else if(A >= 0xc00 && A <= 0xCFF) // Backup memory control - { - switch(A & 0xC0) - { - case 0x80: return(BackupControl); - case 0x00: return(Last_VDC_AR[0]); - case 0x40: return(Last_VDC_AR[1]); - } - } - else if(A >= 0xe00 && A <= 0xeff) - { - return(PCFXIRQ_Read16(A)); - } - else if(A >= 0xf00 && A <= 0xfff) - { - return(FXTIMER_Read16(A, timestamp)); - } - else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if(WantHuC6273) - return(HuC6273_Read16(A)); - } - else if(FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) - { - return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); - } - else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - puts("FXSCSI 16-bit:"); - return(FXSCSI_CtrlRead(A)); - } + return (ExBusReset); + } + else if (A >= 0xc00 && A <= 0xCFF) // Backup memory control + { + switch (A & 0xC0) + { + case 0x80: + return (BackupControl); + case 0x00: + return (Last_VDC_AR[0]); + case 0x40: + return (Last_VDC_AR[1]); + } + } + else if (A >= 0xe00 && A <= 0xeff) + { + return (PCFXIRQ_Read16(A)); + } + else if (A >= 0xf00 && A <= 0xfff) + { + return (FXTIMER_Read16(A, timestamp)); + } + else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if (WantHuC6273) + return (HuC6273_Read16(A)); + } + else if (FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) + { + return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); + } + else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + puts("FXSCSI 16-bit:"); + return (FXSCSI_CtrlRead(A)); + } - FXDBG("Unknown 16-bit port read: %08x", A); + FXDBG("Unknown 16-bit port read: %08x", A); - return(0x00); + return (0x00); } static void MDFN_FASTCALL port_wbyte(v810_timestamp_t ×tamp, uint32 A, uint8 V) { - if(A >= 0x000 && A <= 0x0FF) - FXINPUT_Write8(A, V, timestamp); - else if(A >= 0x100 && A <= 0x1FF) - { - timestamp += 2; - SoundBox_Write(A, V, timestamp); - } - else if(A >= 0x200 && A <= 0x2FF) - { - timestamp += 2; - RAINBOW_Write8(A, V); - } - else if(A >= 0x300 && A <= 0x3FF) // FXVCE - { - timestamp += 2; - FXVCE_Write16(A, V); - } - else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 2; + if (A >= 0x000 && A <= 0x0FF) + FXINPUT_Write8(A, V, timestamp); + else if (A >= 0x100 && A <= 0x1FF) + { + timestamp += 2; + SoundBox_Write(A, V, timestamp); + } + else if (A >= 0x200 && A <= 0x2FF) + { + timestamp += 2; + RAINBOW_Write8(A, V); + } + else if (A >= 0x300 && A <= 0x3FF) // FXVCE + { + timestamp += 2; + FXVCE_Write16(A, V); + } + else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 2; - if(!(A & 4)) - Last_VDC_AR[(A >> 8) & 0x1] = V; + if (!(A & 4)) + Last_VDC_AR[(A >> 8) & 0x1] = V; - fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); - } - else if(A >= 0x600 && A <= 0x6FF) - { - timestamp += 2; - KING_Write8(timestamp, A, V); - } - else if(A >= 0x700 && A <= 0x7FF) - { - if(!(A & 1)) - { - FXDBG("ExBusReset B Write: %02x", V & 1); - ExBusReset = V & 1; - } - } - else if(A >= 0xc00 && A <= 0xCFF) - { - switch(A & 0xC1) - { - case 0x80: BackupControl = V & 0x3; - break; + fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); + } + else if (A >= 0x600 && A <= 0x6FF) + { + timestamp += 2; + KING_Write8(timestamp, A, V); + } + else if (A >= 0x700 && A <= 0x7FF) + { + if (!(A & 1)) + { + FXDBG("ExBusReset B Write: %02x", V & 1); + ExBusReset = V & 1; + } + } + else if (A >= 0xc00 && A <= 0xCFF) + { + switch (A & 0xC1) + { + case 0x80: + BackupControl = V & 0x3; + break; - default: FXDBG("Port 8-bit write: %08x %02x", A, V); - break; - } - } - else if(A >= 0xe00 && A <= 0xeff) - { - FXDBG("IRQ write8: %08x %02x", A, V); - PCFXIRQ_Write16(A, V); - } - else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if(WantHuC6273) - HuC6273_Write16(A, V); - } - else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - FXSCSI_CtrlWrite(A, V); - } - else - { - FXDBG("Port 8-bit write: %08x %02x", A, V); - } + default: + FXDBG("Port 8-bit write: %08x %02x", A, V); + break; + } + } + else if (A >= 0xe00 && A <= 0xeff) + { + FXDBG("IRQ write8: %08x %02x", A, V); + PCFXIRQ_Write16(A, V); + } + else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if (WantHuC6273) + HuC6273_Write16(A, V); + } + else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + FXSCSI_CtrlWrite(A, V); + } + else + { + FXDBG("Port 8-bit write: %08x %02x", A, V); + } } static void MDFN_FASTCALL port_whword(v810_timestamp_t ×tamp, uint32 A, uint16 V) { - if(A >= 0x000 && A <= 0x0FF) - FXINPUT_Write16(A, V, timestamp); - else if(A >= 0x100 && A <= 0x1FF) - { - timestamp += 2; - SoundBox_Write(A, V, timestamp); - } - else if(A >= 0x200 && A <= 0x2FF) - { - timestamp += 2; - RAINBOW_Write16(A, V); - } - else if(A >= 0x300 && A <= 0x3FF) - { - timestamp += 2; - FXVCE_Write16(A, V); - } - else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 2; + if (A >= 0x000 && A <= 0x0FF) + FXINPUT_Write16(A, V, timestamp); + else if (A >= 0x100 && A <= 0x1FF) + { + timestamp += 2; + SoundBox_Write(A, V, timestamp); + } + else if (A >= 0x200 && A <= 0x2FF) + { + timestamp += 2; + RAINBOW_Write16(A, V); + } + else if (A >= 0x300 && A <= 0x3FF) + { + timestamp += 2; + FXVCE_Write16(A, V); + } + else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 2; - if(!(A & 4)) - Last_VDC_AR[(A >> 8) & 0x1] = V; + if (!(A & 4)) + Last_VDC_AR[(A >> 8) & 0x1] = V; - fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); - } - else if(A >= 0x600 && A <= 0x6FF) - { - timestamp += 2; - KING_Write16(timestamp, A, V); - } - else if(A >= 0x700 && A <= 0x7FF) - { - ExBusReset = V & 1; - FXDBG("ExBusReset H Write: %04x", V); - } - else if(A >= 0x800 && A <= 0x8FF) // ?? LIP writes here - { - FXDBG("Port 16-bit write: %08x %04x", A, V); - } - else if(A >= 0xc00 && A <= 0xCFF) - { - switch(A & 0xC0) - { - case 0x80: BackupControl = V & 0x3; - break; + fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); + } + else if (A >= 0x600 && A <= 0x6FF) + { + timestamp += 2; + KING_Write16(timestamp, A, V); + } + else if (A >= 0x700 && A <= 0x7FF) + { + ExBusReset = V & 1; + FXDBG("ExBusReset H Write: %04x", V); + } + else if (A >= 0x800 && A <= 0x8FF) // ?? LIP writes here + { + FXDBG("Port 16-bit write: %08x %04x", A, V); + } + else if (A >= 0xc00 && A <= 0xCFF) + { + switch (A & 0xC0) + { + case 0x80: + BackupControl = V & 0x3; + break; - default: FXDBG("Port 16-bit write: %08x %04x", A, V); - break; - } - } - else if(A >= 0xe00 && A <= 0xeff) - { - PCFXIRQ_Write16(A, V); - } - else if(A >= 0xF00 && A <= 0xFFF) - { - FXTIMER_Write16(A, V, timestamp); - } - else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if(WantHuC6273) - HuC6273_Write16(A, V); - } - else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - puts("FXSCSI 16-bit:"); - FXSCSI_CtrlWrite(A, V); - } - else - { - FXDBG("Port 16-bit write: %08x %04x", A, V); - } + default: + FXDBG("Port 16-bit write: %08x %04x", A, V); + break; + } + } + else if (A >= 0xe00 && A <= 0xeff) + { + PCFXIRQ_Write16(A, V); + } + else if (A >= 0xF00 && A <= 0xFFF) + { + FXTIMER_Write16(A, V, timestamp); + } + else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if (WantHuC6273) + HuC6273_Write16(A, V); + } + else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + puts("FXSCSI 16-bit:"); + FXSCSI_CtrlWrite(A, V); + } + else + { + FXDBG("Port 16-bit write: %08x %04x", A, V); + } } - diff --git a/waterbox/pcfx/pcfx.cpp b/waterbox/pcfx/pcfx.cpp index 60f12f836e..96e376e592 100644 --- a/waterbox/pcfx/pcfx.cpp +++ b/waterbox/pcfx/pcfx.cpp @@ -69,6 +69,9 @@ static uint16 BackupControl; static uint8 BackupRAM[0x8000], ExBackupRAM[0x8000]; static uint8 ExBusReset; // I/O Register at 0x0700 +static bool Lagged; +static void (*InputCallback)(); + // Checks to see if this main-RAM-area access // is in the same DRAM page as the last access. #define RAMLPCHECK \ @@ -707,7 +710,7 @@ EXPORT void FrameAdvance(MyFrameInfo& f) { for (int i = 0; i < 2; i++) InputData[i] = f.Buttons[i]; - + Lagged = true; uint32_t ConsoleButtons = f.Buttons[2]; int NewActiveDisk = ActiveDisk; #define ROSE(n) ((ConsoleButtons & 1 << (n)) > (PrevConsoleButtons & 1 << (n))) @@ -733,6 +736,7 @@ EXPORT void FrameAdvance(MyFrameInfo& f) f.Width = Ess.w; f.Height = Ess.h; f.Samples = Ess.SoundBufSize; + f.Lagged = Lagged; const uint32_t* src = FrameBuffer; uint32_t* dst = f.VideoBuffer; @@ -797,7 +801,7 @@ EXPORT void EnableLayers(int mask) EXPORT void SetInputCallback(void (*callback)()) { - // TODO + InputCallback = callback; } // settings