summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--romdb.c135
-rw-r--r--sega_mapper.c135
-rw-r--r--sega_mapper.h11
4 files changed, 148 insertions, 135 deletions
diff --git a/Makefile b/Makefile
index 4339e2e..c27abee 100644
--- a/Makefile
+++ b/Makefile
@@ -127,7 +127,7 @@ Z80OBJS=z80inst.o z80_to_x86.o
AUDIOOBJS=ym2612.o psg.o wave.o
CONFIGOBJS=config.o tern.o util.o
-MAINOBJS=blastem.o system.o genesis.o debug.o gdb_remote.o vdp.o render_sdl.o ppm.o io.o romdb.o hash.o menu.o xband.o realtec.o i2c.o nor.o $(TERMINAL) $(CONFIGOBJS) gst.o $(M68KOBJS) $(TRANSOBJS) $(AUDIOOBJS)
+MAINOBJS=blastem.o system.o genesis.o debug.o gdb_remote.o vdp.o render_sdl.o ppm.o io.o romdb.o hash.o menu.o xband.o realtec.o i2c.o nor.o sega_mapper.o $(TERMINAL) $(CONFIGOBJS) gst.o $(M68KOBJS) $(TRANSOBJS) $(AUDIOOBJS)
ifeq ($(CPU),x86_64)
CFLAGS+=-DX86_64 -m64
diff --git a/romdb.c b/romdb.c
index a220f6d..b8b36fa 100644
--- a/romdb.c
+++ b/romdb.c
@@ -9,6 +9,7 @@
#include "xband.h"
#include "realtec.h"
#include "nor.h"
+#include "sega_mapper.h"
#define DOM_TITLE_START 0x120
#define DOM_TITLE_END 0x150
@@ -31,140 +32,6 @@ char const *save_type_name(uint8_t save_type)
return "SRAM";
}
-uint16_t read_sram_w(uint32_t address, m68k_context * context)
-{
- genesis_context * gen = context->system;
- address &= gen->save_ram_mask;
- switch(gen->save_type)
- {
- case RAM_FLAG_BOTH:
- return gen->save_storage[address] << 8 | gen->save_storage[address+1];
- case RAM_FLAG_EVEN:
- return gen->save_storage[address >> 1] << 8 | 0xFF;
- case RAM_FLAG_ODD:
- return gen->save_storage[address >> 1] | 0xFF00;
- }
- return 0xFFFF;//We should never get here
-}
-
-uint8_t read_sram_b(uint32_t address, m68k_context * context)
-{
- genesis_context * gen = context->system;
- address &= gen->save_ram_mask;
- switch(gen->save_type)
- {
- case RAM_FLAG_BOTH:
- return gen->save_storage[address];
- case RAM_FLAG_EVEN:
- if (address & 1) {
- return 0xFF;
- } else {
- return gen->save_storage[address >> 1];
- }
- case RAM_FLAG_ODD:
- if (address & 1) {
- return gen->save_storage[address >> 1];
- } else {
- return 0xFF;
- }
- }
- return 0xFF;//We should never get here
-}
-
-m68k_context * write_sram_area_w(uint32_t address, m68k_context * context, uint16_t value)
-{
- genesis_context * gen = context->system;
- if ((gen->bank_regs[0] & 0x3) == 1) {
- address &= gen->save_ram_mask;
- switch(gen->save_type)
- {
- case RAM_FLAG_BOTH:
- gen->save_storage[address] = value >> 8;
- gen->save_storage[address+1] = value;
- break;
- case RAM_FLAG_EVEN:
- gen->save_storage[address >> 1] = value >> 8;
- break;
- case RAM_FLAG_ODD:
- gen->save_storage[address >> 1] = value;
- break;
- }
- }
- return context;
-}
-
-m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value)
-{
- genesis_context * gen = context->system;
- if ((gen->bank_regs[0] & 0x3) == 1) {
- address &= gen->save_ram_mask;
- switch(gen->save_type)
- {
- case RAM_FLAG_BOTH:
- gen->save_storage[address] = value;
- break;
- case RAM_FLAG_EVEN:
- if (!(address & 1)) {
- gen->save_storage[address >> 1] = value;
- }
- break;
- case RAM_FLAG_ODD:
- if (address & 1) {
- gen->save_storage[address >> 1] = value;
- }
- break;
- }
- }
- return context;
-}
-
-m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
-{
- genesis_context * gen = context->system;
- address &= 0xE;
- address >>= 1;
- gen->bank_regs[address] = value;
- if (!address) {
- if (value & 1) {
- //Used for games that only use the mapper for SRAM
- if (context->mem_pointers[gen->mapper_start_index]) {
- gen->mapper_temp = context->mem_pointers[gen->mapper_start_index];
- }
- context->mem_pointers[gen->mapper_start_index] = NULL;
- //For games that need more than 4MB
- for (int i = 4; i < 8; i++)
- {
- context->mem_pointers[gen->mapper_start_index + i] = NULL;
- }
- } else {
- //Used for games that only use the mapper for SRAM
- if (!context->mem_pointers[gen->mapper_start_index]) {
- context->mem_pointers[gen->mapper_start_index] = gen->mapper_temp;
- }
- //For games that need more than 4MB
- for (int i = 4; i < 8; i++)
- {
- context->mem_pointers[gen->mapper_start_index + i] = gen->cart + 0x40000*gen->bank_regs[i];
- }
- }
- } else {
- void *new_ptr = gen->cart + 0x40000*value;
- if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
- m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);
- context->mem_pointers[gen->mapper_start_index + address] = new_ptr;
- }
- }
- return context;
-}
-
-m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value)
-{
- if (address & 1) {
- write_bank_reg_w(address, context, value);
- }
- return context;
-}
-
tern_node *load_rom_db()
{
tern_node *db = parse_bundled_config("rom.db");
diff --git a/sega_mapper.c b/sega_mapper.c
new file mode 100644
index 0000000..eb81eaa
--- /dev/null
+++ b/sega_mapper.c
@@ -0,0 +1,135 @@
+#include "genesis.h"
+
+uint16_t read_sram_w(uint32_t address, m68k_context * context)
+{
+ genesis_context * gen = context->system;
+ address &= gen->save_ram_mask;
+ switch(gen->save_type)
+ {
+ case RAM_FLAG_BOTH:
+ return gen->save_storage[address] << 8 | gen->save_storage[address+1];
+ case RAM_FLAG_EVEN:
+ return gen->save_storage[address >> 1] << 8 | 0xFF;
+ case RAM_FLAG_ODD:
+ return gen->save_storage[address >> 1] | 0xFF00;
+ }
+ return 0xFFFF;//We should never get here
+}
+
+uint8_t read_sram_b(uint32_t address, m68k_context * context)
+{
+ genesis_context * gen = context->system;
+ address &= gen->save_ram_mask;
+ switch(gen->save_type)
+ {
+ case RAM_FLAG_BOTH:
+ return gen->save_storage[address];
+ case RAM_FLAG_EVEN:
+ if (address & 1) {
+ return 0xFF;
+ } else {
+ return gen->save_storage[address >> 1];
+ }
+ case RAM_FLAG_ODD:
+ if (address & 1) {
+ return gen->save_storage[address >> 1];
+ } else {
+ return 0xFF;
+ }
+ }
+ return 0xFF;//We should never get here
+}
+
+m68k_context * write_sram_area_w(uint32_t address, m68k_context * context, uint16_t value)
+{
+ genesis_context * gen = context->system;
+ if ((gen->bank_regs[0] & 0x3) == 1) {
+ address &= gen->save_ram_mask;
+ switch(gen->save_type)
+ {
+ case RAM_FLAG_BOTH:
+ gen->save_storage[address] = value >> 8;
+ gen->save_storage[address+1] = value;
+ break;
+ case RAM_FLAG_EVEN:
+ gen->save_storage[address >> 1] = value >> 8;
+ break;
+ case RAM_FLAG_ODD:
+ gen->save_storage[address >> 1] = value;
+ break;
+ }
+ }
+ return context;
+}
+
+m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value)
+{
+ genesis_context * gen = context->system;
+ if ((gen->bank_regs[0] & 0x3) == 1) {
+ address &= gen->save_ram_mask;
+ switch(gen->save_type)
+ {
+ case RAM_FLAG_BOTH:
+ gen->save_storage[address] = value;
+ break;
+ case RAM_FLAG_EVEN:
+ if (!(address & 1)) {
+ gen->save_storage[address >> 1] = value;
+ }
+ break;
+ case RAM_FLAG_ODD:
+ if (address & 1) {
+ gen->save_storage[address >> 1] = value;
+ }
+ break;
+ }
+ }
+ return context;
+}
+
+m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
+{
+ genesis_context * gen = context->system;
+ address &= 0xE;
+ address >>= 1;
+ gen->bank_regs[address] = value;
+ if (!address) {
+ if (value & 1) {
+ //Used for games that only use the mapper for SRAM
+ if (context->mem_pointers[gen->mapper_start_index]) {
+ gen->mapper_temp = context->mem_pointers[gen->mapper_start_index];
+ }
+ context->mem_pointers[gen->mapper_start_index] = NULL;
+ //For games that need more than 4MB
+ for (int i = 4; i < 8; i++)
+ {
+ context->mem_pointers[gen->mapper_start_index + i] = NULL;
+ }
+ } else {
+ //Used for games that only use the mapper for SRAM
+ if (!context->mem_pointers[gen->mapper_start_index]) {
+ context->mem_pointers[gen->mapper_start_index] = gen->mapper_temp;
+ }
+ //For games that need more than 4MB
+ for (int i = 4; i < 8; i++)
+ {
+ context->mem_pointers[gen->mapper_start_index + i] = gen->cart + 0x40000*gen->bank_regs[i];
+ }
+ }
+ } else {
+ void *new_ptr = gen->cart + 0x40000*value;
+ if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
+ m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);
+ context->mem_pointers[gen->mapper_start_index + address] = new_ptr;
+ }
+ }
+ return context;
+}
+
+m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value)
+{
+ if (address & 1) {
+ write_bank_reg_w(address, context, value);
+ }
+ return context;
+}
diff --git a/sega_mapper.h b/sega_mapper.h
new file mode 100644
index 0000000..f18c285
--- /dev/null
+++ b/sega_mapper.h
@@ -0,0 +1,11 @@
+#ifndef SEGA_MAPPER_H_
+#define SEGA_MAPPER_H_
+
+uint16_t read_sram_w(uint32_t address, m68k_context * context);
+uint8_t read_sram_b(uint32_t address, m68k_context * context);
+m68k_context * write_sram_area_w(uint32_t address, m68k_context * context, uint16_t value);
+m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value);
+m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value);
+m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value);
+
+#endif //SEGA_MAPPER_H_