// interpreter.c // Useful for carrying out tests of the CPU instructions. // Refer to interpreter.md for the manual #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'){ //EXPAND, MAKE IT PRINT SINGLE AND PAGE address x = 0; do { c = getc(stdin); } while(c == ' ' || c == '\n'); x = dCharToNum(c) << 4; x += dCharToNum(getc(stdin)); c = getc(stdin); if (c != '\n'){ x <<= 8; x = dCharToNum(c) << 4; x += dCharToNum(getc(stdin)); } else{ dPageDump(x); } 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; } if (c == 'S' || c == 's'){ address x = 0; byte y = 0; for(int i = 3; i >= 0; i--){ x += (dCharToNum(getc(stdin)) << (4*i)); } c = getc(stdin); if (c != '.'){ printf("Error assigning memory to 0x%x\n", x); break; } for(int i = 1; i >= 0; i--){ y += (dCharToNum(getc(stdin)) << (4*i)); } printf("%4x:%2x\n", x, y); Memory[x] = y; continue; } // From here on it is expected input will be an instruction 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); } }