#ifndef CPU_6502_H #define CPU_6502_H #include #include typedef struct { uint8_t A; uint8_t X; uint8_t Y; uint8_t SP; uint16_t PC; uint8_t PS; struct memory_t *memory; bool debug; int steps; } cpu_6502_t; enum { PS_N = 0x80, PS_V = 0x40, PS_B = 0x10, PS_D = 0x08, PS_I = 0x04, PS_Z = 0x02, PS_C = 0x01 }; enum { LDX_IMM = 0xA2, LDX_ZERO = 0xA6, LDY_IMM = 0xA0, LDY_ZERO = 0xA4, LDA_IMM = 0xA9, LDA_ZERO = 0xA5, STX_ABS = 0x8E, DEY_IMPL = 0x88, ROL_ACC = 0x2A, BNE_REL = 0xD0, BCC_REL = 0x90, JMP_ABS = 0x4C, JSR_ABS = 0x20, RTS_IMPL = 0x60, TXS_IMPL = 0x9A }; void cpu_6502_init( cpu_6502_t *cpu, struct memory_t *memory ); void cpu_6502_reset( cpu_6502_t *cpu ); uint8_t cpu_6502_read_byte( cpu_6502_t *cpu, uint16_t addr ); uint16_t cpu_6502_read_word( cpu_6502_t *cpu, uint16_t addr ); void cpu_6502_write_byte( cpu_6502_t *cpu, uint16_t addr, uint8_t data ); void cpu_6502_push_byte( cpu_6502_t *cpu, uint8_t data ); void cpu_6502_push_word( cpu_6502_t *cpu, uint16_t data ); uint8_t cpu_6502_pop_byte( cpu_6502_t *cpu ); uint16_t cpu_6502_pop_word( cpu_6502_t *cpu ); void cpu_6502_run( cpu_6502_t *cpu, int steps ); void cpu_6502_step( cpu_6502_t *cpu ); void cpu_6502_print_state( cpu_6502_t *cpu, uint8_t opcode ); void cpu_6502_print_memory( cpu_6502_t *cpu, uint16_t base, uint8_t size ); void cpu_6502_print_stack( cpu_6502_t *cpu ); void cpu_6502_print_zerop_page( cpu_6502_t *cpu ); #endif