comparison 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
comparison
equal deleted inserted replaced
1015:6c54d5a5c7c0 1016:5fb64487b6e1
128 return filesize; 128 return filesize;
129 } 129 }
130 130
131 uint16_t read_dma_value(uint32_t address) 131 uint16_t read_dma_value(uint32_t address)
132 { 132 {
133 //addresses here are word addresses (i.e. bit 0 corresponds to A1), so no need to do div by 2 133 //addresses here are word addresses (i.e. bit 0 corresponds to A1), so no need to do multiply by 2
134 if (address < 0x200000) { 134 uint16_t *ptr = get_native_pointer(address*2, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen);
135 return cart[address]; 135 if (ptr) {
136 } else if(address >= 0x700000) { 136 return *ptr;
137 return ram[address & 0x7FFF];
138 } else {
139 uint16_t *ptr = get_native_pointer(address*2, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen);
140 if (ptr) {
141 return *ptr;
142 }
143 } 137 }
144 //TODO: Figure out what happens when you try to DMA from weird adresses like IO or banked Z80 area 138 //TODO: Figure out what happens when you try to DMA from weird adresses like IO or banked Z80 area
145 return 0; 139 return 0;
146 } 140 }
147 141
969 free(gen->z80); 963 free(gen->z80);
970 ym_free(gen->ym); 964 ym_free(gen->ym);
971 psg_free(gen->psg); 965 psg_free(gen->psg);
972 free(gen->save_storage); 966 free(gen->save_storage);
973 free(gen->save_dir); 967 free(gen->save_dir);
968 free(gen->lock_on);
974 } 969 }
975 970
976 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger) 971 void start_genesis(genesis_context *gen, char *statefile, uint8_t *debugger)
977 { 972 {
978 973
1068 int loaded = 0; 1063 int loaded = 0;
1069 uint8_t force_version = 0; 1064 uint8_t force_version = 0;
1070 char * romfname = NULL; 1065 char * romfname = NULL;
1071 FILE *address_log = NULL; 1066 FILE *address_log = NULL;
1072 char * statefile = NULL; 1067 char * statefile = NULL;
1073 int rom_size; 1068 int rom_size, lock_on_size;
1069 uint16_t *lock_on = NULL;
1074 uint8_t * debuggerfun = NULL; 1070 uint8_t * debuggerfun = NULL;
1075 uint8_t fullscreen = FULLSCREEN_DEFAULT, use_gl = 1; 1071 uint8_t fullscreen = FULLSCREEN_DEFAULT, use_gl = 1;
1076 uint8_t debug_target = 0; 1072 uint8_t debug_target = 0;
1077 for (int i = 1; i < argc; i++) { 1073 for (int i = 1; i < argc; i++) {
1078 if (argv[i][0] == '-') { 1074 if (argv[i][0] == '-') {
1133 force_no_terminal(); 1129 force_no_terminal();
1134 break; 1130 break;
1135 case 'y': 1131 case 'y':
1136 ym_log = 1; 1132 ym_log = 1;
1137 break; 1133 break;
1134 case 'o': {
1135 i++;
1136 if (i >= argc) {
1137 fatal_error("-o must be followed by a lock on cartridge filename\n");
1138 }
1139 uint16_t *tmp = cart;
1140 lock_on_size = load_rom(argv[i]);
1141 if (lock_on_size) {
1142 byteswap_rom(lock_on_size);
1143 lock_on = cart;
1144 } else {
1145 fatal_error("Failed to load lock on cartridge %s\n", argv[i]);
1146 }
1147 cart = tmp;
1148 break;
1149 }
1138 case 'h': 1150 case 'h':
1139 info_message( 1151 info_message(
1140 "Usage: blastem [OPTIONS] ROMFILE [WIDTH] [HEIGHT]\n" 1152 "Usage: blastem [OPTIONS] ROMFILE [WIDTH] [HEIGHT]\n"
1141 "Options:\n" 1153 "Options:\n"
1142 " -h Print this help text\n" 1154 " -h Print this help text\n"
1210 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, NULL, 1222 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, NULL,
1211 (read_16_fun)io_read_w, (write_16_fun)io_write_w, 1223 (read_16_fun)io_read_w, (write_16_fun)io_write_w,
1212 (read_8_fun)io_read, (write_8_fun)io_write} 1224 (read_8_fun)io_read, (write_8_fun)io_write}
1213 }; 1225 };
1214 tern_node *rom_db = load_rom_db(); 1226 tern_node *rom_db = load_rom_db();
1215 rom_info info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); 1227 rom_info info = configure_rom(rom_db, cart, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
1216 byteswap_rom(rom_size); 1228 byteswap_rom(rom_size);
1217 set_region(&info, force_version); 1229 set_region(&info, force_version);
1218 update_title(info.name); 1230 update_title(info.name);
1219 int def_width = 0; 1231 int def_width = 0;
1220 char *config_width = tern_find_path(config, "video\0width\0").ptrval; 1232 char *config_width = tern_find_path(config, "video\0width\0").ptrval;
1233 if (!headless) { 1245 if (!headless) {
1234 render_init(width, height, title, fps, fullscreen); 1246 render_init(width, height, title, fps, fullscreen);
1235 } 1247 }
1236 1248
1237 genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0); 1249 genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0);
1250 genesis->lock_on = lock_on;
1238 setup_saves(romfname, &info, genesis); 1251 setup_saves(romfname, &info, genesis);
1239 if (menu) { 1252 if (menu) {
1240 menu_context = genesis; 1253 menu_context = genesis;
1241 } else { 1254 } else {
1242 genesis->m68k->options->address_log = address_log; 1255 genesis->m68k->options->address_log = address_log;
1264 } 1277 }
1265 memset(ram, 0, RAM_WORDS * sizeof(uint16_t)); 1278 memset(ram, 0, RAM_WORDS * sizeof(uint16_t));
1266 if (!(rom_size = load_rom(menu_context->next_rom))) { 1279 if (!(rom_size = load_rom(menu_context->next_rom))) {
1267 fatal_error("Failed to open %s for reading\n", menu_context->next_rom); 1280 fatal_error("Failed to open %s for reading\n", menu_context->next_rom);
1268 } 1281 }
1269 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); 1282 info = configure_rom(rom_db, cart, rom_size, NULL, 0, base_map, sizeof(base_map)/sizeof(base_map[0]));
1270 byteswap_rom(rom_size); 1283 byteswap_rom(rom_size);
1271 set_region(&info, force_version); 1284 set_region(&info, force_version);
1272 update_title(info.name); 1285 update_title(info.name);
1273 if (!game_context) { 1286 if (!game_context) {
1274 //start a new arena and save old one in suspended genesis context 1287 //start a new arena and save old one in suspended genesis context