Make dumpregs and dump_ram accessible from debug HWI. Add emulator ID to debug irqh

This commit is contained in:
Maurizio Porrato 2020-01-22 08:21:09 +00:00
parent 56eae1aca1
commit 9ceac9ae5a
1 changed files with 39 additions and 25 deletions

64
dsim.c
View File

@ -8,6 +8,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#define EMU_ID 0xed6f
#define EMU_VER 0x0000
uint16_t ram[0x10000]; uint16_t ram[0x10000];
uint16_t ra, rb, rc, rx, ry, rz, ri, rj; uint16_t ra, rb, rc, rx, ry, rz, ri, rj;
uint16_t rpc, rsp, rex, ria; uint16_t rpc, rsp, rex, ria;
@ -20,6 +23,27 @@ uint16_t intq[MAX_INTQ_SIZE];
unsigned int intq_size; unsigned int intq_size;
uint8_t intq_head; uint8_t intq_head;
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 intq_push(uint16_t v) void intq_push(uint16_t v)
{ {
if (intq_size < MAX_INTQ_SIZE) { if (intq_size < MAX_INTQ_SIZE) {
@ -64,7 +88,21 @@ struct dev_entry {
void debug_irqh() void debug_irqh()
{ {
running = false; switch (ra) {
case 0x0000:
running = false;
break;
case 0x0001:
dumpregs();
break;
case 0x0002:
dump_ram(ry, rx);
break;
case 0xffff:
rx = EMU_ID;
ry = EMU_VER;
break;
}
} }
struct dev_entry iodevs[] = { struct dev_entry iodevs[] = {
@ -442,14 +480,6 @@ const op_t sops[] = {
oNOP, oNOP, oNOP, oNOP, oNOP, oNOP, oNOP, oNOP /* 18-1f */ oNOP, oNOP, oNOP, oNOP, oNOP, oNOP, oNOP, oNOP /* 18-1f */
}; };
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 next() void next()
{ {
uint16_t ir; uint16_t ir;
@ -469,8 +499,6 @@ void next()
} }
} }
dumpregs();
ir = ram[rpc++]; ir = ram[rpc++];
opcode = ir & 0x001f; opcode = ir & 0x001f;
@ -518,24 +546,10 @@ int load_image(char *filename)
} }
} }
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");
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (argc > 1) { if (argc > 1) {
load_image(argv[1]); load_image(argv[1]);
dump_ram(0, 32);
reset(); reset();
while (running) next(); while (running) next();
} }