diff blastem.c @ 1016:5fb64487b6e1

Very basic support for S&K lock-on. Needs more work for full functionality.
author Michael Pavone <pavone@retrodev.com>
date Mon, 02 May 2016 21:06:12 -0700
parents 883fe974f72b
children 216fa63749b3
line wrap: on
line diff
--- a/blastem.c	Mon May 02 18:29:29 2016 -0700
+++ b/blastem.c	Mon May 02 21:06:12 2016 -0700
@@ -130,16 +130,10 @@
 
 uint16_t read_dma_value(uint32_t address)
 {
-	//addresses here are word addresses (i.e. bit 0 corresponds to A1), so no need to do div by 2
-	if (address < 0x200000) {
-		return cart[address];
-	} else if(address >= 0x700000) {
-		return ram[address & 0x7FFF];
-	} else {
-		uint16_t *ptr = get_native_pointer(address*2, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen);
-		if (ptr) {
-			return *ptr;
-		}
+	//addresses here are word addresses (i.e. bit 0 corresponds to A1), so no need to do multiply by 2
+	uint16_t *ptr = get_native_pointer(address*2, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen);
+	if (ptr) {
+		return *ptr;
 	}
 	//TODO: Figure out what happens when you try to DMA from weird adresses like IO or banked Z80 area
 	return 0;
@@ -971,6 +965,7 @@
 	psg_free(gen->psg);
 	free(gen->save_storage);
 	free(gen->save_dir);
+	free(gen->lock_on);
 }
 
 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger)
@@ -1070,7 +1065,8 @@
 	char * romfname = NULL;
 	FILE *address_log = NULL;
 	char * statefile = NULL;
-	int rom_size;
+	int rom_size, lock_on_size;
+	uint16_t *lock_on = NULL;
 	uint8_t * debuggerfun = NULL;
 	uint8_t fullscreen = FULLSCREEN_DEFAULT, use_gl = 1;
 	uint8_t debug_target = 0;
@@ -1135,6 +1131,22 @@
 			case 'y':
 				ym_log = 1;
 				break;
+			case 'o': {
+				i++;
+				if (i >= argc) {
+					fatal_error("-o must be followed by a lock on cartridge filename\n");
+				}
+				uint16_t *tmp = cart;
+				lock_on_size = load_rom(argv[i]);
+				if (lock_on_size) {
+					byteswap_rom(lock_on_size);
+					lock_on = cart;
+				} else {
+					fatal_error("Failed to load lock on cartridge %s\n", argv[i]);
+				}
+				cart = tmp;
+				break;
+			}
 			case 'h':
 				info_message(
 					"Usage: blastem [OPTIONS] ROMFILE [WIDTH] [HEIGHT]\n"
@@ -1212,7 +1224,7 @@
 		           (read_8_fun)io_read,         (write_8_fun)io_write}
 	};
 	tern_node *rom_db = load_rom_db();
-	rom_info info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
+	rom_info info = configure_rom(rom_db, cart, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
 	byteswap_rom(rom_size);
 	set_region(&info, force_version);
 	update_title(info.name);
@@ -1235,6 +1247,7 @@
 	}
 
 	genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0);
+	genesis->lock_on = lock_on;
 	setup_saves(romfname, &info, genesis);
 	if (menu) {
 		menu_context = genesis;
@@ -1266,7 +1279,7 @@
 			if (!(rom_size = load_rom(menu_context->next_rom))) {
 				fatal_error("Failed to open %s for reading\n", menu_context->next_rom);
 			}
-			info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
+			info = configure_rom(rom_db, cart, rom_size, NULL, 0, base_map, sizeof(base_map)/sizeof(base_map[0]));
 			byteswap_rom(rom_size);
 			set_region(&info, force_version);
 			update_title(info.name);