Mercurial > repos > blastem
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 |