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 }