Mercurial > repos > blastem
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])); |