diff options
| -rw-r--r-- | cpu.c | 89 | ||||
| -rw-r--r-- | opcodes.h | 305 |
2 files changed, 182 insertions, 212 deletions
| @@ -99,55 +99,6 @@ memwrite16(uint16_t addr, uint16_t word) | |||
| 99 | memory[addr + 1] = (word & 0xFF00) >> 8; | 99 | memory[addr + 1] = (word & 0xFF00) >> 8; |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | static uint8_t | ||
| 103 | opcode_arg(enum addressing_mode mode) | ||
| 104 | { | ||
| 105 | uint16_t arg, val; | ||
| 106 | |||
| 107 | if (mode != AM_ABS && mode != AM_ABS_X && mode != AM_ABS_Y) { | ||
| 108 | arg = peek(regs.pc++); | ||
| 109 | } else { | ||
| 110 | arg = peek16(regs.pc); | ||
| 111 | regs.pc += 2; | ||
| 112 | } | ||
| 113 | |||
| 114 | switch (mode) { | ||
| 115 | case AM_IMM: | ||
| 116 | case AM_REL: | ||
| 117 | val = arg; | ||
| 118 | break; | ||
| 119 | case AM_ZP: | ||
| 120 | val = peek(arg % 256); | ||
| 121 | break; | ||
| 122 | case AM_ZP_X: | ||
| 123 | val = peek((arg + regs.x) % 256); | ||
| 124 | break; | ||
| 125 | case AM_ZP_Y: | ||
| 126 | val = peek((arg + regs.y) % 256); | ||
| 127 | break; | ||
| 128 | case AM_ABS: | ||
| 129 | val = peek16(arg); | ||
| 130 | break; | ||
| 131 | case AM_ABS_X: | ||
| 132 | val = peek16(arg + regs.x); | ||
| 133 | break; | ||
| 134 | case AM_ABS_Y: | ||
| 135 | val = peek16(arg + regs.y); | ||
| 136 | break; | ||
| 137 | case AM_IND_X: | ||
| 138 | val = peek(peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256); | ||
| 139 | break; | ||
| 140 | case AM_IND_Y: | ||
| 141 | val = peek(peek(arg) + peek((arg + 1) % 256) * 256 + regs.y); | ||
| 142 | break; | ||
| 143 | default: | ||
| 144 | fprintf(stderr, "INVALID ADDRESSING MODE %i\n", mode); | ||
| 145 | abort(); | ||
| 146 | } | ||
| 147 | |||
| 148 | return val; | ||
| 149 | } | ||
| 150 | |||
| 151 | static uint16_t | 102 | static uint16_t |
| 152 | opcode_mem(enum addressing_mode mode) | 103 | opcode_mem(enum addressing_mode mode) |
| 153 | { | 104 | { |
| @@ -193,7 +144,7 @@ opcode_mem(enum addressing_mode mode) | |||
| 193 | val = peek(arg) + peek((arg + 1) % 256) * 256 + regs.y; | 144 | val = peek(arg) + peek((arg + 1) % 256) * 256 + regs.y; |
| 194 | break; | 145 | break; |
| 195 | default: | 146 | default: |
| 196 | fprintf(stderr, "opcode_mem INVALID ADDRESSING MODE %i\n", mode); | 147 | fprintf(stderr, "INVALID ADDRESSING MODE %i\n", mode); |
| 197 | abort(); | 148 | abort(); |
| 198 | } | 149 | } |
| 199 | 150 | ||
| @@ -271,7 +222,8 @@ BEQ(uint16_t arg) | |||
| 271 | void | 222 | void |
| 272 | BIT(uint16_t arg) | 223 | BIT(uint16_t arg) |
| 273 | { | 224 | { |
| 274 | uint8_t tmp = peek(arg); | 225 | uint8_t tmp = arg; |
| 226 | |||
| 275 | regs.status.zero = (regs.a & tmp) == 0; | 227 | regs.status.zero = (regs.a & tmp) == 0; |
| 276 | regs.status.overflow = (tmp & (1 << 6)) != 0; | 228 | regs.status.overflow = (tmp & (1 << 6)) != 0; |
| 277 | STATUS_UPDATE_NEGATIVE(tmp); | 229 | STATUS_UPDATE_NEGATIVE(tmp); |
| @@ -628,8 +580,18 @@ RTS(uint16_t arg) | |||
| 628 | void | 580 | void |
| 629 | SBC(uint16_t arg) | 581 | SBC(uint16_t arg) |
| 630 | { | 582 | { |
| 631 | /* SBC is described online as ADC with argument as two's complement */ | 583 | uint8_t tmp = arg & 0xFF; |
| 632 | ADC(~(uint8_t)arg); | 584 | uint16_t diff; |
| 585 | |||
| 586 | diff = regs.a - tmp - !regs.status.carry; | ||
| 587 | |||
| 588 | regs.status.carry = diff > 0xFF; | ||
| 589 | regs.status.carry = !regs.status.carry; | ||
| 590 | /* overflow flag formula: https://stackoverflow.com/a/29224684 */ | ||
| 591 | regs.status.overflow = ((regs.a ^ arg) & (regs.a ^ diff) & 0x80) != 0; | ||
| 592 | regs.a = diff & 0xFF; | ||
| 593 | |||
| 594 | STATUS_UPDATE_NZ(regs.a); | ||
| 633 | } | 595 | } |
| 634 | 596 | ||
| 635 | void | 597 | void |
| @@ -759,10 +721,10 @@ interpret(void) | |||
| 759 | printf("$%04X", arg); | 721 | printf("$%04X", arg); |
| 760 | break; | 722 | break; |
| 761 | case AM_ABS_X: | 723 | case AM_ABS_X: |
| 762 | printf("$%04X,X", arg); | 724 | printf("$%04X,X @ %04X", arg - regs.x, arg); |
| 763 | break; | 725 | break; |
| 764 | case AM_ABS_Y: | 726 | case AM_ABS_Y: |
| 765 | printf("$%04X,Y", arg); | 727 | printf("$%04X,Y @ %04X", arg - regs.y, arg); |
| 766 | break; | 728 | break; |
| 767 | case AM_IND: | 729 | case AM_IND: |
| 768 | printf("($%04X) = %04X\t\t", arg, peek16(arg)); | 730 | printf("($%04X) = %04X\t\t", arg, peek16(arg)); |
| @@ -776,13 +738,20 @@ interpret(void) | |||
| 776 | break; | 738 | break; |
| 777 | } | 739 | } |
| 778 | 740 | ||
| 779 | if (opcodes[op].didmemory) printf(" = %02X", peek(arg)); | 741 | if (opcodes[op].memread || opcodes[op].memwrite) |
| 780 | printf("\t\t\t"); | 742 | printf(" = %02X", peek(arg)); |
| 743 | |||
| 744 | if (mode != AM_ABS_X && mode != AM_ABS_Y) | ||
| 745 | putchar('\t'); | ||
| 746 | printf("\t\t"); | ||
| 781 | 747 | ||
| 782 | printf("A:%02X X:%02X Y:%02X P:%02X SP:%02X CYC:%d %08b\n", | 748 | printf("A:%02X X:%02X Y:%02X P:%02X SP:%02X CYC:%d\n", |
| 783 | regs.a, regs.x, regs.y, STATUS_TO_INT(), regs.sp, cycles, STATUS_TO_INT()); | 749 | regs.a, regs.x, regs.y, STATUS_TO_INT(), regs.sp, cycles); |
| 784 | 750 | ||
| 785 | opcodes[op].instr(arg); | 751 | if (opcodes[op].memread) |
| 752 | opcodes[op].instr(peek(arg)); | ||
| 753 | else | ||
| 754 | opcodes[op].instr(arg); | ||
| 786 | cycles += opcodes[op].cycles; | 755 | cycles += opcodes[op].cycles; |
| 787 | } | 756 | } |
| 788 | loop_exit: | 757 | loop_exit: |
| @@ -26,161 +26,162 @@ struct opcode { | |||
| 26 | void (*instr)(uint16_t arg); | 26 | void (*instr)(uint16_t arg); |
| 27 | uint8_t bytes; | 27 | uint8_t bytes; |
| 28 | uint8_t cycles; | 28 | uint8_t cycles; |
| 29 | bool didmemory; | 29 | bool memread; |
| 30 | bool memwrite; | ||
| 30 | enum addressing_mode mode; | 31 | enum addressing_mode mode; |
| 31 | }; | 32 | }; |
| 32 | 33 | ||
| 33 | struct opcode opcodes[0x100] = { | 34 | struct opcode opcodes[0x100] = { |
| 34 | /* official opcodes */ | 35 | /* official opcodes */ |
| 35 | [0x69] = { "ADC", ADC, 2, 2, false, AM_IMM }, | 36 | [0x69] = { "ADC", ADC, 2, 2, false, false, AM_IMM }, |
| 36 | [0x65] = { "ADC", ADC, 2, 3, false, AM_ZP }, | 37 | [0x65] = { "ADC", ADC, 2, 3, false, false, AM_ZP }, |
| 37 | [0x75] = { "ADC", ADC, 2, 4, false, AM_ZP_X }, | 38 | [0x75] = { "ADC", ADC, 2, 4, false, false, AM_ZP_X }, |
| 38 | [0x6D] = { "ADC", ADC, 3, 4, false, AM_ABS }, | 39 | [0x6D] = { "ADC", ADC, 3, 4, false, false, AM_ABS }, |
| 39 | [0x7D] = { "ADC", ADC, 3, 4, false, AM_ABS_X }, | 40 | [0x7D] = { "ADC", ADC, 3, 4, false, false, AM_ABS_X }, |
| 40 | [0x79] = { "ADC", ADC, 3, 4, false, AM_ABS_Y }, | 41 | [0x79] = { "ADC", ADC, 3, 4, false, false, AM_ABS_Y }, |
| 41 | [0x61] = { "ADC", ADC, 2, 6, false, AM_IND_X }, | 42 | [0x61] = { "ADC", ADC, 2, 6, false, false, AM_IND_X }, |
| 42 | [0x71] = { "ADC", ADC, 2, 5, false, AM_IND_Y }, | 43 | [0x71] = { "ADC", ADC, 2, 5, false, false, AM_IND_Y }, |
| 43 | [0x29] = { "AND", AND, 2, 2, false, AM_IMM }, | 44 | [0x29] = { "AND", AND, 2, 2, false, false, AM_IMM }, |
| 44 | [0x25] = { "AND", AND, 2, 3, false, AM_ZP }, | 45 | [0x25] = { "AND", AND, 2, 3, false, false, AM_ZP }, |
| 45 | [0x35] = { "AND", AND, 2, 4, false, AM_ZP_X }, | 46 | [0x35] = { "AND", AND, 2, 4, false, false, AM_ZP_X }, |
| 46 | [0x2D] = { "AND", AND, 3, 4, false, AM_ABS }, | 47 | [0x2D] = { "AND", AND, 3, 4, false, false, AM_ABS }, |
| 47 | [0x3D] = { "AND", AND, 3, 4, false, AM_ABS_X }, | 48 | [0x3D] = { "AND", AND, 3, 4, false, false, AM_ABS_X }, |
| 48 | [0x39] = { "AND", AND, 3, 4, false, AM_ABS_Y }, | 49 | [0x39] = { "AND", AND, 3, 4, false, false, AM_ABS_Y }, |
| 49 | [0x21] = { "AND", AND, 2, 6, false, AM_IND_X }, | 50 | [0x21] = { "AND", AND, 2, 6, false, false, AM_IND_X }, |
| 50 | [0x31] = { "AND", AND, 2, 5, false, AM_IND_Y }, | 51 | [0x31] = { "AND", AND, 2, 5, false, false, AM_IND_Y }, |
| 51 | [0x0A] = { "ASL", ASL_acc, 1, 2, false, AM_ACC }, | 52 | [0x0A] = { "ASL", ASL_acc, 1, 2, false, false, AM_ACC }, |
| 52 | [0x06] = { "ASL", ASL, 2, 5, true, AM_ZP }, | 53 | [0x06] = { "ASL", ASL, 2, 5, false, true, AM_ZP }, |
| 53 | [0x16] = { "ASL", ASL, 2, 6, true, AM_ZP_X }, | 54 | [0x16] = { "ASL", ASL, 2, 6, false, true, AM_ZP_X }, |
| 54 | [0x0E] = { "ASL", ASL, 3, 6, true, AM_ABS }, | 55 | [0x0E] = { "ASL", ASL, 3, 6, false, true, AM_ABS }, |
| 55 | [0x1E] = { "ASL", ASL, 3, 7, true, AM_ABS_X }, | 56 | [0x1E] = { "ASL", ASL, 3, 7, false, true, AM_ABS_X }, |
| 56 | [0x90] = { "BCC", BCC, 2, 2, false, AM_REL }, | 57 | [0x90] = { "BCC", BCC, 2, 2, false, false, AM_REL }, |
| 57 | [0xB0] = { "BCS", BCS, 2, 2, false, AM_REL }, | 58 | [0xB0] = { "BCS", BCS, 2, 2, false, false, AM_REL }, |
| 58 | [0xF0] = { "BEQ", BEQ, 2, 2, false, AM_REL }, | 59 | [0xF0] = { "BEQ", BEQ, 2, 2, false, false, AM_REL }, |
| 59 | [0x24] = { "BIT", BIT, 2, 3, true, AM_ZP }, | 60 | [0x24] = { "BIT", BIT, 2, 3, true, false, AM_ZP }, |
| 60 | [0x2C] = { "BIT", BIT, 3, 4, true, AM_ABS }, | 61 | [0x2C] = { "BIT", BIT, 3, 4, true, false, AM_ABS }, |
| 61 | [0x30] = { "BMI", BMI, 2, 2, false, AM_REL }, | 62 | [0x30] = { "BMI", BMI, 2, 2, false, false, AM_REL }, |
| 62 | [0xD0] = { "BNE", BNE, 2, 2, false, AM_REL }, | 63 | [0xD0] = { "BNE", BNE, 2, 2, false, false, AM_REL }, |
| 63 | [0x10] = { "BPL", BPL, 2, 2, false, AM_REL }, | 64 | [0x10] = { "BPL", BPL, 2, 2, false, false, AM_REL }, |
| 64 | [0x00] = { "BRK", BRK, 1, 7, false, AM_NONE }, | 65 | [0x00] = { "BRK", BRK, 1, 7, false, false, AM_NONE }, |
| 65 | [0x50] = { "BVC", BVC, 2, 2, false, AM_REL }, | 66 | [0x50] = { "BVC", BVC, 2, 2, false, false, AM_REL }, |
| 66 | [0x70] = { "BVS", BVS, 2, 2, false, AM_REL }, | 67 | [0x70] = { "BVS", BVS, 2, 2, false, false, AM_REL }, |
| 67 | [0x18] = { "CLC", CLC, 1, 2, false, AM_NONE }, | 68 | [0x18] = { "CLC", CLC, 1, 2, false, false, AM_NONE }, |
| 68 | [0xD8] = { "CLD", CLD, 1, 2, false, AM_NONE }, | 69 | [0xD8] = { "CLD", CLD, 1, 2, false, false, AM_NONE }, |
| 69 | [0x58] = { "CLI", CLI, 1, 2, false, AM_NONE }, | 70 | [0x58] = { "CLI", CLI, 1, 2, false, false, AM_NONE }, |
| 70 | [0xB8] = { "CLV", CLV, 1, 2, false, AM_NONE }, | 71 | [0xB8] = { "CLV", CLV, 1, 2, false, false, AM_NONE }, |
| 71 | [0xC9] = { "CMP", CMP, 2, 2, false, AM_IMM }, | 72 | [0xC9] = { "CMP", CMP, 2, 2, false, false, AM_IMM }, |
| 72 | [0xC5] = { "CMP", CMP, 2, 3, false, AM_ZP }, | 73 | [0xC5] = { "CMP", CMP, 2, 3, false, false, AM_ZP }, |
| 73 | [0xD5] = { "CMP", CMP, 2, 4, false, AM_ZP_X }, | 74 | [0xD5] = { "CMP", CMP, 2, 4, false, false, AM_ZP_X }, |
| 74 | [0xCD] = { "CMP", CMP, 3, 4, false, AM_ABS }, | 75 | [0xCD] = { "CMP", CMP, 3, 4, false, false, AM_ABS }, |
| 75 | [0xDD] = { "CMP", CMP, 3, 4, false, AM_ABS_X }, | 76 | [0xDD] = { "CMP", CMP, 3, 4, false, false, AM_ABS_X }, |
| 76 | [0xD9] = { "CMP", CMP, 3, 4, false, AM_ABS_Y }, | 77 | [0xD9] = { "CMP", CMP, 3, 4, false, false, AM_ABS_Y }, |
| 77 | [0xC1] = { "CMP", CMP, 2, 6, false, AM_IND_X }, | 78 | [0xC1] = { "CMP", CMP, 2, 6, false, false, AM_IND_X }, |
| 78 | [0xD1] = { "CMP", CMP, 2, 5, false, AM_IND_Y }, | 79 | [0xD1] = { "CMP", CMP, 2, 5, false, false, AM_IND_Y }, |
| 79 | [0xE0] = { "CPX", CPX, 2, 2, false, AM_IMM }, | 80 | [0xE0] = { "CPX", CPX, 2, 2, false, false, AM_IMM }, |
| 80 | [0xE4] = { "CPX", CPX, 2, 3, false, AM_ZP }, | 81 | [0xE4] = { "CPX", CPX, 2, 3, false, false, AM_ZP }, |
| 81 | [0xEC] = { "CPX", CPX, 3, 4, false, AM_ABS }, | 82 | [0xEC] = { "CPX", CPX, 3, 4, false, false, AM_ABS }, |
| 82 | [0xC0] = { "CPY", CPY, 2, 2, false, AM_IMM }, | 83 | [0xC0] = { "CPY", CPY, 2, 2, false, false, AM_IMM }, |
| 83 | [0xC4] = { "CPY", CPY, 2, 3, false, AM_ZP }, | 84 | [0xC4] = { "CPY", CPY, 2, 3, false, false, AM_ZP }, |
| 84 | [0xCC] = { "CPY", CPY, 3, 4, false, AM_ABS }, | 85 | [0xCC] = { "CPY", CPY, 3, 4, false, false, AM_ABS }, |
| 85 | [0xC6] = { "DEC", DEC, 2, 5, true, AM_ZP }, | 86 | [0xC6] = { "DEC", DEC, 2, 5, false, true, AM_ZP }, |
| 86 | [0xD6] = { "DEC", DEC, 2, 6, true, AM_ZP_X }, | 87 | [0xD6] = { "DEC", DEC, 2, 6, false, true, AM_ZP_X }, |
| 87 | [0xCE] = { "DEC", DEC, 3, 6, true, AM_ABS }, | 88 | [0xCE] = { "DEC", DEC, 3, 6, false, true, AM_ABS }, |
| 88 | [0xDE] = { "DEC", DEC, 3, 7, true, AM_ABS_X }, | 89 | [0xDE] = { "DEC", DEC, 3, 7, false, true, AM_ABS_X }, |
| 89 | [0xCA] = { "DEX", DEX, 1, 2, false, AM_NONE }, | 90 | [0xCA] = { "DEX", DEX, 1, 2, false, false, AM_NONE }, |
| 90 | [0x88] = { "DEY", DEY, 1, 2, false, AM_NONE }, | 91 | [0x88] = { "DEY", DEY, 1, 2, false, false, AM_NONE }, |
| 91 | [0x49] = { "EOR", EOR, 2, 2, false, AM_IMM }, | 92 | [0x49] = { "EOR", EOR, 2, 2, false, false, AM_IMM }, |
| 92 | [0x45] = { "EOR", EOR, 2, 3, false, AM_ZP }, | 93 | [0x45] = { "EOR", EOR, 2, 3, false, false, AM_ZP }, |
| 93 | [0x55] = { "EOR", EOR, 2, 4, false, AM_ZP_X }, | 94 | [0x55] = { "EOR", EOR, 2, 4, false, false, AM_ZP_X }, |
| 94 | [0x4D] = { "EOR", EOR, 3, 4, false, AM_ABS }, | 95 | [0x4D] = { "EOR", EOR, 3, 4, false, false, AM_ABS }, |
| 95 | [0x5D] = { "EOR", EOR, 3, 4, false, AM_ABS_X }, | 96 | [0x5D] = { "EOR", EOR, 3, 4, false, false, AM_ABS_X }, |
| 96 | [0x59] = { "EOR", EOR, 3, 4, false, AM_ABS_Y }, | 97 | [0x59] = { "EOR", EOR, 3, 4, false, false, AM_ABS_Y }, |
| 97 | [0x41] = { "EOR", EOR, 2, 6, false, AM_IND_X }, | 98 | [0x41] = { "EOR", EOR, 2, 6, false, false, AM_IND_X }, |
| 98 | [0x51] = { "EOR", EOR, 2, 5, false, AM_IND_Y }, | 99 | [0x51] = { "EOR", EOR, 2, 5, false, false, AM_IND_Y }, |
| 99 | [0xE6] = { "INC", INC, 2, 5, true, AM_ZP }, | 100 | [0xE6] = { "INC", INC, 2, 5, false, true, AM_ZP }, |
| 100 | [0xF6] = { "INC", INC, 2, 6, true, AM_ZP_X }, | 101 | [0xF6] = { "INC", INC, 2, 6, false, true, AM_ZP_X }, |
| 101 | [0xEE] = { "INC", INC, 3, 6, true, AM_ABS }, | 102 | [0xEE] = { "INC", INC, 3, 6, false, true, AM_ABS }, |
| 102 | [0xFE] = { "INC", INC, 3, 7, true, AM_ABS_X }, | 103 | [0xFE] = { "INC", INC, 3, 7, false, true, AM_ABS_X }, |
| 103 | [0xE8] = { "INX", INX, 1, 2, false, AM_NONE }, | 104 | [0xE8] = { "INX", INX, 1, 2, false, false, AM_NONE }, |
| 104 | [0xC8] = { "INY", INY, 1, 2, false, AM_NONE }, | 105 | [0xC8] = { "INY", INY, 1, 2, false, false, AM_NONE }, |
| 105 | [0x4C] = { "JMP", JMP, 3, 3, false, AM_ABS }, | 106 | [0x4C] = { "JMP", JMP, 3, 3, false, false, AM_ABS }, |
| 106 | [0x6C] = { "JMP", JMP, 3, 5, false, AM_IND }, | 107 | [0x6C] = { "JMP", JMP, 3, 5, false, false, AM_IND }, |
| 107 | [0x20] = { "JSR", JSR, 3, 6, false, AM_ABS }, | 108 | [0x20] = { "JSR", JSR, 3, 6, false, false, AM_ABS }, |
| 108 | [0xA9] = { "LDA", LDA, 2, 2, false, AM_IMM }, | 109 | [0xA9] = { "LDA", LDA, 2, 2, false, false, AM_IMM }, |
| 109 | [0xA5] = { "LDA", LDA, 2, 3, false, AM_ZP }, | 110 | [0xA5] = { "LDA", LDA, 2, 3, true, false, AM_ZP }, |
| 110 | [0xB5] = { "LDA", LDA, 2, 4, false, AM_ZP_X }, | 111 | [0xB5] = { "LDA", LDA, 2, 4, true, false, AM_ZP_X }, |
| 111 | [0xAD] = { "LDA", LDA, 3, 4, false, AM_ABS }, | 112 | [0xAD] = { "LDA", LDA, 3, 4, true, false, AM_ABS }, |
| 112 | [0xBD] = { "LDA", LDA, 3, 4, false, AM_ABS_X }, | 113 | [0xBD] = { "LDA", LDA, 3, 4, true, false, AM_ABS_X }, |
| 113 | [0xB9] = { "LDA", LDA, 3, 4, false, AM_ABS_Y }, | 114 | [0xB9] = { "LDA", LDA, 3, 4, true, false, AM_ABS_Y }, |
| 114 | [0xA1] = { "LDA", LDA, 2, 6, false, AM_IND_X }, | 115 | [0xA1] = { "LDA", LDA, 2, 6, true, false, AM_IND_X }, |
| 115 | [0xB1] = { "LDA", LDA, 2, 5, false, AM_IND_Y }, | 116 | [0xB1] = { "LDA", LDA, 2, 5, true, false, AM_IND_Y }, |
| 116 | [0xA2] = { "LDX", LDX, 2, 2, false, AM_IMM }, | 117 | [0xA2] = { "LDX", LDX, 2, 2, false, false, AM_IMM }, |
| 117 | [0xA6] = { "LDX", LDX, 2, 3, true, AM_ZP }, | 118 | [0xA6] = { "LDX", LDX, 2, 3, true, false, AM_ZP }, |
| 118 | [0xB6] = { "LDX", LDX, 2, 4, false, AM_ZP_Y }, | 119 | [0xB6] = { "LDX", LDX, 2, 4, true, false, AM_ZP_Y }, |
| 119 | [0xAE] = { "LDX", LDX, 3, 4, true, AM_ABS }, | 120 | [0xAE] = { "LDX", LDX, 3, 4, true, false, AM_ABS }, |
| 120 | [0xBE] = { "LDX", LDX, 3, 4, false, AM_ABS_Y }, | 121 | [0xBE] = { "LDX", LDX, 3, 4, true, false, AM_ABS_Y }, |
| 121 | [0xA0] = { "LDY", LDY, 2, 2, false, AM_IMM }, | 122 | [0xA0] = { "LDY", LDY, 2, 2, false, false, AM_IMM }, |
| 122 | [0xA4] = { "LDY", LDY, 2, 3, false, AM_ZP }, | 123 | [0xA4] = { "LDY", LDY, 2, 3, true, false, AM_ZP }, |
| 123 | [0xB4] = { "LDY", LDY, 2, 4, false, AM_ZP_X }, | 124 | [0xB4] = { "LDY", LDY, 2, 4, true, false, AM_ZP_X }, |
| 124 | [0xAC] = { "LDY", LDY, 3, 4, false, AM_ABS }, | 125 | [0xAC] = { "LDY", LDY, 3, 4, true, false, AM_ABS }, |
| 125 | [0xBC] = { "LDY", LDY, 3, 4, false, AM_ABS_X }, | 126 | [0xBC] = { "LDY", LDY, 3, 4, true, false, AM_ABS_X }, |
| 126 | [0x4A] = { "LSR", LSR_acc, 1, 2, false, AM_ACC }, | 127 | [0x4A] = { "LSR", LSR_acc, 1, 2, false, false, AM_ACC }, |
| 127 | [0x46] = { "LSR", LSR, 2, 5, true, AM_ZP }, | 128 | [0x46] = { "LSR", LSR, 2, 5, false, true, AM_ZP }, |
| 128 | [0x56] = { "LSR", LSR, 2, 6, true, AM_ZP_X }, | 129 | [0x56] = { "LSR", LSR, 2, 6, false, true, AM_ZP_X }, |
| 129 | [0x4E] = { "LSR", LSR, 3, 6, true, AM_ABS }, | 130 | [0x4E] = { "LSR", LSR, 3, 6, false, true, AM_ABS }, |
| 130 | [0x5E] = { "LSR", LSR, 3, 7, true, AM_ABS_X }, | 131 | [0x5E] = { "LSR", LSR, 3, 7, false, true, AM_ABS_X }, |
| 131 | [0xEA] = { "NOP", NOP, 1, 2, false, AM_NONE }, | 132 | [0xEA] = { "NOP", NOP, 1, 2, false, false, AM_NONE }, |
| 132 | [0x09] = { "ORA", ORA, 2, 2, false, AM_IMM }, | 133 | [0x09] = { "ORA", ORA, 2, 2, false, false, AM_IMM }, |
| 133 | [0x05] = { "ORA", ORA, 2, 3, false, AM_ZP }, | 134 | [0x05] = { "ORA", ORA, 2, 3, false, false, AM_ZP }, |
| 134 | [0x15] = { "ORA", ORA, 2, 4, false, AM_ZP_X }, | 135 | [0x15] = { "ORA", ORA, 2, 4, false, false, AM_ZP_X }, |
| 135 | [0x0D] = { "ORA", ORA, 3, 4, false, AM_ABS }, | 136 | [0x0D] = { "ORA", ORA, 3, 4, false, false, AM_ABS }, |
| 136 | [0x1D] = { "ORA", ORA, 3, 4, false, AM_ABS_X }, | 137 | [0x1D] = { "ORA", ORA, 3, 4, false, false, AM_ABS_X }, |
| 137 | [0x19] = { "ORA", ORA, 3, 4, false, AM_ABS_Y }, | 138 | [0x19] = { "ORA", ORA, 3, 4, false, false, AM_ABS_Y }, |
| 138 | [0x01] = { "ORA", ORA, 2, 6, false, AM_IND_X }, | 139 | [0x01] = { "ORA", ORA, 2, 6, false, false, AM_IND_X }, |
| 139 | [0x11] = { "ORA", ORA, 2, 5, false, AM_IND_Y }, | 140 | [0x11] = { "ORA", ORA, 2, 5, false, false, AM_IND_Y }, |
| 140 | [0x48] = { "PHA", PHA, 1, 3, false, AM_NONE }, | 141 | [0x48] = { "PHA", PHA, 1, 3, false, false, AM_NONE }, |
| 141 | [0x08] = { "PHP", PHP, 1, 3, false, AM_NONE }, | 142 | [0x08] = { "PHP", PHP, 1, 3, false, false, AM_NONE }, |
| 142 | [0x68] = { "PLA", PLA, 1, 4, false, AM_NONE }, | 143 | [0x68] = { "PLA", PLA, 1, 4, false, false, AM_NONE }, |
| 143 | [0x28] = { "PLP", PLP, 1, 4, false, AM_NONE }, | 144 | [0x28] = { "PLP", PLP, 1, 4, false, false, AM_NONE }, |
| 144 | [0x2A] = { "ROL", ROL_acc, 1, 2, false, AM_ACC }, | 145 | [0x2A] = { "ROL", ROL_acc, 1, 2, false, false, AM_ACC }, |
| 145 | [0x26] = { "ROL", ROL, 2, 5, true, AM_ZP }, | 146 | [0x26] = { "ROL", ROL, 2, 5, false, true, AM_ZP }, |
| 146 | [0x36] = { "ROL", ROL, 2, 6, true, AM_ZP_X }, | 147 | [0x36] = { "ROL", ROL, 2, 6, false, true, AM_ZP_X }, |
| 147 | [0x2E] = { "ROL", ROL, 3, 6, true, AM_ABS }, | 148 | [0x2E] = { "ROL", ROL, 3, 6, false, true, AM_ABS }, |
| 148 | [0x3E] = { "ROL", ROL, 3, 7, true, AM_ABS_X }, | 149 | [0x3E] = { "ROL", ROL, 3, 7, false, true, AM_ABS_X }, |
| 149 | [0x6A] = { "ROR", ROR_acc, 1, 2, false, AM_ACC }, | 150 | [0x6A] = { "ROR", ROR_acc, 1, 2, false, false, AM_ACC }, |
| 150 | [0x66] = { "ROR", ROR, 2, 5, true, AM_ZP }, | 151 | [0x66] = { "ROR", ROR, 2, 5, false, true, AM_ZP }, |
| 151 | [0x76] = { "ROR", ROR, 2, 6, true, AM_ZP_X }, | 152 | [0x76] = { "ROR", ROR, 2, 6, false, true, AM_ZP_X }, |
| 152 | [0x6E] = { "ROR", ROR, 3, 6, true, AM_ABS }, | 153 | [0x6E] = { "ROR", ROR, 3, 6, false, true, AM_ABS }, |
| 153 | [0x7E] = { "ROR", ROR, 3, 7, true, AM_ABS_X }, | 154 | [0x7E] = { "ROR", ROR, 3, 7, false, true, AM_ABS_X }, |
| 154 | [0x40] = { "RTI", RTI, 1, 6, false, AM_NONE }, | 155 | [0x40] = { "RTI", RTI, 1, 6, false, false, AM_NONE }, |
| 155 | [0x60] = { "RTS", RTS, 1, 6, false, AM_NONE }, | 156 | [0x60] = { "RTS", RTS, 1, 6, false, false, AM_NONE }, |
| 156 | [0xE9] = { "SBC", SBC, 2, 2, false, AM_IMM }, | 157 | [0xE9] = { "SBC", SBC, 2, 2, false, false, AM_IMM }, |
| 157 | [0xE5] = { "SBC", SBC, 2, 3, false, AM_ZP }, | 158 | [0xE5] = { "SBC", SBC, 2, 3, false, false, AM_ZP }, |
| 158 | [0xF5] = { "SBC", SBC, 2, 4, false, AM_ZP_X }, | 159 | [0xF5] = { "SBC", SBC, 2, 4, false, false, AM_ZP_X }, |
| 159 | [0xED] = { "SBC", SBC, 3, 4, false, AM_ABS }, | 160 | [0xED] = { "SBC", SBC, 3, 4, false, false, AM_ABS }, |
| 160 | [0xFD] = { "SBC", SBC, 3, 4, false, AM_ABS_X }, | 161 | [0xFD] = { "SBC", SBC, 3, 4, false, false, AM_ABS_X }, |
| 161 | [0xF9] = { "SBC", SBC, 3, 4, false, AM_ABS_Y }, | 162 | [0xF9] = { "SBC", SBC, 3, 4, false, false, AM_ABS_Y }, |
| 162 | [0xE1] = { "SBC", SBC, 2, 6, false, AM_IND_X }, | 163 | [0xE1] = { "SBC", SBC, 2, 6, false, false, AM_IND_X }, |
| 163 | [0xF1] = { "SBC", SBC, 2, 5, false, AM_IND_Y }, | 164 | [0xF1] = { "SBC", SBC, 2, 5, false, false, AM_IND_Y }, |
| 164 | [0x38] = { "SEC", SEC, 1, 2, false, AM_NONE }, | 165 | [0x38] = { "SEC", SEC, 1, 2, false, false, AM_NONE }, |
| 165 | [0xF8] = { "SED", SED, 1, 2, false, AM_NONE }, | 166 | [0xF8] = { "SED", SED, 1, 2, false, false, AM_NONE }, |
| 166 | [0x78] = { "SEI", SEI, 1, 2, false, AM_NONE }, | 167 | [0x78] = { "SEI", SEI, 1, 2, false, false, AM_NONE }, |
| 167 | [0x85] = { "STA", STA, 2, 3, true, AM_ZP }, | 168 | [0x85] = { "STA", STA, 2, 3, false, true, AM_ZP }, |
| 168 | [0x95] = { "STA", STA, 2, 4, true, AM_ZP_X }, | 169 | [0x95] = { "STA", STA, 2, 4, false, true, AM_ZP_X }, |
| 169 | [0x8D] = { "STA", STA, 3, 4, true, AM_ABS }, | 170 | [0x8D] = { "STA", STA, 3, 4, false, true, AM_ABS }, |
| 170 | [0x9D] = { "STA", STA, 3, 5, true, AM_ABS_X }, | 171 | [0x9D] = { "STA", STA, 3, 5, false, true, AM_ABS_X }, |
| 171 | [0x99] = { "STA", STA, 3, 5, true, AM_ABS_Y }, | 172 | [0x99] = { "STA", STA, 3, 5, false, true, AM_ABS_Y }, |
| 172 | [0x81] = { "STA", STA, 2, 6, true, AM_IND_X }, | 173 | [0x81] = { "STA", STA, 2, 6, false, true, AM_IND_X }, |
| 173 | [0x91] = { "STA", STA, 2, 6, true, AM_IND_Y }, | 174 | [0x91] = { "STA", STA, 2, 6, false, true, AM_IND_Y }, |
| 174 | [0x86] = { "STX", STX, 2, 3, true, AM_ZP }, | 175 | [0x86] = { "STX", STX, 2, 3, false, true, AM_ZP }, |
| 175 | [0x96] = { "STX", STX, 2, 4, true, AM_ZP_Y }, | 176 | [0x96] = { "STX", STX, 2, 4, false, true, AM_ZP_Y }, |
| 176 | [0x8E] = { "STX", STX, 3, 4, true, AM_ABS }, | 177 | [0x8E] = { "STX", STX, 3, 4, false, true, AM_ABS }, |
| 177 | [0x84] = { "STY", STY, 2, 3, true, AM_ZP }, | 178 | [0x84] = { "STY", STY, 2, 3, false, true, AM_ZP }, |
| 178 | [0x94] = { "STY", STY, 2, 4, true, AM_ZP_X }, | 179 | [0x94] = { "STY", STY, 2, 4, false, true, AM_ZP_X }, |
| 179 | [0x8C] = { "STY", STY, 3, 4, true, AM_ABS }, | 180 | [0x8C] = { "STY", STY, 3, 4, false, true, AM_ABS }, |
| 180 | [0xAA] = { "TAX", TAX, 1, 2, false, AM_NONE }, | 181 | [0xAA] = { "TAX", TAX, 1, 2, false, false, AM_NONE }, |
| 181 | [0xA8] = { "TAY", TAY, 1, 2, false, AM_NONE }, | 182 | [0xA8] = { "TAY", TAY, 1, 2, false, false, AM_NONE }, |
| 182 | [0xBA] = { "TSX", TSX, 1, 2, false, AM_NONE }, | 183 | [0xBA] = { "TSX", TSX, 1, 2, false, false, AM_NONE }, |
| 183 | [0x8A] = { "TXA", TXA, 1, 2, false, AM_NONE }, | 184 | [0x8A] = { "TXA", TXA, 1, 2, false, false, AM_NONE }, |
| 184 | [0x9A] = { "TXS", TXS, 1, 2, false, AM_NONE }, | 185 | [0x9A] = { "TXS", TXS, 1, 2, false, false, AM_NONE }, |
| 185 | [0x98] = { "TYA", TYA, 1, 2, false, AM_NONE }, | 186 | [0x98] = { "TYA", TYA, 1, 2, false, false, AM_NONE }, |
| 186 | }; | 187 | }; |
