You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
6.0 KiB
C

#include <stdio.h>
#include <string.h>
#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]];
}
}