summaryrefslogtreecommitdiff
path: root/debug.c
blob: 4e0b2700738221bc509ab715b7dec2aab74d11ee (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
/*	
 *	debug.c is a tool which can be used to interpret 6502 machine code inline.
 *	Machine code is expected as hexadecimal of length 2 or 6, depending on the instruction.
 *	Note that zero-page addressing is not fully emulated yet; it will still address the zero-page
 	section of memory but the instructions still take an address of length 4.
	This will be fixed later when the whole system is functional.
 *	There are a few special keywords which have particular debugging meaning
 */

#include"include.h"

int charToNum (char c, int mul) {
	if (c != 0x20 && (c >= 0x30 && c <= 0x39)){
		a = (mul * (c - 0x30));
	}else if (c != 0x20 && (c >= 0x41 && c <= 0x46)){
		a = (mul * (c - 0x31));
	}
}

void debug_print(){
	printf("\nacc:\t%x\nX:\t%x\nY:\t%x\nstack:\t%x\nflags:\t%x", acc, X, Y, S, P);
}

int main(){
	char c;
	unsigned char a, b;
	while(true){
		// Pass 1
		c = getchar();
		if (c == EOF) break;
		switch(c){
			case D: case d:
				debug_print();
				break;
			case M: case m:
				int m = 0;
				for(int i = 1; i <= 1000; i *= 10){
					m += charToNum(getchar(), 1000/i);
				}
				printf("Address %d has %x", m, Memory[m]);
				break;

		}
		a += charToNum(c, 0x10);
		// Pass 2
		c = getchar(); if (c == EOF) break;
		a += charToNum(c, 0x01);
		//Check for next value
		c = getchar();
		if (!(c == EOF || c == ' ')) {
			// Four passes
			b += charToNum(c, 0x1000);
			c = getchar(); if (c == EOF) break;
			b += charToNum(c, 0x0100);
			c = getchar(); if (c == EOF) break;
			b += charToNum(c, 0x0010);
			c = getchar(); if (c == EOF) break;
			b += charToNum(c, 0x0001);
		}
		runInstruction(a, b);
		c = getchar(); if (c == EOF) break;
	}
}