aboutsummaryrefslogtreecommitdiff
path: root/backends/gp32/gpdebug.c
blob: 4626c44bc5b9c7e992e7e9d9f990f190e760755e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//////////////////////////////////////////////////////////////////////////////
// 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;
}