summaryrefslogtreecommitdiff
path: root/cpu.c
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 /cpu.c
parentdd757c4324f856c8f91d79a4f741d8bb6477064a (diff)
add lda immediate and brk
Diffstat (limited to 'cpu.c')
-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];
40/* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */ 40/* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */
41uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; 41uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 };
42 42
43void brk(void)
44{
45 /* TODO: push regs.pc and regs.status to stack and load IRQ vector */
46 regs.status.brk = 1;
47 return;
48}
49
50void lda(enum addressing_mode mode)
51{
52 uint8_t val;
53
54 switch (mode) {
55 case AM_IMMEDIATE: /* $A9 */
56 val = program[regs.pc++];
57 regs.acc = val;
58 break;
59 case AM_ZERO_PAGE: /* $A5 */
60 case AM_ZERO_PAGE_X: /* $B5 */
61 case AM_ABSOLUTE: /* $AD */
62 case AM_ABSOLUTE_X: /* $BD */
63 case AM_ABSOLUTE_Y: /* $B9 */
64 case AM_INDIRECT_X: /* $A1 */
65 case AM_INDIRECT_Y: /* $B1 */
66 /* TODO */
67 break;
68 default:
69 return;
70 }
71
72 regs.status.zero = regs.acc == 0;
73 regs.status.negative = (regs.acc & (1 << 7)) != 0;
74}
75
43void interpret(void) 76void interpret(void)
44{ 77{
45 uint8_t opcode; 78 uint8_t opcode;
@@ -49,6 +82,33 @@ void interpret(void)
49 opcode = program[regs.pc++]; 82 opcode = program[regs.pc++];
50 83
51 switch (opcode) { 84 switch (opcode) {
85 case 0x00:
86 brk();
87 return;
88 case 0xa9:
89 lda(AM_IMMEDIATE);
90 break;
91 case 0xa5:
92 lda(AM_ZERO_PAGE);
93 break;
94 case 0xb5:
95 lda(AM_ZERO_PAGE_X);
96 break;
97 case 0xad:
98 lda(AM_ABSOLUTE);
99 break;
100 case 0xbd:
101 lda(AM_ABSOLUTE_X);
102 break;
103 case 0xb9:
104 lda(AM_ABSOLUTE_Y);
105 break;
106 case 0xa1:
107 lda(AM_INDIRECT_X);
108 break;
109 case 0xb1:
110 lda(AM_INDIRECT_Y);
111 break;
52 default: 112 default:
53 break; 113 break;
54 } 114 }