#include #include #include "memory_map.h" #include "ram.h" #include "state.h" #include "exception.h" #include "execute.h" #include "decode_print.h" int main(int argc, char *argv[]) { assert(argc > 1); FILE * f = fopen(argv[1], "r"); if (f == NULL) { fprintf(stderr, "fopen %s\n", argv[1]); return -1; } int ret = fseek(f, 0, SEEK_END); assert(ret == 0); uint32_t read_size = ftell(f); ret = fseek(f, 0, SEEK_SET); assert(ret == 0); uint32_t rom_size = ((read_size + 3) & ~3); uint32_t buf[rom_size / 4]; uint32_t ret_size = fread(buf, 1, read_size, f); assert(ret_size == read_size); ret = fclose(f); assert(ret == 0); struct memory_map map = { .length = 0 }; map.entry[map.length++] = (struct memory_map_entry){ .start = 0x0000'0000, .size = rom_size, .mem = (void *)buf, .access = ram__memory_access, }; struct architectural_state state = { 0 }; POWERON(&state); char const * instruction_buf; char operand_buf[128]; while (1) { uint32_t instruction_code = fetch(&state, &map); decode_and_print_instruction(&state, &map, instruction_code, &instruction_buf, operand_buf, 128); printf("pc %08x %-7s %-20s\n", state.pc[0], instruction_buf, operand_buf); if (physical_address(state.pc[0]) == 0x38) break; step(&state, &map); } printf("part1 %d\n", state.gbr); printf("part2 %d %d\n", state.mach, state.macl); }