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
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]];
|
|
}
|
|
}
|