changeset 1415:f7d653bb8899

Move Sega mapper implementation out of romdb.c
author Michael Pavone <pavone@retrodev.com>
date Fri, 23 Jun 2017 23:16:44 -0700
parents d94855080529
children 11ac0b511cff
files Makefile romdb.c sega_mapper.c sega_mapper.h
diffstat 4 files changed, 148 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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");
--- /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;
+}
--- /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_