Mercurial > repos > blastem
comparison blastem.c @ 883:9f149f0e98b7
It is now possible to switch back and forth between the menu ROM and the game
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 13 Nov 2015 19:15:37 -0800 |
parents | 54ffba3768d6 |
children | 252dfd29831d |
comparison
equal
deleted
inserted
replaced
882:75453bf2ffac | 883:9f149f0e98b7 |
---|---|
1 /* | 1 /* |
2 Copyright 2013 Michael Pavone | 2 Copyright 2013 Michael Pavone |
3 This file is part of BlastEm. | 3 This file is part of BlastEm. |
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. | 4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. |
5 */ | 5 */ |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 #include <ctype.h> | |
10 | |
6 #include "68kinst.h" | 11 #include "68kinst.h" |
7 #include "m68k_core.h" | 12 #include "m68k_core.h" |
8 #include "z80_to_x86.h" | 13 #include "z80_to_x86.h" |
9 #include "mem.h" | 14 #include "mem.h" |
10 #include "vdp.h" | 15 #include "vdp.h" |
13 #include "gdb_remote.h" | 18 #include "gdb_remote.h" |
14 #include "gst.h" | 19 #include "gst.h" |
15 #include "util.h" | 20 #include "util.h" |
16 #include "romdb.h" | 21 #include "romdb.h" |
17 #include "terminal.h" | 22 #include "terminal.h" |
18 #include <stdio.h> | 23 #include "arena.h" |
19 #include <stdlib.h> | |
20 #include <string.h> | |
21 #include <ctype.h> | |
22 | 24 |
23 #define BLASTEM_VERSION "0.3.X" | 25 #define BLASTEM_VERSION "0.3.X" |
24 | 26 |
25 #define MCLKS_NTSC 53693175 | 27 #define MCLKS_NTSC 53693175 |
26 #define MCLKS_PAL 53203395 | 28 #define MCLKS_PAL 53203395 |
42 #else | 44 #else |
43 #define FULLSCREEN_DEFAULT 0 | 45 #define FULLSCREEN_DEFAULT 0 |
44 #endif | 46 #endif |
45 | 47 |
46 uint16_t *cart; | 48 uint16_t *cart; |
47 uint16_t ram[RAM_WORDS]; | 49 uint16_t *ram; |
48 uint8_t z80_ram[Z80_RAM_BYTES]; | 50 uint8_t z80_ram[Z80_RAM_BYTES]; |
49 | 51 |
50 int headless = 0; | 52 int headless = 0; |
51 int exit_after = 0; | 53 int exit_after = 0; |
52 int z80_enabled = 1; | 54 int z80_enabled = 1; |
782 } | 784 } |
783 ym_adjust_master_clock(context->ym, context->master_clock); | 785 ym_adjust_master_clock(context->ym, context->master_clock); |
784 psg_adjust_master_clock(context->psg, context->master_clock); | 786 psg_adjust_master_clock(context->psg, context->master_clock); |
785 } | 787 } |
786 | 788 |
787 const memmap_chunk base_map[] = { | |
788 {0xE00000, 0x1000000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, | |
789 NULL, NULL, NULL, NULL}, | |
790 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, NULL, | |
791 (read_16_fun)vdp_port_read, (write_16_fun)vdp_port_write, | |
792 (read_8_fun)vdp_port_read_b, (write_8_fun)vdp_port_write_b}, | |
793 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, NULL, | |
794 (read_16_fun)io_read_w, (write_16_fun)io_write_w, | |
795 (read_8_fun)io_read, (write_8_fun)io_write} | |
796 }; | |
797 | |
798 char * save_filename; | 789 char * save_filename; |
799 genesis_context *genesis; | 790 genesis_context *genesis; |
800 genesis_context *menu_context; | 791 genesis_context *menu_context; |
801 genesis_context *game_context; | 792 genesis_context *game_context; |
802 void persist_save() | 793 void persist_save() |
848 | 839 |
849 gen->z80->system = gen; | 840 gen->z80->system = gen; |
850 gen->z80->mem_pointers[0] = z80_ram; | 841 gen->z80->mem_pointers[0] = z80_ram; |
851 gen->z80->mem_pointers[1] = gen->z80->mem_pointers[2] = (uint8_t *)cart; | 842 gen->z80->mem_pointers[1] = gen->z80->mem_pointers[2] = (uint8_t *)cart; |
852 | 843 |
844 gen->cart = cart; | |
853 gen->work_ram = ram; | 845 gen->work_ram = ram; |
854 gen->zram = z80_ram; | 846 gen->zram = z80_ram; |
855 setup_io_devices(config, gen->ports); | 847 setup_io_devices(config, gen->ports); |
856 | 848 |
857 gen->save_type = rom->save_type; | 849 gen->save_type = rom->save_type; |
1078 } | 1070 } |
1079 //TODO: load relative to executable or from assets depending on platform | 1071 //TODO: load relative to executable or from assets depending on platform |
1080 | 1072 |
1081 loaded = 1; | 1073 loaded = 1; |
1082 } | 1074 } |
1075 ram = malloc(RAM_WORDS * sizeof(uint16_t)); | |
1076 memmap_chunk base_map[] = { | |
1077 {0xE00000, 0x1000000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, | |
1078 NULL, NULL, NULL, NULL}, | |
1079 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, NULL, | |
1080 (read_16_fun)vdp_port_read, (write_16_fun)vdp_port_write, | |
1081 (read_8_fun)vdp_port_read_b, (write_8_fun)vdp_port_write_b}, | |
1082 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, NULL, | |
1083 (read_16_fun)io_read_w, (write_16_fun)io_write_w, | |
1084 (read_8_fun)io_read, (write_8_fun)io_write} | |
1085 }; | |
1083 tern_node *rom_db = load_rom_db(); | 1086 tern_node *rom_db = load_rom_db(); |
1084 rom_info info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); | 1087 rom_info info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); |
1085 byteswap_rom(rom_size); | 1088 byteswap_rom(rom_size); |
1086 set_region(&info, force_version); | 1089 set_region(&info, force_version); |
1087 update_title(info.name); | 1090 update_title(info.name); |
1125 genesis->m68k->options->address_log = address_log; | 1128 genesis->m68k->options->address_log = address_log; |
1126 game_context = genesis; | 1129 game_context = genesis; |
1127 } | 1130 } |
1128 | 1131 |
1129 start_genesis(genesis, menu ? NULL : statefile, menu ? NULL : debuggerfun); | 1132 start_genesis(genesis, menu ? NULL : statefile, menu ? NULL : debuggerfun); |
1130 if (menu && menu_context->next_rom) { | 1133 for(;;) |
1131 //TODO: Allow returning to menu | 1134 { |
1132 if (!(rom_size = load_rom(menu_context->next_rom))) { | 1135 if (menu && menu_context->next_rom) { |
1133 fatal_error("Failed to open %s for reading\n", menu_context->next_rom); | 1136 if (!(rom_size = load_rom(menu_context->next_rom))) { |
1134 } | 1137 fatal_error("Failed to open %s for reading\n", menu_context->next_rom); |
1135 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); | 1138 } |
1136 byteswap_rom(rom_size); | 1139 base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t)); |
1137 set_region(&info, force_version); | 1140 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); |
1138 update_title(info.name); | 1141 byteswap_rom(rom_size); |
1139 fname_size = strlen(romfname); | 1142 set_region(&info, force_version); |
1140 ext = info.save_type == SAVE_I2C ? "eeprom" : "sram"; | 1143 update_title(info.name); |
1141 save_filename = malloc(fname_size+strlen(ext) + 2); | 1144 fname_size = strlen(romfname); |
1142 memcpy(save_filename, romfname, fname_size); | 1145 ext = info.save_type == SAVE_I2C ? "eeprom" : "sram"; |
1143 for (i = fname_size-1; fname_size >= 0; --i) { | 1146 save_filename = malloc(fname_size+strlen(ext) + 2); |
1144 if (save_filename[i] == '.') { | 1147 memcpy(save_filename, romfname, fname_size); |
1145 strcpy(save_filename + i + 1, ext); | 1148 for (i = fname_size-1; fname_size >= 0; --i) { |
1146 break; | 1149 if (save_filename[i] == '.') { |
1147 } | 1150 strcpy(save_filename + i + 1, ext); |
1148 } | 1151 break; |
1149 if (i < 0) { | 1152 } |
1150 save_filename[fname_size] = '.'; | 1153 } |
1151 strcpy(save_filename + fname_size + 1, ext); | 1154 if (i < 0) { |
1152 } | 1155 save_filename[fname_size] = '.'; |
1153 game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0); | 1156 strcpy(save_filename + fname_size + 1, ext); |
1154 genesis->m68k->options->address_log = address_log; | 1157 } |
1155 genesis = game_context; | 1158 if (!game_context) { |
1156 start_genesis(genesis, statefile, debuggerfun); | 1159 //start a new arena and save old one in suspended genesis context |
1160 genesis->arena = start_new_arena(); | |
1161 //allocate new genesis context | |
1162 game_context = alloc_init_genesis(&info, fps, ym_log ? YM_OPT_WAVE_LOG : 0); | |
1163 } else { | |
1164 //TODO: hard reset of context with new ROM | |
1165 } | |
1166 free(menu_context->next_rom); | |
1167 menu_context->next_rom = NULL; | |
1168 menu = 0; | |
1169 genesis = game_context; | |
1170 genesis->m68k->options->address_log = address_log; | |
1171 start_genesis(genesis, statefile, debuggerfun); | |
1172 } | |
1173 else if (menu && game_context) { | |
1174 puts("Switching back to game context"); | |
1175 genesis->arena = set_current_arena(game_context->arena); | |
1176 genesis = game_context; | |
1177 cart = genesis->cart; | |
1178 ram = genesis->work_ram; | |
1179 menu = 0; | |
1180 set_keybindings(genesis->ports); | |
1181 resume_68k(genesis->m68k); | |
1182 } else if (!menu && menu_context) { | |
1183 puts("Switching back to menu context"); | |
1184 genesis->arena = set_current_arena(menu_context->arena); | |
1185 genesis = menu_context; | |
1186 cart = genesis->cart; | |
1187 ram = genesis->work_ram; | |
1188 menu = 1; | |
1189 set_keybindings(genesis->ports); | |
1190 resume_68k(genesis->m68k); | |
1191 } else { | |
1192 break; | |
1193 } | |
1157 } | 1194 } |
1158 | 1195 |
1159 return 0; | 1196 return 0; |
1160 } | 1197 } |