repo2/unmerged/zpu_firmware/replay/debug.c @ 1476
1 | markw | #include "debug.h"
|
|
#include "pause.h"
|
|||
#define ATARIBASE = 0x10000;
|
|||
int xpos;
|
|||
int ypos;
|
|||
int onoff; // perhaps we can plot to another address buffer, which we can scroll through in the monitor?
|
|||
int debugoffsetval;
|
|||
void topofscreen()
|
|||
{
|
|||
xpos = 0;
|
|||
ypos = 0;
|
|||
}
|
|||
void setxpos(int val)
|
|||
{
|
|||
xpos = val;
|
|||
}
|
|||
void setypos(int val)
|
|||
{
|
|||
ypos = val;
|
|||
}
|
|||
void initdebug(int onoff_in)
|
|||
{
|
|||
xpos = 0;
|
|||
ypos = 0;
|
|||
onoff = onoff_in;
|
|||
}
|
|||
void nextline()
|
|||
{
|
|||
int i;
|
|||
xpos=0;
|
|||
ypos+=1;
|
|||
if (ypos==24)
|
|||
ypos = 0;
|
|||
for (i=0;i!=40;++i)
|
|||
plot(0,i,ypos);
|
|||
//Delay100usX(5000);
|
|||
}
|
|||
unsigned char toatarichar(int val)
|
|||
{
|
|||
int inv = val>=128;
|
|||
if (inv)
|
|||
{
|
|||
val-=128;
|
|||
}
|
|||
if (val>='A' && val<='Z')
|
|||
{
|
|||
val+=-'A'+33;
|
|||
}
|
|||
else if (val>='a' && val<='z')
|
|||
{
|
|||
val+=-'a'+33+64;
|
|||
}
|
|||
else if (val>='0' && val<='9')
|
|||
{
|
|||
val+=-'0'+16;
|
|||
}
|
|||
else if (val>=32 && val<=47)
|
|||
{
|
|||
val+=-32;
|
|||
}
|
|||
else
|
|||
{
|
|||
val = 0;
|
|||
}
|
|||
if (inv)
|
|||
{
|
|||
val+=128;
|
|||
}
|
|||
return val;
|
|||
}
|
|||
unsigned char hextoatarichar(int val)
|
|||
{
|
|||
if (val>=0 && val<=9)
|
|||
{
|
|||
val+=+16;
|
|||
}
|
|||
else if (val>=10 && val<=15)
|
|||
{
|
|||
val+=-10+33;
|
|||
}
|
|||
return val;
|
|||
}
|
|||
void plot(unsigned char val, int x, int y)
|
|||
{
|
|||
if (onoff == 0) return;
|
|||
unsigned char volatile * baseaddr = (unsigned char volatile *)(40000 + 0x10000);
|
|||
*(baseaddr + y*40+x) = val+debugoffsetval;
|
|||
}
|
|||
void debugoffset(int x)
|
|||
{
|
|||
debugoffsetval = x;
|
|||
}
|
|||
void debug(char const * str)
|
|||
{
|
|||
while (1)
|
|||
{
|
|||
int val = *str++;
|
|||
if (val==0) break;
|
|||
if (val=='\n') {nextline();continue;};
|
|||
plot(toatarichar(val),xpos,ypos);
|
|||
++xpos;
|
|||
if (xpos==40)
|
|||
{
|
|||
nextline();
|
|||
}
|
|||
}
|
|||
debugoffsetval = 0;
|
|||
}
|
|||
void plotnext(unsigned char val)
|
|||
{
|
|||
plot(val,xpos,ypos);
|
|||
++xpos;
|
|||
if (xpos==40) nextline();
|
|||
}
|
|||
void plotnextnumber(unsigned short val)
|
|||
{
|
|||
plotnext(hextoatarichar((val&0xf000)>>12));
|
|||
plotnext(hextoatarichar((val&0x0f00)>>8));
|
|||
plotnext(hextoatarichar((val&0x00f0)>>4));
|
|||
plotnext(hextoatarichar((val&0x000f)>>0));
|
|||
debugoffsetval = 0;
|
|||
}
|
|||
void hexdump(char const * str, int length)
|
|||
{
|
|||
nextline();
|
|||
for (;length>0;--length)
|
|||
{
|
|||
unsigned char val= *str++;
|
|||
// LH 10 cols = char
|
|||
// RH 20 cols = hex
|
|||
plot(toatarichar(val),xpos,ypos);
|
|||
plot(hextoatarichar((val&0xf0) >> 4),xpos*2+20,ypos);
|
|||
plot(hextoatarichar(val&0xf),xpos*2+21,ypos);
|
|||
++xpos;
|
|||
if (xpos==10)
|
|||
{
|
|||
nextline();
|
|||
}
|
|||
}
|
|||
nextline();
|
|||
}
|
|||
void hexdump_pure(char const * str, int length)
|
|||
{
|
|||
xpos = xpos&0xfffe;
|
|||
for (;length>0;--length)
|
|||
{
|
|||
unsigned char val= *str++;
|
|||
plot(hextoatarichar((val&0xf0) >> 4),xpos++,ypos);
|
|||
plot(hextoatarichar(val&0xf),xpos++,ypos);
|
|||
if (xpos==40)
|
|||
{
|
|||
nextline();
|
|||
}
|
|||
}
|
|||
}
|