diff --git a/test6502.cpp b/test6502.cpp new file mode 100644 index 0000000..5cbc10b --- /dev/null +++ b/test6502.cpp @@ -0,0 +1,90 @@ +#include +#include +#include +#include "cpu6502.h" +#include "dis6502.h" + +struct dummyclock +{ + int cycles = 0; + void add_cpu_cycles(int N) { + cycles += N; + } +}; + +struct bus +{ + std::array memory; + bus() + { + std::fill(memory.begin(), memory.end(), 0xA5); + } + uint8_t read(uint16_t addr) const + { + printf("read 0x%04X yields 0x%02X\n", addr, memory[addr]); + return memory[addr]; + } + void write(uint16_t addr, uint8_t data) + { + printf("write 0x%02X to 0x%04X\n", data, addr); + memory[addr] = data; + } +}; + +template +void print_cpu_state(const CPU6502& cpu) +{ + printf("6502: A:%02X X:%02X Y:%02X P:", cpu.a, cpu.x, cpu.y); + printf("%s", (cpu.p & cpu.N) ? "N" : "n"); + printf("%s", (cpu.p & cpu.V) ? "V" : "v"); + printf("-"); + printf("%s", (cpu.p & cpu.B) ? "B" : "b"); + printf("%s", (cpu.p & cpu.D) ? "D" : "d"); + printf("%s", (cpu.p & cpu.I) ? "I" : "i"); + printf("%s", (cpu.p & cpu.Z) ? "Z" : "z"); + printf("%s ", (cpu.p & cpu.C) ? "C" : "c"); + printf("S:%02X ", cpu.s); + printf("PC:%04X\n", cpu.pc); +} + +template +std::string read_bus_and_disassemble(const BUS &bus, int pc) +{ + uint8_t buf[4]; + buf[0] = bus.read(pc + 0); + buf[1] = bus.read(pc + 1); + buf[2] = bus.read(pc + 2); + buf[3] = bus.read(pc + 3); + auto [bytes, dis] = disassemble_6502(pc - 1, buf); + return dis; +} + +int main(int argc, const char **argv) +{ + bus machine; + + FILE *testbin = fopen("6502_functional_test.bin", "rb"); + assert(testbin); + fseek(testbin, 0, SEEK_END); + long length = ftell(testbin); + fseek(testbin, 0, SEEK_SET); + fread(machine.memory.data(), 1, length, testbin); + fclose(testbin); + + dummyclock clock; + + CPU6502 cpu(clock, machine); + + cpu.cycle(); + + cpu.pc = 0x400; + + uint16_t oldpc = 0x0; + do { + print_cpu_state(cpu); + printf("%s\n", read_bus_and_disassemble(machine, cpu.pc).c_str()); + oldpc = cpu.pc; + cpu.cycle(); + } while(cpu.pc != oldpc); + print_cpu_state(cpu); +}