// interpreter.c // Useful for carrying out tests of the CPU instructions. /* 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(); byte c; // Interpreter loop while(1){ // Retrieve first character of a line do { c = getc(stdin); } 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; } // 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--) { do { z = getc(stdin); } while (z == ' ' || z == '\t'); //if (z != '\n'){ x += dCharToNum(z) << ((4 * (i - 1))); /*}else{ i++; }*/ } callInstructionTable(c, x); } }