PCE: Use 1-byte operands for zero page addressing, fixed/improved effective address display

This commit is contained in:
Sour 2022-05-19 18:44:57 -04:00
parent 284c4f959c
commit 529508d8d5
9 changed files with 45 additions and 46 deletions

View file

@ -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);

View file

@ -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");

View file

@ -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;
}

View file

@ -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));

View file

@ -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;

View file

@ -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);

View file

@ -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());

View file

@ -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;

View file

@ -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;