comparison blastem.c @ 1082:2ec5e6eaf81d

Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
author Michael Pavone <pavone@retrodev.com>
date Thu, 06 Oct 2016 09:34:31 -0700
parents 1a66d5165ea7
children faa3a4617f62
comparison
equal deleted inserted replaced
1081:89cc20cf1ad3 1082:2ec5e6eaf81d
873 printf("Saved %s to %s\n", game_context->save_type == SAVE_I2C ? "EEPROM" : "SRAM", save_filename); 873 printf("Saved %s to %s\n", game_context->save_type == SAVE_I2C ? "EEPROM" : "SRAM", save_filename);
874 } 874 }
875 875
876 #ifndef NO_Z80 876 #ifndef NO_Z80
877 const memmap_chunk z80_map[] = { 877 const memmap_chunk z80_map[] = {
878 { 0x0000, 0x4000, 0x1FFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL }, 878 { 0x0000, 0x4000, 0x1FFF, 0, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, z80_ram, NULL, NULL, NULL, NULL },
879 { 0x8000, 0x10000, 0x7FFF, 0, 0, NULL, NULL, NULL, z80_read_bank, z80_write_bank}, 879 { 0x8000, 0x10000, 0x7FFF, 0, 0, 0, NULL, NULL, NULL, z80_read_bank, z80_write_bank},
880 { 0x4000, 0x6000, 0x0003, 0, 0, NULL, NULL, NULL, z80_read_ym, z80_write_ym}, 880 { 0x4000, 0x6000, 0x0003, 0, 0, 0, NULL, NULL, NULL, z80_read_ym, z80_write_ym},
881 { 0x6000, 0x6100, 0xFFFF, 0, 0, NULL, NULL, NULL, NULL, z80_write_bank_reg}, 881 { 0x6000, 0x6100, 0xFFFF, 0, 0, 0, NULL, NULL, NULL, NULL, z80_write_bank_reg},
882 { 0x7F00, 0x8000, 0x00FF, 0, 0, NULL, NULL, NULL, z80_vdp_port_read, z80_vdp_port_write} 882 { 0x7F00, 0x8000, 0x00FF, 0, 0, 0, NULL, NULL, NULL, z80_vdp_port_read, z80_vdp_port_write}
883 }; 883 };
884 #endif 884 #endif
885 885
886 genesis_context *alloc_init_genesis(rom_info *rom, int fps, uint32_t ym_opts) 886 genesis_context *alloc_init_genesis(rom_info *rom, int fps, uint32_t ym_opts)
887 { 887 {
937 937
938 m68k_options *opts = malloc(sizeof(m68k_options)); 938 m68k_options *opts = malloc(sizeof(m68k_options));
939 init_m68k_opts(opts, rom->map, rom->map_chunks, MCLKS_PER_68K); 939 init_m68k_opts(opts, rom->map, rom->map_chunks, MCLKS_PER_68K);
940 //TODO: make this configurable 940 //TODO: make this configurable
941 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY; 941 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY;
942 gen->m68k = init_68k_context(opts); 942 gen->m68k = init_68k_context(opts, NULL);
943 gen->m68k->system = gen; 943 gen->m68k->system = gen;
944 944
945 for (int i = 0; i < rom->map_chunks; i++) 945 for (int i = 0; i < rom->map_chunks; i++)
946 { 946 {
947 if (rom->map[i].flags & MMAP_PTR_IDX) { 947 if (rom->map[i].flags & MMAP_PTR_IDX) {
1211 if (!MCLKS_PER_68K) { 1211 if (!MCLKS_PER_68K) {
1212 MCLKS_PER_68K = 7; 1212 MCLKS_PER_68K = 7;
1213 } 1213 }
1214 ram = malloc(RAM_WORDS * sizeof(uint16_t)); 1214 ram = malloc(RAM_WORDS * sizeof(uint16_t));
1215 memmap_chunk base_map[] = { 1215 memmap_chunk base_map[] = {
1216 {0xE00000, 0x1000000, 0xFFFF, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram, 1216 {0xE00000, 0x1000000, 0xFFFF, 0, 0, MMAP_READ | MMAP_WRITE | MMAP_CODE, ram,
1217 NULL, NULL, NULL, NULL}, 1217 NULL, NULL, NULL, NULL},
1218 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, NULL, 1218 {0xC00000, 0xE00000, 0x1FFFFF, 0, 0, 0, NULL,
1219 (read_16_fun)vdp_port_read, (write_16_fun)vdp_port_write, 1219 (read_16_fun)vdp_port_read, (write_16_fun)vdp_port_write,
1220 (read_8_fun)vdp_port_read_b, (write_8_fun)vdp_port_write_b}, 1220 (read_8_fun)vdp_port_read_b, (write_8_fun)vdp_port_write_b},
1221 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, NULL, 1221 {0xA00000, 0xA12000, 0x1FFFF, 0, 0, 0, NULL,
1222 (read_16_fun)io_read_w, (write_16_fun)io_write_w, 1222 (read_16_fun)io_read_w, (write_16_fun)io_write_w,
1223 (read_8_fun)io_read, (write_8_fun)io_write} 1223 (read_8_fun)io_read, (write_8_fun)io_write}
1224 }; 1224 };
1225 tern_node *rom_db = load_rom_db(); 1225 tern_node *rom_db = load_rom_db();
1226 rom_info info = configure_rom(rom_db, cart, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0])); 1226 rom_info info = configure_rom(rom_db, cart, rom_size, lock_on, lock_on_size, base_map, sizeof(base_map)/sizeof(base_map[0]));