dcpu16/dev_debug.c

63 lines
1.3 KiB
C

#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include "device.h"
#define EMU_ID 0xed6f
#define EMU_VER 0x0000
void dumpregs()
{
printf("%4s %4s %4s %4s %4s %4s %4s %4s %4s %4s %4s %4s\n",
"PC","SP","A","B","C","X","Y","Z","I","J","EX","IA");
printf("%04hx %04hx %04hx %04hx %04hx %04hx %04hx %04hx %04hx %04hx %04hx %04hx\n",
rpc, rsp, ra, rb, rc, rx, ry, rz, ri, rj, rex, ria);
}
void dump_ram(uint16_t addr, uint16_t count)
{
uint16_t i, a;
for (i=0; i<count; i++) {
a = (addr + i) % sizeof(ram);
if ((i % 8) == 0)
printf("\n%04x: ", a);
printf("%04x ", ram[a]);
}
printf("\n");
}
void debug_tick()
{
if (trace)
dumpregs();
}
void debug_irqh()
{
switch (ra) {
case 0x0000:
running = false;
break;
case 0x0001:
dumpregs();
break;
case 0x0002:
dump_ram(ry, rx);
break;
case 0x0004:
trace = false;
break;
case 0x0005:
trace = true;
break;
case 0xffff:
rx = EMU_ID;
ry = EMU_VER;
break;
}
}
struct dev_entry debug_dev = { 0x6d53647c, 0x62e037d3, 0x0000, "Debugger", debug_irqh, NULL, NULL, debug_tick }; /* Debug device */