changeset 777:79b10b421d3c

Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
author Michael Pavone <pavone@retrodev.com>
date Mon, 20 Jul 2015 21:43:17 -0700
parents cbf97d335444
children 6e1711d56633
files blastem.c romdb.c
diffstat 2 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Mon Jul 20 21:15:34 2015 -0700
+++ b/blastem.c	Mon Jul 20 21:43:17 2015 -0700
@@ -110,7 +110,7 @@
 			return load_smd_rom(filesize, f);
 		}
 	}
-	cart = malloc(filesize);
+	cart = malloc(nearest_pow2(filesize));
 	if (filesize != fread(cart, 1, filesize, f)) {
 		fprintf(stderr, "Error reading from %s\n", filename);
 		exit(1);
@@ -760,7 +760,7 @@
 	z80_context * context = vcontext;
 
 	context->bank_reg = (context->bank_reg >> 1 | value << 8) & 0x1FF;
-	if (context->bank_reg < 0x80) {
+	if (context->bank_reg < 0x100) {
 		genesis_context *gen = context->system;
 		context->mem_pointers[1] = get_native_pointer(context->bank_reg << 15, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen);
 	} else {
--- a/romdb.c	Mon Jul 20 21:15:34 2015 -0700
+++ b/romdb.c	Mon Jul 20 21:43:17 2015 -0700
@@ -478,20 +478,25 @@
 
 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks)
 {
+	uint32_t rom_end = get_u32be(rom + ROM_END) + 1;
+	if (size > rom_end) {
+		rom_end = size;
+	} else if (rom_end > nearest_pow2(size)) {
+		rom_end = nearest_pow2(size);
+	}
 	if (rom[RAM_ID] == 'R' && rom[RAM_ID+1] == 'A') {
-		uint32_t rom_end = get_u32be(rom + ROM_END) + 1;
 		uint32_t ram_start = get_u32be(rom + RAM_START);
 		uint32_t ram_end = get_u32be(rom + RAM_END);
 		uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK;
 		ram_start &= 0xFFFFFE;
 		ram_end |= 1;
 		info->save_mask = ram_end - ram_start;
-		uint32_t size = info->save_mask + 1;
+		uint32_t save_size = info->save_mask + 1;
 		if (ram_flags != RAM_FLAG_BOTH) {
-			size /= 2;
+			save_size /= 2;
 		}
-		info->save_size = size;
-		info->save_buffer = malloc(size);
+		info->save_size = save_size;
+		info->save_buffer = malloc(save_size);
 		
 		info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3);
 		info->map = malloc(sizeof(memmap_chunk) * info->map_chunks);
@@ -499,7 +504,7 @@
 		memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks);
 		
 		if (ram_start >= rom_end) {
-			info->map[0].end = rom_end;
+			info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000;
 			//TODO: ROM mirroring
 			info->map[0].mask = 0xFFFFFF;
 			info->map[0].flags = MMAP_READ;
@@ -548,7 +553,7 @@
 		memset(info->map, 0, sizeof(memmap_chunk));
 		memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks);
 		
-		info->map[0].end = 0x400000;
+		info->map[0].end =rom_end > 0x400000 ? rom_end : 0x400000;
 		info->map[0].mask = 0xFFFFFF;
 		info->map[0].flags = MMAP_READ;
 		info->map[0].buffer = rom;