# HG changeset patch # User Michael Pavone # Date 1498285004 25200 # Node ID f7d653bb8899cda52601ecc2c7f1849fd3053eee # Parent d9485508052969d270d76d234bf832e5d86f3b59 Move Sega mapper implementation out of romdb.c diff -r d94855080529 -r f7d653bb8899 Makefile --- a/Makefile Fri Jun 23 21:48:38 2017 -0700 +++ b/Makefile Fri Jun 23 23:16:44 2017 -0700 @@ -127,7 +127,7 @@ 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 -r d94855080529 -r f7d653bb8899 romdb.c --- a/romdb.c Fri Jun 23 21:48:38 2017 -0700 +++ b/romdb.c Fri Jun 23 23:16:44 2017 -0700 @@ -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 @@ 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 -r d94855080529 -r f7d653bb8899 sega_mapper.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sega_mapper.c Fri Jun 23 23:16:44 2017 -0700 @@ -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 -r d94855080529 -r f7d653bb8899 sega_mapper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sega_mapper.h Fri Jun 23 23:16:44 2017 -0700 @@ -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_