mirror of https://github.com/snes9xgit/snes9x.git
Add some APU debugging capabilities.
This commit is contained in:
parent
30a924fa48
commit
dfff94200c
|
@ -62,7 +62,17 @@ void SMP::op_step() {
|
||||||
#if defined(PSEUDO_CYCLE)
|
#if defined(PSEUDO_CYCLE)
|
||||||
|
|
||||||
if(opcode_cycle == 0)
|
if(opcode_cycle == 0)
|
||||||
|
{
|
||||||
|
#ifdef DEBUGGER
|
||||||
|
if (Settings.TraceSMP)
|
||||||
|
{
|
||||||
|
disassemble_opcode(tmp, regs.pc);
|
||||||
|
S9xTraceMessage (tmp);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
opcode_number = op_readpc();
|
opcode_number = op_readpc();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch(opcode_number) {
|
switch(opcode_number) {
|
||||||
#include "core/oppseudo_misc.cpp"
|
#include "core/oppseudo_misc.cpp"
|
||||||
|
|
|
@ -288,7 +288,7 @@ void SMP::disassemble_opcode(char *output, uint16 addr) {
|
||||||
strcat(s, t);
|
strcat(s, t);
|
||||||
|
|
||||||
sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ",
|
sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ",
|
||||||
regs.a, regs.x, regs.y, regs.sp, (uint16)regs.ya);
|
regs.B.a, regs.x, regs.B.y, regs.sp, (uint16)regs.ya);
|
||||||
strcat(s, t);
|
strcat(s, t);
|
||||||
|
|
||||||
sprintf(t, "%c%c%c%c%c%c%c%c",
|
sprintf(t, "%c%c%c%c%c%c%c%c",
|
||||||
|
@ -301,4 +301,9 @@ void SMP::disassemble_opcode(char *output, uint16 addr) {
|
||||||
regs.p.z ? 'Z' : 'z',
|
regs.p.z ? 'Z' : 'z',
|
||||||
regs.p.c ? 'C' : 'c');
|
regs.p.c ? 'C' : 'c');
|
||||||
strcat(s, t);
|
strcat(s, t);
|
||||||
|
|
||||||
|
sprintf(t, " %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",
|
||||||
|
apuram[0xf4], apuram[0xf5], apuram[0xf6], apuram[0xf7],
|
||||||
|
cpu.port_read(0), cpu.port_read(1), cpu.port_read(2), cpu.port_read(3));
|
||||||
|
strcat(s, t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,22 @@
|
||||||
#define CYCLE_ACCURATE
|
#define CYCLE_ACCURATE
|
||||||
#define PSEUDO_CYCLE
|
#define PSEUDO_CYCLE
|
||||||
|
|
||||||
|
#ifdef DEBUGGER
|
||||||
|
#include "../../../snes9x.h"
|
||||||
|
#include "../../../debug.h"
|
||||||
|
char tmp[1024];
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <snes/snes.hpp>
|
#include <snes/snes.hpp>
|
||||||
|
|
||||||
#define SMP_CPP
|
#define SMP_CPP
|
||||||
namespace SNES {
|
namespace SNES {
|
||||||
|
|
||||||
// TODO: reactivate once APU debugger works again
|
// TODO: reactivate once APU debugger works again
|
||||||
#if 0 // DEBUGGER
|
#ifdef DEBUGGER
|
||||||
#include "debugger/debugger.cpp"
|
// #include "debugger/debugger.cpp"
|
||||||
#include "debugger/disassembler.cpp"
|
#include "debugger/disassembler.cpp"
|
||||||
SMPDebugger smp;
|
SMP smp;
|
||||||
#else
|
#else
|
||||||
SMP smp;
|
SMP smp;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -122,6 +122,11 @@ public:
|
||||||
inline uint8 op_lsr (uint8 x);
|
inline uint8 op_lsr (uint8 x);
|
||||||
inline uint8 op_rol (uint8 x);
|
inline uint8 op_rol (uint8 x);
|
||||||
inline uint8 op_ror (uint8 x);
|
inline uint8 op_ror (uint8 x);
|
||||||
|
#ifdef DEBUGGER
|
||||||
|
void disassemble_opcode(char *output, uint16 addr);
|
||||||
|
inline uint8 disassemble_read(uint16 addr);
|
||||||
|
inline uint16 relb(int8 offset, int op_len);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: reactivate once APU debugger works again
|
// TODO: reactivate once APU debugger works again
|
||||||
|
|
|
@ -198,6 +198,8 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "../apu/apu.h"
|
||||||
|
|
||||||
struct SOpcodes
|
struct SOpcodes
|
||||||
{
|
{
|
||||||
void (*S9xOpcode) (void);
|
void (*S9xOpcode) (void);
|
||||||
|
@ -289,6 +291,8 @@ static inline void S9xCheckInterrupts (void)
|
||||||
{
|
{
|
||||||
bool8 thisIRQ = PPU.HTimerEnabled | PPU.VTimerEnabled;
|
bool8 thisIRQ = PPU.HTimerEnabled | PPU.VTimerEnabled;
|
||||||
|
|
||||||
|
S9xAPUExecute();
|
||||||
|
|
||||||
if (CPU.IRQLine & thisIRQ)
|
if (CPU.IRQLine & thisIRQ)
|
||||||
CPU.IRQTransition = TRUE;
|
CPU.IRQTransition = TRUE;
|
||||||
|
|
||||||
|
|
27
debug.cpp
27
debug.cpp
|
@ -202,6 +202,8 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "missing.h"
|
#include "missing.h"
|
||||||
|
|
||||||
|
#include "apu/bapu/snes/snes.hpp"
|
||||||
|
|
||||||
extern SDMA DMA[8];
|
extern SDMA DMA[8];
|
||||||
extern FILE *apu_trace;
|
extern FILE *apu_trace;
|
||||||
FILE *trace = NULL, *trace2 = NULL;
|
FILE *trace = NULL, *trace2 = NULL;
|
||||||
|
@ -259,7 +261,7 @@ static const char *HelpMessage[] =
|
||||||
// "ai - Shou APU vectors",
|
// "ai - Shou APU vectors",
|
||||||
// "a - Show APU status",
|
// "a - Show APU status",
|
||||||
// "x - Show Sound DSP status",
|
// "x - Show Sound DSP status",
|
||||||
// "A - Toggle APU instruction tracing to aputrace.log",
|
"A - Toggle APU instruction tracing to trace.log",
|
||||||
// "B - Toggle sound DSP register tracing to aputrace.log",
|
// "B - Toggle sound DSP register tracing to aputrace.log",
|
||||||
// "C - Dump sound sample addresses",
|
// "C - Dump sound sample addresses",
|
||||||
// "ad [Address] - Dump APU RAM from PC or [Address]",
|
// "ad [Address] - Dump APU RAM from PC or [Address]",
|
||||||
|
@ -1581,8 +1583,11 @@ static void debug_process_command (char *Line)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: reactivate once APU debugger works again
|
// TODO: reactivate once APU debugger works again
|
||||||
/*if (*Line == 'A')
|
if (*Line == 'A')
|
||||||
spc_core->debug_toggle_trace();*/
|
{
|
||||||
|
Settings.TraceSMP = !Settings.TraceSMP;
|
||||||
|
printf("SMP tracing %s\n", Settings.TraceSMP ? "enabled" : "disabled");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (*Line == 'B')
|
if (*Line == 'B')
|
||||||
|
@ -1643,20 +1648,16 @@ static void debug_process_command (char *Line)
|
||||||
}
|
}
|
||||||
|
|
||||||
*Line = 0;
|
*Line = 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (*Line == 'a')
|
if (*Line == 'a')
|
||||||
{
|
{
|
||||||
printf("APU in-ports : %02X %02X %02X %02X\n", IAPU.RAM[0xF4], IAPU.RAM[0xF5], IAPU.RAM[0xF6], IAPU.RAM[0xF7]);
|
printf("S-CPU-side ports S-CPU writes these, S-SMP reads: %02X %02X %02X %02X\n", SNES::cpu.port_read(0), SNES::cpu.port_read(1), SNES::cpu.port_read(2), SNES::cpu.port_read(3));
|
||||||
printf("APU out-ports: %02X %02X %02X %02X\n", APU.OutPorts[0], APU.OutPorts[1], APU.OutPorts[2], APU.OutPorts[3]);
|
printf("S-SMP-side ports S-SMP writes these, S-CPU reads: %02X %02X %02X %02X\n", SNES::smp.port_read(0), SNES::smp.port_read(1), SNES::smp.port_read(2), SNES::smp.port_read(3));
|
||||||
printf("ROM/RAM switch: %s\n", (IAPU.RAM[0xf1] & 0x80) ? "ROM" : "RAM");
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
if (APU.TimerEnabled[i])
|
|
||||||
printf("Timer%d enabled, Value: 0x%03X, 4-bit: 0x%02X, Target: 0x%03X\n",
|
|
||||||
i, APU.Timer[i], IAPU.RAM[0xfd + i], APU.TimerTarget[i]);
|
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if (*Line == 'P')
|
if (*Line == 'P')
|
||||||
{
|
{
|
||||||
Settings.TraceDSP = !Settings.TraceDSP;
|
Settings.TraceDSP = !Settings.TraceDSP;
|
||||||
|
|
|
@ -516,6 +516,7 @@ void S9xLoadConfigFiles (char **argv, int argc)
|
||||||
ENSURE_TRACE_OPEN(trace,"trace.log","wb")
|
ENSURE_TRACE_OPEN(trace,"trace.log","wb")
|
||||||
CPU.Flags |= TRACE_FLAG;
|
CPU.Flags |= TRACE_FLAG;
|
||||||
}
|
}
|
||||||
|
Settings.TraceSMP = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
S9xParsePortConfig(conf, 1);
|
S9xParsePortConfig(conf, 1);
|
||||||
|
|
Loading…
Reference in New Issue