diff options
author | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-04-27 21:12:58 +1000 |
---|---|---|
committer | alekseiplusplus <alekseijeaves@protonmail.com> | 2023-04-27 21:12:58 +1000 |
commit | df566a054e6ee4b567bb1635073448ffc599a982 (patch) | |
tree | 66a852e6e13d8b8b040a0323a6f60182c6c2fcdb /interpreter.c | |
parent | c620138d9100286d583b56e4427ef2288d9173e4 (diff) |
interpreter.c is mostly complete
Diffstat (limited to 'interpreter.c')
-rw-r--r-- | interpreter.c | 93 |
1 files changed, 82 insertions, 11 deletions
diff --git a/interpreter.c b/interpreter.c index fece473..331da43 100644 --- a/interpreter.c +++ b/interpreter.c @@ -1,9 +1,41 @@ -// test.c -// Temporary .c file where arbitrary tests are carried out. +// interpreter.c +// Useful for carrying out tests of the CPU instructions. -#include"headers/include.h" //LOOK INTO PTHREADS +/* interpreter.c manual + +This program contains many functions which make it easy to write tests for the 6502 CPU. + +The expected input is machine code written in plaintext. + +The program accepts stdin, so it can be used in two ways. + - Typing instructions inline. + - Piping a file in with cat. +I didn't implement arguments because this is only a debug program. + +Here are some valid ways to write an LDA with immediate addressing: + a901 + A901 + A9 01 + +The interpreter comes with multiple statements for the purpose of debugging the emulator. + Qq Quits the program. + Should be put at the end of a textfile, or the program will segfault (inconsequentially). + Rr Resets the virtual computer. + Pp Dumps processor state. + Mm Dumps a specified page of memory. + Takes an argument only of the form XX. + Be aware that unallocated memory is permitted to be dumped. + / Prints until newline. + # Ignores until newline. +*/ + + +#include"headers/include.h" #include"headers/debug.h" +//Write a custom getc function here which ignores spaces + + int main(int argc, char *argv[]){ AppleOn(); @@ -12,34 +44,73 @@ int main(int argc, char *argv[]){ // Interpreter loop while(1){ + + // Retrieve first character of a line do { c = getc(stdin); - } while (c == '\n' || c == ' '); + } while (c == '\n' || c == ' ' || c == '\t'); + + // The following are special debug commands. + // Quit program + if (c == 'Q' || c == 'q'){ + break; + } + + if (c == 'R' || c == 'r'){ + AppleReset(); //need to flesh out this function + continue; + } + + // Dump processor status if (c == 'P' || c == 'p'){ dStatusDump(); continue; } - if (c == 'M' || c == 'm'){ - c = dCharToNum(getc(stdin)) << 4; + // Dump a page of memory + if (c == 'M' || c == 'm'){ + do { + c = getc(stdin); + } while(c == ' ' || c == '\n'); + c = dCharToNum(c) << 4; c += dCharToNum(getc(stdin)); dPageDump(c); continue; } + // Print out a statement + if (c == '/'){ + do { + c = getc(stdin); + printf("%c", c); + } while(c != '\n'); + continue; + } + + // Comment, so ignores until newline. + if (c == '#'){ + do { + c = getc(stdin); + } while(c != '\n'); + continue; + } + // From here on it is expected input will be mostly correct c = dCharToNum(c) << 4; c += dCharToNum(getc(stdin)); address x = 0x0000; char z; for(int i = ((fAddressGetLengthPrempt(c) * 2) - 2); i > 0; i--) { - z = getc(stdin); - if (z != '\n'){ - x += dCharToNum(z) << ((4 * (i - 1))); - }else{ + do { + z = getc(stdin); + } while (z == ' ' || z == '\t'); + + //if (z != '\n'){ + x += dCharToNum(z) << ((4 * (i - 1))); + /*}else{ i++; - } + }*/ } callInstructionTable(c, x); } |