mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
PCE: Use 1-byte operands for zero page addressing, fixed/improved effective address display
This commit is contained in:
parent
284c4f959c
commit
529508d8d5
9 changed files with 45 additions and 46 deletions
|
@ -383,6 +383,9 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
|
|||
case CpuType::Gsu:
|
||||
{
|
||||
GsuState state = (GsuState&)_debugger->GetCpuStateRef(lineCpuType);
|
||||
state.R[15] = (uint16_t)row.CpuAddress;
|
||||
state.ProgramBank = (row.CpuAddress >> 16);
|
||||
|
||||
if(!disInfo.IsInitialized()) {
|
||||
disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Gsu, row.Address.Type, _memoryDumper);
|
||||
} else {
|
||||
|
@ -430,6 +433,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
|
|||
case CpuType::Gameboy:
|
||||
{
|
||||
GbCpuState state = (GbCpuState&)_debugger->GetCpuStateRef(lineCpuType);
|
||||
state.PC = (uint16_t)row.CpuAddress;
|
||||
|
||||
CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType);
|
||||
if(!disInfo.IsInitialized()) {
|
||||
disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Gameboy, row.Address.Type, _memoryDumper);
|
||||
|
@ -446,6 +451,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
|
|||
case CpuType::Nes:
|
||||
{
|
||||
NesCpuState state = (NesCpuState&)_debugger->GetCpuStateRef(lineCpuType);
|
||||
state.PC = (uint16_t)row.CpuAddress;
|
||||
|
||||
CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType);
|
||||
if(!disInfo.IsInitialized()) {
|
||||
disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Nes, row.Address.Type, _memoryDumper);
|
||||
|
@ -466,6 +473,8 @@ CodeLineData Disassembler::GetLineData(DisassemblyResult& row, CpuType type, Mem
|
|||
case CpuType::Pce:
|
||||
{
|
||||
PceCpuState state = (PceCpuState&)_debugger->GetCpuStateRef(lineCpuType);
|
||||
state.PC = (uint16_t)row.CpuAddress;
|
||||
|
||||
CodeDataLogger* cdl = _debugger->GetCodeDataLogger(lineCpuType);
|
||||
if(!disInfo.IsInitialized()) {
|
||||
disInfo = DisassemblyInfo(row.Address.Address, 0, CpuType::Pce, row.Address.Type, _memoryDumper);
|
||||
|
|
|
@ -96,7 +96,7 @@ int32_t DisassemblyInfo::GetEffectiveAddress(Debugger *debugger, void *cpuState,
|
|||
case CpuType::Gameboy: return GameboyDisUtils::GetEffectiveAddress(*this, *(GbCpuState*)cpuState);
|
||||
|
||||
case CpuType::Nes: return NesDisUtils::GetEffectiveAddress(*this, *(NesCpuState*)cpuState, debugger->GetMemoryDumper());
|
||||
case CpuType::Pce: return PceDisUtils::GetEffectiveAddress(*this, *(PceCpuState*)cpuState, debugger->GetMemoryDumper());
|
||||
case CpuType::Pce: return PceDisUtils::GetEffectiveAddress(*this, (PceConsole*)debugger->GetConsole(), *(PceCpuState*)cpuState);
|
||||
}
|
||||
|
||||
throw std::runtime_error("GetEffectiveAddress - Unsupported CPU type");
|
||||
|
|
|
@ -8,10 +8,9 @@
|
|||
#undef PceCpu
|
||||
#undef DUMMYCPU
|
||||
|
||||
DummyPceCpu::DummyPceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager)
|
||||
DummyPceCpu::DummyPceCpu(Emulator* emu, PceMemoryManager* memoryManager)
|
||||
{
|
||||
_emu = emu;
|
||||
_console = console;
|
||||
_memoryManager = memoryManager;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ PceDebugger::PceDebugger(Debugger* debugger)
|
|||
_memoryAccessCounter = debugger->GetMemoryAccessCounter();
|
||||
_settings = debugger->GetEmulator()->GetSettings();
|
||||
|
||||
_dummyCpu.reset(new DummyPceCpu(_emu, _console, _memoryManager));
|
||||
_dummyCpu.reset(new DummyPceCpu(_emu, _memoryManager));
|
||||
|
||||
_codeDataLogger.reset(new CodeDataLogger(MemoryType::PcePrgRom, _emu->GetMemory(MemoryType::PcePrgRom).Size, CpuType::Pce));
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#include "stdafx.h"
|
||||
#include "PCE/Debugger/PceDisUtils.h"
|
||||
#include "PCE/Debugger/DummyPceCpu.h"
|
||||
#include "PCE/PceConsole.h"
|
||||
#include "PCE/PceTypes.h"
|
||||
#include "Shared/EmuSettings.h"
|
||||
#include "Debugger/DisassemblyInfo.h"
|
||||
|
@ -83,8 +85,7 @@ void PceDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_t me
|
|||
};
|
||||
|
||||
auto writeZeroAddr = [&str, &info, &writeLabelOrAddr, labelManager](uint8_t zero) {
|
||||
uint16_t addr = 0x2000 + zero;
|
||||
writeLabelOrAddr(addr);
|
||||
str.WriteAll('$', HexUtilities::ToHex(zero));
|
||||
};
|
||||
|
||||
switch(addrMode) {
|
||||
|
@ -173,44 +174,38 @@ void PceDisUtils::GetDisassembly(DisassemblyInfo& info, string& out, uint32_t me
|
|||
out += str.ToString();
|
||||
}
|
||||
|
||||
int32_t PceDisUtils::GetEffectiveAddress(DisassemblyInfo& info, PceCpuState& state, MemoryDumper* memoryDumper)
|
||||
int32_t PceDisUtils::GetEffectiveAddress(DisassemblyInfo& info, PceConsole* console, PceCpuState& state)
|
||||
{
|
||||
uint8_t* byteCode = info.GetByteCode();
|
||||
switch(_opMode[info.GetOpCode()]) {
|
||||
default: break;
|
||||
|
||||
case PceAddrMode::ZeroX: return (uint8_t)(byteCode[1] + state.X); break;
|
||||
case PceAddrMode::ZeroY: return (uint8_t)(byteCode[1] + state.Y); break;
|
||||
|
||||
case PceAddrMode::IndX: {
|
||||
uint8_t zeroAddr = byteCode[1] + state.X;
|
||||
return memoryDumper->GetMemoryValue(MemoryType::PceMemory, zeroAddr) | memoryDumper->GetMemoryValue(MemoryType::PceMemory, (uint8_t)(zeroAddr + 1)) << 8;
|
||||
}
|
||||
|
||||
case PceAddrMode::IndY: {
|
||||
uint8_t zeroAddr = byteCode[1];
|
||||
uint16_t addr = memoryDumper->GetMemoryValue(MemoryType::PceMemory, zeroAddr) | memoryDumper->GetMemoryValue(MemoryType::PceMemory, (uint8_t)(zeroAddr + 1)) << 8;
|
||||
return (uint16_t)(addr + state.Y);
|
||||
}
|
||||
|
||||
case PceAddrMode::Ind: {
|
||||
uint16_t addr = byteCode[1] | (byteCode[2] << 8);
|
||||
if((addr & 0xFF) == 0xFF) {
|
||||
//CPU bug when indirect address starts at the end of a page
|
||||
uint8_t lo = memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr);
|
||||
uint8_t hi = memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr & 0xFF00);
|
||||
return lo | (hi << 8);
|
||||
} else {
|
||||
return memoryDumper->GetMemoryValue(MemoryType::PceMemory, addr);
|
||||
}
|
||||
}
|
||||
|
||||
case PceAddrMode::Zero:
|
||||
case PceAddrMode::ZeroX:
|
||||
case PceAddrMode::ZeroY:
|
||||
case PceAddrMode::IndX:
|
||||
case PceAddrMode::IndY:
|
||||
case PceAddrMode::Ind:
|
||||
case PceAddrMode::AbsX:
|
||||
case PceAddrMode::AbsXInd:
|
||||
return (uint16_t)((byteCode[1] | (byteCode[2] << 8)) + state.X) & 0xFFFF;
|
||||
|
||||
case PceAddrMode::AbsY:
|
||||
return (uint16_t)((byteCode[1] | (byteCode[2] << 8)) + state.Y) & 0xFFFF;
|
||||
case PceAddrMode::ZInd:
|
||||
case PceAddrMode::ZeroRel:
|
||||
case PceAddrMode::ImZero:
|
||||
case PceAddrMode::ImZeroX:
|
||||
case PceAddrMode::ImAbs:
|
||||
case PceAddrMode::ImAbsX:
|
||||
DummyPceCpu pceCpu(nullptr, console->GetMemoryManager());
|
||||
pceCpu.SetDummyState(state);
|
||||
pceCpu.Exec();
|
||||
|
||||
uint32_t count = pceCpu.GetOperationCount();
|
||||
for(int i = count - 1; i > 0; i--) {
|
||||
MemoryOperationInfo opInfo = pceCpu.GetOperationInfo(i);
|
||||
if(opInfo.Type != MemoryOperationType::ExecOperand) {
|
||||
return opInfo.Address;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
|
|
@ -5,6 +5,7 @@ class DisassemblyInfo;
|
|||
class LabelManager;
|
||||
class MemoryDumper;
|
||||
class EmuSettings;
|
||||
class PceConsole;
|
||||
struct PceCpuState;
|
||||
enum class PceAddrMode;
|
||||
|
||||
|
@ -15,7 +16,7 @@ private:
|
|||
|
||||
public:
|
||||
static void GetDisassembly(DisassemblyInfo& info, string& out, uint32_t memoryAddr, LabelManager* labelManager, EmuSettings* settings);
|
||||
static int32_t GetEffectiveAddress(DisassemblyInfo& info, PceCpuState& state, MemoryDumper* memoryDumper);
|
||||
static int32_t GetEffectiveAddress(DisassemblyInfo& info, PceConsole* console, PceCpuState& state);
|
||||
|
||||
static uint8_t GetOpSize(uint8_t opCode);
|
||||
static char const* const GetOpName(uint8_t opCode);
|
||||
|
|
|
@ -104,7 +104,7 @@ LoadRomResult PceConsole::LoadRom(VirtualFile& romFile)
|
|||
|
||||
_psg.reset(new PcePsg(_emu));
|
||||
_memoryManager.reset(new PceMemoryManager(_emu, this, _vpc.get(), _vce.get(), _controlManager.get(), _psg.get(), _mapper.get(), _cdrom.get(), romData, cardRamSize));
|
||||
_cpu.reset(new PceCpu(_emu, this, _memoryManager.get()));
|
||||
_cpu.reset(new PceCpu(_emu, _memoryManager.get()));
|
||||
|
||||
MessageManager::Log("-----------------");
|
||||
MessageManager::Log("Loaded: " + romFile.GetFileName());
|
||||
|
|
|
@ -48,10 +48,9 @@ PceAddrMode const PceCpu::_addrMode[] = {
|
|||
};
|
||||
|
||||
#ifndef DUMMYCPU
|
||||
PceCpu::PceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager)
|
||||
PceCpu::PceCpu(Emulator* emu, PceMemoryManager* memoryManager)
|
||||
{
|
||||
_emu = emu;
|
||||
_console = console;
|
||||
_memoryManager = memoryManager;
|
||||
|
||||
_instAddrMode = PceAddrMode::None;
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include "MemoryOperationType.h"
|
||||
|
||||
class Emulator;
|
||||
class PceConsole;
|
||||
class PceMemoryManager;
|
||||
|
||||
class PceCpu
|
||||
|
@ -31,7 +30,6 @@ private:
|
|||
static PceAddrMode const _addrMode[256];
|
||||
|
||||
Emulator* _emu;
|
||||
PceConsole* _console;
|
||||
PceMemoryManager* _memoryManager;
|
||||
|
||||
PceCpuState _state;
|
||||
|
@ -294,14 +292,12 @@ private:
|
|||
void ProcessIrq(bool forBrk);
|
||||
|
||||
public:
|
||||
PceCpu(Emulator* emu, PceConsole* console, PceMemoryManager* memoryManager);
|
||||
PceCpu(Emulator* emu, PceMemoryManager* memoryManager);
|
||||
|
||||
PceCpuState& GetState() { return _state; }
|
||||
|
||||
void Exec();
|
||||
|
||||
|
||||
|
||||
#ifdef DUMMYCPU
|
||||
private:
|
||||
uint32_t _memOpCounter = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue