summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-09 16:02:04 +0530
committervin <git@vineetk.net>2024-06-09 16:02:04 +0530
commit4db0a8163e6641923466da99ff84d34dfdca44fa (patch)
tree8c00e52c2347f6be56971dd0aba1effc1c3bb02e /cpu.c
parent858cbfba48145ff9303a4127cb73911fc8904462 (diff)
implement some more instructions and branching?
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c89
1 files changed, 64 insertions, 25 deletions
diff --git a/cpu.c b/cpu.c
index 3bbfc42..c5b35f6 100644
--- a/cpu.c
+++ b/cpu.c
@@ -76,6 +76,7 @@ opcode_arg(enum addressing_mode mode)
switch (mode) {
case AM_IMM:
+ case AM_REL:
val = arg;
break;
case AM_ZP:
@@ -128,13 +129,23 @@ adc(uint8_t arg)
static void
and(uint8_t arg)
{
-/* TODO: complete this */
+ regs.a &= arg;
+
+ STATUS_UPDATE_ZERO(regs.a);
+ STATUS_UPDATE_NEGATIVE(regs.a);
}
static void
asl(uint8_t arg)
{
-/* TODO: complete this */
+ uint16_t tmp;
+
+ tmp = regs.a << 1;
+ regs.a = tmp & 0xFF;
+
+ regs.status.carry = tmp > 0xFF;
+ STATUS_UPDATE_ZERO(regs.a);
+ STATUS_UPDATE_NEGATIVE(regs.a);
}
static void
@@ -152,43 +163,51 @@ bbs(uint8_t arg)
static void
bcc(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.carry == 0)
+ regs.pc += arg;
}
static void
bcs(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.carry == 1)
+ regs.pc += arg;
}
static void
beq(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.zero == 1)
+ regs.pc += arg;
}
static void
bit(uint8_t arg)
{
-/* TODO: complete this */
+ regs.status.zero = (regs.a & arg) == 0;
+ regs.status.overflow = (arg & (1 << 6)) > 0;
+ regs.status.negative = (arg & (1 << 7)) > 0;
}
static void
bmi(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.negative == 1)
+ regs.pc += arg;
}
static void
bne(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.zero == 0)
+ regs.pc += arg;
}
static void
bpl(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.negative == 0)
+ regs.pc += arg;
}
static void
@@ -198,7 +217,7 @@ bra(uint8_t arg)
}
static void
-brk()
+brk(void)
{
/* TODO: push regs.pc and regs.status to stack and load IRQ vector */
regs.status.brk = 1;
@@ -208,55 +227,75 @@ brk()
static void
bvc(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.overflow == 0)
+ regs.pc += arg;
}
static void
bvs(uint8_t arg)
{
-/* TODO: complete this */
+ if (regs.status.overflow == 1)
+ regs.pc += arg;
}
static void
-clc(uint8_t arg)
+clc(void)
{
-/* TODO: complete this */
+ regs.status.carry = 0;
}
static void
-cld(uint8_t arg)
+cld(void)
{
-/* TODO: complete this */
+ regs.status.decimal_mode = 0;
}
static void
-cli(uint8_t arg)
+cli(void)
{
-/* TODO: complete this */
+ regs.status.interrupt_disable = 0;
}
static void
-clv(uint8_t arg)
+clv(void)
{
-/* TODO: complete this */
+ regs.status.overflow = 0;
}
static void
cmp(uint8_t arg)
{
-/* TODO: complete this */
+ uint8_t tmp;
+
+ tmp = regs.a - arg;
+
+ regs.status.carry = regs.a >= arg;
+ regs.status.zero = regs.a == arg;
+ regs.status.negative = (tmp & (1 << 7)) > 0;
}
static void
cpx(uint8_t arg)
{
-/* TODO: complete this */
+ uint8_t tmp;
+
+ tmp = regs.x - arg;
+
+ regs.status.carry = regs.x >= arg;
+ regs.status.zero = regs.x == arg;
+ regs.status.negative = (tmp & (1 << 7)) > 0;
}
static void
cpy(uint8_t arg)
{
-/* TODO: complete this */
+ uint8_t tmp;
+
+ tmp = regs.y - arg;
+
+ regs.status.carry = regs.y >= arg;
+ regs.status.zero = regs.y == arg;
+ regs.status.negative = (tmp & (1 << 7)) > 0;
}
static void
@@ -290,7 +329,7 @@ inc(uint8_t arg)
}
static void
-inx()
+inx(void)
{
regs.x++;
@@ -496,7 +535,7 @@ stz(uint8_t arg)
}
static void
-tax()
+tax(void)
{
regs.x = regs.a;