#ifndef CPU_6502_H #define CPU_6502_H #include #include #include "bus.h" typedef struct { uint8_t A; uint8_t X; uint8_t Y; uint8_t SP; uint16_t PC; uint8_t PS; bus_t *bus; int debug_flags; int steps; int cycles; int error_state; } cpu_6502_t; // debug flags enum { DEBUG_STATUS = 0x01, DEBUG_ZERO_PAGE = 0x02, DEBUG_STACK = 0x04 }; // error state enum { ERROR_STATE_OK = 0x00, ERROR_STATE_ILLEGAL_OPCODE = 0x01 }; // processor state bits enum { PS_N = 0x80, PS_V = 0x40, PS_B = 0x10, PS_D = 0x08, PS_I = 0x04, PS_Z = 0x02, PS_C = 0x01 }; // opcodes enum { LDX_IMM = 0xa2, LDX_ZERO = 0xa6, LDY_IMM = 0xa0, LDY_ZERO = 0xa4, LDA_IMM = 0xa9, LDA_ZERO = 0xa5, LDA_ABS = 0xad, STX_ZERO = 0x86, STX_ABS = 0x8e, STA_ZERO = 0x85, STA_ABS = 0x8d, DEX_IMPL = 0xca, DEY_IMPL = 0x88, INY_IMPL = 0xc8, INC_ZERO = 0xe6, ROL_ACC = 0x2a, AND_IMM = 0x29, OR_IMM = 0x09, BNE_REL = 0xd0, BCC_REL = 0x90, BCS_REL = 0xb0, JMP_ABS = 0x4c, JSR_ABS = 0x20, RTS_IMPL = 0x60, CLI_IMPL = 0x58, SEI_IMPL = 0x78, TXS_IMPL = 0x9a, CPX_IMM = 0xe0, SBC_IMM = 0xe9, NOP_IMPL = 0xea }; enum { MAX_OPCODE_MNEMONIC_STRING_LENGTH = 20, MAX_MENMONIC_LENGTH = 5, NOF_OPCODES = 256 }; void cpu_6502_init( cpu_6502_t *cpu, bus_t *bus, bool initialize ); 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_steps( cpu_6502_t *cpu, int steps ); void cpu_6502_run_cycles( cpu_6502_t *cpu, int cycles ); void cpu_6502_step( cpu_6502_t *cpu ); void cpu_6502_get_opcode_mnemonic( cpu_6502_t *cpu, char *buf, int buflen, uint16_t addr ); void cpu_6502_print_debug( cpu_6502_t *cpu ); void cpu_6502_print_state( cpu_6502_t *cpu, uint16_t addr ); 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 ); bool cpu_6502_is_negative( cpu_6502_t *cpu ); bool cpu_6502_is_overflow( cpu_6502_t *cpu ); bool cpu_6502_is_brk( cpu_6502_t *cpu ); bool cpu_6502_is_decimal( cpu_6502_t *cpu ); bool cpu_6502_is_interrupt( cpu_6502_t *cpu ); bool cpu_6502_is_zero( cpu_6502_t *cpu ); bool cpu_6502_is_carry( cpu_6502_t *cpu ); #endif