summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-05-24 11:50:08 +0530
committervin <git@vineetk.net>2024-05-24 11:50:08 +0530
commit24ca08a83d8b420d337d29c87d672b624890b5bf (patch)
treec2d6c7700b8a47832cdc06744717f3cf480f4b82
parentdd757c4324f856c8f91d79a4f741d8bb6477064a (diff)
add lda immediate and brk
-rw-r--r--cpu.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/cpu.c b/cpu.c
index 4a16835..0843189 100644
--- a/cpu.c
+++ b/cpu.c
@@ -40,6 +40,39 @@ uint8_t addrbus[0x10000];
/* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */
uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 };
+void brk(void)
+{
+ /* TODO: push regs.pc and regs.status to stack and load IRQ vector */
+ regs.status.brk = 1;
+ return;
+}
+
+void lda(enum addressing_mode mode)
+{
+ uint8_t val;
+
+ switch (mode) {
+ case AM_IMMEDIATE: /* $A9 */
+ val = program[regs.pc++];
+ regs.acc = val;
+ break;
+ case AM_ZERO_PAGE: /* $A5 */
+ case AM_ZERO_PAGE_X: /* $B5 */
+ case AM_ABSOLUTE: /* $AD */
+ case AM_ABSOLUTE_X: /* $BD */
+ case AM_ABSOLUTE_Y: /* $B9 */
+ case AM_INDIRECT_X: /* $A1 */
+ case AM_INDIRECT_Y: /* $B1 */
+ /* TODO */
+ break;
+ default:
+ return;
+ }
+
+ regs.status.zero = regs.acc == 0;
+ regs.status.negative = (regs.acc & (1 << 7)) != 0;
+}
+
void interpret(void)
{
uint8_t opcode;
@@ -49,6 +82,33 @@ void interpret(void)
opcode = program[regs.pc++];
switch (opcode) {
+ case 0x00:
+ brk();
+ return;
+ case 0xa9:
+ lda(AM_IMMEDIATE);
+ break;
+ case 0xa5:
+ lda(AM_ZERO_PAGE);
+ break;
+ case 0xb5:
+ lda(AM_ZERO_PAGE_X);
+ break;
+ case 0xad:
+ lda(AM_ABSOLUTE);
+ break;
+ case 0xbd:
+ lda(AM_ABSOLUTE_X);
+ break;
+ case 0xb9:
+ lda(AM_ABSOLUTE_Y);
+ break;
+ case 0xa1:
+ lda(AM_INDIRECT_X);
+ break;
+ case 0xb1:
+ lda(AM_INDIRECT_Y);
+ break;
default:
break;
}