1 #ifndef _6502_H 2 #define _6502_H 3 4 #include <stdint.h> 5 6 /* Instruction */ 7 typedef struct { 8 char *name; 9 uint8_t (*op)(void); 10 uint8_t (*mode)(void); 11 uint8_t cycles; 12 } INS; 13 14 typedef struct { 15 uint8_t ac, x, y, sp, st; 16 uint16_t pc; 17 } CPU; 18 19 /* zero-page: fast shorter instructions 20 * first-page: stack; 21 * last-six bytes: used to store special addresses */ 22 typedef struct { 23 uint8_t ram[0x10000]; /* 64kb memory */ 24 } MEM; 25 26 /* 6502 status register flags */ 27 typedef enum { 28 C, /* Carry */ 29 Z, /* Zero */ 30 I, /* Disable interrupts */ 31 D, /* Decimal mode */ 32 B, /* Break */ 33 U, /* Unused */ 34 V, /* Overflow */ 35 N /* Negative */ 36 } ST_FLAG; 37 38 char *CPU_mode_name(uint8_t (*mode)(void)); 39 uint16_t CPU_get_pc(void); 40 uint8_t CPU_exec(INS ins); 41 uint8_t CPU_get_flag(ST_FLAG flag); 42 void CPU_branch(void); 43 void CPU_dump(void); 44 void CPU_fetch(INS *ins); 45 void CPU_init(void); 46 void CPU_irq(void); 47 void CPU_nm_irq(void); 48 void CPU_reset(void); 49 void CPU_set_flag(ST_FLAG flag, uint8_t val); 50 51 void MEM_init(void); 52 void MEM_set_pc_start(uint16_t addr); 53 uint8_t MEM_read(uint16_t addr); 54 uint8_t MEM_write(uint16_t addr, uint8_t val); /* returns written value */ 55 void MEM_dump(void); 56 void MEM_dump_page(uint16_t page); 57 void MEM_dump_last_six(void); 58 int MEM_load_from_file(char *fp); 59 60 61 void print_reg(uint8_t); 62 63 64 /* Addresing modes */ 65 uint8_t ABS(void); 66 uint8_t ABX(void); 67 uint8_t ABY(void); 68 uint8_t IMM(void); 69 uint8_t IMP(void); 70 uint8_t IND(void); 71 uint8_t IZX(void); 72 uint8_t IZY(void); 73 uint8_t REL(void); 74 uint8_t ZP0(void); 75 uint8_t ZPX(void); 76 uint8_t ZPY(void); 77 78 79 /* Opcodes */ 80 uint8_t ADC(void); 81 uint8_t AND(void); 82 uint8_t ASL(void); 83 uint8_t BCC(void); 84 uint8_t BCS(void); 85 uint8_t BEQ(void); 86 uint8_t BIT(void); 87 uint8_t BMI(void); 88 uint8_t BNE(void); 89 uint8_t BPL(void); 90 uint8_t BRK(void); 91 uint8_t BVC(void); 92 uint8_t BVS(void); 93 uint8_t CLC(void); 94 uint8_t CLD(void); 95 uint8_t CLI(void); 96 uint8_t CLV(void); 97 uint8_t CMP(void); 98 uint8_t CPX(void); 99 uint8_t CPY(void); 100 uint8_t DEC(void); 101 uint8_t DEX(void); 102 uint8_t DEY(void); 103 uint8_t EOR(void); 104 uint8_t INC(void); 105 uint8_t INX(void); 106 uint8_t INY(void); 107 uint8_t JMP(void); 108 uint8_t JSR(void); 109 uint8_t LDA(void); 110 uint8_t LDX(void); 111 uint8_t LDY(void); 112 uint8_t LSR(void); 113 uint8_t NOP(void); 114 uint8_t ORA(void); 115 uint8_t PHA(void); 116 uint8_t PHP(void); 117 uint8_t PLA(void); 118 uint8_t PLP(void); 119 uint8_t ROL(void); 120 uint8_t ROR(void); 121 uint8_t RTI(void); 122 uint8_t RTS(void); 123 uint8_t SBC(void); 124 uint8_t SEC(void); 125 uint8_t SED(void); 126 uint8_t SEI(void); 127 uint8_t STA(void); 128 uint8_t STX(void); 129 uint8_t STY(void); 130 uint8_t TAX(void); 131 uint8_t TAY(void); 132 uint8_t TSX(void); 133 uint8_t TXA(void); 134 uint8_t TXS(void); 135 uint8_t TYA(void); 136 137 uint8_t NUL(void); 138 139 140 #endif