diff options
| author | vin <git@vineetk.net> | 2024-05-24 12:55:44 +0530 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-05-24 12:55:44 +0530 |
| commit | 10567e0be8402bae1cd5d267b5739e9962ea028a (patch) | |
| tree | e08e75b96217b5a0ef19bec2ff283dd1d9b7f93f /cpu.c | |
| parent | 8493837ef921880196c29f0b766bebe9d2bf33ad (diff) | |
load program rom into proper offset in memory
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 40 |
1 files changed, 24 insertions, 16 deletions
| @@ -1,5 +1,6 @@ | |||
| 1 | #include <stdint.h> | 1 | #include <stdint.h> |
| 2 | #include <stdio.h> | 2 | #include <stdio.h> |
| 3 | #include <string.h> | ||
| 3 | 4 | ||
| 4 | #define STATUS_UPDATE_ZERO(r) \ | 5 | #define STATUS_UPDATE_ZERO(r) \ |
| 5 | (regs.status.zero = r == 0) | 6 | (regs.status.zero = r == 0) |
| @@ -41,7 +42,7 @@ enum addressing_mode { | |||
| 41 | AM_INDIRECT_INDEXED, | 42 | AM_INDIRECT_INDEXED, |
| 42 | }; | 43 | }; |
| 43 | 44 | ||
| 44 | uint8_t addrbus[0x10000]; | 45 | uint8_t memory[0x10000]; |
| 45 | 46 | ||
| 46 | /* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */ | 47 | /* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */ |
| 47 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; | 48 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; |
| @@ -82,7 +83,7 @@ lda(enum addressing_mode mode) | |||
| 82 | 83 | ||
| 83 | switch (mode) { | 84 | switch (mode) { |
| 84 | case AM_IMMEDIATE: /* $A9 */ | 85 | case AM_IMMEDIATE: /* $A9 */ |
| 85 | val = program[regs.pc++]; | 86 | val = memory[regs.pc++]; |
| 86 | printf("arg1 $%02X\n", val); | 87 | printf("arg1 $%02X\n", val); |
| 87 | regs.a = val; | 88 | regs.a = val; |
| 88 | break; | 89 | break; |
| @@ -119,22 +120,9 @@ void | |||
| 119 | interpret(void) | 120 | interpret(void) |
| 120 | { | 121 | { |
| 121 | uint8_t opcode; | 122 | uint8_t opcode; |
| 122 | regs.pc = 0; | ||
| 123 | regs.status.unused = 1; | ||
| 124 | |||
| 125 | printf("Initial State:\n"); | ||
| 126 | printf("status: %i%i%i%i%i%i%i%i\n", regs.status.carry, | ||
| 127 | regs.status.zero, regs.status.interrupt_disable, | ||
| 128 | regs.status.decimal_mode, regs.status.brk, | ||
| 129 | regs.status.unused, regs.status.overflow, | ||
| 130 | regs.status.negative); | ||
| 131 | printf("A: $%02X, X: $%02X, Y: $%02X, SP: $%02X, PC: $%02X\n", | ||
| 132 | regs.a, regs.x, regs.y, regs.sp, regs.pc); | ||
| 133 | |||
| 134 | putchar('\n'); | ||
| 135 | 123 | ||
| 136 | for (;;) { | 124 | for (;;) { |
| 137 | opcode = program[regs.pc++]; | 125 | opcode = memory[regs.pc++]; |
| 138 | 126 | ||
| 139 | printf("opcode: $%02X\n", opcode); | 127 | printf("opcode: $%02X\n", opcode); |
| 140 | 128 | ||
| @@ -190,6 +178,26 @@ interpret(void) | |||
| 190 | int | 178 | int |
| 191 | main(void) | 179 | main(void) |
| 192 | { | 180 | { |
| 181 | if (sizeof(program) > (0x10000 - 0x8000)) { | ||
| 182 | fprintf(stderr, "program is too big for memory\n"); | ||
| 183 | return 1; | ||
| 184 | } | ||
| 185 | memcpy(memory + 0x8000, program, sizeof(program)); | ||
| 186 | regs.pc = 0x8000; | ||
| 187 | |||
| 188 | regs.status.unused = 1; | ||
| 189 | |||
| 190 | printf("Initial State:\n"); | ||
| 191 | printf("status: %i%i%i%i%i%i%i%i\n", regs.status.carry, | ||
| 192 | regs.status.zero, regs.status.interrupt_disable, | ||
| 193 | regs.status.decimal_mode, regs.status.brk, | ||
| 194 | regs.status.unused, regs.status.overflow, | ||
| 195 | regs.status.negative); | ||
| 196 | printf("A: $%02X, X: $%02X, Y: $%02X, SP: $%02X, PC: $%02X\n", | ||
| 197 | regs.a, regs.x, regs.y, regs.sp, regs.pc); | ||
| 198 | |||
| 199 | putchar('\n'); | ||
| 200 | |||
| 193 | interpret(); | 201 | interpret(); |
| 194 | 202 | ||
| 195 | return 0; | 203 | return 0; |
