ref: fd4f5b1a9a7f81825a5023b251a2e788e986e49c
dir: /debug.c/
#include <u.h>
#include <libc.h>
#include "dat.h"
#include "fns.h"
jmp_buf trapjmp;
static void
deltrap(void *u, char *msg)
{
if(strcmp(msg, "interrupt") == 0){
notejmp(u, trapjmp, 1);
noted(NCONT);
}
noted(NDFLT);
}
void
trapinit(void)
{
static int init = 0;
if(init == 0){
notify(deltrap);
init++;
}
}
void
trap(void)
{
longjmp(trapjmp, 1);
}
char*
rnam(u8int r)
{
switch(r){
case B: return "B";
case C: return "C";
case D: return "D";
case E: return "E";
case H: return "H";
case L: return "L";
case M: return "M";
case A: return "A";
}
return "X";
}
char*
rpnam(u8int r)
{
switch(r){
case BC: return "BC";
case DE: return "DE";
case HL: return "HL";
}
return "XX";
}
void
dumpinst(void)
{
fprint(2, "op: %#.2x [%#.2x %#.2x]\n",
mem[insn.pc+0], mem[insn.pc+1], mem[insn.pc+2]);
}
static char
flagchar(int f)
{
switch(1<<f){
case Fcarry: return 'C';
case Fparity: return 'P';
case Fhcarry: return 'H';
case Fzero: return 'Z';
case Fsign: return 'S';
}
return 0;
}
void
dumpregs(void)
{
int i;
fprint(2, "A=%#.2x\n", cpu.r[A]);
fprint(2, "B=%#.2x\n", cpu.r[B]);
fprint(2, "C=%#.2x\n", cpu.r[C]);
fprint(2, "D=%#.2x\n", cpu.r[D]);
fprint(2, "E=%#.2x\n", cpu.r[E]);
fprint(2, "H=%#.2x\n", cpu.r[H]);
fprint(2, "L=%#.2x\n", cpu.r[L]);
fprint(2, "F=%#.2x", cpu.flg);
if(cpu.flg != 0){
fprint(2, " (");
for(i = 0; i < 8; i++)
if((cpu.flg&1<<i) != 0)
fprint(2, "%c", flagchar(i));
fprint(2, ")");
}
fprint(2, "\n");
fprint(2, "PC=%#.4x\n", cpu.PC);
fprint(2, "SP=%#.4x\n", cpu.SP);
}
void
dumpmem(u16int s, u16int e)
{
while(s < e){
fprint(2, "%.4x: %.2x\n", s, mem[s]);
s++;
}
}
void
itrace0(char *fmt, ...)
{
va_list args;
va_start(args, fmt);
fprint(2, "%#.4x ", insn.pc);
vfprint(2, fmt, args);
fprint(2, "\n");
va_end(args);
}
void
fatal(char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprint(2, fmt, args);
fprint(2, "\n");
va_end(args);
dumpinst();
dumpregs();
exits("fatal");
}