summaryrefslogtreecommitdiff
path: root/mapper.c
diff options
context:
space:
mode:
authorPeter Fors <peter.fors@mindkiller.com>2025-04-02 13:17:35 +0200
committerPeter Fors <peter.fors@mindkiller.com>2025-04-02 13:17:35 +0200
commit971e51eebbf088f1ac590da1fc57e803eb1ee8cf (patch)
tree887bac941f0d9e540e3b1ba5c27c6426e76746b2 /mapper.c
parent6f63478cf43d4c0b77cabe3f76710f2b9f0c912e (diff)
add mapper #66 (GXROM)
Diffstat (limited to 'mapper.c')
-rw-r--r--mapper.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/mapper.c b/mapper.c
index 0b595ff..4fb8346 100644
--- a/mapper.c
+++ b/mapper.c
@@ -3,27 +3,40 @@
#include "mapper_nrom.c"
// #include "mapper_mmc1.c"
// #include "mapper_uxrom.c"
+#include "mapper_gxrom.c"
-static void mapper_setup(struct nes_state *state) {
- printf("Mapper: %d\n", state->ines.mapper);
- switch(state->ines.mapper) {
- case 0:
- state->mapper.read = mapper_nrom_read;
- state->mapper.write = mapper_nrom_write;
- state->mapper.tick = mapper_nrom_tick;
- state->mapper.init = mapper_nrom_init;
- state->mapper.init(state);
- break;
+struct mapper_entry {
+ int id;
+ uint8_t (*read)(struct nes_state *state, uint32_t addr);
+ void (*write)(struct nes_state *state, uint32_t addr, uint8_t value);
+ void (*tick)(struct nes_state *state);
+ void (*init)(struct nes_state *state);
+};
- default:
- // fallback: NROM-compatible
- state->mapper.read = mapper_nrom_read;
- state->mapper.write = mapper_nrom_write;
- state->mapper.tick = mapper_nrom_tick;
- state->mapper.init = mapper_nrom_init;
+static struct mapper_entry mapper_table[] = {
+ { 0, mapper_nrom_read, mapper_nrom_write, mapper_nrom_tick, mapper_nrom_init },
+ { 66, mapper_66_read, mapper_66_write, mapper_66_tick, mapper_66_init },
+ // { 1, mapper_mmc1_read, ... }, etc
+};
+
+static void mapper_setup(struct nes_state *state) {
+ uint32_t mapper = state->ines.mapper;
+ for(uint32_t i = 0; i < sizeof(mapper_table)/sizeof(mapper_table[0]); i++) {
+ if(mapper_table[i].id == mapper) {
+printf("%d\n", mapper);
+ state->mapper.read = mapper_table[i].read;
+ state->mapper.write = mapper_table[i].write;
+ state->mapper.tick = mapper_table[i].tick;
+ state->mapper.init = mapper_table[i].init;
state->mapper.init(state);
- break;
+ return;
+ }
}
-}
-
+ printf("Unsupported mapper %d, falling back to NROM\n", mapper);
+ state->mapper.read = mapper_nrom_read;
+ state->mapper.write = mapper_nrom_write;
+ state->mapper.tick = mapper_nrom_tick;
+ state->mapper.init = mapper_nrom_init;
+ state->mapper.init(state);
+}