#include typedef enum { e6502_Status_C = 0b00000001, e6502_Status_Z = 0b00000010, e6502_Status_I = 0b00000100, e6502_Status_D = 0b00001000, e6502_Status_B = 0b00010000, e6502_Status_1 = 0b00100000, e6502_Status_V = 0b01000000, e6502_Status_N = 0b10000000, } e6502_Status_Flag_Bit; typedef struct { uint16_t PC; uint8_t SP; uint8_t A; uint8_t X; uint8_t Y; uint8_t S; } e6502_Registers; typedef struct { e6502_Registers registers; int cycle; int instr; uint8_t memory[65536]; } e6502_Core; #define e6502_Memory_Stack (0x0100U) #define e6502_IRQ_Vec (0xFFFEU) #define e6502_Reset_Vec (0xFFFCU) #define e6502_NMI_Vec (0xFFFAU) typedef uint16_t e6502_Mem_Addr; /* uint8_t e6502_r8(e6502_Core* core, e6502_Mem_Addr adr); void e6502_w8(e6502_Core* core, e6502_Mem_Addr adr, uint8_t val); */ static inline uint8_t e6502_r8(e6502_Core* core, e6502_Mem_Addr adr) { return core->memory[adr]; } static inline void e6502_w8(e6502_Core* core, e6502_Mem_Addr adr, uint8_t val) { core->memory[adr] = val; } static inline uint16_t e6502_r16(e6502_Core* core, e6502_Mem_Addr adr) { return e6502_r8(core, adr) | ((uint16_t)e6502_r8(core, adr + 1) << 8); } static inline void e6502_w16(e6502_Core* core, e6502_Mem_Addr adr, uint16_t val) { e6502_w8(core, adr, val); e6502_w8(core, adr + 1, val >> 8); } static inline void e6502_push8(e6502_Core* core, uint8_t val) { e6502_w8(core, e6502_Memory_Stack + core->registers.SP--, val); } static inline void e6502_push16(e6502_Core* core, uint16_t val) { e6502_push8(core, val >> 8); e6502_push8(core, val & 0xFF); } static inline uint8_t e6502_pop8(e6502_Core* core) { return e6502_r8(core, e6502_Memory_Stack + ++core->registers.SP); } static inline uint16_t e6502_pop16(e6502_Core* core) { return (e6502_pop8(core) | ((uint16_t)e6502_pop8(core) << 8)); } int e6502_run(e6502_Core* core, int remaining, int* run, int instructions); int e6502_reset(e6502_Core* core);