summaryrefslogtreecommitdiff
path: root/interpreter.c
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.c')
-rw-r--r--interpreter.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/interpreter.c b/interpreter.c
new file mode 100644
index 0000000..0df27ce
--- /dev/null
+++ b/interpreter.c
@@ -0,0 +1,65 @@
+/*
+ * interpreter.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 characters which print debug information
+ d Prints main system information
+ mXXXX Prints contents of particular memory location
+ */
+
+#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;
+ }
+} \ No newline at end of file