implement untested most of stack-related opcodes

This commit is contained in:
Vineet K 2024-06-10 22:56:06 +05:30
parent dbb952a52b
commit 3412a03a5e

127
cpu.c
View File

@ -10,6 +10,11 @@
#define STATUS_UPDATE_NEGATIVE(r) \ #define STATUS_UPDATE_NEGATIVE(r) \
(regs.status.negative = ((r & (1 << 7)) > 0)) (regs.status.negative = ((r & (1 << 7)) > 0))
#define PUSH(b) \
(memwrite(0x0100 + regs.sp--, b))
#define PULL() \
(peek(0x0100 + regs.sp++))
struct cpu_flags { struct cpu_flags {
uint8_t carry : 1; uint8_t carry : 1;
uint8_t zero : 1; uint8_t zero : 1;
@ -467,51 +472,48 @@ ora(uint8_t arg)
} }
static void static void
pha(uint8_t arg) pha(void)
{ {
/* TODO: complete this */ PUSH(regs.a);
} }
static void static void
php(uint8_t arg) php(void)
{ {
/* TODO: complete this */ uint8_t status;
status = (regs.status.carry << 7) | (regs.status.zero << 6)
| (regs.status.interrupt_disable << 5) | (regs.status.decimal_mode << 4)
| (regs.status.brk << 3) | (regs.status.unused << 2)
| (regs.status.overflow << 1) | regs.status.negative;
PUSH(status);
} }
static void static void
phx(uint8_t arg) pla(void)
{ {
/* TODO: complete this */ regs.a = PULL();
STATUS_UPDATE_ZERO(regs.a);
STATUS_UPDATE_NEGATIVE(regs.a);
} }
static void static void
phy(uint8_t arg) plp(void)
{ {
/* TODO: complete this */ uint8_t status;
}
static void status = PULL();
pla(uint8_t arg)
{
/* TODO: complete this */
}
static void regs.status.carry = (status & (1 << 7)) > 0;
plp(uint8_t arg) regs.status.zero = (status & (1 << 6)) > 0;
{ regs.status.interrupt_disable = (status & (1 << 5)) > 0;
/* TODO: complete this */ regs.status.decimal_mode = (status & (1 << 4)) > 0;
} regs.status.brk = (status & (1 << 3)) > 0;
regs.status.unused = (status & (1 << 2)) > 0;
static void regs.status.overflow = (status & (1 << 1)) > 0;
plx(uint8_t arg) regs.status.negative = (status & 1) > 0;
{
/* TODO: complete this */
}
static void
ply(uint8_t arg)
{
/* TODO: complete this */
} }
static void static void
@ -562,19 +564,19 @@ sbc(uint8_t arg)
} }
static void static void
sec(uint8_t arg) sec(void)
{ {
regs.status.carry = 1; regs.status.carry = 1;
} }
static void static void
sed(uint8_t arg) sed(void)
{ {
regs.status.decimal_mode = 1; regs.status.decimal_mode = 1;
} }
static void static void
sei(uint8_t arg) sei(void)
{ {
regs.status.interrupt_disable = 1; regs.status.interrupt_disable = 1;
} }
@ -607,7 +609,7 @@ tax(void)
} }
static void static void
tay(uint8_t arg) tay(void)
{ {
regs.y = regs.a; regs.y = regs.a;
@ -616,13 +618,16 @@ tay(uint8_t arg)
} }
static void static void
tsx(uint8_t arg) tsx(void)
{ {
/* TODO: complete this */ regs.x = PULL();
STATUS_UPDATE_ZERO(regs.x);
STATUS_UPDATE_NEGATIVE(regs.x);
} }
static void static void
txa(uint8_t arg) txa(void)
{ {
regs.a = regs.x; regs.a = regs.x;
@ -631,13 +636,13 @@ txa(uint8_t arg)
} }
static void static void
txs(uint8_t arg) txs(void)
{ {
/* TODO: complete this */ PUSH(regs.x);
} }
static void static void
tya(uint8_t arg) tya(void)
{ {
regs.a = regs.y; regs.a = regs.y;
@ -1121,35 +1126,19 @@ interpret(void)
cycles += 5; cycles += 5;
break; break;
case 0x48: case 0x48:
pha(opcode_arg(AM_ACC)); pha();
cycles += 3; cycles += 3;
break; break;
case 0x08: case 0x08:
php(opcode_arg(AM_ACC)); php();
cycles += 3;
break;
case 0xda:
phx(opcode_arg(AM_ACC));
cycles += 3;
break;
case 0x5a:
phy(opcode_arg(AM_ACC));
cycles += 3; cycles += 3;
break; break;
case 0x68: case 0x68:
pla(opcode_arg(AM_ACC)); pla();
cycles += 4; cycles += 4;
break; break;
case 0x28: case 0x28:
plp(opcode_arg(AM_ACC)); plp();
cycles += 4;
break;
case 0xfa:
plx(opcode_arg(AM_ACC));
cycles += 4;
break;
case 0x7a:
ply(opcode_arg(AM_ACC));
cycles += 4; cycles += 4;
break; break;
case 0x2a: case 0x2a:
@ -1237,15 +1226,15 @@ interpret(void)
cycles += 5; cycles += 5;
break; break;
case 0x38: case 0x38:
sec(opcode_arg(AM_ACC)); sec();
cycles += 2; cycles += 2;
break; break;
case 0xf8: case 0xf8:
sed(opcode_arg(AM_ACC)); sed();
cycles += 2; cycles += 2;
break; break;
case 0x78: case 0x78:
sei(opcode_arg(AM_ACC)); sei();
cycles += 2; cycles += 2;
break; break;
case 0x85: case 0x85:
@ -1309,23 +1298,23 @@ interpret(void)
cycles += 2; cycles += 2;
break; break;
case 0xa8: case 0xa8:
tay(opcode_arg(AM_ACC)); tay();
cycles += 2; cycles += 2;
break; break;
case 0xba: case 0xba:
tsx(opcode_arg(AM_ACC)); tsx();
cycles += 2; cycles += 2;
break; break;
case 0x8a: case 0x8a:
txa(opcode_arg(AM_ACC)); txa();
cycles += 2; cycles += 2;
break; break;
case 0x9a: case 0x9a:
txs(opcode_arg(AM_ACC)); txs();
cycles += 2; cycles += 2;
break; break;
case 0x98: case 0x98:
tya(opcode_arg(AM_ACC)); tya();
cycles += 2; cycles += 2;
break; break;
default: default:
@ -1353,6 +1342,8 @@ cpu_init(void)
memset(&regs.status, 0, sizeof(regs.status)); memset(&regs.status, 0, sizeof(regs.status));
regs.status.unused = 1; regs.status.unused = 1;
cycles += 7;
} }
int int