diff options
| author | vin <git@vineetk.net> | 2024-06-30 19:10:29 -0400 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-06-30 19:10:29 -0400 |
| commit | a4b39966aed8d41ad4ddc6700683c4779e8d1cb2 (patch) | |
| tree | 8fab3574f3d83199a4965ffecd0db549105ff96c | |
| parent | f28733401ebfe5457a4a79a37fbd5d2001de90bd (diff) | |
start refactoring opcode defs into an array
| -rw-r--r-- | cpu.c | 18 | ||||
| -rw-r--r-- | cpu.h | 62 | ||||
| -rw-r--r-- | opcodes.h | 184 |
3 files changed, 248 insertions, 16 deletions
| @@ -4,6 +4,8 @@ | |||
| 4 | #include <stdlib.h> | 4 | #include <stdlib.h> |
| 5 | #include <string.h> | 5 | #include <string.h> |
| 6 | 6 | ||
| 7 | #include "cpu.h" | ||
| 8 | #include "opcodes.h" | ||
| 7 | #include "rom.h" | 9 | #include "rom.h" |
| 8 | 10 | ||
| 9 | #define MAX(a, b) ((a > b) ? a : b) | 11 | #define MAX(a, b) ((a > b) ? a : b) |
| @@ -52,22 +54,6 @@ struct registers regs = {0}; | |||
| 52 | 54 | ||
| 53 | struct Rom rom = {0}; | 55 | struct Rom rom = {0}; |
| 54 | 56 | ||
| 55 | enum addressing_mode { | ||
| 56 | AM_ACC, | ||
| 57 | AM_IMPLICIT, | ||
| 58 | AM_IMM, | ||
| 59 | AM_ZP, | ||
| 60 | AM_ZP_X, | ||
| 61 | AM_ZP_Y, | ||
| 62 | AM_REL, | ||
| 63 | AM_ABS, | ||
| 64 | AM_ABS_X, | ||
| 65 | AM_ABS_Y, | ||
| 66 | AM_IND, | ||
| 67 | AM_IND_X, | ||
| 68 | AM_IND_Y, | ||
| 69 | }; | ||
| 70 | |||
| 71 | /* 64K address space, 16bit words */ | 57 | /* 64K address space, 16bit words */ |
| 72 | uint8_t memory[0x16000]; | 58 | uint8_t memory[0x16000]; |
| 73 | 59 | ||
| @@ -0,0 +1,62 @@ | |||
| 1 | #include <stdint.h> | ||
| 2 | |||
| 3 | void ADC(uint16_t arg); | ||
| 4 | void AND(uint16_t arg); | ||
| 5 | void ASL_acc(uint16_t arg); | ||
| 6 | void ASL(uint16_t arg); | ||
| 7 | void BCC(uint16_t arg); | ||
| 8 | void BCS(uint16_t arg); | ||
| 9 | void BEQ(uint16_t arg); | ||
| 10 | void BIT(uint16_t arg); | ||
| 11 | void BMI(uint16_t arg); | ||
| 12 | void BNE(uint16_t arg); | ||
| 13 | void BPL(uint16_t arg); | ||
| 14 | void BRK(uint16_t arg); | ||
| 15 | void BVC(uint16_t arg); | ||
| 16 | void BVS(uint16_t arg); | ||
| 17 | void CLC(uint16_t arg); | ||
| 18 | void CLD(uint16_t arg); | ||
| 19 | void CLI(uint16_t arg); | ||
| 20 | void CLV(uint16_t arg); | ||
| 21 | void CMP(uint16_t arg); | ||
| 22 | void CPX(uint16_t arg); | ||
| 23 | void CPY(uint16_t arg); | ||
| 24 | void DEC(uint16_t arg); | ||
| 25 | void DEX(uint16_t arg); | ||
| 26 | void DEY(uint16_t arg); | ||
| 27 | void EOR(uint16_t arg); | ||
| 28 | void INC(uint16_t arg); | ||
| 29 | void INX(uint16_t arg); | ||
| 30 | void INY(uint16_t arg); | ||
| 31 | void JMP(uint16_t arg); | ||
| 32 | void JSR(uint16_t arg); | ||
| 33 | void LDA(uint16_t arg); | ||
| 34 | void LDX(uint16_t arg); | ||
| 35 | void LDY(uint16_t arg); | ||
| 36 | void LSR_acc(uint16_t arg); | ||
| 37 | void LSR(uint16_t arg); | ||
| 38 | void NOP(uint16_t arg); | ||
| 39 | void ORA(uint16_t arg); | ||
| 40 | void PHA(uint16_t arg); | ||
| 41 | void PHP(uint16_t arg); | ||
| 42 | void PLA(uint16_t arg); | ||
| 43 | void PLP(uint16_t arg); | ||
| 44 | void ROL_acc(uint16_t arg); | ||
| 45 | void ROL(uint16_t arg); | ||
| 46 | void ROR_acc(uint16_t arg); | ||
| 47 | void ROR(uint16_t arg); | ||
| 48 | void RTI(uint16_t arg); | ||
| 49 | void RTS(uint16_t arg); | ||
| 50 | void SBC(uint16_t arg); | ||
| 51 | void SEC(uint16_t arg); | ||
| 52 | void SED(uint16_t arg); | ||
| 53 | void SEI(uint16_t arg); | ||
| 54 | void STA(uint16_t arg); | ||
| 55 | void STX(uint16_t arg); | ||
| 56 | void STY(uint16_t arg); | ||
| 57 | void TAX(uint16_t arg); | ||
| 58 | void TAY(uint16_t arg); | ||
| 59 | void TSX(uint16_t arg); | ||
| 60 | void TXA(uint16_t arg); | ||
| 61 | void TXS(uint16_t arg); | ||
| 62 | void TYA(uint16_t arg); | ||
diff --git a/opcodes.h b/opcodes.h new file mode 100644 index 0000000..defc427 --- /dev/null +++ b/opcodes.h | |||
| @@ -0,0 +1,184 @@ | |||
| 1 | #include <stdint.h> | ||
| 2 | |||
| 3 | #include "cpu.h" | ||
| 4 | |||
| 5 | enum addressing_mode { | ||
| 6 | AM_NONE, | ||
| 7 | AM_ACC, | ||
| 8 | AM_IMM, | ||
| 9 | AM_REL, | ||
| 10 | AM_ZP, | ||
| 11 | AM_ZP_X, | ||
| 12 | AM_ZP_Y, | ||
| 13 | AM_ABS, | ||
| 14 | AM_ABS_X, | ||
| 15 | AM_ABS_Y, | ||
| 16 | AM_IND, | ||
| 17 | AM_IND_X, | ||
| 18 | AM_IND_Y, | ||
| 19 | }; | ||
| 20 | |||
| 21 | /* index of below array is the code of the instruction */ | ||
| 22 | struct opcode { | ||
| 23 | const char name[4]; | ||
| 24 | /* I know 16bit seems wasteful, but some ops use 16bit memory as arg */ | ||
| 25 | void (*instr)(uint16_t arg); | ||
| 26 | uint8_t bytes; | ||
| 27 | uint8_t cycles; | ||
| 28 | enum addressing_mode mode; | ||
| 29 | }; | ||
| 30 | |||
| 31 | struct opcode opcodes[0x100] = { | ||
| 32 | /* official opcodes */ | ||
| 33 | [0x69] = { "ADC", ADC, 2, 2, AM_IMM }, | ||
| 34 | [0x65] = { "ADC", ADC, 2, 3, AM_ZP }, | ||
| 35 | [0x75] = { "ADC", ADC, 2, 4, AM_ZP_X }, | ||
| 36 | [0x6D] = { "ADC", ADC, 3, 4, AM_ABS }, | ||
| 37 | [0x7D] = { "ADC", ADC, 3, 4, AM_ABS_X }, | ||
| 38 | [0x79] = { "ADC", ADC, 3, 4, AM_ABS_Y }, | ||
| 39 | [0x61] = { "ADC", ADC, 2, 6, AM_IND_X }, | ||
| 40 | [0x71] = { "ADC", ADC, 2, 5, AM_IND_Y }, | ||
| 41 | [0x29] = { "AND", AND, 2, 2, AM_IMM }, | ||
| 42 | [0x25] = { "AND", AND, 2, 3, AM_ZP }, | ||
| 43 | [0x35] = { "AND", AND, 2, 4, AM_ZP_X }, | ||
| 44 | [0x2D] = { "AND", AND, 3, 4, AM_ABS }, | ||
| 45 | [0x3D] = { "AND", AND, 3, 4, AM_ABS_X }, | ||
| 46 | [0x39] = { "AND", AND, 3, 4, AM_ABS_Y }, | ||
| 47 | [0x21] = { "AND", AND, 2, 6, AM_IND_X }, | ||
| 48 | [0x31] = { "AND", AND, 2, 5, AM_IND_Y }, | ||
| 49 | [0x0A] = { "ASL", ASL_acc, 1, 2, AM_ACC }, | ||
| 50 | [0x06] = { "ASL", ASL, 2, 5, AM_ZP }, | ||
| 51 | [0x16] = { "ASL", ASL, 2, 6, AM_ZP_X }, | ||
| 52 | [0x0E] = { "ASL", ASL, 3, 6, AM_ABS }, | ||
| 53 | [0x1E] = { "ASL", ASL, 3, 7, AM_ABS_X }, | ||
| 54 | [0x90] = { "BCC", BCC, 2, 2, AM_REL }, | ||
| 55 | [0xB0] = { "BCS", BCS, 2, 2, AM_REL }, | ||
| 56 | [0xF0] = { "BEQ", BEQ, 2, 2, AM_REL }, | ||
| 57 | [0x24] = { "BIT", BIT, 2, 3, AM_ZP }, | ||
| 58 | [0x2C] = { "BIT", BIT, 3, 4, AM_ABS }, | ||
| 59 | [0x30] = { "BMI", BMI, 2, 2, AM_REL }, | ||
| 60 | [0xD0] = { "BNE", BNE, 2, 2, AM_REL }, | ||
| 61 | [0x10] = { "BPL", BPL, 2, 2, AM_REL }, | ||
| 62 | [0x00] = { "BRK", BRK, 1, 7, AM_NONE }, | ||
| 63 | [0x50] = { "BVC", BVC, 2, 2, AM_REL }, | ||
| 64 | [0x70] = { "BVS", BVS, 2, 2, AM_REL }, | ||
| 65 | [0x18] = { "CLC", CLC, 1, 2, AM_NONE }, | ||
| 66 | [0xD8] = { "CLD", CLD, 1, 2, AM_NONE }, | ||
| 67 | [0x58] = { "CLI", CLI, 1, 2, AM_NONE }, | ||
| 68 | [0xB8] = { "CLV", CLV, 1, 2, AM_NONE }, | ||
| 69 | [0xC9] = { "CMP", CMP, 2, 2, AM_IMM }, | ||
| 70 | [0xC5] = { "CMP", CMP, 2, 3, AM_ZP }, | ||
| 71 | [0xD5] = { "CMP", CMP, 2, 4, AM_ZP_X }, | ||
| 72 | [0xCD] = { "CMP", CMP, 3, 4, AM_ABS }, | ||
| 73 | [0xDD] = { "CMP", CMP, 3, 4, AM_ABS_X }, | ||
| 74 | [0xD9] = { "CMP", CMP, 3, 4, AM_ABS_Y }, | ||
| 75 | [0xC1] = { "CMP", CMP, 2, 6, AM_IND_X }, | ||
| 76 | [0xD1] = { "CMP", CMP, 2, 5, AM_IND_Y }, | ||
| 77 | [0xE0] = { "CPX", CPX, 2, 2, AM_IMM }, | ||
| 78 | [0xE4] = { "CPX", CPX, 2, 3, AM_ZP }, | ||
| 79 | [0xEC] = { "CPX", CPX, 3, 4, AM_ABS }, | ||
| 80 | [0xC0] = { "CPY", CPY, 2, 2, AM_IMM }, | ||
| 81 | [0xC4] = { "CPY", CPY, 2, 3, AM_ZP }, | ||
| 82 | [0xCC] = { "CPY", CPY, 3, 4, AM_ABS }, | ||
| 83 | [0xC6] = { "DEC", DEC, 2, 5, AM_ZP }, | ||
| 84 | [0xD6] = { "DEC", DEC, 2, 6, AM_ZP_X }, | ||
| 85 | [0xCE] = { "DEC", DEC, 3, 6, AM_ABS }, | ||
| 86 | [0xDE] = { "DEC", DEC, 3, 7, AM_ABS_X }, | ||
| 87 | [0xCA] = { "DEX", DEX, 1, 2, AM_NONE }, | ||
| 88 | [0x88] = { "DEY", DEY, 1, 2, AM_NONE }, | ||
| 89 | [0x49] = { "EOR", EOR, 2, 2, AM_IMM }, | ||
| 90 | [0x45] = { "EOR", EOR, 2, 3, AM_ZP }, | ||
| 91 | [0x55] = { "EOR", EOR, 2, 4, AM_ZP_X }, | ||
| 92 | [0x4D] = { "EOR", EOR, 3, 4, AM_ABS }, | ||
| 93 | [0x5D] = { "EOR", EOR, 3, 4, AM_ABS_X }, | ||
| 94 | [0x59] = { "EOR", EOR, 3, 4, AM_ABS_Y }, | ||
| 95 | [0x41] = { "EOR", EOR, 2, 6, AM_IND_X }, | ||
| 96 | [0x51] = { "EOR", EOR, 2, 5, AM_IND_Y }, | ||
| 97 | [0xE6] = { "INC", INC, 2, 5, AM_ZP }, | ||
| 98 | [0xF6] = { "INC", INC, 2, 6, AM_ZP_X }, | ||
| 99 | [0xEE] = { "INC", INC, 3, 6, AM_ABS }, | ||
| 100 | [0xFE] = { "INC", INC, 3, 7, AM_ABS_X }, | ||
| 101 | [0xE8] = { "INX", INX, 1, 2, AM_NONE }, | ||
| 102 | [0xC8] = { "INY", INY, 1, 2, AM_NONE }, | ||
| 103 | [0x4C] = { "JMP", JMP, 3, 3, AM_ABS }, | ||
| 104 | [0x6C] = { "JMP", JMP, 3, 5, AM_IND }, | ||
| 105 | [0x20] = { "JSR", JSR, 3, 6, AM_ABS }, | ||
| 106 | [0xA9] = { "LDA", LDA, 2, 2, AM_IMM }, | ||
| 107 | [0xA5] = { "LDA", LDA, 2, 3, AM_ZP }, | ||
| 108 | [0xB5] = { "LDA", LDA, 2, 4, AM_ZP_X }, | ||
| 109 | [0xAD] = { "LDA", LDA, 3, 4, AM_ABS }, | ||
| 110 | [0xBD] = { "LDA", LDA, 3, 4, AM_ABS_X }, | ||
| 111 | [0xB9] = { "LDA", LDA, 3, 4, AM_ABS_Y }, | ||
| 112 | [0xA1] = { "LDA", LDA, 2, 6, AM_IND_X }, | ||
| 113 | [0xB1] = { "LDA", LDA, 2, 5, AM_IND_Y }, | ||
| 114 | [0xA2] = { "LDX", LDX, 2, 2, AM_IMM }, | ||
| 115 | [0xA6] = { "LDX", LDX, 2, 3, AM_ZP }, | ||
| 116 | [0xB6] = { "LDX", LDX, 2, 4, AM_ZP_Y }, | ||
| 117 | [0xAE] = { "LDX", LDX, 3, 4, AM_ABS }, | ||
| 118 | [0xBE] = { "LDX", LDX, 3, 4, AM_ABS_Y }, | ||
| 119 | [0xA0] = { "LDY", LDY, 2, 2, AM_IMM }, | ||
| 120 | [0xA4] = { "LDY", LDY, 2, 3, AM_ZP }, | ||
| 121 | [0xB4] = { "LDY", LDY, 2, 4, AM_ZP_X }, | ||
| 122 | [0xAC] = { "LDY", LDY, 3, 4, AM_ABS }, | ||
| 123 | [0xBC] = { "LDY", LDY, 3, 4, AM_ABS_X }, | ||
| 124 | [0x4A] = { "LSR", LSR_acc, 1, 2, AM_ACC }, | ||
| 125 | [0x46] = { "LSR", LSR, 2, 5, AM_ZP }, | ||
| 126 | [0x56] = { "LSR", LSR, 2, 6, AM_ZP_X }, | ||
| 127 | [0x4E] = { "LSR", LSR, 3, 6, AM_ABS }, | ||
| 128 | [0x5E] = { "LSR", LSR, 3, 7, AM_ABS_X }, | ||
| 129 | [0xEA] = { "NOP", NOP, 1, 2, AM_NONE }, | ||
| 130 | [0x09] = { "ORA", ORA, 2, 2, AM_IMM }, | ||
| 131 | [0x05] = { "ORA", ORA, 2, 3, AM_ZP }, | ||
| 132 | [0x15] = { "ORA", ORA, 2, 4, AM_ZP_X }, | ||
| 133 | [0x0D] = { "ORA", ORA, 3, 4, AM_ABS }, | ||
| 134 | [0x1D] = { "ORA", ORA, 3, 4, AM_ABS_X }, | ||
| 135 | [0x19] = { "ORA", ORA, 3, 4, AM_ABS_Y }, | ||
| 136 | [0x01] = { "ORA", ORA, 2, 6, AM_IND_X }, | ||
| 137 | [0x11] = { "ORA", ORA, 2, 5, AM_IND_Y }, | ||
| 138 | [0x48] = { "PHA", PHA, 1, 3, AM_NONE }, | ||
| 139 | [0x08] = { "PHP", PHP, 1, 3, AM_NONE }, | ||
| 140 | [0x68] = { "PLA", PLA, 1, 4, AM_NONE }, | ||
| 141 | [0x28] = { "PLP", PLP, 1, 4, AM_NONE }, | ||
| 142 | [0x2A] = { "ROL", ROL_acc, 1, 2, AM_ACC }, | ||
| 143 | [0x26] = { "ROL", ROL, 2, 5, AM_ZP }, | ||
| 144 | [0x36] = { "ROL", ROL, 2, 6, AM_ZP_X }, | ||
| 145 | [0x2E] = { "ROL", ROL, 3, 6, AM_ABS }, | ||
| 146 | [0x3E] = { "ROL", ROL, 3, 7, AM_ABS_X }, | ||
| 147 | [0x6A] = { "ROR", ROR_acc, 1, 2, AM_ACC }, | ||
| 148 | [0x66] = { "ROR", ROR, 2, 5, AM_ZP }, | ||
| 149 | [0x76] = { "ROR", ROR, 2, 6, AM_ZP_X }, | ||
| 150 | [0x6E] = { "ROR", ROR, 3, 6, AM_ABS }, | ||
| 151 | [0x7E] = { "ROR", ROR, 3, 7, AM_ABS_X }, | ||
| 152 | [0x40] = { "RTI", RTI, 1, 6, AM_NONE }, | ||
| 153 | [0x60] = { "RTS", RTS, 1, 6, AM_NONE }, | ||
| 154 | [0xE9] = { "SBC", SBC, 2, 2, AM_IMM }, | ||
| 155 | [0xE5] = { "SBC", SBC, 2, 3, AM_ZP }, | ||
| 156 | [0xF5] = { "SBC", SBC, 2, 4, AM_ZP_X }, | ||
| 157 | [0xED] = { "SBC", SBC, 3, 4, AM_ABS }, | ||
| 158 | [0xFD] = { "SBC", SBC, 3, 4, AM_ABS_X }, | ||
| 159 | [0xF9] = { "SBC", SBC, 3, 4, AM_ABS_Y }, | ||
| 160 | [0xE1] = { "SBC", SBC, 2, 6, AM_IND_X }, | ||
| 161 | [0xF1] = { "SBC", SBC, 2, 5, AM_IND_Y }, | ||
| 162 | [0x38] = { "SEC", SEC, 1, 2, AM_NONE }, | ||
| 163 | [0xF8] = { "SED", SED, 1, 2, AM_NONE }, | ||
| 164 | [0x78] = { "SEI", SEI, 1, 2, AM_NONE }, | ||
| 165 | [0x85] = { "STA", STA, 2, 3, AM_ZP }, | ||
| 166 | [0x95] = { "STA", STA, 2, 4, AM_ZP_X }, | ||
| 167 | [0x8D] = { "STA", STA, 3, 4, AM_ABS }, | ||
| 168 | [0x9D] = { "STA", STA, 3, 5, AM_ABS_X }, | ||
| 169 | [0x99] = { "STA", STA, 3, 5, AM_ABS_Y }, | ||
| 170 | [0x81] = { "STA", STA, 2, 6, AM_IND_X }, | ||
| 171 | [0x91] = { "STA", STA, 2, 6, AM_IND_Y }, | ||
| 172 | [0x86] = { "STX", STX, 2, 3, AM_ZP }, | ||
| 173 | [0x96] = { "STX", STX, 2, 4, AM_ZP_Y }, | ||
| 174 | [0x8E] = { "STX", STX, 3, 4, AM_ABS }, | ||
| 175 | [0x84] = { "STY", STY, 2, 3, AM_ZP }, | ||
| 176 | [0x94] = { "STY", STY, 2, 4, AM_ZP_X }, | ||
| 177 | [0x8C] = { "STY", STY, 3, 4, AM_ABS }, | ||
| 178 | [0xAA] = { "TAX", TAX, 1, 2, AM_NONE }, | ||
| 179 | [0xA8] = { "TAY", TAY, 1, 2, AM_NONE }, | ||
| 180 | [0xBA] = { "TSX", TSX, 1, 2, AM_NONE }, | ||
| 181 | [0x8A] = { "TXA", TXA, 1, 2, AM_NONE }, | ||
| 182 | [0x9A] = { "TXS", TXS, 1, 2, AM_NONE }, | ||
| 183 | [0x98] = { "TYA", TYA, 1, 2, AM_NONE }, | ||
| 184 | }; | ||
