Mercurial > repos > blastem
annotate genesis.c @ 2456:72d0eac49507
Implement movep in new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 21 Feb 2024 20:09:11 -0800 |
parents | bed4d3db8a3f |
children | cb62730d5c99 |
rev | line source |
---|---|
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 /* |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 Copyright 2013-2016 Michael Pavone |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 This file is part of BlastEm. |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
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. |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 */ |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "genesis.h" |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
7 #include "segacd.h" |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 #include "blastem.h" |
1414
d94855080529
Move I2C EEPROM and NOR Flash functions out of romdb.c into new files
Michael Pavone <pavone@retrodev.com>
parents:
1401
diff
changeset
|
9 #include "nor.h" |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 #include <stdlib.h> |
1188
448ce87b87fc
Fix missing include that prevented building Windows version
Michael Pavone <pavone@retrodev.com>
parents:
1184
diff
changeset
|
11 #include <ctype.h> |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
12 #include <time.h> |
1220
1e7977460d18
Add mising include in genesis.c so the Windows build works again
Michael Pavone <pavone@retrodev.com>
parents:
1215
diff
changeset
|
13 #include <string.h> |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 #include "render.h" |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 #include "gst.h" |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 #include "util.h" |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
17 #include "debug.h" |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
18 #include "gdb_remote.h" |
1478
da1dce39e846
Refactored save slot related logic to reduce duplication and allow reuse in new UI. Get state loading/saving mostly working in new UI
Michael Pavone <pavone@retrodev.com>
parents:
1471
diff
changeset
|
19 #include "saves.h" |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
20 #include "bindings.h" |
1610 | 21 #include "jcart.h" |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
22 #include "config.h" |
1946 | 23 #include "event_log.h" |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
24 #include "paths.h" |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 #define MCLKS_NTSC 53693175 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 #define MCLKS_PAL 53203395 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 uint32_t MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 #define MCLKS_PER_YM 7 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 #define MCLKS_PER_Z80 15 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 #define MCLKS_PER_PSG (MCLKS_PER_Z80*16) |
1291
f17fe0d00626
Adjust Z80 interrupt pulse duration to match hardware measurements
Michael Pavone <pavone@retrodev.com>
parents:
1288
diff
changeset
|
32 #define Z80_INT_PULSE_MCLKS 2573 //measured value is ~171.5 Z80 clocks |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 #define DEFAULT_SYNC_INTERVAL MCLKS_LINE |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 #define DEFAULT_LOWPASS_CUTOFF 3390 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 //TODO: Figure out the exact value for this |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 #define LINES_NTSC 262 |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
38 #define LINES_PAL 313 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
40 #ifdef IS_LIB |
1927
9fd4bedc1a31
Update libretro target to use render_audio shared audio code
Mike Pavone <pavone@retrodev.com>
parents:
1915
diff
changeset
|
41 #define MAX_SOUND_CYCLES (MCLKS_PER_YM*NUM_OPERATORS*6*4) |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
42 #else |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
43 #define MAX_SOUND_CYCLES 100000 |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
44 #endif |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
46 #ifdef NEW_CORE |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
47 #define Z80_CYCLE cycles |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
48 #define Z80_OPTS opts |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
49 #define z80_handle_code_write(...) |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
50 #else |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
51 #define Z80_CYCLE current_cycle |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
52 #define Z80_OPTS options |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
53 #endif |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
54 |
1946 | 55 void genesis_serialize(genesis_context *gen, serialize_buffer *buf, uint32_t m68k_pc, uint8_t all) |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
56 { |
1946 | 57 if (all) { |
58 start_section(buf, SECTION_68000); | |
59 m68k_serialize(gen->m68k, m68k_pc, buf); | |
60 end_section(buf); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
61 |
2428 | 62 if (gen->header.type == SYSTEM_GENESIS) { |
63 start_section(buf, SECTION_Z80); | |
64 z80_serialize(gen->z80, buf); | |
65 end_section(buf); | |
66 } | |
1946 | 67 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
68 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
69 start_section(buf, SECTION_VDP); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
70 vdp_serialize(gen->vdp, buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
71 end_section(buf); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
72 |
2428 | 73 if (gen->header.type != SYSTEM_PICO) { |
74 start_section(buf, SECTION_YM2612); | |
75 ym_serialize(gen->ym, buf); | |
76 end_section(buf); | |
77 } | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
78 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
79 start_section(buf, SECTION_PSG); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
80 psg_serialize(gen->psg, buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
81 end_section(buf); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
82 |
1946 | 83 if (all) { |
84 start_section(buf, SECTION_GEN_BUS_ARBITER); | |
85 save_int8(buf, gen->z80->reset); | |
86 save_int8(buf, gen->z80->busreq); | |
87 save_int16(buf, gen->z80_bank_reg); | |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
88 //I think the refresh logic may technically be part of the VDP, but whatever |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
89 save_int32(buf, gen->last_sync_cycle); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
90 save_int32(buf, gen->refresh_counter); |
1946 | 91 end_section(buf); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
92 |
2428 | 93 if (gen->header.type == SYSTEM_GENESIS) { |
94 start_section(buf, SECTION_SEGA_IO_1); | |
95 io_serialize(gen->io.ports, buf); | |
96 end_section(buf); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
97 |
2428 | 98 start_section(buf, SECTION_SEGA_IO_2); |
99 io_serialize(gen->io.ports + 1, buf); | |
100 end_section(buf); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
101 |
2428 | 102 start_section(buf, SECTION_SEGA_IO_EXT); |
103 io_serialize(gen->io.ports + 2, buf); | |
104 end_section(buf); | |
105 } | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
106 |
1946 | 107 start_section(buf, SECTION_MAIN_RAM); |
108 save_int8(buf, RAM_WORDS * 2 / 1024); | |
109 save_buffer16(buf, gen->work_ram, RAM_WORDS); | |
110 end_section(buf); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
111 |
2428 | 112 if (gen->header.type == SYSTEM_GENESIS) { |
113 start_section(buf, SECTION_SOUND_RAM); | |
114 save_int8(buf, Z80_RAM_BYTES / 1024); | |
115 save_buffer8(buf, gen->zram, Z80_RAM_BYTES); | |
116 end_section(buf); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
117 |
2428 | 118 if (gen->version_reg & 0xF) { |
119 //only save TMSS info if it's present | |
120 //that will allow a state saved on a model lacking TMSS | |
121 //to be loaded on a model that has it | |
122 start_section(buf, SECTION_TMSS); | |
123 save_int8(buf, gen->tmss); | |
124 save_buffer16(buf, gen->tmss_lock, 2); | |
125 end_section(buf); | |
126 } | |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
127 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
128 |
1946 | 129 cart_serialize(&gen->header, buf); |
130 } | |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
131 if (gen->expansion) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
132 segacd_context *cd = gen->expansion; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
133 segacd_serialize(cd, buf, all); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
134 } |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
135 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
136 |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
137 static uint8_t *serialize(system_header *sys, size_t *size_out) |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
138 { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
139 genesis_context *gen = (genesis_context *)sys; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
140 uint32_t address; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
141 if (gen->m68k->resume_pc) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
142 gen->m68k->target_cycle = gen->m68k->current_cycle; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
143 gen->header.save_state = SERIALIZE_SLOT+1; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
144 resume_68k(gen->m68k); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
145 if (size_out) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
146 *size_out = gen->serialize_size; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
147 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
148 return gen->serialize_tmp; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
149 } else { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
150 serialize_buffer state; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
151 init_serialize(&state); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
152 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k) << 16; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
153 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k); |
1946 | 154 genesis_serialize(gen, &state, address, 1); |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
155 if (size_out) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
156 *size_out = state.size; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
157 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
158 return state.data; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
159 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
160 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
161 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
162 static void ram_deserialize(deserialize_buffer *buf, void *vgen) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
163 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
164 genesis_context *gen = vgen; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
165 uint32_t ram_size = load_int8(buf) * 1024 / 2; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
166 if (ram_size > RAM_WORDS) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
167 fatal_error("State has a RAM size of %d bytes", ram_size * 2); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
168 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
169 load_buffer16(buf, gen->work_ram, ram_size); |
1452
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
170 m68k_invalidate_code_range(gen->m68k, 0xE00000, 0x1000000); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
171 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
172 |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
173 static void zram_deserialize(deserialize_buffer *buf, void *vgen) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
174 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
175 genesis_context *gen = vgen; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
176 uint32_t ram_size = load_int8(buf) * 1024; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
177 if (ram_size > Z80_RAM_BYTES) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
178 fatal_error("State has a Z80 RAM size of %d bytes", ram_size); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
179 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
180 load_buffer8(buf, gen->zram, ram_size); |
1452
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
181 z80_invalidate_code_range(gen->z80, 0, 0x4000); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
182 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
183 |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
184 static void update_z80_bank_pointer(genesis_context *gen) |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
185 { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
186 if (gen->z80_bank_reg < 0x140) { |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
187 gen->z80->mem_pointers[1] = get_native_pointer(gen->z80_bank_reg << 15, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen); |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
188 } else { |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
189 gen->z80->mem_pointers[1] = NULL; |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
190 } |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
191 z80_invalidate_code_range(gen->z80, 0x8000, 0xFFFF); |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
192 } |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
193 |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
194 static void bus_arbiter_deserialize(deserialize_buffer *buf, void *vgen) |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
195 { |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
196 genesis_context *gen = vgen; |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
197 gen->z80->reset = load_int8(buf); |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
198 gen->z80->busreq = load_int8(buf); |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
199 gen->z80_bank_reg = load_int16(buf) & 0x1FF; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
200 if ((buf->size - buf->cur_pos) >= 2 * sizeof(uint32_t)) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
201 gen->last_sync_cycle = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
202 gen->refresh_counter = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
203 } else { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
204 //save state is from an older version of BlastEm that lacks these fields |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
205 //set them to reasonable values |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
206 gen->last_sync_cycle = gen->m68k->current_cycle; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
207 gen->refresh_counter = 0; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
208 } |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
209 } |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
210 |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
211 static void tmss_deserialize(deserialize_buffer *buf, void *vgen) |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
212 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
213 genesis_context *gen = vgen; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
214 gen->tmss = load_int8(buf); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
215 load_buffer16(buf, gen->tmss_lock, 2); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
216 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
217 |
1636
d2775a242dc6
Make sure M68K sync and target cycles are updated after loading a savestate. Fixes an issue in which loading a savestate would result in things being unresponsive until emulation cycle caught up to whatever the pre-state load sync cycle was
Mike Pavone <pavone@retrodev.com>
parents:
1631
diff
changeset
|
218 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context); |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
219 static void check_tmss_lock(genesis_context *gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
220 static void toggle_tmss_rom(genesis_context *gen); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
221 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
222 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
223 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
224 register_section_handler(buf, (section_handler){.fun = m68k_deserialize, .data = gen->m68k}, SECTION_68000); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
225 register_section_handler(buf, (section_handler){.fun = vdp_deserialize, .data = gen->vdp}, SECTION_VDP); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
226 register_section_handler(buf, (section_handler){.fun = psg_deserialize, .data = gen->psg}, SECTION_PSG); |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
227 register_section_handler(buf, (section_handler){.fun = bus_arbiter_deserialize, .data = gen}, SECTION_GEN_BUS_ARBITER); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
228 register_section_handler(buf, (section_handler){.fun = ram_deserialize, .data = gen}, SECTION_MAIN_RAM); |
1444
14a2834d010c
Save/restore mapper state in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1440
diff
changeset
|
229 register_section_handler(buf, (section_handler){.fun = cart_deserialize, .data = gen}, SECTION_MAPPER); |
2428 | 230 if (gen->header.type == SYSTEM_GENESIS) { |
231 register_section_handler(buf, (section_handler){.fun = z80_deserialize, .data = gen->z80}, SECTION_Z80); | |
232 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports}, SECTION_SEGA_IO_1); | |
233 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 1}, SECTION_SEGA_IO_2); | |
234 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 2}, SECTION_SEGA_IO_EXT); | |
235 register_section_handler(buf, (section_handler){.fun = zram_deserialize, .data = gen}, SECTION_SOUND_RAM); | |
236 register_section_handler(buf, (section_handler){.fun = tmss_deserialize, .data = gen}, SECTION_TMSS); | |
237 } | |
238 if (gen->header.type != SYSTEM_PICO) { | |
239 register_section_handler(buf, (section_handler){.fun = ym_deserialize, .data = gen->ym}, SECTION_YM2612); | |
240 } | |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
241 if (gen->expansion) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
242 segacd_context *cd = gen->expansion; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
243 segacd_register_section_handlers(cd, buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
244 } |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
245 uint8_t tmss_old = gen->tmss; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
246 gen->tmss = 0xFF; |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
247 while (buf->cur_pos < buf->size) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
248 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
249 load_section(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
250 } |
2428 | 251 if (gen->header.type == SYSTEM_GENESIS && (gen->version_reg & 0xF)) { |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
252 if (gen->tmss == 0xFF) { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
253 //state lacked a TMSS section, assume that the game ROM is mapped in |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
254 //and that the VDP is unlocked |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
255 gen->tmss_lock[0] = 0x5345; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
256 gen->tmss_lock[1] = 0x4741; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
257 gen->tmss = 1; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
258 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
259 if (gen->tmss != tmss_old) { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
260 toggle_tmss_rom(gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
261 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
262 check_tmss_lock(gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
263 } |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
264 update_z80_bank_pointer(gen); |
1636
d2775a242dc6
Make sure M68K sync and target cycles are updated after loading a savestate. Fixes an issue in which loading a savestate would result in things being unresponsive until emulation cycle caught up to whatever the pre-state load sync cycle was
Mike Pavone <pavone@retrodev.com>
parents:
1631
diff
changeset
|
265 adjust_int_cycle(gen->m68k, gen->vdp); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
266 //HACK: Fix this once PC/IR is represented in a better way in 68K core |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
267 //Would be better for this hack to live in side the 68K core itself, but it's better to do it |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
268 //after RAM has been loaded to avoid any unnecessary retranslation |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
269 gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
270 if (gen->expansion) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
271 segacd_context *cd = gen->expansion; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
272 cd->m68k->resume_pc = get_native_address_trans(cd->m68k, cd->m68k->last_prefetch_address); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
273 } |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
274 free(buf->handlers); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
275 buf->handlers = NULL; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
276 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
277 |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
278 static void deserialize(system_header *sys, uint8_t *data, size_t size) |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
279 { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
280 genesis_context *gen = (genesis_context *)sys; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
281 deserialize_buffer buffer; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
282 init_deserialize(&buffer, data, size); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
283 genesis_deserialize(&buffer, gen); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
284 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
285 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
286 uint16_t read_dma_value(uint32_t address) |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
287 { |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
288 genesis_context *genesis = (genesis_context *)current_system; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
289 address *= 2; |
1420
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
290 //TODO: Figure out what happens when you try to DMA from weird adresses like IO or banked Z80 area |
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
291 if ((address >= 0xA00000 && address < 0xB00000) || (address >= 0xC00000 && address <= 0xE00000)) { |
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
292 return 0; |
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
293 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
294 if (genesis->expansion) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
295 segacd_context *cd = genesis->expansion; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
296 uint32_t word_ram = cd->base + 0x200000; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
297 uint32_t word_ram_end = cd->base + 0x240000; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
298 if (address >= word_ram && address < word_ram_end) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
299 //FIXME: first word should just be garbage |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
300 if (!cd->has_vdp_dma_value) { |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
301 cd->vdp_dma_value = read_word(genesis->m68k->last_prefetch_address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
302 cd->has_vdp_dma_value = 1; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
303 } |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
304 uint16_t ret = cd->vdp_dma_value; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
305 cd->vdp_dma_value = read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
306 return ret; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
307 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
308 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
309 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
310 return read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->options->gen, genesis->m68k); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
311 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
312 |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
313 void vdp_dma_started(void) |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
314 { |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
315 genesis_context *genesis = (genesis_context *)current_system; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
316 if (genesis->expansion) { |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
317 segacd_context *cd = genesis->expansion; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
318 cd->has_vdp_dma_value = 0; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
319 } |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
320 } |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
321 |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
322 |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
323 static uint16_t get_open_bus_value(system_header *system) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
324 { |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
325 genesis_context *genesis = (genesis_context *)system; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
326 return read_dma_value(genesis->m68k->last_prefetch_address/2); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
327 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
328 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
329 static void adjust_int_cycle(m68k_context * context, vdp_context * v_context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 //static int old_int_cycle = CYCLE_NEVER; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 genesis_context *gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
333 if (context->sync_cycle - context->current_cycle > gen->max_cycles) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 context->sync_cycle = context->current_cycle + gen->max_cycles; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
336 context->int_cycle = CYCLE_NEVER; |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
337 uint8_t mask = context->status & 0x7; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
338 if (mask < 6) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 uint32_t next_vint = vdp_next_vint(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 if (next_vint != CYCLE_NEVER) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
341 context->int_cycle = next_vint; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
342 context->int_num = 6; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
343 } |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
344 if (mask < 4) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
345 uint32_t next_hint = vdp_next_hint(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
346 if (next_hint != CYCLE_NEVER) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
347 next_hint = next_hint < context->current_cycle ? context->current_cycle : next_hint; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
348 if (next_hint < context->int_cycle) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
349 context->int_cycle = next_hint; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
350 context->int_num = 4; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
351 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
352 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
353 } |
2428 | 354 if (mask < 2 && (v_context->regs[REG_MODE_3] & BIT_EINT_EN) && gen->header.type == SYSTEM_GENESIS) { |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
355 uint32_t next_eint_port0 = io_next_interrupt(gen->io.ports, context->current_cycle); |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
356 uint32_t next_eint_port1 = io_next_interrupt(gen->io.ports + 1, context->current_cycle); |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
357 uint32_t next_eint_port2 = io_next_interrupt(gen->io.ports + 2, context->current_cycle); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
358 uint32_t next_eint = next_eint_port0 < next_eint_port1 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
359 ? (next_eint_port0 < next_eint_port2 ? next_eint_port0 : next_eint_port2) |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
360 : (next_eint_port1 < next_eint_port2 ? next_eint_port1 : next_eint_port2); |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
361 if (next_eint != CYCLE_NEVER) { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
362 next_eint = next_eint < context->current_cycle ? context->current_cycle : next_eint; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
363 if (next_eint < context->int_cycle) { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
364 context->int_cycle = next_eint; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
365 context->int_num = 2; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
366 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
367 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
368 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
369 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
370 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
371 if (context->int_cycle > context->current_cycle && context->int_pending == INT_PENDING_SR_CHANGE) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
372 context->int_pending = INT_PENDING_NONE; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
373 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 /*if (context->int_cycle != old_int_cycle) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
375 printf("int cycle changed to: %d, level: %d @ %d(%d), frame: %d, vcounter: %d, hslot: %d, mask: %d, hint_counter: %d\n", context->int_cycle, context->int_num, v_context->cycles, context->current_cycle, v_context->frame, v_context->vcounter, v_context->hslot, context->status & 0x7, v_context->hint_counter); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
376 old_int_cycle = context->int_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
377 }*/ |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
378 |
1304
5b90d7669eee
Fix exit trace mode edge case. Call do_sync if trace mode bit is changed in eori sr
Michael Pavone <pavone@retrodev.com>
parents:
1303
diff
changeset
|
379 if (context->status & M68K_STATUS_TRACE || context->trace_pending) { |
1303
208803173ebc
Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents:
1291
diff
changeset
|
380 context->target_cycle = context->current_cycle; |
208803173ebc
Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents:
1291
diff
changeset
|
381 return; |
208803173ebc
Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents:
1291
diff
changeset
|
382 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
383 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
384 context->target_cycle = context->int_cycle < context->sync_cycle ? context->int_cycle : context->sync_cycle; |
2424
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
385 if (context->should_return || gen->header.enter_debugger || context->wp_hit) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
386 context->target_cycle = context->current_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
387 } else if (context->target_cycle < context->current_cycle) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
388 //Changes to SR can result in an interrupt cycle that's in the past |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
389 //This can cause issues with the implementation of STOP though |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
390 context->target_cycle = context->current_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
391 } |
1364
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
392 if (context->target_cycle == context->int_cycle) { |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
393 //Currently delays from Z80 access and refresh are applied only when we sync |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
394 //this can cause extra latency when it comes to interrupts |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
395 //to prevent this code forces some extra synchronization in the period immediately before an interrupt |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
396 if ((context->target_cycle - context->current_cycle) > gen->int_latency_prev1) { |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
397 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev1; |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
398 } else if ((context->target_cycle - context->current_cycle) > gen->int_latency_prev2) { |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
399 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev2; |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
400 } else { |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
401 context->target_cycle = context->sync_cycle = context->current_cycle; |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
402 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
403 |
1364
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
404 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
405 /*printf("Cyc: %d, Trgt: %d, Int Cyc: %d, Int: %d, Mask: %X, V: %d, H: %d, HICount: %d, HReg: %d, Line: %d\n", |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 context->current_cycle, context->target_cycle, context->int_cycle, context->int_num, (context->status & 0x7), |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 v_context->regs[REG_MODE_2] & 0x20, v_context->regs[REG_MODE_1] & 0x10, v_context->hint_counter, v_context->regs[REG_HINT], v_context->cycles / MCLKS_LINE);*/ |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
408 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
409 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
410 //#define DO_DEBUG_PRINT |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
411 #ifdef DO_DEBUG_PRINT |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
412 #define dprintf printf |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
413 #define dputs puts |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
414 #else |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
415 #define dprintf |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
416 #define dputs |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
417 #endif |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
418 |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
419 static void z80_next_int_pulse(z80_context * z_context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
420 { |
1108
87114df913ec
Fix Z80 interrupt pulse duration. Fixes inconsistent music playback speed in Sonic 2 introduced in 0.4.1
Michael Pavone <pavone@retrodev.com>
parents:
1105
diff
changeset
|
421 genesis_context * gen = z_context->system; |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
422 #ifdef NEW_CORE |
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
423 z_context->int_cycle = vdp_next_vint_z80(gen->vdp); |
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
424 z_context->int_end_cycle = z_context->int_cycle + Z80_INT_PULSE_MCLKS; |
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
425 z_context->int_value = 0xFF; |
1766
1dc718581aac
Fix Z80 interrupts in Gen/MD mode when using new core. Disable CPU debug log in new Z80 core
Michael Pavone <pavone@retrodev.com>
parents:
1753
diff
changeset
|
426 z80_sync_cycle(z_context, z_context->sync_cycle); |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
427 #else |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
428 z_context->int_pulse_start = vdp_next_vint_z80(gen->vdp); |
1291
f17fe0d00626
Adjust Z80 interrupt pulse duration to match hardware measurements
Michael Pavone <pavone@retrodev.com>
parents:
1288
diff
changeset
|
429 z_context->int_pulse_end = z_context->int_pulse_start + Z80_INT_PULSE_MCLKS; |
1471
2e6320d261ff
Implemented Z80 IM 2 and attempted correct intack cycle delay
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
430 z_context->im2_vector = 0xFF; |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
431 #endif |
1108
87114df913ec
Fix Z80 interrupt pulse duration. Fixes inconsistent music playback speed in Sonic 2 introduced in 0.4.1
Michael Pavone <pavone@retrodev.com>
parents:
1105
diff
changeset
|
432 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
433 |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
434 static void sync_z80(genesis_context *gen, uint32_t mclks) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
435 { |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
436 z80_context *z_context = gen->z80; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
437 #ifndef NO_Z80 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
438 if (z80_enabled) { |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
439 #ifdef NEW_CORE |
1766
1dc718581aac
Fix Z80 interrupts in Gen/MD mode when using new core. Disable CPU debug log in new Z80 core
Michael Pavone <pavone@retrodev.com>
parents:
1753
diff
changeset
|
440 if (z_context->int_cycle == 0xFFFFFFFFU) { |
1dc718581aac
Fix Z80 interrupts in Gen/MD mode when using new core. Disable CPU debug log in new Z80 core
Michael Pavone <pavone@retrodev.com>
parents:
1753
diff
changeset
|
441 z80_next_int_pulse(z_context); |
1dc718581aac
Fix Z80 interrupts in Gen/MD mode when using new core. Disable CPU debug log in new Z80 core
Michael Pavone <pavone@retrodev.com>
parents:
1753
diff
changeset
|
442 } |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
443 #endif |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
444 if (gen->enter_z80_debugger && !z_context->reset && !z_context->busack) { |
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
445 while (!z_context->pc) { |
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
446 z80_run(z_context, z_context->current_cycle + 4); |
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
447 } |
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
448 gen->enter_z80_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
449 #ifndef IS_LIB |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
450 zdebugger(z_context, z_context->pc); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
451 #endif |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
452 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
453 z80_run(z_context, mclks); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
454 } else |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
455 #endif |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
456 { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
457 z_context->Z80_CYCLE = mclks; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
458 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
459 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
460 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
461 static void sync_sound(genesis_context * gen, uint32_t target) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
462 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
463 //printf("YM | Cycle: %d, bpos: %d, PSG | Cycle: %d, bpos: %d\n", gen->ym->current_cycle, gen->ym->buffer_pos, gen->psg->cycles, gen->psg->buffer_pos * 2); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
464 while (target > gen->psg->cycles && target - gen->psg->cycles > MAX_SOUND_CYCLES) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
465 uint32_t cur_target = gen->psg->cycles + MAX_SOUND_CYCLES; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
466 //printf("Running PSG to cycle %d\n", cur_target); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
467 psg_run(gen->psg, cur_target); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
468 //printf("Running YM-2612 to cycle %d\n", cur_target); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
469 ym_run(gen->ym, cur_target); |
2080 | 470 if (gen->expansion) { |
471 scd_run(gen->expansion, gen_cycle_to_scd(cur_target, gen)); | |
472 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
473 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
474 psg_run(gen->psg, target); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
475 ym_run(gen->ym, target); |
2080 | 476 if (gen->expansion) { |
477 scd_run(gen->expansion, gen_cycle_to_scd(target, gen)); | |
478 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
479 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
480 //printf("Target: %d, YM bufferpos: %d, PSG bufferpos: %d\n", target, gen->ym->buffer_pos, gen->psg->buffer_pos * 2); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
481 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
482 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
483 #define REFRESH_INTERVAL 128 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
484 #define REFRESH_DELAY 2 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
485 |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
486 void gen_update_refresh(m68k_context *context) |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
487 { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
488 uint32_t interval = MCLKS_PER_68K * REFRESH_INTERVAL; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
489 genesis_context *gen = context->system; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
490 gen->refresh_counter += context->current_cycle - gen->last_sync_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
491 gen->last_sync_cycle = context->current_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
492 context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / interval); |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
493 gen->refresh_counter = gen->refresh_counter % interval; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
494 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
495 |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
496 void gen_update_refresh_free_access(m68k_context *context) |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
497 { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
498 genesis_context *gen = context->system; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
499 uint32_t before = context->current_cycle - 4*MCLKS_PER_68K; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
500 if (before < gen->last_sync_cycle) { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
501 return; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
502 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
503 //Add refresh delays for any accesses that happened beofre the current one |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
504 gen->refresh_counter += before - gen->last_sync_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
505 uint32_t interval = MCLKS_PER_68K * REFRESH_INTERVAL; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
506 uint32_t delay = REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / interval); |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
507 if (delay) { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
508 //To avoid the extra cycles being absorbed in the refresh free update below, we need to update again |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
509 gen->refresh_counter = gen->refresh_counter % interval; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
510 gen->refresh_counter += delay; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
511 delay += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / interval); |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
512 context->current_cycle += delay; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
513 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
514 gen->last_sync_cycle = context->current_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
515 //advance refresh counter for the current access, but don't generate delays |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
516 gen->refresh_counter += 4*MCLKS_PER_68K; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
517 gen->refresh_counter = gen->refresh_counter % interval; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
518 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
519 |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
520 void gen_update_refresh_no_wait(m68k_context *context) |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
521 { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
522 uint32_t interval = MCLKS_PER_68K * REFRESH_INTERVAL; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
523 genesis_context *gen = context->system; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
524 gen->refresh_counter += context->current_cycle - gen->last_sync_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
525 gen->last_sync_cycle = context->current_cycle; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
526 gen->refresh_counter = gen->refresh_counter % interval; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
527 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
528 |
1170
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
529 #include <limits.h> |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
530 #define ADJUST_BUFFER (8*MCLKS_LINE*313) |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
531 #define MAX_NO_ADJUST (UINT_MAX-ADJUST_BUFFER) |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
532 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
533 static m68k_context *sync_components(m68k_context * context, uint32_t address) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
534 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
535 genesis_context * gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
536 vdp_context * v_context = gen->vdp; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
537 z80_context * z_context = gen->z80; |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
538 if (gen->bus_busy) { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
539 gen_update_refresh_no_wait(context); |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
540 } else { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
541 gen_update_refresh(context); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
542 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
543 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
544 uint32_t mclks = context->current_cycle; |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
545 sync_z80(gen, mclks); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
546 sync_sound(gen, mclks); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
547 vdp_run_context(v_context, mclks); |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
548 io_run(gen->io.ports, mclks); |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
549 io_run(gen->io.ports + 1, mclks); |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
550 io_run(gen->io.ports + 2, mclks); |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
551 if (gen->expansion) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
552 scd_run(gen->expansion, gen_cycle_to_scd(mclks, gen)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
553 } |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
554 if (mclks >= gen->reset_cycle) { |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
555 gen->reset_requested = 1; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
556 context->should_return = 1; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
557 gen->reset_cycle = CYCLE_NEVER; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
558 } |
1971
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
559 if (v_context->frame != gen->last_frame) { |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
560 #ifndef IS_LIB |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
561 if (gen->ym->scope) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
562 scope_render(gen->ym->scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
563 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
564 #endif |
1971
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
565 //printf("reached frame end %d | MCLK Cycles: %d, Target: %d, VDP cycles: %d, vcounter: %d, hslot: %d\n", gen->last_frame, mclks, gen->frame_end, v_context->cycles, v_context->vcounter, v_context->hslot); |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
566 uint32_t elapsed = v_context->frame - gen->last_frame; |
1971
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
567 gen->last_frame = v_context->frame; |
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
568 event_flush(mclks); |
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
569 gen->last_flush_cycle = mclks; |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
570 if (gen->header.enter_debugger_frames) { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
571 if (elapsed >= gen->header.enter_debugger_frames) { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
572 gen->header.enter_debugger_frames = 0; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
573 gen->header.enter_debugger = 1; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
574 } else { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
575 gen->header.enter_debugger_frames -= elapsed; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
576 } |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
577 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
578 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
579 if(exit_after){ |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
580 if (elapsed >= exit_after) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
581 exit(0); |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
582 } else { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
583 exit_after -= elapsed; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
584 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
585 } |
1170
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
586 if (context->current_cycle > MAX_NO_ADJUST) { |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
587 uint32_t deduction = mclks - ADJUST_BUFFER; |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
588 vdp_adjust_cycles(v_context, deduction); |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
589 io_adjust_cycles(gen->io.ports, context->current_cycle, deduction); |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
590 io_adjust_cycles(gen->io.ports+1, context->current_cycle, deduction); |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
591 io_adjust_cycles(gen->io.ports+2, context->current_cycle, deduction); |
1610 | 592 if (gen->mapper_type == MAPPER_JCART) { |
593 jcart_adjust_cycles(gen, deduction); | |
594 } | |
1170
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
595 context->current_cycle -= deduction; |
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
596 z80_adjust_cycles(z_context, deduction); |
1902
32a3aa7b4a45
Fix YM2612 busy flag timing
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
597 ym_adjust_cycles(gen->ym, deduction); |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
598 if (gen->ym->vgm) { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
599 vgm_adjust_cycles(gen->ym->vgm, deduction); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
600 } |
1170
9170fc4d9835
Don't adjust cycles every frame. Only when we start getting close to UINT_MAX. Don't adjust all the way down to zero when we do adjust. Shouldn't fix anything, but may make debugging current issues easier.
Michael Pavone <pavone@retrodev.com>
parents:
1165
diff
changeset
|
601 gen->psg->cycles -= deduction; |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
602 if (gen->reset_cycle != CYCLE_NEVER) { |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
603 gen->reset_cycle -= deduction; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
604 } |
1946 | 605 event_cycle_adjust(mclks, deduction); |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
606 if (gen->expansion) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
607 scd_adjust_cycle(gen->expansion, deduction); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
608 } |
1971
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
609 gen->last_flush_cycle -= deduction; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
610 } |
1971
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
611 } else if (mclks - gen->last_flush_cycle > gen->soft_flush_cycles) { |
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
612 event_soft_flush(mclks); |
80920c21bb52
Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents:
1954
diff
changeset
|
613 gen->last_flush_cycle = mclks; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
614 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
615 gen->frame_end = vdp_cycles_to_frame_end(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
616 context->sync_cycle = gen->frame_end; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
617 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->current_cycle, v_context->vcounter, v_context->hslot); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
618 if (!address && (gen->header.enter_debugger || gen->header.save_state)) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
619 context->sync_cycle = context->current_cycle + 1; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
620 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
621 adjust_int_cycle(context, v_context); |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
622 if (gen->reset_cycle < context->target_cycle) { |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
623 context->target_cycle = gen->reset_cycle; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
624 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
625 if (address) { |
2424
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
626 if (gen->header.enter_debugger || context->wp_hit) { |
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
627 if (!context->wp_hit) { |
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
628 gen->header.enter_debugger = 0; |
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
629 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
630 #ifndef IS_LIB |
2033
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
631 if (gen->header.debugger_type == DEBUGGER_NATIVE) { |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
632 debugger(context, address); |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
633 } else { |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
634 gdb_debug_enter(context, address); |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
635 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
636 #endif |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
637 } |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
638 #ifdef NEW_CORE |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
639 if (gen->header.save_state) { |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
640 #else |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
641 if (gen->header.save_state && (z_context->pc || !z_context->native_pc || z_context->reset || !z_context->busreq)) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
642 #endif |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
643 uint8_t slot = gen->header.save_state - 1; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
644 gen->header.save_state = 0; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
645 #ifndef NEW_CORE |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
646 if (z_context->native_pc && !z_context->reset) { |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
647 //advance Z80 core to the start of an instruction |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
648 while (!z_context->pc) |
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
649 { |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
650 sync_z80(gen, z_context->current_cycle + MCLKS_PER_Z80); |
1440
7d4483944d4d
Allow actually saving a save state in more Z80 states. Save busreq/reset state in bus arbiter section for "native" save states
Michael Pavone <pavone@retrodev.com>
parents:
1433
diff
changeset
|
651 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
652 } |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
653 #endif |
1946 | 654 char *save_path = slot >= SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); |
655 if (use_native_states || slot >= SERIALIZE_SLOT) { | |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
656 serialize_buffer state; |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
657 init_serialize(&state); |
1946 | 658 genesis_serialize(gen, &state, address, slot != EVENTLOG_SLOT); |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
659 if (slot == SERIALIZE_SLOT) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
660 gen->serialize_tmp = state.data; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
661 gen->serialize_size = state.size; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
662 context->sync_cycle = context->current_cycle; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
663 context->should_return = 1; |
1946 | 664 } else if (slot == EVENTLOG_SLOT) { |
665 event_state(context->current_cycle, &state); | |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
666 } else { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
667 save_to_file(&state, save_path); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
668 free(state.data); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
669 } |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
670 } else { |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
671 save_gst(gen, save_path, address); |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
672 } |
1849
6b5147f08846
Don't print out a message when saving a state to the serialization pseudo-slot
Michael Pavone <pavone@retrodev.com>
parents:
1848
diff
changeset
|
673 if (slot != SERIALIZE_SLOT) { |
6b5147f08846
Don't print out a message when saving a state to the serialization pseudo-slot
Michael Pavone <pavone@retrodev.com>
parents:
1848
diff
changeset
|
674 debug_message("Saved state to %s\n", save_path); |
6b5147f08846
Don't print out a message when saving a state to the serialization pseudo-slot
Michael Pavone <pavone@retrodev.com>
parents:
1848
diff
changeset
|
675 } |
1478
da1dce39e846
Refactored save slot related logic to reduce duplication and allow reuse in new UI. Get state loading/saving mostly working in new UI
Michael Pavone <pavone@retrodev.com>
parents:
1471
diff
changeset
|
676 free(save_path); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
677 } else if(gen->header.save_state) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
678 context->sync_cycle = context->current_cycle + 1; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
679 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
680 } |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
681 return context; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
682 } |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
683 |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
684 static void sync_sound_pico(genesis_context * gen, uint32_t target) |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
685 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
686 while (target > gen->psg->cycles && target - gen->psg->cycles > MAX_SOUND_CYCLES) |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
687 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
688 uint32_t cur_target = gen->psg->cycles + MAX_SOUND_CYCLES; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
689 psg_run(gen->psg, cur_target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
690 pico_pcm_run(gen->adpcm, cur_target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
691 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
692 psg_run(gen->psg, target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
693 pico_pcm_run(gen->adpcm, target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
694 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
695 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
696 static void adjust_int_cycle_pico(m68k_context *context, vdp_context *v_context) |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
697 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
698 genesis_context *gen = context->system; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
699 if (context->sync_cycle - context->current_cycle > gen->max_cycles) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
700 context->sync_cycle = context->current_cycle + gen->max_cycles; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
701 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
702 context->int_cycle = CYCLE_NEVER; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
703 uint8_t mask = context->status & 0x7; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
704 if (mask < 6) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
705 uint32_t next_vint = vdp_next_vint(v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
706 if (next_vint != CYCLE_NEVER) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
707 context->int_cycle = next_vint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
708 context->int_num = 6; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
709 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
710 if (mask < 5) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
711 uint32_t next_hint = vdp_next_hint(v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
712 if (next_hint != CYCLE_NEVER) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
713 next_hint = next_hint < context->current_cycle ? context->current_cycle : next_hint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
714 if (next_hint < context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
715 context->int_cycle = next_hint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
716 context->int_num = 5; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
717 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
718 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
719 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
720 if (mask < 3) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
721 uint32_t next_pcm_int = pico_pcm_next_int(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
722 if (next_pcm_int != CYCLE_NEVER && next_pcm_int < context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
723 context->int_cycle = next_pcm_int; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
724 context->int_num = 3; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
725 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
726 if (mask < 2 && (v_context->regs[REG_MODE_3] & BIT_EINT_EN) && gen->header.type == SYSTEM_GENESIS) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
727 uint32_t next_eint_port0 = io_next_interrupt(gen->io.ports, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
728 uint32_t next_eint_port1 = io_next_interrupt(gen->io.ports + 1, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
729 uint32_t next_eint_port2 = io_next_interrupt(gen->io.ports + 2, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
730 uint32_t next_eint = next_eint_port0 < next_eint_port1 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
731 ? (next_eint_port0 < next_eint_port2 ? next_eint_port0 : next_eint_port2) |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
732 : (next_eint_port1 < next_eint_port2 ? next_eint_port1 : next_eint_port2); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
733 if (next_eint != CYCLE_NEVER) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
734 next_eint = next_eint < context->current_cycle ? context->current_cycle : next_eint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
735 if (next_eint < context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
736 context->int_cycle = next_eint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
737 context->int_num = 2; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
738 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
739 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
740 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
741 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
742 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
743 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
744 if (context->int_cycle > context->current_cycle && context->int_pending == INT_PENDING_SR_CHANGE) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
745 context->int_pending = INT_PENDING_NONE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
746 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
747 /*if (context->int_cycle != old_int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
748 printf("int cycle changed to: %d, level: %d @ %d(%d), frame: %d, vcounter: %d, hslot: %d, mask: %d, hint_counter: %d\n", context->int_cycle, context->int_num, v_context->cycles, context->current_cycle, v_context->frame, v_context->vcounter, v_context->hslot, context->status & 0x7, v_context->hint_counter); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
749 old_int_cycle = context->int_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
750 }*/ |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
751 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
752 if (context->status & M68K_STATUS_TRACE || context->trace_pending) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
753 context->target_cycle = context->current_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
754 return; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
755 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
756 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
757 context->target_cycle = context->int_cycle < context->sync_cycle ? context->int_cycle : context->sync_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
758 if (context->should_return || gen->header.enter_debugger || context->wp_hit) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
759 context->target_cycle = context->current_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
760 } else if (context->target_cycle < context->current_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
761 //Changes to SR can result in an interrupt cycle that's in the past |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
762 //This can cause issues with the implementation of STOP though |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
763 context->target_cycle = context->current_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
764 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
765 if (context->target_cycle == context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
766 //Currently delays from Z80 access and refresh are applied only when we sync |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
767 //this can cause extra latency when it comes to interrupts |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
768 //to prevent this code forces some extra synchronization in the period immediately before an interrupt |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
769 if ((context->target_cycle - context->current_cycle) > gen->int_latency_prev1) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
770 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev1; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
771 } else if ((context->target_cycle - context->current_cycle) > gen->int_latency_prev2) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
772 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev2; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
773 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
774 context->target_cycle = context->sync_cycle = context->current_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
775 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
776 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
777 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
778 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
779 |
2428 | 780 static m68k_context* sync_components_pico(m68k_context * context, uint32_t address) |
781 { | |
782 genesis_context * gen = context->system; | |
783 vdp_context * v_context = gen->vdp; | |
784 if (gen->bus_busy) { | |
785 gen_update_refresh_no_wait(context); | |
786 } else { | |
787 gen_update_refresh(context); | |
788 } | |
789 | |
790 uint32_t mclks = context->current_cycle; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
791 sync_sound_pico(gen, mclks); |
2428 | 792 vdp_run_context(v_context, mclks); |
793 if (mclks >= gen->reset_cycle) { | |
794 gen->reset_requested = 1; | |
795 context->should_return = 1; | |
796 gen->reset_cycle = CYCLE_NEVER; | |
797 } | |
798 if (v_context->frame != gen->last_frame) { | |
799 #ifndef IS_LIB | |
800 if (gen->psg->scope) { | |
801 scope_render(gen->psg->scope); | |
802 } | |
803 #endif | |
804 //printf("reached frame end %d | MCLK Cycles: %d, Target: %d, VDP cycles: %d, vcounter: %d, hslot: %d\n", gen->last_frame, mclks, gen->frame_end, v_context->cycles, v_context->vcounter, v_context->hslot); | |
805 uint32_t elapsed = v_context->frame - gen->last_frame; | |
806 gen->last_frame = v_context->frame; | |
807 event_flush(mclks); | |
808 gen->last_flush_cycle = mclks; | |
809 if (gen->header.enter_debugger_frames) { | |
810 if (elapsed >= gen->header.enter_debugger_frames) { | |
811 gen->header.enter_debugger_frames = 0; | |
812 gen->header.enter_debugger = 1; | |
813 } else { | |
814 gen->header.enter_debugger_frames -= elapsed; | |
815 } | |
816 } | |
817 | |
818 if(exit_after){ | |
819 if (elapsed >= exit_after) { | |
820 exit(0); | |
821 } else { | |
822 exit_after -= elapsed; | |
823 } | |
824 } | |
825 if (context->current_cycle > MAX_NO_ADJUST) { | |
826 uint32_t deduction = mclks - ADJUST_BUFFER; | |
827 vdp_adjust_cycles(v_context, deduction); | |
828 if (gen->mapper_type == MAPPER_JCART) { | |
829 jcart_adjust_cycles(gen, deduction); | |
830 } | |
831 context->current_cycle -= deduction; | |
832 if (gen->psg->vgm) { | |
833 vgm_adjust_cycles(gen->psg->vgm, deduction); | |
834 } | |
835 gen->psg->cycles -= deduction; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
836 gen->adpcm->cycle -= deduction; |
2428 | 837 if (gen->reset_cycle != CYCLE_NEVER) { |
838 gen->reset_cycle -= deduction; | |
839 } | |
840 event_cycle_adjust(mclks, deduction); | |
841 if (gen->expansion) { | |
842 scd_adjust_cycle(gen->expansion, deduction); | |
843 } | |
844 gen->last_flush_cycle -= deduction; | |
845 } | |
846 } else if (mclks - gen->last_flush_cycle > gen->soft_flush_cycles) { | |
847 event_soft_flush(mclks); | |
848 gen->last_flush_cycle = mclks; | |
849 } | |
850 gen->frame_end = vdp_cycles_to_frame_end(v_context); | |
851 context->sync_cycle = gen->frame_end; | |
852 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->current_cycle, v_context->vcounter, v_context->hslot); | |
853 if (!address && (gen->header.enter_debugger || gen->header.save_state)) { | |
854 context->sync_cycle = context->current_cycle + 1; | |
855 } | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
856 adjust_int_cycle_pico(context, v_context); |
2428 | 857 if (gen->reset_cycle < context->target_cycle) { |
858 context->target_cycle = gen->reset_cycle; | |
859 } | |
860 if (address) { | |
861 if (gen->header.enter_debugger || context->wp_hit) { | |
862 if (!context->wp_hit) { | |
863 gen->header.enter_debugger = 0; | |
864 } | |
865 #ifndef IS_LIB | |
866 if (gen->header.debugger_type == DEBUGGER_NATIVE) { | |
867 debugger(context, address); | |
868 } else { | |
869 gdb_debug_enter(context, address); | |
870 } | |
871 #endif | |
872 } | |
873 if (gen->header.save_state) { | |
874 uint8_t slot = gen->header.save_state - 1; | |
875 gen->header.save_state = 0; | |
876 char *save_path = slot >= SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); | |
877 if (use_native_states || slot >= SERIALIZE_SLOT) { | |
878 serialize_buffer state; | |
879 init_serialize(&state); | |
880 genesis_serialize(gen, &state, address, slot != EVENTLOG_SLOT); | |
881 if (slot == SERIALIZE_SLOT) { | |
882 gen->serialize_tmp = state.data; | |
883 gen->serialize_size = state.size; | |
884 context->sync_cycle = context->current_cycle; | |
885 context->should_return = 1; | |
886 } else if (slot == EVENTLOG_SLOT) { | |
887 event_state(context->current_cycle, &state); | |
888 } else { | |
889 save_to_file(&state, save_path); | |
890 free(state.data); | |
891 } | |
892 } else { | |
893 save_gst(gen, save_path, address); | |
894 } | |
895 if (slot != SERIALIZE_SLOT) { | |
896 debug_message("Saved state to %s\n", save_path); | |
897 } | |
898 free(save_path); | |
899 } else if(gen->header.save_state) { | |
900 context->sync_cycle = context->current_cycle + 1; | |
901 } | |
902 } | |
903 return context; | |
904 } | |
905 | |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
906 static m68k_context *int_ack(m68k_context *context) |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
907 { |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
908 genesis_context * gen = context->system; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
909 if (gen->header.type != SYSTEM_PICO || context->int_num > 4 || context->int_num < 3) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
910 vdp_context * v_context = gen->vdp; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
911 //printf("acknowledging %d @ %d:%d, vcounter: %d, hslot: %d\n", context->int_ack, context->current_cycle, v_context->cycles, v_context->vcounter, v_context->hslot); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
912 vdp_run_context(v_context, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
913 vdp_int_ack(v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
914 } |
2354
a773b8f09292
Remove old refresh hack that is causing VDPFifoTesting to have a failed test
Michael Pavone <pavone@retrodev.com>
parents:
2350
diff
changeset
|
915 |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
916 //the Genesis responds to these exclusively with !VPA which means its a slow |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
917 //6800 operation. documentation says these can take between 10 and 19 cycles. |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
918 //actual results measurements seem to suggest it's actually between 9 and 18 |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
919 //Base 68K core has added 4 cycles for a normal int ack cycle already |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
920 //We add 5 + the current cycle count (in 68K cycles) mod 10 to simulate the |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
921 //additional variable delay from the use of the 6800 cycle |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
922 uint32_t cycle_count = context->current_cycle / context->options->gen.clock_divider; |
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
923 context->current_cycle += 5 + (cycle_count % 10); |
2354
a773b8f09292
Remove old refresh hack that is causing VDPFifoTesting to have a failed test
Michael Pavone <pavone@retrodev.com>
parents:
2350
diff
changeset
|
924 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
925 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
926 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
927 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
928 static m68k_context * vdp_port_write(uint32_t vdp_port, m68k_context * context, uint16_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
929 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
930 if (vdp_port & 0x2700E0) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
931 fatal_error("machine freeze due to write to address %X\n", 0xC00000 | vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
932 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
933 genesis_context * gen = context->system; |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
934 if (!gen->vdp_unlocked) { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
935 fatal_error("machine freeze due to VDP write to %X without TMSS unlock\n", 0xC00000 | vdp_port); |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
936 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
937 vdp_port &= 0x1F; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
938 //printf("vdp_port write: %X, value: %X, cycle: %d\n", vdp_port, value, context->current_cycle); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
939 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
940 //do refresh check here so we can avoid adding a penalty for a refresh that happens during a VDP access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
941 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
942 |
2428 | 943 if (gen->header.type == SYSTEM_PICO) { |
944 sync_components_pico(context, 0); | |
945 } else { | |
946 sync_components(context, 0); | |
947 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
948 vdp_context *v_context = gen->vdp; |
1374
8f404b1fa572
Go back to resetting the refresh counter after a DMA. Probably not quite correct as it is probably reset on VDP triggered refresh, but this is close enough for now given the general limitations with my refresh code. VDP FIFO Testing seems to be passing 100% reliably again (was occassionally failing still with the last commit)
Michael Pavone <pavone@retrodev.com>
parents:
1373
diff
changeset
|
949 uint32_t before_cycle = v_context->cycles; |
2391
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
950 uint8_t did_dma = 0; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
951 if (vdp_port < 0x10) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
952 int blocked; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
953 if (vdp_port < 4) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
954 while (vdp_data_port_write(v_context, value) < 0) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
955 while(v_context->flags & FLAG_DMA_RUN) { |
2391
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
956 did_dma = 1; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
957 vdp_run_dma_done(v_context, gen->frame_end); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
958 if (v_context->cycles >= gen->frame_end) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
959 uint32_t cycle_diff = v_context->cycles - context->current_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
960 uint32_t m68k_cycle_diff = (cycle_diff / MCLKS_PER_68K) * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
961 if (m68k_cycle_diff < cycle_diff) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
962 m68k_cycle_diff += MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
963 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
964 context->current_cycle += m68k_cycle_diff; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
965 gen->bus_busy = 1; |
2428 | 966 if (gen->header.type == SYSTEM_PICO) { |
967 sync_components_pico(context, 0); | |
968 } else { | |
969 sync_components(context, 0); | |
970 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
971 gen->bus_busy = 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
972 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
973 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
974 //context->current_cycle = v_context->cycles; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
975 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
976 } else if(vdp_port < 8) { |
1371
5b20840711c1
Remove HINT_FUDGE and make a small adjustment to how VDP syncs with rest of system instead. Worse results on CRAM dot issue, but much less of a hack
Michael Pavone <pavone@retrodev.com>
parents:
1364
diff
changeset
|
977 vdp_run_context_full(v_context, context->current_cycle); |
1373
7cfc9d532e34
Fixed regression from VDP sync changes. Direct color DMA demos are now achieving stable sync again
Michael Pavone <pavone@retrodev.com>
parents:
1372
diff
changeset
|
978 before_cycle = v_context->cycles; |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
979 blocked = vdp_control_port_write(v_context, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
980 if (blocked) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
981 while (blocked) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
982 while(v_context->flags & FLAG_DMA_RUN) { |
2391
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
983 did_dma = 1; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
984 vdp_run_dma_done(v_context, gen->frame_end); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
985 if (v_context->cycles >= gen->frame_end) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
986 uint32_t cycle_diff = v_context->cycles - context->current_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
987 uint32_t m68k_cycle_diff = (cycle_diff / MCLKS_PER_68K) * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
988 if (m68k_cycle_diff < cycle_diff) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
989 m68k_cycle_diff += MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
990 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
991 context->current_cycle += m68k_cycle_diff; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
992 gen->bus_busy = 1; |
2428 | 993 if (gen->header.type == SYSTEM_PICO) { |
994 sync_components_pico(context, 0); | |
995 } else { | |
996 sync_components(context, 0); | |
997 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
998 gen->bus_busy = 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
999 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1000 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
1001 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1002 if (blocked < 0) { |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1003 blocked = vdp_control_port_write(v_context, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1004 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1005 blocked = 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1006 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1007 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1008 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1009 context->sync_cycle = gen->frame_end = vdp_cycles_to_frame_end(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1010 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->current_cycle, v_context->vcounter, v_context->hslot); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1011 if (gen->header.type == SYSTEM_PICO) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1012 adjust_int_cycle_pico(context, v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1013 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1014 adjust_int_cycle(context, v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1015 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1016 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1017 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1018 fatal_error("Illegal write to HV Counter port %X\n", vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1019 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1020 if (v_context->cycles != before_cycle) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1021 //printf("68K paused for %d (%d) cycles at cycle %d (%d) for write\n", v_context->cycles - context->current_cycle, v_context->cycles - before_cycle, context->current_cycle, before_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1022 uint32_t cycle_diff = v_context->cycles - context->current_cycle; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1023 uint32_t m68k_cycle_diff = (cycle_diff / MCLKS_PER_68K) * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1024 if (m68k_cycle_diff < cycle_diff) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1025 m68k_cycle_diff += MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1026 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1027 context->current_cycle += m68k_cycle_diff; |
2428 | 1028 if (gen->header.type == SYSTEM_GENESIS) { |
1029 //Lock the Z80 out of the bus until the VDP access is complete | |
1030 gen->bus_busy = 1; | |
1031 sync_z80(gen, v_context->cycles); | |
1032 gen->bus_busy = 0; | |
1033 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1034 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1035 } else if (vdp_port < 0x18) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1036 psg_write(gen->psg, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1037 } else { |
1318
bfdd450e7dea
Initial work on handling the 128KB VRAM mode bit and some basic prep work for VDP test register support
Michael Pavone <pavone@retrodev.com>
parents:
1316
diff
changeset
|
1038 vdp_test_port_write(gen->vdp, value); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1039 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1040 |
2391
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1041 if (did_dma) { |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1042 gen->refresh_counter = 0; |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1043 gen->last_sync_cycle = context->current_cycle; |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1044 } else { |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1045 //refresh may have happened while we were waiting on the VDP, |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1046 //so advance refresh_counter but don't add any delays |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1047 gen_update_refresh_no_wait(context); |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1048 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1049 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1050 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1051 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1052 static m68k_context * vdp_port_write_b(uint32_t vdp_port, m68k_context * context, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1053 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1054 return vdp_port_write(vdp_port, context, vdp_port < 0x10 ? value | value << 8 : ((vdp_port & 1) ? value : 0)); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1055 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1056 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1057 static void * z80_vdp_port_write(uint32_t vdp_port, void * vcontext, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1058 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1059 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1060 genesis_context * gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1061 vdp_port &= 0xFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1062 if (vdp_port & 0xE0) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1063 fatal_error("machine freeze due to write to Z80 address %X\n", 0x7F00 | vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1064 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1065 if (vdp_port < 0x10) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1066 //These probably won't currently interact well with the 68K accessing the VDP |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1067 if (vdp_port < 4) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1068 vdp_run_context(gen->vdp, context->Z80_CYCLE); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1069 vdp_data_port_write(gen->vdp, value << 8 | value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1070 } else if (vdp_port < 8) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1071 vdp_run_context_full(gen->vdp, context->Z80_CYCLE); |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1072 vdp_control_port_write(gen->vdp, value << 8 | value, context->Z80_CYCLE); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1073 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1074 fatal_error("Illegal write to HV Counter port %X\n", vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1075 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1076 } else if (vdp_port < 0x18) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1077 sync_sound(gen, context->Z80_CYCLE); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1078 psg_write(gen->psg, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1079 } else { |
2327
9dd27530c570
Fix Z80 access to VDP debug register
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1080 vdp_test_port_write(gen->vdp, value << 8 | value); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1081 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1082 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1083 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1084 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1085 static uint16_t vdp_port_read(uint32_t vdp_port, m68k_context * context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1086 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1087 if (vdp_port & 0x2700E0) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1088 fatal_error("machine freeze due to read from address %X\n", 0xC00000 | vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1089 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1090 genesis_context *gen = context->system; |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1091 if (!gen->vdp_unlocked) { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1092 fatal_error("machine freeze due to VDP read from %X without TMSS unlock\n", 0xC00000 | vdp_port); |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1093 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1094 vdp_port &= 0x1F; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1095 uint16_t value; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1096 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
1097 //do refresh check here so we can avoid adding a penalty for a refresh that happens during a VDP access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1098 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1099 |
2428 | 1100 if (gen->header.type == SYSTEM_PICO) { |
1101 sync_components_pico(context, 0); | |
1102 } else { | |
1103 sync_components(context, 0); | |
1104 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1105 vdp_context * v_context = gen->vdp; |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1106 uint32_t before_cycle = context->current_cycle; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1107 if (vdp_port < 0x10) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1108 if (vdp_port < 4) { |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1109 value = vdp_data_port_read(v_context, &context->current_cycle, MCLKS_PER_68K); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1110 } else if(vdp_port < 8) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1111 value = vdp_control_port_read(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1112 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1113 value = vdp_hv_counter_read(v_context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1114 //printf("HV Counter: %X at cycle %d\n", value, v_context->cycles); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1115 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1116 } else if (vdp_port < 0x18){ |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1117 fatal_error("Illegal read from PSG port %X\n", vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1118 } else { |
1869
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1119 value = get_open_bus_value(&gen->header); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1120 } |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1121 if (context->current_cycle != before_cycle) { |
2021
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1122 //printf("68K paused for %d (%d) cycles at cycle %d (%d) for read\n", v_context->cycles - context->current_cycle, v_context->cycles - before_cycle, context->current_cycle, before_cycle); |
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1123 //Lock the Z80 out of the bus until the VDP access is complete |
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1124 genesis_context *gen = context->system; |
2428 | 1125 if (gen->header.type == SYSTEM_GENESIS) { |
1126 gen->bus_busy = 1; | |
1127 sync_z80(gen, context->current_cycle); | |
1128 gen->bus_busy = 0; | |
1129 } | |
2021
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1130 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1131 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
1132 //refresh may have happened while we were waiting on the VDP, |
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
1133 //so advance refresh_counter but don't add any delays |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1134 gen_update_refresh_no_wait(context); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1135 return value; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1136 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1137 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1138 static uint8_t vdp_port_read_b(uint32_t vdp_port, m68k_context * context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1139 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1140 uint16_t value = vdp_port_read(vdp_port, context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1141 if (vdp_port & 1) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1142 return value; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1143 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1144 return value >> 8; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1145 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1146 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1147 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1148 static uint8_t z80_vdp_port_read(uint32_t vdp_port, void * vcontext) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1149 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1150 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1151 if (vdp_port & 0xE0) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1152 fatal_error("machine freeze due to read from Z80 address %X\n", 0x7F00 | vdp_port); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1153 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1154 genesis_context * gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1155 //VDP access goes over the 68K bus like a bank area access |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1156 //typical delay from bus arbitration |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1157 context->Z80_CYCLE += 3 * MCLKS_PER_Z80; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1158 //TODO: add cycle for an access right after a previous one |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1159 //TODO: Below cycle time is an estimate based on the time between 68K !BG goes low and Z80 !MREQ goes high |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1160 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1161 gen->m68k->current_cycle += 8 * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1162 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1163 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1164 vdp_port &= 0x1F; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1165 uint16_t ret; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1166 if (vdp_port < 0x10) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1167 //These probably won't currently interact well with the 68K accessing the VDP |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1168 vdp_run_context(gen->vdp, context->Z80_CYCLE); |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1169 uint32_t before = context->Z80_CYCLE; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1170 if (vdp_port < 4) { |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1171 ret = vdp_data_port_read(gen->vdp, &context->Z80_CYCLE, MCLKS_PER_Z80); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1172 } else if (vdp_port < 8) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1173 ret = vdp_control_port_read(gen->vdp); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1174 } else { |
1316
3185438e0134
Fix copy pasta error in handling of Z80 VDP port reads. HV counter reads are not illegal writes =P. Fixes immediate exit in Overdrive II, though other problems remain
Michael Pavone <pavone@retrodev.com>
parents:
1309
diff
changeset
|
1175 ret = vdp_hv_counter_read(gen->vdp); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1176 } |
2227
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1177 if (context->Z80_CYCLE != before) { |
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1178 gen->m68k->current_cycle += context->Z80_CYCLE - before; |
eaaf28af3c94
Implement VDP read latency and invalid write delays revealed by Ti_'s instruction timing ROM
Michael Pavone <pavone@retrodev.com>
parents:
2194
diff
changeset
|
1179 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1180 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1181 //TODO: Figure out the correct value today |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1182 ret = 0xFFFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1183 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1184 return vdp_port & 1 ? ret : ret >> 8; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1185 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1186 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1187 //TODO: Move this inside the system context |
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1188 static uint32_t zram_counter = 0; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1189 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1190 static m68k_context * io_write(uint32_t location, m68k_context * context, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1191 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1192 genesis_context * gen = context->system; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1193 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1194 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1195 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1196 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1197 if (location < 0x10000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1198 //Access to Z80 memory incurs a one 68K cycle wait state |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1199 context->current_cycle += MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1200 if (!z80_enabled || z80_get_busack(gen->z80, context->current_cycle)) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1201 location &= 0x7FFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1202 if (location < 0x4000) { |
1104
4224980a5f84
Fix the previous WIP commit. Quick tests suggests things are no more broken than before now.
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
1203 gen->zram[location & 0x1FFF] = value; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1204 #ifndef NO_Z80 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1205 z80_handle_code_write(location & 0x1FFF, gen->z80); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1206 #endif |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1207 } else if (location < 0x6000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1208 sync_sound(gen, context->current_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1209 if (location & 1) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1210 ym_data_write(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1211 } else if(location & 2) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1212 ym_address_write_part2(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1213 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1214 ym_address_write_part1(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1215 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1216 } else if (location == 0x6000) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1217 gen->z80_bank_reg = (gen->z80_bank_reg >> 1 | value << 8) & 0x1FF; |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1218 if (gen->z80_bank_reg < 0x80) { |
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1219 gen->z80->mem_pointers[1] = (gen->z80_bank_reg << 15) + ((char *)gen->z80->mem_pointers[2]); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1220 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1221 gen->z80->mem_pointers[1] = NULL; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1222 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1223 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1224 fatal_error("68K write to unhandled Z80 address %X\n", location); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1225 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1226 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1227 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1228 if (location < 0x10100) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1229 switch(location >> 1 & 0xFF) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1230 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1231 case 0x1: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1232 io_data_write(gen->io.ports, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1233 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1234 case 0x2: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1235 io_data_write(gen->io.ports+1, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1236 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1237 case 0x3: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1238 io_data_write(gen->io.ports+2, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1239 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1240 case 0x4: |
1348
040c5600e2d9
Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents:
1333
diff
changeset
|
1241 io_control_write(gen->io.ports, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1242 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1243 case 0x5: |
1348
040c5600e2d9
Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents:
1333
diff
changeset
|
1244 io_control_write(gen->io.ports+1, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1245 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1246 case 0x6: |
1348
040c5600e2d9
Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents:
1333
diff
changeset
|
1247 io_control_write(gen->io.ports+2, value, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1248 break; |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1249 case 0x7: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1250 io_tx_write(gen->io.ports, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1251 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1252 case 0x8: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1253 case 0xB: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1254 case 0xE: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1255 //serial input port is not writeable |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1256 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1257 case 0x9: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1258 io_sctrl_write(gen->io.ports, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1259 gen->io.ports[0].serial_ctrl = value; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1260 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1261 case 0xA: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1262 io_tx_write(gen->io.ports + 1, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1263 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1264 case 0xC: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1265 io_sctrl_write(gen->io.ports + 1, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1266 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1267 case 0xD: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1268 io_tx_write(gen->io.ports + 2, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1269 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1270 case 0xF: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1271 io_sctrl_write(gen->io.ports + 2, value, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1272 break; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1273 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1274 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1275 uint32_t masked = location & 0xFFF00; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1276 if (masked == 0x11100) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1277 if (value & 1) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1278 dputs("bus requesting Z80"); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1279 if (z80_enabled) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1280 z80_assert_busreq(gen->z80, context->current_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1281 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1282 gen->z80->busack = 1; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1283 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1284 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1285 if (gen->z80->busreq) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1286 dputs("releasing z80 bus"); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1287 #ifdef DO_DEBUG_PRINT |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1288 char fname[20]; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1289 sprintf(fname, "zram-%d", zram_counter++); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1290 FILE * f = fopen(fname, "wb"); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1291 fwrite(z80_ram, 1, sizeof(z80_ram), f); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1292 fclose(f); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1293 #endif |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1294 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1295 if (z80_enabled) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1296 z80_clear_busreq(gen->z80, context->current_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1297 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1298 gen->z80->busack = 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1299 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1300 } |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1301 } else if (masked == 0x11200) { |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
1302 sync_z80(gen, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1303 if (value & 1) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1304 if (z80_enabled) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1305 z80_clear_reset(gen->z80, context->current_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1306 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1307 gen->z80->reset = 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1308 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1309 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1310 if (z80_enabled) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1311 z80_assert_reset(gen->z80, context->current_cycle); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1312 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1313 gen->z80->reset = 1; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1314 } |
1308
1b3fe6e03e7b
Reset YM2612 whenver the Z80 is reset. Fixes issue with stuck notes in Fantastic Dizzy and Kid Chameleon
Michael Pavone <pavone@retrodev.com>
parents:
1304
diff
changeset
|
1315 ym_reset(gen->ym); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1316 } |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1317 } else if (masked != 0x11300 && masked != 0x11000) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1318 fatal_error("Machine freeze due to unmapped write to address %X\n", location | 0xA00000); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1319 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1320 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1321 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1322 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1323 //no refresh delays during IO access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1324 gen_update_refresh_no_wait(context); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1325 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1326 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1327 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1328 static m68k_context * io_write_w(uint32_t location, m68k_context * context, uint16_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1329 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1330 if (location < 0x10000 || (location & 0x1FFF) >= 0x100) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1331 return io_write(location, context, value >> 8); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1332 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1333 return io_write(location, context, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1334 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1335 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1336 |
2428 | 1337 static void* pico_io_write(uint32_t location, void *vcontext, uint8_t value) |
1338 { | |
1339 printf("Pico IO write.b %X - %X\n", location, value); | |
1340 return vcontext; | |
1341 } | |
1342 | |
1343 static void* pico_io_write_w(uint32_t location, void *vcontext, uint16_t value) | |
1344 { | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1345 uint32_t port = location & 0xFE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1346 m68k_context *context = vcontext; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1347 genesis_context *gen = context->system; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1348 if (port == 0x10) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1349 sync_sound_pico(gen, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1350 pico_pcm_data_write(gen->adpcm, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1351 printf("PICO ADPCM Data: %04X\n", value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1352 if (context->int_num == 3) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1353 adjust_int_cycle_pico(context, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1354 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1355 } else if (port == 0x12) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1356 sync_sound_pico(gen, context->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1357 printf("PICO ADPCM Control: %04X\n", value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1358 pico_pcm_ctrl_write(gen->adpcm, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1359 adjust_int_cycle_pico(context, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1360 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1361 return pico_io_write(location, vcontext, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1362 } |
2428 | 1363 return vcontext; |
1364 } | |
1365 | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1366 #define FOREIGN 0x80 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1367 #define HZ50 0x40 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1368 #define USA FOREIGN |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1369 #define JAP 0x00 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1370 #define EUR (HZ50|FOREIGN) |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1371 #define NO_DISK 0x20 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1372 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1373 static uint8_t io_read(uint32_t location, m68k_context * context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1374 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1375 uint8_t value; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1376 genesis_context *gen = context->system; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1377 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1378 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1379 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1380 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1381 if (location < 0x10000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1382 //Access to Z80 memory incurs a one 68K cycle wait state |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1383 context->current_cycle += MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1384 if (!z80_enabled || z80_get_busack(gen->z80, context->current_cycle)) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1385 location &= 0x7FFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1386 if (location < 0x4000) { |
1104
4224980a5f84
Fix the previous WIP commit. Quick tests suggests things are no more broken than before now.
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
1387 value = gen->zram[location & 0x1FFF]; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1388 } else if (location < 0x6000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1389 sync_sound(gen, context->current_cycle); |
1904
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
1390 value = ym_read_status(gen->ym, context->current_cycle, location); |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1391 } else if (location < 0x7F00) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1392 value = 0xFF; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1393 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1394 fatal_error("Machine freeze due to read of Z80 VDP memory window by 68K: %X\n", location | 0xA00000); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1395 value = 0xFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1396 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1397 } else { |
1914
5b94e0e7c5a5
Reading from Z80 bus when Z80 is not bus requested should return open bus. Fixes regression in Metal Sonic Rebooted
Michael Pavone <pavone@retrodev.com>
parents:
1909
diff
changeset
|
1398 uint16_t word = get_open_bus_value(&gen->header); |
5b94e0e7c5a5
Reading from Z80 bus when Z80 is not bus requested should return open bus. Fixes regression in Metal Sonic Rebooted
Michael Pavone <pavone@retrodev.com>
parents:
1909
diff
changeset
|
1399 value = location & 1 ? word : word >> 8; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1400 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1401 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1402 if (location < 0x10100) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1403 switch(location >> 1 & 0xFF) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1404 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1405 case 0x0: |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1406 //version bits should be 0 for now since we're not emulating TMSS |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1407 value = gen->version_reg; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1408 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1409 case 0x1: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1410 value = io_data_read(gen->io.ports, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1411 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1412 case 0x2: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1413 value = io_data_read(gen->io.ports+1, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1414 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1415 case 0x3: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1416 value = io_data_read(gen->io.ports+2, context->current_cycle); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1417 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1418 case 0x4: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1419 value = gen->io.ports[0].control; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1420 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1421 case 0x5: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1422 value = gen->io.ports[1].control; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1423 break; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1424 case 0x6: |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1425 value = gen->io.ports[2].control; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1426 break; |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1427 case 0x7: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1428 value = gen->io.ports[0].serial_out; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1429 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1430 case 0x8: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1431 value = io_rx_read(gen->io.ports, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1432 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1433 case 0x9: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1434 value = io_sctrl_read(gen->io.ports, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1435 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1436 case 0xA: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1437 value = gen->io.ports[1].serial_out; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1438 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1439 case 0xB: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1440 value = io_rx_read(gen->io.ports + 1, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1441 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1442 case 0xC: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1443 value = io_sctrl_read(gen->io.ports, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1444 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1445 case 0xD: |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1446 value = gen->io.ports[2].serial_out; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1447 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1448 case 0xE: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1449 value = io_rx_read(gen->io.ports + 1, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1450 break; |
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1451 case 0xF: |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
1452 value = io_sctrl_read(gen->io.ports, context->current_cycle); |
1215
cf69a179aeaf
Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around.
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1453 break; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1454 default: |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1455 value = get_open_bus_value(&gen->header) >> 8; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1456 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1457 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1458 uint32_t masked = location & 0xFFF00; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1459 if (masked == 0x11100) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1460 value = z80_enabled ? !z80_get_busack(gen->z80, context->current_cycle) : !gen->z80->busack; |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
1461 value |= (get_open_bus_value(&gen->header) >> 8) & 0xFE; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1462 dprintf("Byte read of BUSREQ returned %d @ %d (reset: %d)\n", value, context->current_cycle, gen->z80->reset); |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1463 } else if (masked == 0x11200) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1464 value = !gen->z80->reset; |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1465 } else if (masked == 0x11300 || masked == 0x11000) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1466 //A11300 is apparently completely unused |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1467 //A11000 is the memory control register which I am assuming is write only |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1468 value = get_open_bus_value(&gen->header) >> 8; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1469 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1470 location |= 0xA00000; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1471 fatal_error("Machine freeze due to read of unmapped IO location %X\n", location); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1472 value = 0xFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1473 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1474 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1475 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1476 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1477 //no refresh delays during IO access |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
1478 gen_update_refresh_no_wait(context); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1479 return value; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1480 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1481 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1482 static uint16_t io_read_w(uint32_t location, m68k_context * context) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1483 { |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
1484 genesis_context *gen = context->system; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1485 uint16_t value = io_read(location, context); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1486 if (location < 0x10000 || (location & 0x1FFF) < 0x100) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1487 value = value | (value << 8); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1488 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1489 value <<= 8; |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
1490 value |= get_open_bus_value(&gen->header) & 0xFF; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1491 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1492 return value; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1493 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1494 |
2428 | 1495 static uint8_t pico_io_read(uint32_t location, void *vcontext) |
1496 { | |
1497 m68k_context *m68k = vcontext; | |
1498 genesis_context *gen = m68k->system; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1499 uint16_t tmp; |
2428 | 1500 switch(location >> 1 & 0x7F) |
1501 { | |
1502 case 0: | |
1503 return gen->version_reg; | |
1504 case 1: | |
1505 return gen->pico_button_state; | |
1506 case 2: | |
1507 return gen->pico_pen_x >> 8; | |
1508 case 3: | |
1509 return gen->pico_pen_x; | |
1510 case 4: | |
1511 return gen->pico_pen_y >> 8; | |
1512 case 5: | |
1513 return gen->pico_pen_y; | |
1514 case 6: | |
1515 return gen->pico_page; | |
1516 case 8: | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
1517 //printf("uPD7759 data read @ %u\n", m68k->current_cycle); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1518 sync_sound_pico(gen, m68k->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1519 tmp = pico_pcm_data_read(gen->adpcm); |
2433
2907c3312423
Fix byte reads of ADPCM ports. Fixes hangs in Sanchoume no Tama and Sailor Moon Sailor Stars - Tokimeki Party
Michael Pavone <pavone@retrodev.com>
parents:
2431
diff
changeset
|
1520 return (location & 1) ? tmp : tmp >> 8; |
2428 | 1521 case 9: |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
1522 //printf("uPD7759 contro/status read @ %u\n", m68k->current_cycle); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1523 sync_sound_pico(gen, m68k->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1524 tmp = pico_pcm_ctrl_read(gen->adpcm); |
2433
2907c3312423
Fix byte reads of ADPCM ports. Fixes hangs in Sanchoume no Tama and Sailor Moon Sailor Stars - Tokimeki Party
Michael Pavone <pavone@retrodev.com>
parents:
2431
diff
changeset
|
1525 return (location & 1) ? tmp : tmp >> 8; |
2428 | 1526 return 0; |
1527 default: | |
1528 printf("Unknown Pico IO read %X @ %u\n", location, m68k->current_cycle); | |
1529 return 0xFF; | |
1530 } | |
1531 } | |
1532 | |
1533 static uint16_t pico_io_read_w(uint32_t location, void *vcontext) | |
1534 { | |
1535 m68k_context *m68k = vcontext; | |
1536 genesis_context *gen = m68k->system; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1537 uint32_t port = location & 0xFE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1538 if (port == 0x10) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1539 sync_sound_pico(gen, m68k->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1540 return pico_pcm_data_read(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1541 } else if (port == 0x12) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1542 sync_sound_pico(gen, m68k->current_cycle); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1543 return pico_pcm_ctrl_read(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1544 } |
2428 | 1545 uint16_t value = pico_io_read(location, vcontext); |
1546 return value | (value << 8); | |
1547 } | |
1548 | |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1549 static void * z80_write_ym(uint32_t location, void * vcontext, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1550 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1551 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1552 genesis_context * gen = context->system; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1553 sync_sound(gen, context->Z80_CYCLE); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1554 if (location & 1) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1555 ym_data_write(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1556 } else if (location & 2) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1557 ym_address_write_part2(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1558 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1559 ym_address_write_part1(gen->ym, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1560 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1561 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1562 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1563 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1564 static uint8_t z80_read_ym(uint32_t location, void * vcontext) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1565 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1566 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1567 genesis_context * gen = context->system; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1568 sync_sound(gen, context->Z80_CYCLE); |
1904
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
1569 return ym_read_status(gen->ym, context->Z80_CYCLE, location); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1570 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1571 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1572 static uint8_t z80_read_bank(uint32_t location, void * vcontext) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1573 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1574 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1575 genesis_context *gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1576 if (gen->bus_busy) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1577 context->Z80_CYCLE = gen->m68k->current_cycle; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1578 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1579 //typical delay from bus arbitration |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1580 context->Z80_CYCLE += 3 * MCLKS_PER_Z80; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1581 //TODO: add cycle for an access right after a previous one |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1582 //TODO: Below cycle time is an estimate based on the time between 68K !BG goes low and Z80 !MREQ goes high |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1583 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1584 gen->m68k->current_cycle += 8 * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1585 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1586 location &= 0x7FFF; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1587 if (context->mem_pointers[1]) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1588 return context->mem_pointers[1][location ^ 1]; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1589 } |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1590 uint32_t address = gen->z80_bank_reg << 15 | location; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1591 if (address >= 0xC00000 && address < 0xE00000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1592 return z80_vdp_port_read(location & 0xFF, context); |
1869
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1593 } else if (address >= 0xA10000 && address <= 0xA10001) { |
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1594 //Apparently version reg can be read through Z80 banked area |
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1595 //TODO: Check rest of IO region addresses |
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1596 return gen->version_reg; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1597 } else { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1598 fprintf(stderr, "Unhandled read by Z80 from address %X through banked memory area (%X)\n", address, gen->z80_bank_reg << 15); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1599 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1600 return 0; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1601 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1602 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1603 static void *z80_write_bank(uint32_t location, void * vcontext, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1604 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1605 z80_context * context = vcontext; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1606 genesis_context *gen = context->system; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1607 if (gen->bus_busy) { |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1608 context->Z80_CYCLE = gen->m68k->current_cycle; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1609 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1610 //typical delay from bus arbitration |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1611 context->Z80_CYCLE += 3 * MCLKS_PER_Z80; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1612 //TODO: add cycle for an access right after a previous one |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1613 //TODO: Below cycle time is an estimate based on the time between 68K !BG goes low and Z80 !MREQ goes high |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1614 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1615 gen->m68k->current_cycle += 8 * MCLKS_PER_68K; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1616 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1617 location &= 0x7FFF; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1618 uint32_t address = gen->z80_bank_reg << 15 | location; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1619 if (address >= 0xE00000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1620 address &= 0xFFFF; |
1104
4224980a5f84
Fix the previous WIP commit. Quick tests suggests things are no more broken than before now.
Michael Pavone <pavone@retrodev.com>
parents:
1103
diff
changeset
|
1621 ((uint8_t *)gen->work_ram)[address ^ 1] = value; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1622 } else if (address >= 0xC00000) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1623 z80_vdp_port_write(location & 0xFF, context, value); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1624 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1625 fprintf(stderr, "Unhandled write by Z80 to address %X through banked memory area\n", address); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1626 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1627 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1628 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1629 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1630 static void *z80_write_bank_reg(uint32_t location, void * vcontext, uint8_t value) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1631 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1632 z80_context * context = vcontext; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1633 genesis_context *gen = context->system; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1634 |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
1635 gen->z80_bank_reg = (gen->z80_bank_reg >> 1 | value << 8) & 0x1FF; |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
1636 update_z80_bank_pointer(context->system); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1637 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1638 return context; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1639 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1640 |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1641 static uint16_t unused_read(uint32_t location, void *vcontext) |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1642 { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1643 m68k_context *context = vcontext; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1644 genesis_context *gen = context->system; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1645 if (location >= 0x800000) { |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1646 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1647 gen->refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - gen->last_sync_cycle; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1648 context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL)); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1649 gen->refresh_counter += 4*MCLKS_PER_68K; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1650 gen->refresh_counter = gen->refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1651 gen->last_sync_cycle = context->current_cycle; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1652 } |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1653 |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1654 if (location < 0x800000 || (location >= 0xA13000 && location < 0xA13100) || (location >= 0xA12000 && location < 0xA12100)) { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1655 //Only called if the cart/exp doesn't have a more specific handler for this region |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1656 return get_open_bus_value(&gen->header); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1657 } else if (location == 0xA14000 || location == 0xA14002) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1658 if (gen->version_reg & 0xF) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1659 return gen->tmss_lock[location >> 1 & 1]; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1660 } else { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1661 fatal_error("Machine freeze due to read from TMSS lock when TMSS is not present %X\n", location); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1662 return 0xFFFF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1663 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1664 } else if (location == 0xA14100) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1665 if (gen->version_reg & 0xF) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1666 return get_open_bus_value(&gen->header); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1667 } else { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1668 fatal_error("Machine freeze due to read from TMSS control when TMSS is not present %X\n", location); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1669 return 0xFFFF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1670 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1671 } else { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1672 fatal_error("Machine freeze due to unmapped read from %X\n", location); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1673 return 0xFFFF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1674 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1675 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1676 |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1677 static uint8_t unused_read_b(uint32_t location, void *vcontext) |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1678 { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1679 uint16_t v = unused_read(location & 0xFFFFFE, vcontext); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1680 if (location & 1) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1681 return v; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1682 } else { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1683 return v >> 8; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1684 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1685 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1686 |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1687 static void check_tmss_lock(genesis_context *gen) |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1688 { |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1689 gen->vdp_unlocked = gen->tmss_lock[0] == 0x5345 && gen->tmss_lock[1] == 0x4741; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1690 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1691 |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1692 static void toggle_tmss_rom(genesis_context *gen) |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1693 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1694 m68k_context *context = gen->m68k; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1695 for (int i = 0; i < NUM_MEM_AREAS; i++) |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1696 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1697 uint16_t *tmp = context->mem_pointers[i]; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1698 context->mem_pointers[i] = gen->tmss_pointers[i]; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1699 gen->tmss_pointers[i] = tmp; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1700 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1701 m68k_invalidate_code_range(context, 0, 0x400000); |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1702 } |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1703 |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1704 static void *unused_write(uint32_t location, void *vcontext, uint16_t value) |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1705 { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1706 m68k_context *context = vcontext; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1707 genesis_context *gen = context->system; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1708 if (location >= 0x800000) { |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1709 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1710 gen->refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - gen->last_sync_cycle; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1711 context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL)); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1712 gen->refresh_counter += 4*MCLKS_PER_68K; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1713 gen->refresh_counter = gen->refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1714 gen->last_sync_cycle = context->current_cycle; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1715 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1716 |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1717 uint8_t has_tmss = gen->version_reg & 0xF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1718 if (has_tmss && (location == 0xA14000 || location == 0xA14002)) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1719 gen->tmss_lock[location >> 1 & 1] = value; |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1720 check_tmss_lock(gen); |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1721 } else if (has_tmss && location == 0xA14100) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1722 value &= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1723 if (gen->tmss != value) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1724 gen->tmss = value; |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1725 toggle_tmss_rom(gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1726 } |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1727 } else if (location < 0x800000 || (location >= 0xA13000 && location < 0xA13100) || (location >= 0xA12000 && location < 0xA12100)) { |
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1728 //these writes are ignored when no relevant hardware is present |
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1729 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1730 fatal_error("Machine freeze due to unmapped write to %X\n", location); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1731 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1732 return vcontext; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1733 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1734 |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1735 static void *unused_write_b(uint32_t location, void *vcontext, uint8_t value) |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1736 { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1737 m68k_context *context = vcontext; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1738 genesis_context *gen = context->system; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1739 uint8_t has_tmss = gen->version_reg & 0xF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1740 if (has_tmss && location >= 0xA14000 && location <= 0xA14003) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1741 uint32_t offset = location >> 1 & 1; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1742 if (location & 1) { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1743 gen->tmss_lock[offset] &= 0xFF00; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1744 gen->tmss_lock[offset] |= value; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1745 } else { |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1746 gen->tmss_lock[offset] &= 0xFF; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1747 gen->tmss_lock[offset] |= value << 8; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1748 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1749 check_tmss_lock(gen); |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1750 } else if (has_tmss && (location == 0xA14100 || location == 0xA14101)) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1751 if (location & 1) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1752 value &= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1753 if (gen->tmss != value) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1754 gen->tmss = value; |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1755 toggle_tmss_rom(gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1756 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1757 } |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1758 } else if (location < 0x800000 || (location >= 0xA13000 && location < 0xA13100) || (location >= 0xA12000 && location < 0xA12100)) { |
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1759 //these writes are ignored when no relevant hardware is present |
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1760 } else { |
1907
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1761 fatal_error("Machine freeze due to unmapped byte write to %X\n", location); |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1762 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1763 return vcontext; |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1764 } |
b021ca0bc375
Some partial work on TMSS registers, more accurate open bus locations and implement machine freezes for unmapped areas in the IO region
Michael Pavone <pavone@retrodev.com>
parents:
1906
diff
changeset
|
1765 |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1766 static void set_speed_percent(system_header * system, uint32_t percent) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1767 { |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1768 genesis_context *context = (genesis_context *)system; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1769 uint32_t old_clock = context->master_clock; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1770 context->master_clock = ((uint64_t)context->normal_clock * (uint64_t)percent) / 100; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1771 while (context->ym->current_cycle != context->psg->cycles) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1772 sync_sound(context, context->psg->cycles + MCLKS_PER_PSG); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1773 } |
2278
5a21bc0ec583
Implement turbo/slo mo for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2277
diff
changeset
|
1774 if (context->expansion) { |
5a21bc0ec583
Implement turbo/slo mo for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2277
diff
changeset
|
1775 segacd_context *cd = context->expansion; |
5a21bc0ec583
Implement turbo/slo mo for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2277
diff
changeset
|
1776 segacd_set_speed_percent(cd, percent); |
5a21bc0ec583
Implement turbo/slo mo for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2277
diff
changeset
|
1777 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1778 ym_adjust_master_clock(context->ym, context->master_clock); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1779 psg_adjust_master_clock(context->psg, context->master_clock); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1780 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1781 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1782 void set_region(genesis_context *gen, rom_info *info, uint8_t region) |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1783 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1784 if (!region) { |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1318
diff
changeset
|
1785 char * def_region = tern_find_path_default(config, "system\0default_region\0", (tern_val){.ptrval = "U"}, TVAL_PTR).ptrval; |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
1786 if (!info->regions || (info->regions & translate_region_char(toupper(*def_region)))) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1787 region = translate_region_char(toupper(*def_region)); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1788 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1789 region = info->regions; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1790 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1791 } |
2428 | 1792 uint8_t is_50hz = 0; |
1793 if (gen->header.type == SYSTEM_PICO) { | |
1794 if (region & REGION_E) { | |
1795 is_50hz = 1; | |
1796 gen->version_reg = 0x20; | |
1797 } else if (region & REGION_J) { | |
1798 gen->version_reg = 0; | |
1799 } else { | |
1800 gen->version_reg = 0x40; | |
1801 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1802 } else { |
2428 | 1803 if (region & REGION_E) { |
1804 gen->version_reg = NO_DISK | EUR; | |
1805 is_50hz = 1; | |
1806 } else if (region & REGION_J) { | |
1807 gen->version_reg = NO_DISK | JAP; | |
1808 } else { | |
1809 gen->version_reg = NO_DISK | USA; | |
1810 } | |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1811 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
1812 |
2428 | 1813 if (is_50hz) { |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1814 gen->normal_clock = MCLKS_PAL; |
2428 | 1815 gen->soft_flush_cycles = MCLKS_LINE * 313 / 3 + 2; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1816 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1817 gen->normal_clock = MCLKS_NTSC; |
2428 | 1818 gen->soft_flush_cycles = MCLKS_LINE * 262 / 3 + 2; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1819 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1820 gen->master_clock = gen->normal_clock; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1821 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1822 |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1823 static uint8_t load_state(system_header *system, uint8_t slot) |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1824 { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1825 genesis_context *gen = (genesis_context *)system; |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1826 char *statepath = get_slot_name(system, slot, "state"); |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1827 deserialize_buffer state; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1828 uint32_t pc = 0; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1829 uint8_t ret; |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1830 if (!gen->m68k->resume_pc) { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1831 system->delayed_load_slot = slot + 1; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1832 gen->m68k->should_return = 1; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1833 ret = get_modification_time(statepath) != 0; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1834 if (!ret) { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1835 strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1836 ret = get_modification_time(statepath) != 0; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1837 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1838 goto done; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1839 } |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1840 if (load_from_file(&state, statepath)) { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1841 genesis_deserialize(&state, gen); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1842 free(state.data); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1843 ret = 1; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1844 } else { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1845 strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1846 pc = load_gst(gen, statepath); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1847 ret = pc != 0; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1848 } |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1849 if (ret) { |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1850 debug_message("Loaded state from %s\n", statepath); |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1851 } |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1852 done: |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1853 free(statepath); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1854 return ret; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1855 } |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1856 |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1857 static void handle_reset_requests(genesis_context *gen) |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1858 { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1859 while (gen->reset_requested || gen->header.delayed_load_slot) |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1860 { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1861 if (gen->reset_requested) { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1862 gen->reset_requested = 0; |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
1863 gen->m68k->should_return = 0; |
2428 | 1864 if (gen->header.type == SYSTEM_GENESIS) { |
1865 z80_assert_reset(gen->z80, gen->m68k->current_cycle); | |
1866 z80_clear_busreq(gen->z80, gen->m68k->current_cycle); | |
1867 } | |
1868 if (gen->header.type != SYSTEM_PICO) { | |
1869 ym_reset(gen->ym); | |
1870 } | |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1871 //Is there any sort of VDP reset? |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1872 m68k_reset(gen->m68k); |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1873 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1874 if (gen->header.delayed_load_slot) { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1875 load_state(&gen->header, gen->header.delayed_load_slot - 1); |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1876 gen->header.delayed_load_slot = 0; |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1877 resume_68k(gen->m68k); |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1878 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1879 } |
1980
81df9aa2de9b
Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents:
1971
diff
changeset
|
1880 if (gen->header.force_release || render_should_release_on_exit()) { |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1881 bindings_release_capture(); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1882 vdp_release_framebuffer(gen->vdp); |
2428 | 1883 if (gen->header.type != SYSTEM_PICO) { |
1884 render_pause_source(gen->ym->audio); | |
1885 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1886 render_pause_source(gen->psg->audio); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1887 } |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1888 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1889 |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1890 static void start_genesis(system_header *system, char *statefile) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1891 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1892 genesis_context *gen = (genesis_context *)system; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1893 if (statefile) { |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1894 //first try loading as a native format savestate |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1895 deserialize_buffer state; |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1896 uint32_t pc; |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1897 if (load_from_file(&state, statefile)) { |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
1898 genesis_deserialize(&state, gen); |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1899 free(state.data); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
1900 //HACK |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
1901 pc = gen->m68k->last_prefetch_address; |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1902 } else { |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1903 pc = load_gst(gen, statefile); |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1904 if (!pc) { |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1905 fatal_error("Failed to load save state %s\n", statefile); |
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
1906 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1907 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1908 printf("Loaded %s\n", statefile); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1909 if (gen->header.enter_debugger) { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1910 gen->header.enter_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
1911 #ifndef IS_LIB |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1912 insert_breakpoint(gen->m68k, pc, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
1913 #endif |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1914 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1915 if (gen->header.type == SYSTEM_PICO) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1916 adjust_int_cycle_pico(gen->m68k, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1917 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1918 adjust_int_cycle(gen->m68k, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1919 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1920 start_68k_context(gen->m68k, pc); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1921 } else { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1922 if (gen->header.enter_debugger) { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1923 gen->header.enter_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
1924 #ifndef IS_LIB |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
1925 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k) << 16 |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
1926 | read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->options->gen, gen->m68k); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1927 insert_breakpoint(gen->m68k, address, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
1928 #endif |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1929 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1930 m68k_reset(gen->m68k); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1931 } |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
1932 handle_reset_requests(gen); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
1933 return; |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1934 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1935 |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1936 static void resume_genesis(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1937 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1938 genesis_context *gen = (genesis_context *)system; |
1980
81df9aa2de9b
Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents:
1971
diff
changeset
|
1939 if (gen->header.force_release || render_should_release_on_exit()) { |
81df9aa2de9b
Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents:
1971
diff
changeset
|
1940 gen->header.force_release = 0; |
2428 | 1941 if (gen->header.type == SYSTEM_PICO) { |
1942 render_set_video_standard((gen->version_reg & 0x60) == 0x20 ? VID_PAL : VID_NTSC); | |
1943 } else { | |
1944 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); | |
1945 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1946 bindings_reacquire_capture(); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1947 vdp_reacquire_framebuffer(gen->vdp); |
2428 | 1948 if (gen->header.type != SYSTEM_PICO) { |
1949 render_resume_source(gen->ym->audio); | |
1950 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1951 render_resume_source(gen->psg->audio); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
1952 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1953 resume_68k(gen->m68k); |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
1954 handle_reset_requests(gen); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1955 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1956 |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1957 static void inc_debug_mode(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1958 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1959 genesis_context *gen = (genesis_context *)system; |
1631
c4ba3177b72d
WIP new VDP plane debug view and support for detached VDP debug views generally
Michael Pavone <pavone@retrodev.com>
parents:
1610
diff
changeset
|
1960 vdp_inc_debug_mode(gen->vdp); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1961 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1962 |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1963 static void request_exit(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1964 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1965 genesis_context *gen = (genesis_context *)system; |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
1966 gen->m68k->target_cycle = gen->m68k->current_cycle; |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1967 gen->m68k->should_return = 1; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1968 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1969 |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1970 static void persist_save(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1971 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1972 genesis_context *gen = (genesis_context *)system; |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1973 FILE *f; |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1974 if (gen->expansion) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1975 segacd_context *cd = gen->expansion; |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1976 char *bram_name = path_append(system->save_dir, "internal.bram"); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1977 f = fopen(bram_name, "wb"); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1978 if (f) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1979 fwrite(cd->bram, 1, 8 * 1024, f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1980 fclose(f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1981 printf("Saved internal BRAM to %s\n", bram_name); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1982 } |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1983 free(bram_name); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1984 if (cd->bram_cart_id < 8) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1985 bram_name = path_append(system->save_dir, "cart.bram"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1986 f = fopen(bram_name, "wb"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1987 if (f) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1988 long configured_size = 0x2000 << cd->bram_cart_id; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1989 fwrite(cd->bram_cart, 1, configured_size, f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1990 fclose(f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1991 printf("Saved BRAM cart to %s\n", bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1992 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1993 free(bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
1994 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1995 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1996 if (gen->save_type == SAVE_NONE) { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1997 return; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
1998 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
1999 f = fopen(save_filename, "wb"); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2000 if (!f) { |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2001 fprintf(stderr, "Failed to open %s file %s for writing\n", save_type_name(gen->save_type), save_filename); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2002 return; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2003 } |
1848
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2004 if (gen->save_type == RAM_FLAG_BOTH) { |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2005 byteswap_rom(gen->save_size, (uint16_t *)gen->save_storage); |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2006 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2007 fwrite(gen->save_storage, 1, gen->save_size, f); |
1848
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2008 if (gen->save_type == RAM_FLAG_BOTH) { |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2009 byteswap_rom(gen->save_size, (uint16_t *)gen->save_storage); |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2010 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2011 fclose(f); |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2012 printf("Saved %s to %s\n", save_type_name(gen->save_type), save_filename); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2013 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2014 |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2015 static void load_save(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2016 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2017 genesis_context *gen = (genesis_context *)system; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2018 FILE * f = fopen(save_filename, "rb"); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2019 if (f) { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2020 uint32_t read = fread(gen->save_storage, 1, gen->save_size, f); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2021 fclose(f); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2022 if (read > 0) { |
1848
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2023 if (gen->save_type == RAM_FLAG_BOTH) { |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2024 byteswap_rom(gen->save_size, (uint16_t *)gen->save_storage); |
ef3d368d59b0
16-bit wide save RAM is stored in memory byteswapped for performance reasons, but saving it to disc that way isn't great. Swap before save/after load to fix
Michael Pavone <pavone@retrodev.com>
parents:
1798
diff
changeset
|
2025 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2026 printf("Loaded %s from %s\n", save_type_name(gen->save_type), save_filename); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2027 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2028 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2029 if (gen->expansion) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2030 segacd_context *cd = gen->expansion; |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2031 char *bram_name = path_append(system->save_dir, "internal.bram"); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2032 f = fopen(bram_name, "rb"); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2033 if (f) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2034 uint32_t read = fread(cd->bram, 1, 8 * 1024, f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2035 fclose(f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2036 if (read > 0) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2037 printf("Loaded internal BRAM from %s\n", bram_name); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2038 } |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2039 } else { |
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2040 segacd_format_bram(cd->bram, 8 * 1024); |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2041 } |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2042 free(bram_name); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2043 bram_name = path_append(system->save_dir, "cart.bram"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2044 f = fopen(bram_name, "rb"); |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2045 long configured_size = 0x2000 << cd->bram_cart_id; |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2046 if (f) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2047 long existing_size = nearest_pow2(file_size(f)); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2048 if (existing_size > 1 * 1024 * 1024) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2049 existing_size = 1 * 1024 * 1024; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2050 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2051 if (existing_size != configured_size) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2052 if (existing_size > configured_size) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2053 free(cd->bram_cart); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2054 cd->bram_cart = calloc(existing_size, 1); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2055 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2056 cd->bram_cart_id = 0; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2057 while (existing_size > (0x2000 <<cd->bram_cart_id)) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2058 cd->bram_cart_id++; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2059 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2060 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2061 uint32_t read = fread(cd->bram_cart, 1, existing_size, f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2062 fclose(f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2063 if (read > 0) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2064 printf("Loaded BRAM cart from %s\n", bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2065 } |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2066 } else { |
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2067 segacd_format_bram(cd->bram_cart, configured_size); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2068 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2069 free(bram_name); |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2070 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2071 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2072 |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2073 static void soft_reset(system_header *system) |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2074 { |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2075 genesis_context *gen = (genesis_context *)system; |
1556
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2076 if (gen->reset_cycle == CYCLE_NEVER) { |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2077 double random = (double)rand()/(double)RAND_MAX; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2078 gen->reset_cycle = gen->m68k->current_cycle + random * MCLKS_LINE * (gen->version_reg & HZ50 ? LINES_PAL : LINES_NTSC); |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2079 if (gen->reset_cycle < gen->m68k->target_cycle) { |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2080 gen->m68k->target_cycle = gen->reset_cycle; |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2081 } |
075df0844baa
Randomize soft reset timing and fix silly bug that was accidentally clearing IO state on soft reset
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
2082 } |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2083 } |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2084 |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2085 static void free_genesis(system_header *system) |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2086 { |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2087 genesis_context *gen = (genesis_context *)system; |
2164
4fbe1e7c4a73
Don't leak all Sega CD resources when freeing a Genesis instance
Michael Pavone <pavone@retrodev.com>
parents:
2150
diff
changeset
|
2088 if (gen->expansion) { |
4fbe1e7c4a73
Don't leak all Sega CD resources when freeing a Genesis instance
Michael Pavone <pavone@retrodev.com>
parents:
2150
diff
changeset
|
2089 free_segacd(gen->expansion); |
4fbe1e7c4a73
Don't leak all Sega CD resources when freeing a Genesis instance
Michael Pavone <pavone@retrodev.com>
parents:
2150
diff
changeset
|
2090 } |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2091 vdp_free(gen->vdp); |
1593
24508cb54f87
Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1592
diff
changeset
|
2092 memmap_chunk *map = (memmap_chunk *)gen->m68k->options->gen.memmap; |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2093 m68k_options_free(gen->m68k->options); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
2094 free(gen->cart); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2095 free(gen->m68k); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2096 free(gen->work_ram); |
2428 | 2097 if (gen->header.type == SYSTEM_GENESIS) { |
2098 z80_options_free(gen->z80->Z80_OPTS); | |
2099 free(gen->z80); | |
2100 free(gen->zram); | |
2101 } | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2102 if (gen->header.type == SYSTEM_PICO) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2103 pico_pcm_free(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2104 free(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2105 } else { |
2428 | 2106 ym_free(gen->ym); |
2107 } | |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2108 psg_free(gen->psg); |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2109 free(gen->header.save_dir); |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2110 free_rom_info(&gen->header.info); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2111 free(gen->lock_on); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2112 if (gen->save_type != SAVE_NONE && gen->mapper_type != MAPPER_SEGA_MED_V2) { |
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2113 free(gen->save_storage); |
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2114 } |
2248
f7e2e11f1214
Fix improper free of memory map array from rom_info
Michael Pavone <pavone@retrodev.com>
parents:
2243
diff
changeset
|
2115 free(map); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
2116 free(gen); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2117 } |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2118 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2119 static void gamepad_down(system_header *system, uint8_t gamepad_num, uint8_t button) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2120 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2121 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2122 io_gamepad_down(&gen->io, gamepad_num, button); |
1610 | 2123 if (gen->mapper_type == MAPPER_JCART) { |
2124 jcart_gamepad_down(gen, gamepad_num, button); | |
2125 } | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2126 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2127 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2128 static void gamepad_up(system_header *system, uint8_t gamepad_num, uint8_t button) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2129 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2130 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2131 io_gamepad_up(&gen->io, gamepad_num, button); |
1610 | 2132 if (gen->mapper_type == MAPPER_JCART) { |
2133 jcart_gamepad_up(gen, gamepad_num, button); | |
2134 } | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2135 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2136 |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2137 static void pico_update_page(genesis_context *gen) |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2138 { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2139 #ifndef IS_LIB |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2140 uint8_t page_num = 0; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2141 uint8_t page = gen->pico_page; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2142 while (page) |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2143 { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2144 page_num++; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2145 page >>= 1; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2146 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2147 render_clear_window(gen->pico_story_window, 236, 205, 27); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2148 int x, width; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2149 if (page_num) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2150 x = 0; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2151 width = 640; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2152 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2153 render_fill_rect(gen->pico_story_window, 50, 29, 96, 0, 0, 320, 320); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2154 x = 320; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2155 width = 320; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2156 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2157 if (gen->pico_story_pages[page_num] == 0xFF && page_num == 6 && gen->pico_story_pages[page_num - 1]) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2158 //repeat last page if storybook doesn't have a full 6 pages |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2159 //hack to deal with storybooks that skip page 5 |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2160 page_num--; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2161 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2162 if (gen->pico_story_pages[page_num] != 0xFF) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2163 render_draw_image(gen->pico_story_window, gen->pico_story_pages[page_num], x, 0, width, 320); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2164 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2165 uint8_t grey = page * (255 / 5); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2166 render_fill_rect(gen->pico_story_window, grey, grey, grey, x, 0, width, 320); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2167 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2168 render_window_refresh(gen->pico_story_window); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2169 #endif |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2170 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2171 |
2428 | 2172 static void gamepad_down_pico(system_header *system, uint8_t gamepad_num, uint8_t button) |
2173 { | |
2174 genesis_context *gen = (genesis_context *)system; | |
2175 if (gamepad_num != 1) { | |
2176 return; | |
2177 } | |
2178 //TODO: storyware display | |
2179 if (button == BUTTON_C) { | |
2180 gen->pico_page <<= 1; | |
2181 gen->pico_page |= 1; | |
2182 gen->pico_page &= 0x3F; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2183 pico_update_page(gen); |
2428 | 2184 } else if (button == BUTTON_Z) { |
2185 gen->pico_page >>= 1; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2186 pico_update_page(gen); |
2428 | 2187 } else if (button < BUTTON_B) { |
2188 gen->pico_button_state &= ~(1 << (button - 1)); | |
2189 } | |
2190 } | |
2191 | |
2192 static void gamepad_up_pico(system_header *system, uint8_t gamepad_num, uint8_t button) | |
2193 { | |
2194 genesis_context *gen = (genesis_context *)system; | |
2195 if (gamepad_num != 1) { | |
2196 return; | |
2197 } | |
2198 if (button < BUTTON_B) { | |
2199 gen->pico_button_state |= 1 << (button - 1); | |
2200 } | |
2201 return; | |
2202 } | |
2203 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2204 static void mouse_down(system_header *system, uint8_t mouse_num, uint8_t button) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2205 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2206 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2207 io_mouse_down(&gen->io, mouse_num, button); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2208 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2209 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2210 static void mouse_up(system_header *system, uint8_t mouse_num, uint8_t button) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2211 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2212 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2213 io_mouse_up(&gen->io, mouse_num, button); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2214 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2215 |
2428 | 2216 static void mouse_down_pico(system_header *system, uint8_t mouse_num, uint8_t button) |
2217 { | |
2218 genesis_context *gen = (genesis_context *)system; | |
2219 if (button == MOUSE_LEFT) { | |
2220 gen->pico_button_state &= ~0x80; | |
2221 } | |
2222 } | |
2223 | |
2224 static void mouse_up_pico(system_header *system, uint8_t mouse_num, uint8_t button) | |
2225 { | |
2226 genesis_context *gen = (genesis_context *)system; | |
2227 if (button == MOUSE_LEFT) { | |
2228 gen->pico_button_state |= 0x80; | |
2229 } | |
2230 } | |
2231 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2232 static void mouse_motion_absolute(system_header *system, uint8_t mouse_num, uint16_t x, uint16_t y) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2233 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2234 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2235 io_mouse_motion_absolute(&gen->io, mouse_num, x, y); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2236 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2237 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2238 static void mouse_motion_relative(system_header *system, uint8_t mouse_num, int32_t x, int32_t y) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2239 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2240 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2241 io_mouse_motion_relative(&gen->io, mouse_num, x, y); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2242 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2243 |
2428 | 2244 static void mouse_motion_absolute_pico(system_header *system, uint8_t mouse_num, uint16_t x, uint16_t y) |
2245 { | |
2246 genesis_context *gen = (genesis_context *)system; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2247 //FIXME: coordinate translation feels a little off for storybook area |
2428 | 2248 //TODO: limit to mouse motion on emulated storyware/drawing area |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2249 if (y < 24) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2250 y = 24; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2251 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2252 gen->pico_pen_x = x * (0x17D - 0x3C) / 640 + 0x3C; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2253 if (y < 320) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2254 gen->pico_pen_y = (y-24) * (0x3F4-0x2F8) / (320-24) + 0x2F8; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2255 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2256 gen->pico_pen_y = (y - 320) * (0x2f8-0x1FC) / 320 + 0x1FC; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2257 } |
2428 | 2258 } |
2259 | |
2260 static void mouse_motion_relative_pico(system_header *system, uint8_t mouse_num, int32_t x, int32_t y) | |
2261 { | |
2262 genesis_context *gen = (genesis_context *)system; | |
2263 //TODO: scale properly | |
2264 //TODO: limit to mouse motion on emulated storyware/drawing area | |
2265 gen->pico_pen_x += x; | |
2266 gen->pico_pen_y += y; | |
2267 } | |
2268 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2269 static void keyboard_down(system_header *system, uint8_t scancode) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2270 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2271 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2272 io_keyboard_down(&gen->io, scancode); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2273 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2274 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2275 static void keyboard_up(system_header *system, uint8_t scancode) |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2276 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2277 genesis_context *gen = (genesis_context *)system; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2278 io_keyboard_up(&gen->io, scancode); |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2279 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2280 |
2428 | 2281 static void keyboard_down_pico(system_header *system, uint8_t scancode) |
2282 { | |
2283 genesis_context *gen = (genesis_context *)system; | |
2284 //TODO: Keyboard Pico emulation | |
2285 } | |
2286 | |
2287 static void keyboard_up_pico(system_header *system, uint8_t scancode) | |
2288 { | |
2289 genesis_context *gen = (genesis_context *)system; | |
2290 //TODO: Keyboard Pico emulation | |
2291 } | |
2292 | |
1798
5278b6e44fc1
Optionally emulate the offset around zero in the imperfect DAC of a discrete YM2612
Michael Pavone <pavone@retrodev.com>
parents:
1796
diff
changeset
|
2293 static void set_audio_config(genesis_context *gen) |
1796
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2294 { |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2295 char *config_gain; |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2296 config_gain = tern_find_path(config, "audio\0psg_gain\0", TVAL_PTR).ptrval; |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2297 render_audio_source_gaindb(gen->psg->audio, config_gain ? atof(config_gain) : 0.0f); |
2428 | 2298 if (gen->header.type != SYSTEM_PICO) { |
2299 config_gain = tern_find_path(config, "audio\0fm_gain\0", TVAL_PTR).ptrval; | |
2300 render_audio_source_gaindb(gen->ym->audio, config_gain ? atof(config_gain) : 0.0f); | |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2301 |
2428 | 2302 char *config_dac = tern_find_path_default(config, "audio\0fm_dac\0", (tern_val){.ptrval="zero_offset"}, TVAL_PTR).ptrval; |
2303 ym_enable_zero_offset(gen->ym, !strcmp(config_dac, "zero_offset")); | |
2304 } | |
2277
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2305 |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2306 if (gen->expansion) { |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2307 segacd_context *cd = gen->expansion; |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2308 config_gain = tern_find_path(config, "audio\0rf5c164_gain\0", TVAL_PTR).ptrval; |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2309 render_audio_source_gaindb(cd->pcm.audio, config_gain ? atof(config_gain) : -6.0f); |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2310 config_gain = tern_find_path(config, "audio\0cdda_gain\0", TVAL_PTR).ptrval; |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2311 render_audio_source_gaindb(cd->fader.audio, config_gain ? atof(config_gain) : -9.5f); |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2312 } |
1796
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2313 } |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2314 |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2315 static void config_updated(system_header *system) |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2316 { |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2317 genesis_context *gen = (genesis_context *)system; |
2428 | 2318 if (gen->header.type == SYSTEM_GENESIS) { |
2319 setup_io_devices(config, &system->info, &gen->io); | |
2320 } | |
1798
5278b6e44fc1
Optionally emulate the offset around zero in the imperfect DAC of a discrete YM2612
Michael Pavone <pavone@retrodev.com>
parents:
1796
diff
changeset
|
2321 set_audio_config(gen); |
2384
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2322 //sample rate may have changed |
2428 | 2323 if (gen->header.type != SYSTEM_PICO) { |
2324 ym_adjust_master_clock(gen->ym, gen->master_clock); | |
2325 } | |
2384
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2326 psg_adjust_master_clock(gen->psg, gen->master_clock); |
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2327 if (gen->expansion) { |
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2328 segacd_config_updated(gen->expansion); |
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2329 } |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2330 } |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2331 |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2332 static void start_vgm_log(system_header *system, char *filename) |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2333 { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2334 genesis_context *gen = (genesis_context *)system; |
2254
8b88d57d1218
Prevent VGM logging from getting messed up if slow/turbo is active at log start time
Michael Pavone <pavone@retrodev.com>
parents:
2248
diff
changeset
|
2335 vgm_writer *vgm = vgm_write_open(filename, gen->version_reg & HZ50 ? 50 : 60, gen->normal_clock, gen->m68k->current_cycle); |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2336 if (vgm) { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2337 printf("Started logging VGM to %s\n", filename); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2338 sync_sound(gen, vgm->last_cycle); |
2428 | 2339 if (gen->header.type != SYSTEM_PICO) { |
2340 ym_vgm_log(gen->ym, gen->normal_clock, vgm); | |
2341 } | |
2254
8b88d57d1218
Prevent VGM logging from getting messed up if slow/turbo is active at log start time
Michael Pavone <pavone@retrodev.com>
parents:
2248
diff
changeset
|
2342 psg_vgm_log(gen->psg, gen->normal_clock, vgm); |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2343 gen->header.vgm_logging = 1; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2344 } else { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2345 printf("Failed to start logging to %s\n", filename); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2346 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2347 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2348 |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2349 static void stop_vgm_log(system_header *system) |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2350 { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2351 puts("Stopped VGM log"); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2352 genesis_context *gen = (genesis_context *)system; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2353 vgm_close(gen->ym->vgm); |
2428 | 2354 if (gen->header.type != SYSTEM_PICO) { |
2355 gen->ym->vgm = NULL; | |
2356 } | |
2357 gen->psg->vgm = NULL; | |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2358 gen->header.vgm_logging = 0; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2359 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2360 |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2361 static void toggle_debug_view(system_header *system, uint8_t debug_view) |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2362 { |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2363 #ifndef IS_LIB |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2364 genesis_context *gen = (genesis_context *)system; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2365 if (debug_view < DEBUG_OSCILLOSCOPE) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2366 vdp_toggle_debug_view(gen->vdp, debug_view); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2367 } else if (debug_view == DEBUG_OSCILLOSCOPE) { |
2428 | 2368 if (gen->psg->scope) { |
2369 oscilloscope *scope = gen->psg->scope; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2370 if (gen->header.type == SYSTEM_PICO) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2371 gen->adpcm->scope = NULL; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2372 } else { |
2428 | 2373 gen->ym->scope = NULL; |
2374 } | |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2375 gen->psg->scope = NULL; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2376 if (gen->expansion) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2377 segacd_context *cd = gen->expansion; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2378 cd->pcm.scope = NULL; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2379 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2380 scope_close(scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2381 } else { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2382 oscilloscope *scope = create_oscilloscope(); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2383 if (gen->header.type == SYSTEM_PICO) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2384 pico_pcm_enable_scope(gen->adpcm, scope, gen->normal_clock); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2385 } else { |
2428 | 2386 ym_enable_scope(gen->ym, scope, gen->normal_clock); |
2387 } | |
2255
74112041b2c7
Proper calculation of sample rate for YM2612/PSG oscilloscope view
Michael Pavone <pavone@retrodev.com>
parents:
2254
diff
changeset
|
2388 psg_enable_scope(gen->psg, scope, gen->normal_clock); |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2389 if (gen->expansion) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2390 segacd_context *cd = gen->expansion; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2391 rf5c164_enable_scope(&cd->pcm, scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2392 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2393 } |
2271
3ef80963c2a7
Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents:
2267
diff
changeset
|
2394 } else if (debug_view == DEBUG_CD_GRAPHICS && gen->expansion) { |
3ef80963c2a7
Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents:
2267
diff
changeset
|
2395 scd_toggle_graphics_debug(gen->expansion); |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2396 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2397 #endif |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2398 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2399 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2400 static void *tmss_rom_write_16(uint32_t address, void *context, uint16_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2401 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2402 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2403 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2404 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2405 return gen->tmss_write_16(address, context, value); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2406 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2407 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2408 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2409 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2410 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2411 static void *tmss_rom_write_8(uint32_t address, void *context, uint8_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2412 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2413 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2414 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2415 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2416 return gen->tmss_write_8(address, context, value); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2417 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2418 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2419 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2420 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2421 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2422 static uint16_t tmss_rom_read_16(uint32_t address, void *context) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2423 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2424 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2425 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2426 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2427 return gen->tmss_read_16(address, context); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2428 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2429 return ((uint16_t *)gen->tmss_buffer)[address >> 1]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2430 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2431 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2432 static uint8_t tmss_rom_read_8(uint32_t address, void *context) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2433 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2434 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2435 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2436 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2437 return gen->tmss_read_8(address, context); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2438 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2439 #ifdef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2440 return gen->tmss_buffer[address]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2441 #else |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2442 return gen->tmss_buffer[address ^ 1]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2443 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2444 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2445 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2446 static void *tmss_word_write_16(uint32_t address, void *context, uint16_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2447 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2448 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2449 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2450 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2451 address += gen->tmss_write_offset; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2452 uint16_t *dest = get_native_pointer(address, (void **)m68k->mem_pointers, &m68k->options->gen); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2453 *dest = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2454 m68k_handle_code_write(address, m68k); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2455 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2456 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2457 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2458 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2459 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2460 static void *tmss_word_write_8(uint32_t address, void *context, uint8_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2461 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2462 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2463 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2464 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2465 address += gen->tmss_write_offset; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2466 uint8_t *dest = get_native_pointer(address & ~1, (void **)m68k->mem_pointers, &m68k->options->gen); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2467 #ifdef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2468 dest[address & 1] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2469 #else |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2470 dest[address & 1 ^ 1] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2471 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2472 m68k_handle_code_write(address & ~1, m68k); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2473 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2474 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2475 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2476 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2477 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2478 static void *tmss_odd_write_16(uint32_t address, void *context, uint16_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2479 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2480 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2481 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2482 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2483 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->options->gen, 0, NULL); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2484 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2485 uint8_t *base = (uint8_t *)m68k->mem_pointers[chunk->ptr_index]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2486 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2487 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2488 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2489 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2490 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2491 static void *tmss_odd_write_8(uint32_t address, void *context, uint8_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2492 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2493 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2494 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2495 if (gen->tmss && (address & 1)) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2496 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->options->gen, 0, NULL); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2497 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2498 uint8_t *base = (uint8_t *)m68k->mem_pointers[chunk->ptr_index]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2499 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2500 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2501 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2502 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2503 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2504 static void *tmss_even_write_16(uint32_t address, void *context, uint16_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2505 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2506 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2507 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2508 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2509 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->options->gen, 0, NULL); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2510 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2511 uint8_t *base = (uint8_t *)m68k->mem_pointers[chunk->ptr_index]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2512 base[address] = value >> 8; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2513 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2514 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2515 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2516 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2517 static void *tmss_even_write_8(uint32_t address, void *context, uint8_t value) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2518 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2519 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2520 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2521 if (gen->tmss && !(address & 1)) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2522 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->options->gen, 0, NULL); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2523 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2524 uint8_t *base = (uint8_t *)m68k->mem_pointers[chunk->ptr_index]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2525 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2526 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2527 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2528 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2529 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2530 static genesis_context *shared_init(uint32_t system_opts, rom_info *rom, uint8_t force_region) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2531 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2532 static memmap_chunk z80_map[] = { |
2134
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2533 { 0x0000, 0x4000, 0x1FFF, .flags = MMAP_READ | MMAP_WRITE | MMAP_CODE}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2534 { 0x8000, 0x10000, 0x7FFF, .read_8 = z80_read_bank, .write_8 = z80_write_bank}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2535 { 0x4000, 0x6000, 0x0003, .read_8 = z80_read_ym, .write_8 = z80_write_ym}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2536 { 0x6000, 0x6100, 0xFFFF, .write_8 = z80_write_bank_reg}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2537 { 0x7F00, 0x8000, 0x00FF, .read_8 = z80_vdp_port_read, .write_8 = z80_vdp_port_write} |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2538 }; |
2053 | 2539 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2540 char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2541 if (!m68k_divider) { |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2542 m68k_divider = "7"; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2543 } |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2544 MCLKS_PER_68K = atoi(m68k_divider); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2545 if (!MCLKS_PER_68K) { |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2546 MCLKS_PER_68K = 7; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2547 } |
2053 | 2548 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2549 genesis_context *gen = calloc(1, sizeof(genesis_context)); |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2550 gen->header.set_speed_percent = set_speed_percent; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2551 gen->header.start_context = start_genesis; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2552 gen->header.resume_context = resume_genesis; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2553 gen->header.load_save = load_save; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2554 gen->header.persist_save = persist_save; |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
2555 gen->header.load_state = load_state; |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2556 gen->header.soft_reset = soft_reset; |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2557 gen->header.free_context = free_genesis; |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
2558 gen->header.get_open_bus_value = get_open_bus_value; |
1111
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2559 gen->header.request_exit = request_exit; |
2eb54e24914e
Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents:
1108
diff
changeset
|
2560 gen->header.inc_debug_mode = inc_debug_mode; |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2561 gen->header.gamepad_down = gamepad_down; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2562 gen->header.gamepad_up = gamepad_up; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2563 gen->header.mouse_down = mouse_down; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2564 gen->header.mouse_up = mouse_up; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2565 gen->header.mouse_motion_absolute = mouse_motion_absolute; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2566 gen->header.mouse_motion_relative = mouse_motion_relative; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2567 gen->header.keyboard_down = keyboard_down; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2568 gen->header.keyboard_up = keyboard_up; |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2569 gen->header.config_updated = config_updated; |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
2570 gen->header.serialize = serialize; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
2571 gen->header.deserialize = deserialize; |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2572 gen->header.start_vgm_log = start_vgm_log; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2573 gen->header.stop_vgm_log = stop_vgm_log; |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2574 gen->header.toggle_debug_view = toggle_debug_view; |
1377
e587f16e7d3d
Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents:
1374
diff
changeset
|
2575 gen->header.type = SYSTEM_GENESIS; |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2576 gen->header.info = *rom; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2577 set_region(gen, rom, force_region); |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2578 tern_node *model = get_model(config, SYSTEM_GENESIS); |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2579 uint8_t tmss = !strcmp(tern_find_ptr_default(model, "tmss", "off"), "on"); |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2580 if (tmss) { |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2581 gen->version_reg |= 1; |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
2582 } else { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
2583 gen->vdp_unlocked = 1; |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2584 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2585 |
1906
2d462aa78349
Make VDP VSRAM capacity respect model selection
Michael Pavone <pavone@retrodev.com>
parents:
1904
diff
changeset
|
2586 uint8_t max_vsram = !strcmp(tern_find_ptr_default(model, "vsram", "40"), "64"); |
2194
01ff005b08f6
Very rudimentary support for Game Gear VDP emulation
Michael Pavone <pavone@retrodev.com>
parents:
2184
diff
changeset
|
2587 gen->vdp = init_vdp_context(gen->version_reg & 0x40, max_vsram, VDP_GENESIS); |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
2588 gen->vdp->system = &gen->header; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2589 gen->frame_end = vdp_cycles_to_frame_end(gen->vdp); |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1318
diff
changeset
|
2590 char * config_cycles = tern_find_path(config, "clocks\0max_cycles\0", TVAL_PTR).ptrval; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2591 gen->max_cycles = config_cycles ? atoi(config_cycles) : DEFAULT_SYNC_INTERVAL; |
1364
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
2592 gen->int_latency_prev1 = MCLKS_PER_68K * 32; |
30123ca5856c
Added some code to try and prevent Z80 accesses and refresh cycles from screwing up interrupt latency more than on hardware
Michael Pavone <pavone@retrodev.com>
parents:
1348
diff
changeset
|
2593 gen->int_latency_prev2 = MCLKS_PER_68K * 16; |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2594 |
1565
61fafcbc2c38
Audio DRC now sounds good in both NTSC and PAL, just need to adjust constants to minimize latency without leading to dropouts
Michael Pavone <pavone@retrodev.com>
parents:
1557
diff
changeset
|
2595 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); |
1946 | 2596 event_system_start(SYSTEM_GENESIS, (gen->version_reg & HZ50) ? VID_PAL : VID_NTSC, rom->name); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2597 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2598 gen->ym = malloc(sizeof(ym2612_context)); |
1904
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
2599 char *fm = tern_find_ptr_default(model, "fm", "discrete 2612"); |
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
2600 if (!strcmp(fm + strlen(fm) -4, "3834")) { |
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
2601 system_opts |= YM_OPT_3834; |
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
2602 } |
1555
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1551
diff
changeset
|
2603 ym_init(gen->ym, gen->master_clock, MCLKS_PER_YM, system_opts); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2604 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2605 gen->psg = malloc(sizeof(psg_context)); |
1555
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1551
diff
changeset
|
2606 psg_init(gen->psg, gen->master_clock, MCLKS_PER_PSG); |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2607 |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2608 z80_map[0].buffer = gen->zram = calloc(1, Z80_RAM_BYTES); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2609 #ifndef NO_Z80 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2610 z80_options *z_opts = malloc(sizeof(z80_options)); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
2611 init_z80_opts(z_opts, z80_map, 5, NULL, 0, MCLKS_PER_Z80, 0xFFFF); |
1130
8f14767661fa
Remove memory map assumptions from Z80 core and move a little bit of logic to the generic backend.c so it can be shared between CPU cores
Michael Pavone <pavone@retrodev.com>
parents:
1117
diff
changeset
|
2612 gen->z80 = init_z80_context(z_opts); |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
2613 #ifndef NEW_CORE |
1117
928a65750345
Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
1116
diff
changeset
|
2614 gen->z80->next_int_pulse = z80_next_int_pulse; |
1752
d6d4c006a7b3
Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents:
1690
diff
changeset
|
2615 #endif |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2616 z80_assert_reset(gen->z80, 0); |
1130
8f14767661fa
Remove memory map assumptions from Z80 core and move a little bit of logic to the generic backend.c so it can be shared between CPU cores
Michael Pavone <pavone@retrodev.com>
parents:
1117
diff
changeset
|
2617 #else |
8f14767661fa
Remove memory map assumptions from Z80 core and move a little bit of logic to the generic backend.c so it can be shared between CPU cores
Michael Pavone <pavone@retrodev.com>
parents:
1117
diff
changeset
|
2618 gen->z80 = calloc(1, sizeof(z80_context)); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2619 #endif |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2620 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2621 gen->z80->system = gen; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2622 gen->z80->mem_pointers[0] = gen->zram; |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2623 gen->z80->mem_pointers[1] = gen->z80->mem_pointers[2] = NULL; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2624 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2625 gen->work_ram = calloc(2, RAM_WORDS); |
1326
071e761bcdcf
Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents:
1318
diff
changeset
|
2626 if (!strcmp("random", tern_find_path_default(config, "system\0ram_init\0", (tern_val){.ptrval = "zero"}, TVAL_PTR).ptrval)) |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2627 { |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2628 srand(time(NULL)); |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2629 for (int i = 0; i < RAM_WORDS; i++) |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2630 { |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2631 gen->work_ram[i] = rand(); |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2632 } |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2633 for (int i = 0; i < Z80_RAM_BYTES; i++) |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2634 { |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2635 gen->zram[i] = rand(); |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2636 } |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2637 for (int i = 0; i < VRAM_SIZE; i++) |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2638 { |
1333
69c25e1188e5
Small tweak to how SAT cache updates are done. Mostly fixes the rotating cube scene in Overdrive 2
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
2639 gen->vdp->vdpmem[i] = rand(); |
69c25e1188e5
Small tweak to how SAT cache updates are done. Mostly fixes the rotating cube scene in Overdrive 2
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
2640 } |
69c25e1188e5
Small tweak to how SAT cache updates are done. Mostly fixes the rotating cube scene in Overdrive 2
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
2641 for (int i = 0; i < SAT_CACHE_SIZE; i++) |
69c25e1188e5
Small tweak to how SAT cache updates are done. Mostly fixes the rotating cube scene in Overdrive 2
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
2642 { |
69c25e1188e5
Small tweak to how SAT cache updates are done. Mostly fixes the rotating cube scene in Overdrive 2
Michael Pavone <pavone@retrodev.com>
parents:
1326
diff
changeset
|
2643 gen->vdp->sat_cache[i] = rand(); |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2644 } |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2645 for (int i = 0; i < CRAM_SIZE; i++) |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2646 { |
1428
2540c05520f2
New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents:
1427
diff
changeset
|
2647 write_cram_internal(gen->vdp, i, rand()); |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2648 } |
1906
2d462aa78349
Make VDP VSRAM capacity respect model selection
Michael Pavone <pavone@retrodev.com>
parents:
1904
diff
changeset
|
2649 for (int i = 0; i < gen->vdp->vsram_size; i++) |
1204
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2650 { |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2651 gen->vdp->vsram[i] = rand(); |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2652 } |
d7be5b6e0a8d
Added config file option to specify that RAM should be randomly initialized. Moved default_region inside a new "system" parent node in config
Michael Pavone <pavone@retrodev.com>
parents:
1188
diff
changeset
|
2653 } |
2053 | 2654 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2655 return gen; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2656 } |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2657 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2658 static memmap_chunk base_map[] = { |
2134
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2659 {0xE00000, 0x1000000, 0xFFFF, .flags = MMAP_READ | MMAP_WRITE | MMAP_CODE}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2660 {0xC00000, 0xE00000, 0x1FFFFF, .read_16 = (read_16_fun)vdp_port_read, .write_16 =(write_16_fun)vdp_port_write, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2661 .read_8 = (read_8_fun)vdp_port_read_b, .write_8 = (write_8_fun)vdp_port_write_b}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2662 {0xA00000, 0xA12000, 0x1FFFF, .read_16 = (read_16_fun)io_read_w, .write_16 = (write_16_fun)io_write_w, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2663 .read_8 = (read_8_fun)io_read, .write_8 = (write_8_fun)io_write}, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2664 {0x000000, 0xFFFFFF, 0xFFFFFF, .read_16 = (read_16_fun)unused_read, .write_16 = unused_write, |
9caebcfeac72
Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents:
2090
diff
changeset
|
2665 .read_8 = (read_8_fun)unused_read_b, .write_8 = (write_8_fun)unused_write_b} |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2666 }; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2667 const size_t base_chunks = sizeof(base_map)/sizeof(*base_map); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2668 |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2669 genesis_context *alloc_config_genesis(void *rom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, uint32_t ym_opts, uint8_t force_region) |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2670 { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2671 tern_node *rom_db = get_rom_db(); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2672 rom_info info = configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, base_map, base_chunks); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2673 rom = info.rom; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2674 rom_size = info.rom_size; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2675 #ifndef BLASTEM_BIG_ENDIAN |
2150
a418fa599b2e
Add ROM DB entry to fix SRAM on Triple Play: Gold Edition and make some code changes so that 3MB dumps will work too
Michael Pavone <pavone@retrodev.com>
parents:
2134
diff
changeset
|
2676 byteswap_rom(nearest_pow2(rom_size), rom); |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2677 if (lock_on) { |
2150
a418fa599b2e
Add ROM DB entry to fix SRAM on Triple Play: Gold Edition and make some code changes so that 3MB dumps will work too
Michael Pavone <pavone@retrodev.com>
parents:
2134
diff
changeset
|
2678 byteswap_rom(nearest_pow2(lock_on_size), lock_on); |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2679 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2680 #endif |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2681 char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2682 if (!m68k_divider) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2683 m68k_divider = "7"; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2684 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2685 MCLKS_PER_68K = atoi(m68k_divider); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2686 if (!MCLKS_PER_68K) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2687 MCLKS_PER_68K = 7; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2688 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2689 genesis_context *gen = shared_init(ym_opts, &info, force_region); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2690 gen->z80->mem_pointers[1] = gen->z80->mem_pointers[2] = rom; |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2691 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2692 gen->cart = rom; |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2693 gen->lock_on = lock_on; |
2053 | 2694 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2695 setup_io_devices(config, &info, &gen->io); |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2696 gen->header.has_keyboard = io_has_keyboard(&gen->io); |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2697 gen->mapper_type = info.mapper_type; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2698 gen->save_type = info.save_type; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2699 if (gen->save_type != SAVE_NONE) { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2700 gen->save_ram_mask = info.save_mask; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2701 gen->save_size = info.save_size; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2702 gen->save_storage = info.save_buffer; |
2286
5d3411f52d00
Fix ui.reload for locked-on ROMs
Michael Pavone <pavone@retrodev.com>
parents:
2281
diff
changeset
|
2703 gen->header.info.save_buffer = info.save_buffer = NULL; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2704 gen->eeprom_map = info.eeprom_map; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2705 gen->num_eeprom = info.num_eeprom; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2706 if (gen->save_type == SAVE_I2C) { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2707 eeprom_init(&gen->eeprom, gen->save_storage, gen->save_size); |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2708 } else if (gen->save_type == SAVE_NOR) { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2709 memcpy(&gen->nor, info.nor, sizeof(gen->nor)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2710 //nor_flash_init(&gen->nor, gen->save_storage, gen->save_size, info.save_page_size, info.save_product_id, info.save_bus); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2711 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2712 } else { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2713 gen->save_storage = NULL; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2714 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2715 |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2716 gen->mapper_start_index = info.mapper_start_index; |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2717 |
2053 | 2718 tern_node *model = get_model(config, SYSTEM_GENESIS); |
2719 uint8_t tmss = !strcmp(tern_find_ptr_default(model, "tmss", "off"), "on"); | |
2720 | |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2721 //This must happen before we generate memory access functions in init_m68k_opts |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2722 uint8_t next_ptr_index = 0; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2723 uint32_t tmss_min_alloc = 16 * 1024; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2724 for (int i = 0; i < info.map_chunks; i++) |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2725 { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2726 if (info.map[i].start == 0xE00000) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2727 info.map[i].buffer = gen->work_ram; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2728 if (!tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2729 break; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2730 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2731 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2732 if (info.map[i].flags & MMAP_PTR_IDX && info.map[i].ptr_index >= next_ptr_index) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2733 next_ptr_index = info.map[i].ptr_index + 1; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2734 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2735 if (info.map[i].start < 0x400000 && info.map[i].read_16 != unused_read) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2736 uint32_t highest_offset = (info.map[i].end & info.map[i].mask) + 1; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2737 if (highest_offset > tmss_min_alloc) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2738 tmss_min_alloc = highest_offset; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2739 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2740 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2741 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2742 if (tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2743 char *tmss_path = tern_find_path_default(config, "system\0tmss_path\0", (tern_val){.ptrval = "tmss.md"}, TVAL_PTR).ptrval; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2744 uint8_t *buffer = malloc(tmss_min_alloc); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2745 uint32_t tmss_size; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2746 if (is_absolute_path(tmss_path)) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2747 FILE *f = fopen(tmss_path, "rb"); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2748 if (!f) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2749 fatal_error("Configured to use a model with TMSS, but failed to load the TMSS ROM from %s\n", tmss_path); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2750 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2751 tmss_size = fread(buffer, 1, tmss_min_alloc, f); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2752 fclose(f); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2753 } else { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2754 char *tmp = read_bundled_file(tmss_path, &tmss_size); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2755 if (!tmp) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2756 fatal_error("Configured to use a model with TMSS, but failed to load the TMSS ROM from %s\n", tmss_path); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2757 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2758 memcpy(buffer, tmp, tmss_size); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2759 free(tmp); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2760 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2761 for (uint32_t padded = nearest_pow2(tmss_size); tmss_size < padded; tmss_size++) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2762 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2763 buffer[tmss_size] = 0xFF; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2764 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2765 #ifndef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2766 byteswap_rom(tmss_size, (uint16_t *)buffer); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2767 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2768 //mirror TMSS ROM until we fill up to tmss_min_alloc |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2769 for (uint32_t dst = tmss_size; dst < tmss_min_alloc; dst += tmss_size) |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2770 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2771 memcpy(buffer + dst, buffer, dst + tmss_size > tmss_min_alloc ? tmss_min_alloc - dst : tmss_size); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2772 } |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2773 //modify mappings for ROM space to point to the TMSS ROM and fixup flags to allow switching back and forth |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2774 //WARNING: This code makes some pretty big assumptions about the kinds of map chunks it will encounter |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2775 for (int i = 0; i < info.map_chunks; i++) |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2776 { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2777 if (info.map[i].start < 0x400000 && info.map[i].read_16 != unused_read) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2778 if (info.map[i].flags == MMAP_READ) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2779 //Normal ROM |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2780 info.map[i].flags |= MMAP_PTR_IDX | MMAP_CODE; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2781 info.map[i].ptr_index = next_ptr_index++; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2782 if (info.map[i].ptr_index >= NUM_MEM_AREAS) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2783 fatal_error("Too many memmap chunks with MMAP_PTR_IDX after TMSS remap\n"); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2784 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2785 gen->tmss_pointers[info.map[i].ptr_index] = info.map[i].buffer; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2786 info.map[i].buffer = buffer + (info.map[i].start & ~info.map[i].mask & (tmss_size - 1)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2787 } else if (info.map[i].flags & MMAP_PTR_IDX) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2788 //Sega mapper page or multi-game mapper |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2789 gen->tmss_pointers[info.map[i].ptr_index] = info.map[i].buffer; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2790 info.map[i].buffer = buffer + (info.map[i].start & ~info.map[i].mask & (tmss_size - 1)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2791 if (info.map[i].write_16) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2792 if (!gen->tmss_write_16) { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2793 gen->tmss_write_16 = info.map[i].write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2794 gen->tmss_write_8 = info.map[i].write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2795 info.map[i].write_16 = tmss_rom_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2796 info.map[i].write_8 = tmss_rom_write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2797 } else if (gen->tmss_write_16 == info.map[i].write_16) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2798 info.map[i].write_16 = tmss_rom_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2799 info.map[i].write_8 = tmss_rom_write_8; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2800 } else { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2801 warning("Chunk starting at %X has a write function, but we've already stored a different one for TMSS remap\n", info.map[i].start); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2802 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2803 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2804 } else if ((info.map[i].flags & (MMAP_READ | MMAP_WRITE)) == (MMAP_READ | MMAP_WRITE)) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2805 //RAM or SRAM |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2806 info.map[i].flags |= MMAP_PTR_IDX; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2807 info.map[i].ptr_index = next_ptr_index++; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2808 gen->tmss_pointers[info.map[i].ptr_index] = info.map[i].buffer; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2809 info.map[i].buffer = buffer + (info.map[i].start & ~info.map[i].mask & (tmss_size - 1)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2810 if (!gen->tmss_write_offset || gen->tmss_write_offset == info.map[i].start) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2811 gen->tmss_write_offset = info.map[i].start; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2812 info.map[i].flags &= ~MMAP_WRITE; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2813 if (info.map[i].flags & MMAP_ONLY_ODD) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2814 info.map[i].write_16 = tmss_odd_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2815 info.map[i].write_8 = tmss_odd_write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2816 } else if (info.map[i].flags & MMAP_ONLY_EVEN) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2817 info.map[i].write_16 = tmss_even_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2818 info.map[i].write_8 = tmss_even_write_8; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2819 } else { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2820 info.map[i].write_16 = tmss_word_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2821 info.map[i].write_8 = tmss_word_write_8; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2822 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2823 } else { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2824 warning("Could not remap writes for chunk starting at %X for TMSS because write_offset is %X\n", info.map[i].start, gen->tmss_write_offset); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2825 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2826 } else if (info.map[i].flags & MMAP_READ_CODE) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2827 //NOR flash |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2828 info.map[i].flags |= MMAP_PTR_IDX; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2829 info.map[i].ptr_index = next_ptr_index++; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2830 if (info.map[i].ptr_index >= NUM_MEM_AREAS) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2831 fatal_error("Too many memmap chunks with MMAP_PTR_IDX after TMSS remap\n"); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2832 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2833 gen->tmss_pointers[info.map[i].ptr_index] = info.map[i].buffer; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2834 info.map[i].buffer = buffer + (info.map[i].start & ~info.map[i].mask & (tmss_size - 1)); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2835 if (!gen->tmss_write_16) { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2836 gen->tmss_write_16 = info.map[i].write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2837 gen->tmss_write_8 = info.map[i].write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2838 gen->tmss_read_16 = info.map[i].read_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2839 gen->tmss_read_8 = info.map[i].read_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2840 info.map[i].write_16 = tmss_rom_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2841 info.map[i].write_8 = tmss_rom_write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2842 info.map[i].read_16 = tmss_rom_read_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2843 info.map[i].read_8 = tmss_rom_read_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2844 } else if (gen->tmss_write_16 == info.map[i].write_16) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2845 info.map[i].write_16 = tmss_rom_write_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2846 info.map[i].write_8 = tmss_rom_write_8; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2847 info.map[i].read_16 = tmss_rom_read_16; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2848 info.map[i].read_8 = tmss_rom_read_8; |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2849 } else { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2850 warning("Chunk starting at %X has a write function, but we've already stored a different one for TMSS remap\n", info.map[i].start); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2851 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2852 } else { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2853 warning("Didn't remap chunk starting at %X for TMSS because it has flags %X\n", info.map[i].start, info.map[i].flags); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2854 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2855 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2856 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2857 gen->tmss_buffer = buffer; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2858 } |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2859 memmap_chunk* map = info.map; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2860 uint32_t map_chunks = info.map_chunks; |
2088
c716af3f8980
Enable Sega CD emulation for carts if a CD image is "locked-on" even if the cart does not specify that it uses the CD peripheral in the header
Michael Pavone <pavone@retrodev.com>
parents:
2083
diff
changeset
|
2861 if (info.wants_cd || (current_media()->chain && current_media()->chain->type == MEDIA_CDROM)) { |
2277
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2862 gen->header.type = SYSTEM_SEGACD; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2863 segacd_context *cd = alloc_configure_segacd((system_media *)current_media(), 0, force_region, &info); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2864 gen->expansion = cd; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2865 gen->version_reg &= ~NO_DISK; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2866 cd->genesis = gen; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2867 uint32_t cd_chunks; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2868 memmap_chunk *cd_map = segacd_main_cpu_map(gen->expansion, 1, &cd_chunks); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2869 map_chunks = cd_chunks + info.map_chunks; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2870 map = calloc(map_chunks, sizeof(memmap_chunk)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2871 memcpy(map, info.map, sizeof(memmap_chunk) * (info.map_chunks - 1)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2872 memcpy(map + info.map_chunks - 1, cd_map, sizeof(memmap_chunk) * cd_chunks); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2873 memcpy(map + map_chunks - 1, info.map + info.map_chunks - 1, sizeof(memmap_chunk)); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2874 free(info.map); |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2875 int max_ptr_index = -1; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2876 for (int i = 0; i < info.map_chunks - 1; i++) |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2877 { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2878 if (map[i].flags & MMAP_PTR_IDX && map[i].ptr_index > max_ptr_index) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2879 max_ptr_index = map[i].ptr_index; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2880 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2881 } |
2090
00b6592cad42
Fix typo that messed up Mode 1 for carts with mappers
Michael Pavone <pavone@retrodev.com>
parents:
2088
diff
changeset
|
2882 cd->memptr_start_index = max_ptr_index + 1; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2883 for (int i = info.map_chunks - 1; i < map_chunks - 1; i++) |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2884 { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2885 if (map[i].flags & MMAP_PTR_IDX) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2886 map[i].ptr_index += cd->memptr_start_index; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2887 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2888 } |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2889 cd->base = 0x400000; |
2272
777900eb8e15
Add address logging support to sub CPU
Michael Pavone <pavone@retrodev.com>
parents:
2271
diff
changeset
|
2890 cd->m68k->options->address_log = (ym_opts & OPT_ADDRESS_LOG) ? fopen("address_sub.log", "w") : NULL; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2891 } |
2248
f7e2e11f1214
Fix improper free of memory map array from rom_info
Michael Pavone <pavone@retrodev.com>
parents:
2243
diff
changeset
|
2892 info.map = gen->header.info.map = NULL; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2893 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2894 m68k_options *opts = malloc(sizeof(m68k_options)); |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
2895 init_m68k_opts(opts, map, map_chunks, MCLKS_PER_68K, sync_components, int_ack); |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2896 if (!strcmp(tern_find_ptr_default(model, "tas", "broken"), "broken")) { |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2897 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY; |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2898 } |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2899 gen->m68k = init_68k_context(opts, NULL); |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2900 gen->m68k->system = gen; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2901 opts->address_log = (ym_opts & OPT_ADDRESS_LOG) ? fopen("address.log", "w") : NULL; |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2902 |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2903 //This must happen after the 68K context has been allocated |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2904 for (int i = 0; i < map_chunks; i++) |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2905 { |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2906 if (map[i].flags & MMAP_PTR_IDX) { |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2907 gen->m68k->mem_pointers[map[i].ptr_index] = map[i].buffer; |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2908 } |
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2909 } |
2052
3748a2a8a4b7
Support Sega mapper without 'SEGA SSF' in header or ROM DB entry and implement a subset of the extended Sega mapper implemented in the Mega Everdrive when 'SEGA SSF' is present
Michael Pavone <pavone@retrodev.com>
parents:
2039
diff
changeset
|
2910 |
1452
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2911 if (gen->mapper_type == MAPPER_SEGA) { |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2912 //initialize bank registers |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2913 for (int i = 1; i < sizeof(gen->bank_regs); i++) |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2914 { |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2915 gen->bank_regs[i] = i; |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2916 } |
f284ad74afe1
Make initial bank register state stored in bank_regs match what is put in to mem_pointers for the sega/SSF2 mapper. Invalidate RAM code ranges on RAM deserialization
Michael Pavone <pavone@retrodev.com>
parents:
1449
diff
changeset
|
2917 } |
1954
2fd0a8cb1c80
Properly initialize Genesis reset cycle on startup. Fixes crash in GDB remote debugger when stepping past the first two instructions
Michael Pavone <pavone@retrodev.com>
parents:
1946
diff
changeset
|
2918 gen->reset_cycle = CYCLE_NEVER; |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2919 |
2277
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2920 set_audio_config(gen); |
1103
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2921 return gen; |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2922 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2923 |
1692 | 2924 genesis_context *alloc_config_genesis_cdboot(system_media *media, uint32_t system_opts, uint8_t force_region) |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2925 { |
1692 | 2926 tern_node *rom_db = get_rom_db(); |
2927 rom_info info = configure_rom(rom_db, media->buffer, media->size, NULL, 0, base_map, base_chunks); | |
2267
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2928 if (media->size > 0x20B) { |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2929 //Use a byte in the security code region that's unique across all 3 regions |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2930 //since it's more reliable than the official header field for this |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2931 uint8_t *bytes = media->buffer; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2932 switch (bytes[0x20B]) |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2933 { |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2934 case 0x7A: |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2935 info.regions = REGION_U; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2936 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2937 case 0xA1: |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2938 info.regions = REGION_J; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2939 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2940 case 0x64: |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2941 info.regions = REGION_E; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2942 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2943 } |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
2944 } |
2053 | 2945 |
1692 | 2946 segacd_context *cd = alloc_configure_segacd(media, system_opts, force_region, &info); |
2947 genesis_context *gen = shared_init(system_opts, &info, force_region); | |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2948 gen->cart = gen->lock_on = NULL; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2949 gen->save_storage = NULL; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2950 gen->save_type = SAVE_NONE; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2951 gen->version_reg &= ~NO_DISK; |
2053 | 2952 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2953 gen->expansion = cd; |
2272
777900eb8e15
Add address logging support to sub CPU
Michael Pavone <pavone@retrodev.com>
parents:
2271
diff
changeset
|
2954 cd->m68k->options->address_log = (system_opts & OPT_ADDRESS_LOG) ? fopen("address_sub.log", "w") : NULL; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2955 gen->version_reg &= ~NO_DISK; |
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2956 cd->genesis = gen; |
1692 | 2957 setup_io_devices(config, &info, &gen->io); |
2053 | 2958 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2959 uint32_t cd_chunks; |
2054
8ee7ecbf3f21
Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents:
2053
diff
changeset
|
2960 memmap_chunk *cd_map = segacd_main_cpu_map(gen->expansion, 0, &cd_chunks); |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2961 memmap_chunk *map = malloc(sizeof(memmap_chunk) * (cd_chunks + base_chunks)); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2962 memcpy(map, cd_map, sizeof(memmap_chunk) * cd_chunks); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2963 memcpy(map + cd_chunks, base_map, sizeof(memmap_chunk) * base_chunks); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2964 map[cd_chunks].buffer = gen->work_ram; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2965 uint32_t num_chunks = cd_chunks + base_chunks; |
2053 | 2966 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2967 m68k_options *opts = malloc(sizeof(m68k_options)); |
2350
f8b5142c06aa
Allow 68K to return mid-instruction. Adjust how 68K interrupt ack works so int2 busy flag timing is more correct. Fix some other SCD timing issues
Michael Pavone <pavone@retrodev.com>
parents:
2336
diff
changeset
|
2968 init_m68k_opts(opts, map, num_chunks, MCLKS_PER_68K, sync_components, int_ack); |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2969 //TODO: make this configurable |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2970 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2971 gen->m68k = init_68k_context(opts, NULL); |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2972 gen->m68k->system = gen; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2973 opts->address_log = (system_opts & OPT_ADDRESS_LOG) ? fopen("address.log", "w") : NULL; |
2053 | 2974 |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2975 //This must happen after the 68K context has been allocated |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2976 for (int i = 0; i < num_chunks; i++) |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2977 { |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2978 if (map[i].flags & MMAP_PTR_IDX) { |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2979 gen->m68k->mem_pointers[map[i].ptr_index] = map[i].buffer; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2980 } |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2981 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2982 gen->header.type = SYSTEM_SEGACD; |
2277
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2983 |
9e578fd493e1
Implement gain control for Ricoh PCM and CDDA with defaults based on Model 2 Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2272
diff
changeset
|
2984 set_audio_config(gen); |
1503
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2985 return gen; |
a763523dadf4
Added code for initializing a combined Genesis + Sega CD system when a Sega CD ISO is loaded
Michael Pavone <pavone@retrodev.com>
parents:
1452
diff
changeset
|
2986 } |
2428 | 2987 |
2988 static memmap_chunk pico_base_map[] = { | |
2989 {0xE00000, 0x1000000, 0xFFFF, .flags = MMAP_READ | MMAP_WRITE | MMAP_CODE}, | |
2990 {0xC00000, 0xE00000, 0x1FFFFF, .read_16 = (read_16_fun)vdp_port_read, .write_16 =(write_16_fun)vdp_port_write, | |
2991 .read_8 = (read_8_fun)vdp_port_read_b, .write_8 = (write_8_fun)vdp_port_write_b}, | |
2992 {0x800000, 0x900000, 0xFFFFFF, .read_16 = pico_io_read_w, .write_16 = pico_io_write_w, | |
2993 .read_8 = pico_io_read, .write_8 = pico_io_write} | |
2994 }; | |
2995 const size_t pico_base_chunks = sizeof(pico_base_map)/sizeof(*pico_base_map); | |
2996 | |
2997 genesis_context* alloc_config_pico(void *rom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, uint32_t ym_opts, uint8_t force_region) | |
2998 { | |
2999 tern_node *rom_db = get_rom_db(); | |
3000 rom_info info = configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, pico_base_map, pico_base_chunks); | |
3001 rom = info.rom; | |
3002 rom_size = info.rom_size; | |
3003 #ifndef BLASTEM_BIG_ENDIAN | |
3004 byteswap_rom(nearest_pow2(rom_size), rom); | |
3005 if (lock_on) { | |
3006 byteswap_rom(nearest_pow2(lock_on_size), lock_on); | |
3007 } | |
3008 #endif | |
3009 char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval; | |
3010 if (!m68k_divider) { | |
3011 m68k_divider = "7"; | |
3012 } | |
3013 MCLKS_PER_68K = atoi(m68k_divider); | |
3014 if (!MCLKS_PER_68K) { | |
3015 MCLKS_PER_68K = 7; | |
3016 } | |
3017 genesis_context *gen = calloc(1, sizeof(genesis_context)); | |
3018 gen->header.set_speed_percent = set_speed_percent; | |
3019 gen->header.start_context = start_genesis; | |
3020 gen->header.resume_context = resume_genesis; | |
3021 gen->header.load_save = load_save; | |
3022 gen->header.persist_save = persist_save; | |
3023 gen->header.load_state = load_state; | |
3024 gen->header.soft_reset = soft_reset; | |
3025 gen->header.free_context = free_genesis; | |
3026 gen->header.get_open_bus_value = get_open_bus_value; | |
3027 gen->header.request_exit = request_exit; | |
3028 gen->header.inc_debug_mode = inc_debug_mode; | |
3029 gen->header.gamepad_down = gamepad_down_pico; | |
3030 gen->header.gamepad_up = gamepad_up_pico; | |
3031 gen->header.mouse_down = mouse_down_pico; | |
3032 gen->header.mouse_up = mouse_up_pico; | |
3033 gen->header.mouse_motion_absolute = mouse_motion_absolute_pico; | |
3034 gen->header.mouse_motion_relative = mouse_motion_relative_pico; | |
3035 gen->header.keyboard_down = keyboard_down_pico; | |
3036 gen->header.keyboard_up = keyboard_up_pico; | |
3037 gen->header.config_updated = config_updated; | |
3038 gen->header.serialize = serialize; | |
3039 gen->header.deserialize = deserialize; | |
3040 gen->header.start_vgm_log = start_vgm_log; | |
3041 gen->header.stop_vgm_log = stop_vgm_log; | |
3042 gen->header.toggle_debug_view = toggle_debug_view; | |
3043 gen->header.type = SYSTEM_PICO; | |
3044 gen->header.info = info; | |
2437
79a8cccb6ac1
Add region override for German version of The Lion King for Pico
Michael Pavone <pavone@retrodev.com>
parents:
2433
diff
changeset
|
3045 set_region(gen, &info, force_region); |
2428 | 3046 gen->vdp_unlocked = 1; |
3047 gen->pico_button_state = 0xFF; | |
3048 | |
3049 gen->vdp = init_vdp_context((gen->version_reg & 0x60) == 0x20, 40, VDP_GENESIS); | |
3050 gen->vdp->system = &gen->header; | |
3051 gen->frame_end = vdp_cycles_to_frame_end(gen->vdp); | |
3052 char * config_cycles = tern_find_path(config, "clocks\0max_cycles\0", TVAL_PTR).ptrval; | |
3053 gen->max_cycles = config_cycles ? atoi(config_cycles) : DEFAULT_SYNC_INTERVAL; | |
3054 gen->int_latency_prev1 = MCLKS_PER_68K * 32; | |
3055 gen->int_latency_prev2 = MCLKS_PER_68K * 16; | |
3056 | |
3057 render_set_video_standard((gen->version_reg & 0x60) == 0x20 ? VID_PAL : VID_NTSC); | |
3058 | |
3059 gen->psg = calloc(1, sizeof(psg_context)); | |
3060 psg_init(gen->psg, gen->master_clock, MCLKS_PER_PSG); | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3061 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3062 gen->adpcm = calloc(1, sizeof(pico_pcm)); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3063 pico_pcm_init(gen->adpcm, gen->master_clock, 42); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3064 |
2428 | 3065 gen->work_ram = calloc(2, RAM_WORDS); |
3066 if (!strcmp("random", tern_find_path_default(config, "system\0ram_init\0", (tern_val){.ptrval = "zero"}, TVAL_PTR).ptrval)) | |
3067 { | |
3068 srand(time(NULL)); | |
3069 for (int i = 0; i < RAM_WORDS; i++) | |
3070 { | |
3071 gen->work_ram[i] = rand(); | |
3072 } | |
3073 for (int i = 0; i < VRAM_SIZE; i++) | |
3074 { | |
3075 gen->vdp->vdpmem[i] = rand(); | |
3076 } | |
3077 for (int i = 0; i < SAT_CACHE_SIZE; i++) | |
3078 { | |
3079 gen->vdp->sat_cache[i] = rand(); | |
3080 } | |
3081 for (int i = 0; i < CRAM_SIZE; i++) | |
3082 { | |
3083 write_cram_internal(gen->vdp, i, rand()); | |
3084 } | |
3085 for (int i = 0; i < gen->vdp->vsram_size; i++) | |
3086 { | |
3087 gen->vdp->vsram[i] = rand(); | |
3088 } | |
3089 } | |
3090 gen->cart = rom; | |
3091 gen->lock_on = lock_on; | |
3092 gen->header.has_keyboard = 0; //TODO: Keyboard Pico emulation | |
3093 gen->mapper_type = info.mapper_type; | |
3094 gen->save_type = info.save_type; | |
3095 if (gen->save_type != SAVE_NONE) { | |
3096 gen->save_ram_mask = info.save_mask; | |
3097 gen->save_size = info.save_size; | |
3098 gen->save_storage = info.save_buffer; | |
3099 gen->header.info.save_buffer = info.save_buffer = NULL; | |
3100 gen->eeprom_map = info.eeprom_map; | |
3101 gen->num_eeprom = info.num_eeprom; | |
3102 if (gen->save_type == SAVE_I2C) { | |
3103 eeprom_init(&gen->eeprom, gen->save_storage, gen->save_size); | |
3104 } else if (gen->save_type == SAVE_NOR) { | |
3105 memcpy(&gen->nor, info.nor, sizeof(gen->nor)); | |
3106 //nor_flash_init(&gen->nor, gen->save_storage, gen->save_size, info.save_page_size, info.save_product_id, info.save_bus); | |
3107 } | |
3108 } else { | |
3109 gen->save_storage = NULL; | |
3110 } | |
3111 | |
3112 gen->mapper_start_index = info.mapper_start_index; | |
3113 //This must happen before we generate memory access functions in init_m68k_opts | |
3114 for (int i = 0; i < info.map_chunks; i++) | |
3115 { | |
3116 if (info.map[i].start == 0xE00000) { | |
3117 info.map[i].buffer = gen->work_ram; | |
3118 break; | |
3119 } | |
3120 } | |
3121 | |
3122 memmap_chunk* map = info.map; | |
3123 uint32_t map_chunks = info.map_chunks; | |
3124 info.map = gen->header.info.map = NULL; | |
3125 | |
3126 m68k_options *opts = malloc(sizeof(m68k_options)); | |
3127 init_m68k_opts(opts, map, map_chunks, MCLKS_PER_68K, sync_components_pico, int_ack); | |
3128 //TODO: Pico model selection | |
3129 //if (!strcmp(tern_find_ptr_default(model, "tas", "broken"), "broken")) { | |
3130 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY; | |
3131 //} | |
3132 gen->m68k = init_68k_context(opts, NULL); | |
3133 gen->m68k->system = gen; | |
3134 opts->address_log = (ym_opts & OPT_ADDRESS_LOG) ? fopen("address.log", "w") : NULL; | |
3135 | |
3136 //This must happen after the 68K context has been allocated | |
3137 for (int i = 0; i < map_chunks; i++) | |
3138 { | |
3139 if (map[i].flags & MMAP_PTR_IDX) { | |
3140 gen->m68k->mem_pointers[map[i].ptr_index] = map[i].buffer; | |
3141 } | |
3142 } | |
3143 | |
3144 if (gen->mapper_type == MAPPER_SEGA) { | |
3145 //initialize bank registers | |
3146 for (int i = 1; i < sizeof(gen->bank_regs); i++) | |
3147 { | |
3148 gen->bank_regs[i] = i; | |
3149 } | |
3150 } | |
3151 gen->reset_cycle = CYCLE_NEVER; | |
3152 | |
3153 set_audio_config(gen); | |
3154 bindings_set_mouse_mode(MOUSE_ABSOLUTE); | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3155 memset(gen->pico_story_pages, 0xFF, sizeof(gen->pico_story_pages)); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3156 #ifndef IS_LIB |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3157 gen->pico_story_window = render_create_window("Pico Storybook & Pad", 640, 640, NULL); |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3158 char *manifest_name = alloc_concat(current_media()->name, ".manifest"); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3159 char *manifest_str = load_media_subfile(current_media(), manifest_name, NULL); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3160 tern_node *manifest = NULL; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3161 if (manifest_str) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3162 manifest = parse_config(manifest_str); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3163 if (!manifest) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3164 printf("Failed to parse manifest %s\n", manifest_name); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3165 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3166 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3167 printf("Manifest file %s not found\n", manifest_name); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3168 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3169 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3170 tern_node *pages = tern_find_node(manifest, "pages"); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3171 if (!pages && manifest) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3172 printf("No pages key in %s\n", manifest_name); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3173 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3174 char numkey[18]; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3175 for (int i = 0; i < 7; i++) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3176 uint8_t *img_data; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3177 uint32_t img_size; |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3178 if (pages) { |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3179 sprintf(numkey, "%d", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3180 char *page_path = tern_find_ptr(pages, numkey); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3181 if (page_path) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3182 printf("page %d: %s\n", i, page_path); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3183 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3184 continue; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3185 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3186 img_data = load_media_subfile(current_media(), page_path, &img_size); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3187 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3188 printf("Failed to load image file for page %d from %s\n", i, page_path); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3189 continue; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3190 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3191 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3192 sprintf(numkey, "_%d.png", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3193 char *img_path = alloc_concat(current_media()->name, numkey); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3194 img_data = load_media_subfile(current_media(), img_path, &img_size); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3195 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3196 sprintf(numkey, "_%d.PNG", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3197 char *img_path_loud = alloc_concat(current_media()->name, numkey); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3198 img_data = load_media_subfile(current_media(), img_path_loud, &img_size); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3199 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3200 printf("Failed to load image file for page %d from %s or %s\n", i, img_path, img_path_loud); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3201 free(img_path); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3202 free(img_path_loud); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3203 continue; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3204 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3205 free(img_path_loud); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3206 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3207 free(img_path); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3208 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3209 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3210 gen->pico_story_pages[i] = render_static_image(gen->pico_story_window, img_data, img_size); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3211 if (gen->pico_story_pages[i] == 0xFF) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3212 printf("Failed to decode image for page %d\n", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3213 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3214 free(img_data); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3215 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3216 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3217 free(manifest_name); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3218 tern_free(manifest); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3219 pico_update_page(gen); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3220 #endif |
2428 | 3221 return gen; |
3222 } |