spl

systems programming language
git clone http://frotz.net/git/spl.git
Log | Files | Refs | README | LICENSE

commit 94462befc2a71448fc013d053a6753dc6b482949
parent efd8c1bf29cc3a30053a4a4c7776fba70f29c2e3
Author: Brian Swetland <swetland@frotz.net>
Date:   Sun, 29 Jun 2025 18:42:19 -0700

sr32emu: IO tracing and better test vector errors

Diffstat:
Msoftrisc32/src/cpu-sr32.c | 4++--
Msoftrisc32/src/emulator-sr32.c | 19++++++++++++++-----
Msoftrisc32/src/emulator-sr32.h | 5+++--
3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/softrisc32/src/cpu-sr32.c b/softrisc32/src/cpu-sr32.c @@ -59,7 +59,7 @@ void sr32core(CpuState *s) { case 0: n = mem_rd32(a); break; case 1: n = mem_rd16(a); if (n & 0x8000) n |= 0xFFFF0000; break; case 2: n = mem_rd8(a); if (n & 0x80) n |= 0xFFFFFF00; break; - case 3: n = io_rd32(a); break; + case 3: n = io_rd32(s, a); break; case 4: n = ins & 0xFFFF0000; break; case 5: n = mem_rd16(a); break; case 6: n = mem_rd8(a); break; @@ -82,7 +82,7 @@ void sr32core(CpuState *s) { case 0: mem_wr32(a, b); break; case 1: mem_wr16(a, b); break; case 2: mem_wr8(a, b); break; - case 3: io_wr32(a, b); break; + case 3: io_wr32(s, a, b); break; default: goto undef; } break; diff --git a/softrisc32/src/emulator-sr32.c b/softrisc32/src/emulator-sr32.c @@ -50,27 +50,33 @@ void *mem_dma(uint32_t addr, uint32_t len) { return emu_ram + addr; } -uint32_t io_rd32(uint32_t addr) { +uint32_t io_rd32(CpuState *cs, uint32_t addr) { if (addr == -1) { if (innext == incount) { - fprintf(stderr, "FAIL: input data exhausted\n"); + fprintf(stderr, "FAIL: PC=%08x: input data exhausted\n", cs->pc); exit(1); } + if (cs->flags & F_TRACE_IO) { + fprintf(stderr, "< %08x\n", indata[innext]); + } return indata[innext++]; } return 0; } -void io_wr32(uint32_t addr, uint32_t val) { +void io_wr32(CpuState *cs, uint32_t addr, uint32_t val) { switch (addr) { case -1: + if (cs->flags & F_TRACE_IO) { + fprintf(stderr, "> %08x\n", val); + } if (outnext == outcount) { fprintf(stderr, "FAIL: output data overrun\n"); exit(1); } uint32_t data = outdata[outnext++]; if (data != val) { - fprintf(stderr, "FAIL: output data %08x should be %08x\n", val, data); + fprintf(stderr, "FAIL: PC=%08x: output data %08x should be %08x\n", cs->pc, val, data); exit(1); } break; @@ -152,7 +158,8 @@ void usage(int status) { "options: -x <datafile> Load Test Vector Data\n" " -tf Trace Instruction Fetches\n" " -tr Trace Register Writes\n" - " -tb Trace Branches\n"); + " -tb Trace Branches\n" + " -ti Trace IO Reads & Writes\n"); exit(status); } @@ -177,6 +184,8 @@ int main(int argc, char** argv) { cs.flags |= F_TRACE_REGS; } else if (!strcmp(argv[1], "-tb")) { cs.flags |= F_TRACE_BRANCH; + } else if (!strcmp(argv[1], "-ti")) { + cs.flags |= F_TRACE_IO; } else if (argv[1][0] == '-') { fprintf(stderr, "emu: unknown option: %s\n", argv[1]); return -1; diff --git a/softrisc32/src/emulator-sr32.h b/softrisc32/src/emulator-sr32.h @@ -15,6 +15,7 @@ typedef struct { #define F_TRACE_FETCH 1 #define F_TRACE_REGS 2 #define F_TRACE_BRANCH 4 +#define F_TRACE_IO 8 uint32_t mem_rd32(uint32_t addr); uint32_t mem_rd16(uint32_t addr); @@ -23,8 +24,8 @@ void mem_wr32(uint32_t addr, uint32_t val); void mem_wr16(uint32_t addr, uint32_t val); void mem_wr8(uint32_t addr, uint32_t val); -uint32_t io_rd32(uint32_t addr); -void io_wr32(uint32_t addr, uint32_t val); +uint32_t io_rd32(CpuState *s, uint32_t addr); +void io_wr32(CpuState *s, uint32_t addr, uint32_t val); void do_syscall(CpuState *s, uint32_t n); void do_undef(CpuState *s, uint32_t ins);