changeset 1408:71b6e2298e4a

Better handling of S&K lock on support. Pre-combined ROMs and large (>2MB) S&K hacks should now work. Implemented correct behavior from locking on a 4MB cart
author Michael Pavone <pavone@retrodev.com>
date Mon, 19 Jun 2017 19:18:50 -0700
parents 4c58695c1e1f
children b0e0bb20fc41
files rom.db romdb.c
diffstat 2 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rom.db	Mon Jun 19 09:44:37 2017 -0700
+++ b/rom.db	Mon Jun 19 19:18:50 2017 -0700
@@ -443,6 +443,7 @@
 		200000 {
 			device LOCK-ON
 			last 3FFFFF
+			offset 200000
 		}
 	}
 }
--- a/romdb.c	Mon Jun 19 09:44:37 2017 -0700
+++ b/romdb.c	Mon Jun 19 19:18:50 2017 -0700
@@ -1028,13 +1028,22 @@
 		map->flags = MMAP_READ;
 		map->mask = calc_mask(state->rom_size - offset, start, end);
 	} else if (!strcmp(dtype, "LOCK-ON")) {
-		if (!state->lock_on) {
+		if (state->lock_on) {
+			if (state->lock_on_size > offset) {
+				map->mask = calc_mask(state->lock_on_size - offset, start, end);
+			} else {
+				map->mask = calc_mask(state->lock_on_size, start, end);
+			}
+			map->buffer = state->lock_on + (offset & (nearest_pow2(state->lock_on_size) - 1));
+		} else if (state->rom_size > start) {
+			//This is a bit of a hack to deal with pre-combined S3&K/S2&K ROMs and S&K ROM hacks
+			map->buffer = state->rom + start;
+			map->mask = calc_mask(state->rom_size - start, start, end);
+		} else {
 			//skip this entry if there is no lock on cartridge attached
 			return;
 		}
-		map->buffer = state->lock_on + offset;
 		map->flags = MMAP_READ;
-		map->mask = calc_mask(state->lock_on_size - offset, start, end);
 	} else if (!strcmp(dtype, "EEPROM")) {
 		process_eeprom_def(key, state);
 		add_eeprom_map(node, start, end, state);