summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-07-04 15:06:15 -0400
committervin <git@vineetk.net>2024-07-04 15:06:15 -0400
commite1cdd7386807050bdd7db7debb902425a78e2970 (patch)
treed304c8a346d8ca991c83525cf9c3a0814469791d /cpu.c
parent4ccf9f5cee97c8c2191660a5632ab2da60757f97 (diff)
implement all of the nestest unofficial opcodes and fix branch cycles
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/cpu.c b/cpu.c
index 039337f..1345d8b 100644
--- a/cpu.c
+++ b/cpu.c
@@ -127,9 +127,7 @@ opcode_mem(enum addressing_mode mode)
val = (arg + regs.y) % 256;
break;
case AM_REL:
- val = arg + regs.pc;
- if (((regs.pc + 1) & 0xFF00) != (val & 0xFF00))
- val -= 0x0100;
+ val = (int8_t)arg + regs.pc;
break;
case AM_IMM:
case AM_ABS:
@@ -174,6 +172,9 @@ branch(uint16_t addr, bool cond)
return;
cycles++;
+ if (((regs.pc + 1) & 0xFF00) != (addr & 0xFF00))
+ cycles++;
+
regs.pc = addr;
}
@@ -277,7 +278,7 @@ BRK(uint16_t arg)
{
/* TODO: push regs.pc and regs.status to stack and load IRQ vector */
regs.status.brk = 1;
- // exit(0);
+ exit(0);
}
void
@@ -771,11 +772,11 @@ DCP(uint16_t arg)
memwrite(arg, tmp);
regs.status.carry = tmp <= regs.a;
- STATUS_UPDATE_NZ(tmp);
+ STATUS_UPDATE_NZ(regs.a - tmp);
}
void
-ISC(uint16_t arg)
+ISB(uint16_t arg)
{
INC(arg);
SBC(peek(arg));
@@ -807,7 +808,7 @@ void
RLA(uint16_t arg)
{
ROL(arg);
- AND(arg);
+ AND(peek(arg));
}
void
@@ -821,14 +822,14 @@ void
SLO(uint16_t arg)
{
ASL(arg);
- ORA(arg);
+ ORA(peek(arg));
}
void
SRE(uint16_t arg)
{
LSR(arg);
- EOR(arg);
+ EOR(peek(arg));
}
void