|
- #include <stdint.h>
-
-
- 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);
|