#include #include #include "emulator/a64instruction/a64instruction.h" #include "emulator/a64instruction/a64instruction_global.h" #include "emulator/emulator.h" #include "emulator/fileio.h" #include "global.h" #include "emulator/print.h" #include "emulator/decode.h" #include "emulator/execute.h" #include "emulator/machine_util.h" extern a64inst_instruction *decode(word w); int main(int argc, char **argv) { // Check the arguments if (argc == 1) { fprintf(stderr, "Error: An object file is required. Syntax: ./emulate []"); return EXIT_FAILURE; } FILE *out = stdout; if (argc > 2) { out = fopen(argv[2], "w"); if (out == NULL) { fprintf(stderr, "Error: Could not open file %s\n", argv[2]); return EXIT_FAILURE; } } // Initialising the machine state Machine state = {0}; state.memory = fileio_loadBin(argv[1], MEMORY_SIZE); state.conditionCodes = (PState){0, 1, 0, 0}; state.pc = 0x0; // Fetch-decode-execute cycle word wrd; a64inst_instruction *inst; do { // Step 1: Fetch instruction at PC's address wrd = readMemory(state.memory, state.pc, a64inst_W); // Step 2: Decode instruction to internal representation inst = decode(wrd); // Step 3: Update processor state to reflect executing the instruction, and increment PC execute(&state, inst); if (inst->type != a64inst_BRANCH) state.pc += sizeof(word); } while (inst->type != a64inst_HALT); state.pc -= sizeof(word); printState(&state, out); free(state.memory); return EXIT_SUCCESS; }