From 665d78f87453930d1bddd78b511a8e409317166d Mon Sep 17 00:00:00 2001 From: Perkka2 <36314461+Perkka2@users.noreply.github.com> Date: Sun, 5 Sep 2021 18:08:49 +0200 Subject: [PATCH 1/6] Slightly improved EPSM IRQ functionality --- Core/EPSMAudio.h | 100 ++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/Core/EPSMAudio.h b/Core/EPSMAudio.h index 50789aa1..69b37a6d 100644 --- a/Core/EPSMAudio.h +++ b/Core/EPSMAudio.h @@ -30,6 +30,7 @@ private: uint8_t irqAHighValue; uint8_t irqALowValue; uint8_t irqBValue; + uint8_t irqEnable; uint16_t currentRegister; @@ -92,47 +93,59 @@ private: break; case 0x1: - if (currentRegister == 0x24) { - //Timer A High 8 bits - //std::cout << "Timer A High 8 bits" << std::endl; - irqAHighValue = value; - } - if (currentRegister == 0x25) { - //Timer A Low 2 bits - //std::cout << "Timer A Low 2 bits" << std::endl; - irqALowValue = (value & 0x3); - } - if (currentRegister == 0x26) { - //Timer B 8 bits - //std::cout << "Timer B 8 bits" << std::endl; - irqBValue = value; - } - if ((currentRegister == 0x27) && ((value & 0x5)|(value & 0xA))) { - //Load+Enable IRQ (0xA = TimerB, 0x5 = TimerA) - //std::cout << "Load+Enable IRQ" << std::endl; - if ((currentRegister == 0x27) && (value & 0x5)) { - irqATimer = (uint16_t(irqAHighValue) << 2) | irqALowValue; - irqACurrentTimer = 72 * (1024 - irqATimer) * 2; - irqATimerEnable = 1; - //std::cout << "Load+Enable IRQ A" << std::endl; + if (irqEnable) { + if (currentRegister == 0x24) { + //Timer A High 8 bits + irqAHighValue = value; } - if ((currentRegister == 0x27) && (value & 0xA)) { - irqBTimer = 1152 * (256 - irqBValue) * 2; - irqBCurrentTimer = irqBTimer; - irqBTimerEnable = 1; - //std::cout << "Load+Enable IRQ B " << irqBCurrentTimer << std::endl; + if (currentRegister == 0x25) { + //Timer A Low 2 bits + irqALowValue = (value & 0x3); + } + if (currentRegister == 0x26) { + //Timer B 8 bits + irqBValue = value; + } + if (currentRegister == 0x27) { + //Load+Enable IRQ (0xA = TimerB, 0x5 = TimerA) + if ((value & 0x5)) { + irqATimer = (uint16_t(irqAHighValue) << 2) | irqALowValue; + irqACurrentTimer = 72 * (1024 - irqATimer) * 2; + irqATimerEnable = 1; + } + if ((value & 0xA)) { + irqBTimer = 1152 * (256 - irqBValue) * 2; + irqBCurrentTimer = irqBTimer; + irqBTimerEnable = 1; + } + if ((value & 0x10)) { + //Enable/Reset IRQ + _console->GetCpu()->ClearIrqSource(IRQSource::EPSM); + irqATimerEnable = 0; + } + if ((value & 0x20)) { + //Enable/Reset IRQ + _console->GetCpu()->ClearIrqSource(IRQSource::EPSM); + irqBTimerEnable = 0; + } } } - if ((currentRegister == 0x27) && (value & 0x30)) { - //Enable/Reset IRQ - //std::cout << std::hex << uint16_t(value) << "Reset IRQ" << std::endl; - _console->GetCpu()->ClearIrqSource(IRQSource::EPSM); - irqATimerEnable = 0; - irqBTimerEnable = 0; - } - if ((currentRegister == 0x29) && (value & 0x3)) { - //enable IRQ's - //std::cout << "enable IRQ's" << std::endl; + if ((currentRegister == 0x29)) { + //std::cout << std::hex << "value: " << value << std::endl; + if ((value & 0x3 && (value & 0x80))) { + //if ((value & 0x3 )) { + //enable IRQ's + //std::cout << "enable IRQ's" << std::endl; + irqEnable = 1; + } + if (!(value & 0x83)) { + //enable IRQ's + //std::cout << "enable IRQ's" << std::endl; + irqEnable = 0; + _console->GetCpu()->ClearIrqSource(IRQSource::EPSM); + irqATimerEnable = 0; + irqBTimerEnable = 0; + } } break; case 0x3: @@ -141,10 +154,6 @@ private: }*/ break; } - - //irqBValue = value; - //std::cout << std::hex << irqBValue << std::endl; - } uint32_t getClockFrequency() @@ -170,13 +179,13 @@ protected: EPSMSSGAudio::ClockAudio(); _clock += getClockFrequency() / (double)_console->GetCpu()->GetClockRate(_console->GetModel()); - _clockIRQ += (getClockFrequency()*6) / (double)_console->GetCpu()->GetClockRate(_console->GetModel()); + _clockIRQ += _console->GetSettings()->GetEPSMClockFrequency() / (double)_console->GetCpu()->GetClockRate(_console->GetModel()); while (_clockIRQ >= _cycleCountIRQ) { _cycleCountIRQ++; if (irqATimerEnable) { irqACurrentTimer--; if (!irqACurrentTimer) { - irqATimerEnable = 0; + irqACurrentTimer++; _console->GetCpu()->SetIrqSource(IRQSource::EPSM); } @@ -184,7 +193,7 @@ protected: if (irqBTimerEnable) { irqBCurrentTimer--; if (!irqBCurrentTimer) { - irqBTimerEnable = 0; + irqBCurrentTimer++; _console->GetCpu()->SetIrqSource(IRQSource::EPSM); } @@ -242,6 +251,7 @@ public: _clock = 0; _clockIRQ = 0; + irqEnable = 0; irqATimerEnable = 0; irqBTimerEnable = 0; From b41a264edd7da0d4fcfea2304fde2fb61e6c6e5c Mon Sep 17 00:00:00 2001 From: Perkka2 <36314461+Perkka2@users.noreply.github.com> Date: Tue, 28 Sep 2021 20:58:05 +0200 Subject: [PATCH 2/6] Update EPSMAudio.h Surprised this has not crashed. --- Core/EPSMAudio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/EPSMAudio.h b/Core/EPSMAudio.h index 69b37a6d..b6288322 100644 --- a/Core/EPSMAudio.h +++ b/Core/EPSMAudio.h @@ -211,7 +211,7 @@ protected: { _clock--; - int16_t samples[2]; + int16_t samples[4]; OPN2_Clock(&_chip, samples); for (uint8_t x = 0; x < 2; x++) From 73cbb6871c387bc332b618560dab3c23a210ab68 Mon Sep 17 00:00:00 2001 From: Perkka2 <36314461+Perkka2@users.noreply.github.com> Date: Sun, 17 Oct 2021 21:26:45 +0200 Subject: [PATCH 3/6] Fixed broken 4016 addressing for SSG part on EPSM --- Core/EPSMAudio.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/EPSMAudio.h b/Core/EPSMAudio.h index b6288322..4944f229 100644 --- a/Core/EPSMAudio.h +++ b/Core/EPSMAudio.h @@ -276,9 +276,9 @@ public: const uint8_t a1 = !!(writeAddr & 0x2); if (a0 == 0x0) { writeAddr = 0xC000; } if (a0 == 0x1) { writeAddr = 0xE000; } - if (a1 == 0x0) { EPSMSSGAudio::WriteRegister(writeAddr, value); } + if (a1 == 0x0) { EPSMSSGAudio::WriteRegister(writeAddr, writeValue); } WriteToChip(a0 | (a1 << 1), writeValue); - WriteToChipIRQ(a0 | (a1 << 1), value); + WriteToChipIRQ(a0 | (a1 << 1), writeValue); } break; case 0x401c: //0xC000 A0 = 0, A1 = 0 From 651062a75de085d728e7dc19135707533bcb6e34 Mon Sep 17 00:00:00 2001 From: Thomas McGrew Date: Tue, 19 Oct 2021 21:40:41 -0400 Subject: [PATCH 4/6] Fixed clang compiler warnings --- Core/Debugger.cpp | 6 +++--- Core/EPSMAudio.h | 4 ++-- Core/LuaApi.cpp | 2 ++ Core/MemoryManager.cpp | 3 ++- Core/PartyTap.h | 15 ++++++++------- Core/Sunsoft4.h | 3 +-- Lua/lundump.c | 2 +- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index d1f95942..3114411e 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -901,7 +901,7 @@ bool Debugger::ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uin _currentReadValue = nullptr; if(type == MemoryOperationType::Write) { - if(_runToCycle == -1 && !CheckFlag(DebuggerFlags::IgnoreRedundantWrites) || _memoryManager->DebugRead(addr) != value) { + if((_runToCycle == -1 && !CheckFlag(DebuggerFlags::IgnoreRedundantWrites)) || (_memoryManager->DebugRead(addr) != value)) { _memoryAccessCounter->ProcessMemoryWrite(addressInfo, _cpu->GetCycleCount()); } @@ -916,7 +916,7 @@ bool Debugger::ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uin } } else if(addr >= 0x4018 && _mapper->IsWriteRegister(addr)) { _eventManager->AddDebugEvent(DebugEventType::MapperRegisterWrite, addr, value); - } else if(addr >= 0x4000 && addr <= 0x4015 || addr == 0x4017) { + } else if((addr >= 0x4000 && addr <= 0x4015) || addr == 0x4017) { _eventManager->AddDebugEvent(DebugEventType::ApuRegisterWrite, addr, value); } else if(addr == 0x4016) { _eventManager->AddDebugEvent(DebugEventType::ControlRegisterWrite, addr, value); @@ -1670,4 +1670,4 @@ uint32_t Debugger::GetScreenPixel(uint8_t x, uint8_t y) void Debugger::AddTrace(const char* log) { _traceLogger->LogExtraInfo(log, _cpu->GetCycleCount()); -} \ No newline at end of file +} diff --git a/Core/EPSMAudio.h b/Core/EPSMAudio.h index 4944f229..66744fe6 100644 --- a/Core/EPSMAudio.h +++ b/Core/EPSMAudio.h @@ -130,7 +130,7 @@ private: } } } - if ((currentRegister == 0x29)) { + if (currentRegister == 0x29) { //std::cout << std::hex << "value: " << value << std::endl; if ((value & 0x3 && (value & 0x80))) { //if ((value & 0x3 )) { @@ -306,4 +306,4 @@ public: } } -}; \ No newline at end of file +}; diff --git a/Core/LuaApi.cpp b/Core/LuaApi.cpp index 44bdb982..54816aa4 100644 --- a/Core/LuaApi.cpp +++ b/Core/LuaApi.cpp @@ -826,6 +826,8 @@ int LuaApi::GetAccessCounters(lua_State *lua) lua_rawseti(lua, -2, i); } break; + default: + break; } return 1; diff --git a/Core/MemoryManager.cpp b/Core/MemoryManager.cpp index 1d642392..7ba9d20c 100644 --- a/Core/MemoryManager.cpp +++ b/Core/MemoryManager.cpp @@ -133,7 +133,7 @@ void MemoryManager::Write(uint16_t addr, uint8_t value, MemoryOperationType oper { if(_console->DebugProcessRamOperation(operationType, addr, value)) { _ramWriteHandlers[addr]->WriteRAM(addr, value); - if ((addr == 0x4016) /*| (addr >= 0x401c && addr <= 0x401f)*/) { + if (addr == 0x4016) { _ramWriteHandlers[0xE000]->WriteRAM(addr, value); } } @@ -165,6 +165,7 @@ uint32_t MemoryManager::ToAbsolutePrgAddress(uint16_t ramAddr) void MemoryManager::StreamState(bool saving) { + (void)saving; ArrayInfo internalRam = { _internalRAM, MemoryManager::InternalRAMSize }; Stream(internalRam); } diff --git a/Core/PartyTap.h b/Core/PartyTap.h index 29d70a7c..d69df460 100644 --- a/Core/PartyTap.h +++ b/Core/PartyTap.h @@ -58,16 +58,17 @@ public: { _readCount = 0; _stateBuffer = - IsPressed(PartyTap::Buttons::B1) ? 1 : 0 | - IsPressed(PartyTap::Buttons::B2) ? 2 : 0 | - IsPressed(PartyTap::Buttons::B3) ? 4 : 0 | - IsPressed(PartyTap::Buttons::B4) ? 8 : 0 | - IsPressed(PartyTap::Buttons::B5) ? 16 : 0 | - IsPressed(PartyTap::Buttons::B6) ? 32 : 0; + (IsPressed(PartyTap::Buttons::B1) ? 1 : 0) | + (IsPressed(PartyTap::Buttons::B2) ? 2 : 0) | + (IsPressed(PartyTap::Buttons::B3) ? 4 : 0) | + (IsPressed(PartyTap::Buttons::B4) ? 8 : 0) | + (IsPressed(PartyTap::Buttons::B5) ? 16 : 0) | + (IsPressed(PartyTap::Buttons::B6) ? 32 : 0); } void WriteRAM(uint16_t addr, uint8_t value) override { + (void)addr; StrobeProcessWrite(value); } -}; \ No newline at end of file +}; diff --git a/Core/Sunsoft4.h b/Core/Sunsoft4.h index 69112fde..4982d2e2 100644 --- a/Core/Sunsoft4.h +++ b/Core/Sunsoft4.h @@ -63,7 +63,6 @@ protected: void UpdateState() { - MemoryAccessType access = _prgRamEnabled ? MemoryAccessType::ReadWrite : MemoryAccessType::NoAccess; SetCpuMemoryMapping(0x6000, 0x7FFF, 0, HasBattery() ? PrgMemoryType::SaveRam : PrgMemoryType::WorkRam); if(_usingExternalRom) { @@ -136,4 +135,4 @@ protected: break; } } -}; \ No newline at end of file +}; diff --git a/Lua/lundump.c b/Lua/lundump.c index 4080af9c..414e3777 100644 --- a/Lua/lundump.c +++ b/Lua/lundump.c @@ -234,7 +234,7 @@ static void fchecksize (LoadState *S, size_t size, const char *tname) { #define checksize(S,t) fchecksize(S,sizeof(t),#t) static void checkHeader (LoadState *S) { - checkliteral(S, LUA_SIGNATURE + 1, "not a"); /* 1st char already checked */ + checkliteral(S, &LUA_SIGNATURE[1], "not a"); /* 1st char already checked */ if (LoadByte(S) != LUAC_VERSION) error(S, "version mismatch in"); if (LoadByte(S) != LUAC_FORMAT) From 82b0e6d4d987ca1da47940be465b04c542af702b Mon Sep 17 00:00:00 2001 From: Thomas McGrew Date: Tue, 19 Oct 2021 22:04:02 -0400 Subject: [PATCH 5/6] Fix for mono not saving settings --- GUI.NET/Forms/BaseConfigForm.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GUI.NET/Forms/BaseConfigForm.cs b/GUI.NET/Forms/BaseConfigForm.cs index d22330df..89cd12c1 100644 --- a/GUI.NET/Forms/BaseConfigForm.cs +++ b/GUI.NET/Forms/BaseConfigForm.cs @@ -148,11 +148,13 @@ namespace Mesen.GUI.Forms private void btnOK_Click(object sender, EventArgs e) { + this.DialogResult = ((Button)sender).DialogResult; this.Close(); } private void btnCancel_Click(object sender, EventArgs e) { + this.DialogResult = ((Button)sender).DialogResult; this.Close(); } } From c5d65fadd9940b69e61add86f4cd83f899e21718 Mon Sep 17 00:00:00 2001 From: Zachery Delafosse Date: Tue, 26 Oct 2021 00:17:57 -0500 Subject: [PATCH 6/6] Debugger: Script Window - Include existing emu.stop() in code completion --- GUI.NET/Debugger/frmScript.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI.NET/Debugger/frmScript.cs b/GUI.NET/Debugger/frmScript.cs index 8cd19880..3b7614a2 100644 --- a/GUI.NET/Debugger/frmScript.cs +++ b/GUI.NET/Debugger/frmScript.cs @@ -533,6 +533,7 @@ namespace Mesen.GUI.Debugger new List {"func","emu.getState","emu.getState()","","* Table* Current emulation state","Return a table containing information about the state of the CPU, PPU, APU and cartridge."}, new List {"func","emu.setState","emu.setState(state)","state - *Table* A table containing the state of the emulation to apply.","","Updates the CPU and PPU's state.\nThe* state* parameter must be a table in the same format as the one returned by getState()\nNote: the state of the APU or cartridge cannot be modified by using setState()." }, new List {"func","emu.breakExecution","emu.breakExecution()","","","Breaks the execution of the game and displays the debugger window."}, + new List {"func","emu.stop","emu.stop()","","","Stops execution of the game."}, new List {"func","emu.execute","emu.execute(count, type)","count - *Integer* The number of cycles or instructions to run before breaking\ntype - *Enum* See executeCountType","","Runs the emulator for the specified number of cycles/instructions and then breaks the execution."}, new List {"func","emu.reset","emu.reset()","","","Resets the current game."}, new List {"func","emu.resume","emu.resume()","","","Resumes execution after breaking."},