summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/cpu.c b/cpu.c
index 31f4be2..7ef4985 100644
--- a/cpu.c
+++ b/cpu.c
@@ -60,6 +60,8 @@ uint8_t memory[0x16000];
60 60
61uint32_t cycles = 0; 61uint32_t cycles = 0;
62 62
63bool page_crossed = false;
64
63static uint8_t 65static uint8_t
64peek(uint16_t addr) 66peek(uint16_t addr)
65{ 67{
@@ -124,16 +126,26 @@ opcode_mem(enum addressing_mode mode)
124 case AM_ZP_Y: 126 case AM_ZP_Y:
125 val = (arg + regs.y) % 256; 127 val = (arg + regs.y) % 256;
126 break; 128 break;
127 case AM_IMM:
128 case AM_REL: 129 case AM_REL:
130 val = arg + regs.pc;
131 if ((regs.pc + 1) & 0xFF00 != val & 0xFF00)
132 page_crossed = true;
133 break;
134 case AM_IMM:
129 case AM_ABS: 135 case AM_ABS:
130 val = arg; 136 val = arg;
131 break; 137 break;
132 case AM_ABS_X: 138 case AM_ABS_X:
133 val = arg + regs.x; 139 val = arg + regs.x;
140
141 if ((arg & 0xFF00) != (val & 0xFF00))
142 page_crossed = true;
134 break; 143 break;
135 case AM_ABS_Y: 144 case AM_ABS_Y:
136 val = arg + regs.y; 145 val = arg + regs.y;
146
147 if ((arg & 0xFF00) != (val & 0xFF00))
148 page_crossed = true;
137 break; 149 break;
138 case AM_IND: 150 case AM_IND:
139 val = peek(arg) | (peek(((arg + 1) & 0xFF) | (arg & 0xFF00)) << 8); 151 val = peek(arg) | (peek(((arg + 1) & 0xFF) | (arg & 0xFF00)) << 8);
@@ -143,6 +155,9 @@ opcode_mem(enum addressing_mode mode)
143 break; 155 break;
144 case AM_IND_Y: 156 case AM_IND_Y:
145 val = peek(arg) + peek((arg + 1) % 256) * 256 + regs.y; 157 val = peek(arg) + peek((arg + 1) % 256) * 256 + regs.y;
158
159 if (((uint16_t)(val - regs.y) & 0xFF00) != (val & 0xFF00))
160 page_crossed = true;
146 break; 161 break;
147 default: 162 default:
148 fprintf(stderr, "INVALID ADDRESSING MODE %i\n", mode); 163 fprintf(stderr, "INVALID ADDRESSING MODE %i\n", mode);
@@ -159,10 +174,6 @@ branch(uint16_t addr, bool cond)
159 return; 174 return;
160 cycles++; 175 cycles++;
161 176
162 addr += regs.pc;
163 if ((regs.pc + 1) & 0xFF00 != addr & 0xFF00)
164 cycles++;
165
166 regs.pc = addr; 177 regs.pc = addr;
167} 178}
168 179
@@ -763,7 +774,13 @@ interpret(void)
763 opcodes[op].instr(peek(arg)); 774 opcodes[op].instr(peek(arg));
764 else 775 else
765 opcodes[op].instr(arg); 776 opcodes[op].instr(arg);
777
766 cycles += opcodes[op].cycles; 778 cycles += opcodes[op].cycles;
779 if (page_crossed) {
780 if (opcodes[op].page_cross)
781 cycles++;
782 page_crossed = false;
783 }
767 } 784 }
768loop_exit: 785loop_exit:
769} 786}