Project

General

Profile

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();
}
}
}