scummvm/backends/gp32/gpdebug.c
Peter Moraliyski f9a833abf0 fg
svn-id: r5759
2002-11-30 15:34:37 +00:00

126 lines
4.4 KiB
C

//////////////////////////////////////////////////////////////////////////////
// debug_emu.cpp //
//////////////////////////////////////////////////////////////////////////////
/*
debug support for EmuDebug console v1.2+
*/
//////////////////////////////////////////////////////////////////////////////
// Includes //
//////////////////////////////////////////////////////////////////////////////
#include "gpdebug.h"
//////////////////////////////////////////////////////////////////////////////
// Defines //
//////////////////////////////////////////////////////////////////////////////
#define debugBufferData ((volatile char *)debugBufferAddr + 8)
#define debugBufferBegin REG4((int)debugBufferAddr + 0) // read
#define debugBufferEnd REG4((int)debugBufferAddr + 4) // write
#define debugBufferDataSize 256
#define debugBufferSize (8 + debugBufferDataSize)
//////////////////////////////////////////////////////////////////////////////
// Variables //
//////////////////////////////////////////////////////////////////////////////
static int debugging = 0;
static void * volatile debugBufferAddr;
char debugBuffer[debugBufferDataSize]; // instead of malloc
//////////////////////////////////////////////////////////////////////////////
// __putchar //
//////////////////////////////////////////////////////////////////////////////
void __putchar(int c)
{
unsigned int nextEnd;
if (!debugging) return;
do
{
nextEnd = debugBufferEnd + 1;
if (nextEnd >= debugBufferDataSize) nextEnd = 0;
} while (nextEnd == debugBufferBegin); // full?
debugBufferData[debugBufferEnd] = c;
debugBufferEnd = nextEnd;
}
//////////////////////////////////////////////////////////////////////////////
// __getchar //
//////////////////////////////////////////////////////////////////////////////
int __getchar()
{
//if (!debugging) return -1;
return -1;
}
//////////////////////////////////////////////////////////////////////////////
// __kbhit //
//////////////////////////////////////////////////////////////////////////////
int __kbhit()
{
//if (!debugging) return false;
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// __gets //
//////////////////////////////////////////////////////////////////////////////
char * __gets(char *s)
{
char *p = s;
if (!debugging) return 0;
while (1)
{
int c = getchar();
if (c >= 0) *p++ = c;
if (c == 0) return s;
}
return s;
}
//////////////////////////////////////////////////////////////////////////////
// __puts //
//////////////////////////////////////////////////////////////////////////////
int __puts(const char *s)
{
if (!debugging) return 0;
while (*s) putchar(*s++);
return 0;
/*
while (debugBufferAddr[0]) {} // wait until buffer is clear
int r = sprintf(debugBufferAddr+1, "%s", s);
debugBufferAddr[0] = r;
return r;
*/
}
//////////////////////////////////////////////////////////////////////////////
// __printf //
//////////////////////////////////////////////////////////////////////////////
int __printf(char *fmt, ...)
{
char s[256];
int r;
va_list marker;
if (!debugging) return 0;
va_start(marker, fmt);
r = vsprintf(s, fmt, marker);
va_end(marker);
puts(s);
return r;
}
//////////////////////////////////////////////////////////////////////////////
// InitDebug //
//////////////////////////////////////////////////////////////////////////////
void InitDebug()
{
debugBufferAddr = debugBuffer;
//debugBufferAddr = malloc(debugBufferSize);
debugBufferBegin = debugBufferEnd = 0xEDEBEDEB;
memset((void *)debugBufferData, ' ', debugBufferDataSize);
debugBufferData[0] = '{'; debugBufferData[debugBufferDataSize - 1] = '}';
while (debugBufferBegin && debugBufferEnd) { } // wait for debugger
debugging = 1;
}