#include #include #include "video/gbuffer.h" #include "memory/memory.h" #include "emubase.h" #include "cpu/65el02.h" #include "debug.h" #include "monitor.h" //--------------------------------------------------------------------------- int mempos = 0; //--------------------------------------------------------------------------- char * int2bin8(int data) { static char result[9]; int qi; memset(&result, 0x00, sizeof(result)); for (qi = 0; qi <= 7; qi++) { result[7 - qi] = 0x30 + ((data >> qi) & 1); } return result; } //--------------------------------------------------------------------------- void showdebug() { char tempstring[256]; // sprintf(tempstring," NV-BDIZC - AC %04X - RX %04X - RY %04X",cpu.regA,cpu.regX,cpu.regY); sprintf(tempstring, "ENVMXDIZC - AC %04X - X %04X - Y %04X", cpu.regA, cpu.regX, cpu.regY); drawstring(82, 3, tempstring, 0x01, 0x00, rom_charset); sprintf(tempstring, "%d%s - SP %04X - IP %04X - I %04X", cpu.flagE, int2bin8(getFlags()), cpu.regSP, cpu.regPC, cpu.regI); drawstring(82, 4, tempstring, 0x01, 0x00, rom_charset); sprintf(tempstring, "SR %04X - B %04X - D %04X", cpu.regR, cpu.regB, cpu.regD); drawstring(94, 5, tempstring, 0x01, 0x00, rom_charset); sprintf(tempstring, "MMU enable %02x - device %02X - offset %04X", cpu.mmuEnRB, cpu.mmuRBA, cpu.mmuRBB); drawstring(82, 6, tempstring, 0x01, 0x00, rom_charset); } //--------------------------------------------------------------------------- void showmemory(int memorypos) { int qi, qj; unsigned char tempstring[256]; unsigned char tempreg; for (qi = 0; qi < 16; qi++) { sprintf(tempstring, "%04X ", memorypos & 0xffff); for (qj = 0; qj < 8; qj++) { tempreg = mem_load(memorypos++); // tempreg=ram[(memorypos++)&0xffff]; sprintf(tempstring, "%s%02X ", tempstring, tempreg); drawchar(113 + qj, 34 + qi, tempreg, 0x01, 0x00, rom_charset); } drawstring(82, 34 + qi, tempstring, 0x01, 0x00, rom_charset); } } //--------------------------------------------------------------------------- int getinst(char *str, int ip) { char tempstring2[128]; int opc, mode; char *label = NULL; mode = (cpu.flagX << 1) | cpu.flagM; opc = mem_load(ip); switch (codesizetable[addrmode[mode][opc]]) { case 1: { sprintf(tempstring2, "%02X ", opc); break; } case 2: { sprintf(tempstring2, "%02X %02X ", opc, mem_load(ip + 1)); break; } case 3: { sprintf(tempstring2, "%02X %02X %02X ", opc, mem_load(ip + 1), mem_load(ip + 2)); break; } } sprintf(str, "%04X %s %s ", ip, tempstring2, opcodes[opc]); *tempstring2 = 0; switch (addrmode[mode][opc]) { case 0: { break; } case 1: { sprintf(tempstring2, "($%02X,x) ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 2: { sprintf(tempstring2, "$%02X ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 3: { sprintf(tempstring2, "$%02X%02X ", mem_load(ip + 2), mem_load(ip + 1)); label = getlabel(mem_load(ip + 1) + (mem_load(ip + 2) << 8)); break; } case 4: { sprintf(tempstring2, "($%02X),y ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 5: { sprintf(tempstring2, "$%02X,x ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 6: { sprintf(tempstring2, "$%02X%02X,y ", mem_load(ip + 2), mem_load(ip + 1)); label = getlabel(mem_load(ip + 1) + (mem_load(ip + 2) << 8)); break; } case 7: { sprintf(tempstring2, "$%02X%02X,x ", mem_load(ip + 2), mem_load(ip + 1)); label = getlabel(mem_load(ip + 1) + (mem_load(ip + 2) << 8)); break; } case 8: { sprintf(tempstring2, "$%04X ", ip + 2 + (signed char) mem_load(ip + 1)); label = getlabel(ip + 2 + (signed char) mem_load(ip + 1)); break; } case 9: { sprintf(tempstring2, "($%02X%02X) ", mem_load(ip + 2), mem_load(ip + 1)); label = getlabel(mem_load(ip + 1) + (mem_load(ip + 2) << 8)); break; } case 10: { sprintf(tempstring2, "$%02X,y ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 11: { sprintf(tempstring2, "#$%02X ", mem_load(ip + 1)); break; } case 12: { sprintf(tempstring2, "$%02X%02X ", mem_load(ip + 2), mem_load(ip + 1)); label = getlabel(mem_load(ip + 1) + (mem_load(ip + 2) << 8)); break; } case 13: { sprintf(tempstring2, "$%02X,s ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 14: { sprintf(tempstring2, "($%02X,s),y", mem_load(ip + 1)); break; } case 15: { sprintf(tempstring2, "($%02X) ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 16: { sprintf(tempstring2, "$%02X,r ", mem_load(ip + 1)); label = getlabel(mem_load(ip + 1)); break; } case 17: { sprintf(tempstring2, "($%02X,r),y", mem_load(ip + 1)); break; } case 18: { sprintf(tempstring2, "#$%02X%02X ", mem_load(ip + 2), mem_load(ip + 1)); break; } } if (label != NULL) { if (*label) { strcat(tempstring2, ";"); strcat(tempstring2, label); } } strcat(str, tempstring2); return (codesizetable[addrmode[mode][opc]]); } void showinst(int memorypos, struct cpustruct cpu) { int qi,i = 0; int opc, temp_ip, mode; char tempstring[256]; char tempstring2[32]; temp_ip = memorypos; mode = (cpu.flagX << 1) | cpu.flagM; for (qi = 1; qi < 25; qi++) { getinst(tempstring, temp_ip); strcat(tempstring," "); tempstring[42] = 0x00; opc = mem_load(temp_ip); i = 0; while ( (i <= cpu.breakpoint_count) && ((cpu.breakpoints[i] & 0x1ffff) != (temp_ip | 0x10000)) ) i++; if (i <= cpu.breakpoint_count) // breakpoint hit drawstring(82, 7 + qi, tempstring, 0x01, 0x02, rom_charset); else drawstring(82, 7 + qi, tempstring, 0x01, 0x00, rom_charset); temp_ip = temp_ip + codesizetable[addrmode[mode][opc]]; } }