repo2/unmerged/zpu_firmware/mist/debug.c @ 321
| 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();
 | |||
| 		}
 | |||
| 	}
 | |||
| }
 |