Mercurial > repos > blastem
annotate genesis.c @ 2673:2c8f541af3c5
Get Pico games running with new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 08 Mar 2025 21:09:54 -0800 |
parents | 6068d32b756c |
children | dbff641a33df |
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 #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
|
37 #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
|
38 |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
39 #ifdef IS_LIB |
2568 | 40 #define MAX_SOUND_CYCLES (MCLKS_PER_YM*OPN2_NUM_OPERATORS*6*4) |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
41 #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
|
42 #define MAX_SOUND_CYCLES 100000 |
1688
395f684c5379
Fixed the most glaring issues in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1643
diff
changeset
|
43 #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
|
44 |
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
|
45 #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
|
46 #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
|
47 #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
|
48 #define z80_handle_code_write(...) |
2577
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
49 #define int_num int_priority |
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
|
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 |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
73 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 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; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
141 #ifndef NEW_CORE |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
142 if (gen->m68k->resume_pc) { |
2476
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
143 |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
144 gen->header.save_state = SERIALIZE_SLOT+1; |
2476
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
145 while (!gen->serialize_tmp) |
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
146 { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
147 gen->m68k->target_cycle = gen->m68k->cycles + 1; |
2476
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
148 resume_68k(gen->m68k); |
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
149 } |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
150 if (size_out) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
151 *size_out = gen->serialize_size; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
152 } |
2476
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
153 uint8_t *ret = gen->serialize_tmp; |
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
154 gen->serialize_tmp = NULL; |
aaf7bb58ffca
Fix bug in Gen/MD serialize routine that could cause a use-after free in some cases
Michael Pavone <pavone@retrodev.com>
parents:
2466
diff
changeset
|
155 return ret; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
156 } else |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
157 #endif |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
158 { |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
159 serialize_buffer state; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
160 init_serialize(&state); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
161 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k) << 16; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
162 address |= read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k); |
1946 | 163 genesis_serialize(gen, &state, address, 1); |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
164 if (size_out) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
165 *size_out = state.size; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
166 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
167 return state.data; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
168 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
169 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
170 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
171 static void ram_deserialize(deserialize_buffer *buf, void *vgen) |
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 genesis_context *gen = vgen; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
174 uint32_t ram_size = load_int8(buf) * 1024 / 2; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
175 if (ram_size > RAM_WORDS) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
176 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
|
177 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
178 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
|
179 m68k_invalidate_code_range(gen->m68k, 0xE00000, 0x1000000); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
180 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
181 |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
182 static void zram_deserialize(deserialize_buffer *buf, void *vgen) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
183 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
184 genesis_context *gen = vgen; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
185 uint32_t ram_size = load_int8(buf) * 1024; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
186 if (ram_size > Z80_RAM_BYTES) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
187 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
|
188 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
189 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
|
190 z80_invalidate_code_range(gen->z80, 0, 0x4000); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
191 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
192 |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
193 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
|
194 { |
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
|
195 if (gen->z80_bank_reg < 0x140) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
196 gen->z80->mem_pointers[1] = get_native_pointer(gen->z80_bank_reg << 15, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen); |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
197 } else { |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
198 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
|
199 } |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
200 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
|
201 } |
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
202 |
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
|
203 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
|
204 { |
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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 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
|
210 gen->last_sync_cycle = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
211 gen->refresh_counter = load_int32(buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
212 } else { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
213 //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
|
214 //set them to reasonable values |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
215 gen->last_sync_cycle = gen->m68k->cycles; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
216 gen->refresh_counter = 0; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
217 } |
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
|
218 } |
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
|
219 |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
220 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
|
221 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
222 genesis_context *gen = vgen; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
223 gen->tmss = load_int8(buf); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
224 load_buffer16(buf, gen->tmss_lock, 2); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
225 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
226 |
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
|
227 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
|
228 static void check_tmss_lock(genesis_context *gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
229 static void toggle_tmss_rom(genesis_context *gen); |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
230 #ifndef NEW_CORE |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
231 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
232 #endif |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
233 void genesis_deserialize(deserialize_buffer *buf, genesis_context *gen) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
234 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 register_section_handler(buf, (section_handler){.fun = cart_deserialize, .data = gen}, SECTION_MAPPER); |
2428 | 241 if (gen->header.type == SYSTEM_GENESIS) { |
242 register_section_handler(buf, (section_handler){.fun = z80_deserialize, .data = gen->z80}, SECTION_Z80); | |
243 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports}, SECTION_SEGA_IO_1); | |
244 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 1}, SECTION_SEGA_IO_2); | |
245 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = gen->io.ports + 2}, SECTION_SEGA_IO_EXT); | |
246 register_section_handler(buf, (section_handler){.fun = zram_deserialize, .data = gen}, SECTION_SOUND_RAM); | |
247 register_section_handler(buf, (section_handler){.fun = tmss_deserialize, .data = gen}, SECTION_TMSS); | |
248 } | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
249 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 250 register_section_handler(buf, (section_handler){.fun = ym_deserialize, .data = gen->ym}, SECTION_YM2612); |
251 } | |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
252 if (gen->expansion) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
253 segacd_context *cd = gen->expansion; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
254 segacd_register_section_handlers(cd, buf); |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
255 } |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
256 uint8_t tmss_old = gen->tmss; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
257 gen->tmss = 0xFF; |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
258 while (buf->cur_pos < buf->size) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
259 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
260 load_section(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
261 } |
2428 | 262 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
|
263 if (gen->tmss == 0xFF) { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
264 //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
|
265 //and that the VDP is unlocked |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
266 gen->tmss_lock[0] = 0x5345; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
267 gen->tmss_lock[1] = 0x4741; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
268 gen->tmss = 1; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
269 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
270 if (gen->tmss != tmss_old) { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
271 toggle_tmss_rom(gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
272 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
273 check_tmss_lock(gen); |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
274 } |
1445
349d50930c03
Save and restore Z80 bank register in native save states
Michael Pavone <pavone@retrodev.com>
parents:
1444
diff
changeset
|
275 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
|
276 adjust_int_cycle(gen->m68k, gen->vdp); |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
277 #ifndef NEW_CORE |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
278 //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
|
279 //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
|
280 //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
|
281 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
|
282 if (gen->expansion) { |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
283 segacd_context *cd = gen->expansion; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
284 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
|
285 } |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
286 #endif |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
287 free(buf->handlers); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
288 buf->handlers = NULL; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
289 } |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
290 |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
291 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
|
292 { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
293 genesis_context *gen = (genesis_context *)sys; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
294 deserialize_buffer buffer; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
295 init_deserialize(&buffer, data, size); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
296 genesis_deserialize(&buffer, gen); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
297 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
298 |
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
|
299 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
|
300 { |
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
|
301 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
|
302 address *= 2; |
1420
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
303 //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
|
304 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
|
305 return 0; |
975b5b7eaa77
Fix DMA from byte-wide SRAM
Michael Pavone <pavone@retrodev.com>
parents:
1416
diff
changeset
|
306 } |
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 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
|
308 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
|
309 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
|
310 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
|
311 if (address >= word_ram && address < word_ram_end) { |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
312 if (!cd->has_vdp_dma_value) { |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
313 #ifdef NEW_CORE |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
314 cd->vdp_dma_value = genesis->m68k->prefetch; |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
315 #else |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
316 cd->vdp_dma_value = read_word(genesis->m68k->last_prefetch_address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
317 #endif |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
318 cd->has_vdp_dma_value = 1; |
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 uint16_t ret = cd->vdp_dma_value; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
321 cd->vdp_dma_value = read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->gen, genesis->m68k); |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
322 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
|
323 } |
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
|
324 } |
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
|
325 |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
326 return read_word(address, (void **)genesis->m68k->mem_pointers, &genesis->m68k->opts->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
|
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 |
2336
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
329 void vdp_dma_started(void) |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
330 { |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
331 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
|
332 if (genesis->expansion) { |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
333 segacd_context *cd = genesis->expansion; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
334 cd->has_vdp_dma_value = 0; |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
335 } |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
336 } |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
337 |
83f5529086c5
Make bogus word RAM read more appropriately bogus
Michael Pavone <pavone@retrodev.com>
parents:
2335
diff
changeset
|
338 |
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
|
339 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
|
340 { |
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
|
341 genesis_context *genesis = (genesis_context *)system; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
342 #ifdef NEW_CORE |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
343 return genesis->m68k->prefetch; |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
344 #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
|
345 return read_dma_value(genesis->m68k->last_prefetch_address/2); |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
346 #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
|
347 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
349 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
|
350 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 //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
|
352 genesis_context *gen = context->system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
353 if (context->sync_cycle - context->cycles > gen->max_cycles) { |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
354 context->sync_cycle = context->cycles + gen->max_cycles; |
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
|
355 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 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
|
362 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
|
363 } |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
364 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
|
365 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
|
366 if (next_hint != CYCLE_NEVER) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
367 next_hint = next_hint < context->cycles ? context->cycles : next_hint; |
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
|
368 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
|
369 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
|
370 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
|
371 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } |
2428 | 374 if (mask < 2 && (v_context->regs[REG_MODE_3] & BIT_EINT_EN) && gen->header.type == SYSTEM_GENESIS) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
375 uint32_t next_eint_port0 = io_next_interrupt(gen->io.ports, context->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
376 uint32_t next_eint_port1 = io_next_interrupt(gen->io.ports + 1, context->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
377 uint32_t next_eint_port2 = io_next_interrupt(gen->io.ports + 2, context->cycles); |
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 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
|
379 ? (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
|
380 : (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
|
381 if (next_eint != CYCLE_NEVER) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
382 next_eint = next_eint < context->cycles ? context->cycles : next_eint; |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
383 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
|
384 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
|
385 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
|
386 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
387 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
2021
diff
changeset
|
388 } |
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
|
389 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
391 if (context->int_cycle > context->cycles && context->int_pending == INT_PENDING_SR_CHANGE) { |
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
|
392 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
|
393 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
394 /*if (context->int_cycle != old_int_cycle) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
395 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->cycles, v_context->frame, v_context->vcounter, v_context->hslot, context->status & 0x7, v_context->hint_counter); |
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
|
396 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
|
397 }*/ |
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
|
398 |
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
|
399 if (context->status & M68K_STATUS_TRACE || context->trace_pending) { |
2673
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
400 context->target_cycle = context->cycles + 1; |
1303
208803173ebc
Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents:
1291
diff
changeset
|
401 return; |
208803173ebc
Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents:
1291
diff
changeset
|
402 } |
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
|
403 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
404 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
|
405 if (context->should_return || gen->header.enter_debugger || context->wp_hit) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
406 context->target_cycle = context->cycles; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
407 } else if (context->target_cycle < context->cycles) { |
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
|
408 //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
|
409 //This can cause issues with the implementation of STOP though |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
410 context->target_cycle = context->cycles; |
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
|
411 } |
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
|
412 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
|
413 //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
|
414 //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
|
415 //to prevent this code forces some extra synchronization in the period immediately before an interrupt |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
416 if ((context->target_cycle - context->cycles) > gen->int_latency_prev1) { |
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
|
417 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev1; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
418 } else if ((context->target_cycle - context->cycles) > gen->int_latency_prev2) { |
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
|
419 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
|
420 } else { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
421 context->target_cycle = context->sync_cycle = context->cycles; |
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
|
422 } |
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
|
423 |
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
|
424 } |
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
|
425 /*printf("Cyc: %d, Trgt: %d, Int Cyc: %d, Int: %d, Mask: %X, V: %d, H: %d, HICount: %d, HReg: %d, Line: %d\n", |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
426 context->cycles, context->target_cycle, context->int_cycle, context->int_num, (context->status & 0x7), |
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
|
427 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
|
428 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
429 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
430 //#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
|
431 #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
|
432 #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
|
433 #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
|
434 #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
|
435 #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
|
436 #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
|
437 #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
|
438 |
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
|
439 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
|
440 { |
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
|
441 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
|
442 #ifdef NEW_CORE |
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 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
|
447 #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
|
448 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
|
449 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
|
450 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
|
451 #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
|
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 |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
454 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
|
455 { |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
456 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
|
457 #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
|
458 if (z80_enabled) { |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
459 #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
|
460 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
|
461 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
|
462 } |
1753
33ec5df77fac
Integration of new Z80 core is sort of working now
Michael Pavone <pavone@retrodev.com>
parents:
1752
diff
changeset
|
463 #endif |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
464 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
|
465 while (!z_context->pc) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
466 z80_run(z_context, z_context->Z80_CYCLE + 4); |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
467 } |
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
468 gen->enter_z80_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
469 #ifndef IS_LIB |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
470 zdebugger(z_context, z_context->pc); |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
471 #endif |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
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 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
|
474 } 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
|
475 #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
|
476 { |
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
|
477 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
|
478 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
481 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
|
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 //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
|
484 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
|
485 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
|
486 //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
|
487 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
|
488 //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
|
489 ym_run(gen->ym, cur_target); |
2080 | 490 if (gen->expansion) { |
491 scd_run(gen->expansion, gen_cycle_to_scd(cur_target, gen)); | |
492 } | |
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
|
493 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
494 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
|
495 ym_run(gen->ym, target); |
2080 | 496 if (gen->expansion) { |
497 scd_run(gen->expansion, gen_cycle_to_scd(target, gen)); | |
498 } | |
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
|
499 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
500 //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
|
501 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
502 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
503 #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
|
504 #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
|
505 |
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
|
506 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
|
507 { |
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 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
|
509 genesis_context *gen = context->system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
510 gen->refresh_counter += context->cycles - gen->last_sync_cycle; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
511 gen->last_sync_cycle = context->cycles; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
512 context->cycles += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / interval); |
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
|
513 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
|
514 } |
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 |
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 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
|
517 { |
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 genesis_context *gen = context->system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
519 uint32_t before = context->cycles - 4*MCLKS_PER_68K; |
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
|
520 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
|
521 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
|
522 } |
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 //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
|
524 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
|
525 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
|
526 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
|
527 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
|
528 //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
|
529 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
|
530 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
|
531 delay += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / interval); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
532 context->cycles += delay; |
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
|
533 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
534 gen->last_sync_cycle = context->cycles; |
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
|
535 //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
|
536 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
|
537 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
|
538 } |
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 |
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 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
|
541 { |
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
|
542 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
|
543 genesis_context *gen = context->system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
544 gen->refresh_counter += context->cycles - gen->last_sync_cycle; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
545 gen->last_sync_cycle = context->cycles; |
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
|
546 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
|
547 } |
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
|
548 |
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
|
549 #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
|
550 #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
|
551 #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
|
552 |
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
|
553 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
|
554 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
555 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
|
556 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
|
557 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
|
558 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
|
559 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
|
560 } 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
|
561 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
|
562 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
563 |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
564 uint32_t mclks = context->cycles; |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 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
|
569 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
|
570 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
|
571 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
|
572 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
|
573 } |
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
|
574 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
|
575 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
|
576 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
|
577 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
|
578 } |
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
|
579 if (v_context->frame != gen->last_frame) { |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
580 #ifndef IS_LIB |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
581 if (gen->ym->scope) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
582 scope_render(gen->ym->scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
583 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
584 #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
|
585 //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
|
586 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
|
587 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
|
588 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
|
589 gen->last_flush_cycle = mclks; |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
590 if (gen->header.enter_debugger_frames) { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
591 if (elapsed >= gen->header.enter_debugger_frames) { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
592 gen->header.enter_debugger_frames = 0; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
593 gen->header.enter_debugger = 1; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
594 } else { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
595 gen->header.enter_debugger_frames -= elapsed; |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
596 } |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
597 } |
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
|
598 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
599 if(exit_after){ |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
600 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
|
601 exit(0); |
2179
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
602 } else { |
9a8dd4ba2753
Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2164
diff
changeset
|
603 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
|
604 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
605 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
606 if (context->cycles > MAX_NO_ADJUST) { |
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
|
607 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
|
608 vdp_adjust_cycles(v_context, deduction); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
609 io_adjust_cycles(gen->io.ports, context->cycles, deduction); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
610 io_adjust_cycles(gen->io.ports+1, context->cycles, deduction); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
611 io_adjust_cycles(gen->io.ports+2, context->cycles, deduction); |
1610 | 612 if (gen->mapper_type == MAPPER_JCART) { |
613 jcart_adjust_cycles(gen, deduction); | |
614 } | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
615 context->cycles -= deduction; |
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
|
616 z80_adjust_cycles(z_context, deduction); |
1902
32a3aa7b4a45
Fix YM2612 busy flag timing
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
617 ym_adjust_cycles(gen->ym, deduction); |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
618 if (gen->ym->vgm) { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
619 vgm_adjust_cycles(gen->ym->vgm, deduction); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
620 } |
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
|
621 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
|
622 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
|
623 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
|
624 } |
1946 | 625 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
|
626 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
|
627 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
|
628 } |
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
|
629 gen->last_flush_cycle -= deduction; |
2548
3fc8a1f2eb84
Fix regression in Super Hang-On
Michael Pavone <pavone@retrodev.com>
parents:
2524
diff
changeset
|
630 gen->last_sync_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
|
631 } |
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
|
632 } 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
|
633 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
|
634 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
|
635 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
636 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
|
637 context->sync_cycle = gen->frame_end; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
638 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->cycles, 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
|
639 if (!address && (gen->header.enter_debugger || gen->header.save_state)) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
640 context->sync_cycle = context->cycles + 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
|
641 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
642 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
|
643 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
|
644 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
|
645 } |
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
|
646 if (address) { |
2424
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
647 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
|
648 if (!context->wp_hit) { |
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
649 gen->header.enter_debugger = 0; |
767ec72acca7
Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents:
2391
diff
changeset
|
650 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
651 #ifndef IS_LIB |
2033
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
652 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
|
653 debugger(context, address); |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
654 } else { |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
655 gdb_debug_enter(context, address); |
894bf99a13f1
Make ui.enter_debuger respect which debuger is active
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
656 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
657 #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
|
658 } |
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
|
659 #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
|
660 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
|
661 #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
|
662 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
|
663 #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
|
664 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
|
665 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
|
666 #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
|
667 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
|
668 //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
|
669 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
|
670 { |
2184
408fb8a7e990
Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents:
2179
diff
changeset
|
671 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
|
672 } |
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
|
673 } |
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
|
674 #endif |
1946 | 675 char *save_path = slot >= SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); |
676 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
|
677 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
|
678 init_serialize(&state); |
1946 | 679 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
|
680 if (slot == SERIALIZE_SLOT) { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
681 gen->serialize_tmp = state.data; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
682 gen->serialize_size = state.size; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
683 context->sync_cycle = context->cycles; |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
684 context->should_return = 1; |
1946 | 685 } else if (slot == EVENTLOG_SLOT) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
686 event_state(context->cycles, &state); |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
687 } else { |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
688 save_to_file(&state, save_path); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
689 free(state.data); |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
690 } |
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
|
691 } 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
|
692 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
|
693 } |
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
|
694 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
|
695 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
|
696 } |
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
|
697 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
|
698 } else if(gen->header.save_state) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
699 context->sync_cycle = context->cycles + 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
|
700 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
701 } |
2577
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
702 #ifdef NEW_CORE |
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
703 if (context->target_cycle == context->cycles) { |
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
704 context->target_cycle++; |
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
705 } |
5f725429d08f
WIP changes to new CPU core for rotate instructions and to get interrupts more functional
Michael Pavone <pavone@retrodev.com>
parents:
2571
diff
changeset
|
706 #endif |
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
|
707 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
|
708 } |
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
|
709 |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
710 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
|
711 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
712 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
|
713 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
714 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
|
715 psg_run(gen->psg, cur_target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
716 pico_pcm_run(gen->adpcm, cur_target); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
717 if (gen->ymz) { |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
718 //FIXME: These have a separate crystal |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
719 ymz263b_run(gen->ymz, cur_target); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
720 ymf262_run(gen->opl, cur_target); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
721 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
722 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
723 psg_run(gen->psg, target); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
724 pico_pcm_run(gen->adpcm, target); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
725 if (gen->ymz) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
726 ymz263b_run(gen->ymz, target); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
727 ymf262_run(gen->opl, target); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
728 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
729 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
730 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
731 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
|
732 { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
733 genesis_context *gen = context->system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
734 if (context->sync_cycle - context->cycles > gen->max_cycles) { |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
735 context->sync_cycle = context->cycles + gen->max_cycles; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
736 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
737 context->int_cycle = CYCLE_NEVER; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
738 uint8_t mask = context->status & 0x7; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
739 if (mask < 6) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
740 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
|
741 if (next_vint != CYCLE_NEVER) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
742 context->int_cycle = next_vint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
743 context->int_num = 6; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
744 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
745 if (mask < 5) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
746 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
|
747 if (next_hint != CYCLE_NEVER) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
748 next_hint = next_hint < context->cycles ? context->cycles : next_hint; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
749 if (next_hint < context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
750 context->int_cycle = next_hint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
751 context->int_num = 5; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
752 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
753 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
754 } |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
755 if (mask < 4) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
756 if (v_context->regs[REG_MODE_3] & BIT_EINT_EN) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
757 uint32_t next_eint_port0 = io_next_interrupt(gen->io.ports, context->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
758 uint32_t next_eint_port1 = io_next_interrupt(gen->io.ports + 1, context->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
759 uint32_t next_eint_port2 = io_next_interrupt(gen->io.ports + 2, context->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
760 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
|
761 ? (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
|
762 : (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
|
763 if (next_eint != CYCLE_NEVER) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
764 next_eint = next_eint < context->cycles ? context->cycles : next_eint; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
765 if (next_eint < context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
766 context->int_cycle = next_eint; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
767 context->int_num = 2; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
768 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
769 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
770 } |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
771 if (mask < 3) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
772 uint32_t next_pcm_int = pico_pcm_next_int(gen->adpcm); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
773 if (next_pcm_int != CYCLE_NEVER && next_pcm_int < context->int_cycle) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
774 context->int_cycle = next_pcm_int; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
775 context->int_num = 3; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
776 } |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
777 |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
778 if (mask < 2 && gen->ymz) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
779 uint32_t ymz_int = ymz263b_next_int(gen->ymz); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
780 if (ymz_int < context->int_cycle) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
781 context->int_cycle = ymz_int; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
782 context->int_num = 2; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
783 } |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
784 } |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
785 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
786 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
787 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
788 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
789 if (context->int_cycle > context->cycles && context->int_pending == INT_PENDING_SR_CHANGE) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
790 context->int_pending = INT_PENDING_NONE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
791 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
792 /*if (context->int_cycle != old_int_cycle) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
793 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->cycles, v_context->frame, v_context->vcounter, v_context->hslot, context->status & 0x7, v_context->hint_counter); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
794 old_int_cycle = context->int_cycle; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
795 }*/ |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
796 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
797 if (context->status & M68K_STATUS_TRACE || context->trace_pending) { |
2673
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
798 context->target_cycle = context->cycles + 1; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
799 return; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
800 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
801 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
802 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
|
803 if (context->should_return || gen->header.enter_debugger || context->wp_hit) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
804 context->target_cycle = context->cycles; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
805 } else if (context->target_cycle < context->cycles) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
806 //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
|
807 //This can cause issues with the implementation of STOP though |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
808 context->target_cycle = context->cycles; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
809 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
810 if (context->target_cycle == context->int_cycle) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
811 //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
|
812 //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
|
813 //to prevent this code forces some extra synchronization in the period immediately before an interrupt |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
814 if ((context->target_cycle - context->cycles) > gen->int_latency_prev1) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
815 context->target_cycle = context->sync_cycle = context->int_cycle - gen->int_latency_prev1; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
816 } else if ((context->target_cycle - context->cycles) > gen->int_latency_prev2) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
817 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
|
818 } else { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
819 context->target_cycle = context->sync_cycle = context->cycles; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
820 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
821 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
822 } |
2673
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
823 #ifdef NEW_CORE |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
824 if (context->target_cycle == context->cycles) { |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
825 context->target_cycle++; |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
826 } |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
827 #endif |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
828 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
829 |
2428 | 830 static m68k_context* sync_components_pico(m68k_context * context, uint32_t address) |
831 { | |
832 genesis_context * gen = context->system; | |
833 vdp_context * v_context = gen->vdp; | |
834 if (gen->bus_busy) { | |
835 gen_update_refresh_no_wait(context); | |
836 } else { | |
837 gen_update_refresh(context); | |
838 } | |
839 | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
840 uint32_t mclks = context->cycles; |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
841 sync_sound_pico(gen, mclks); |
2428 | 842 vdp_run_context(v_context, mclks); |
843 if (mclks >= gen->reset_cycle) { | |
844 gen->reset_requested = 1; | |
845 context->should_return = 1; | |
846 gen->reset_cycle = CYCLE_NEVER; | |
847 } | |
848 if (v_context->frame != gen->last_frame) { | |
849 #ifndef IS_LIB | |
850 if (gen->psg->scope) { | |
851 scope_render(gen->psg->scope); | |
852 } | |
853 #endif | |
854 //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); | |
855 uint32_t elapsed = v_context->frame - gen->last_frame; | |
856 gen->last_frame = v_context->frame; | |
857 event_flush(mclks); | |
858 gen->last_flush_cycle = mclks; | |
859 if (gen->header.enter_debugger_frames) { | |
860 if (elapsed >= gen->header.enter_debugger_frames) { | |
861 gen->header.enter_debugger_frames = 0; | |
862 gen->header.enter_debugger = 1; | |
863 } else { | |
864 gen->header.enter_debugger_frames -= elapsed; | |
865 } | |
866 } | |
867 | |
868 if(exit_after){ | |
869 if (elapsed >= exit_after) { | |
870 exit(0); | |
871 } else { | |
872 exit_after -= elapsed; | |
873 } | |
874 } | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
875 if (context->cycles > MAX_NO_ADJUST) { |
2428 | 876 uint32_t deduction = mclks - ADJUST_BUFFER; |
877 vdp_adjust_cycles(v_context, deduction); | |
878 if (gen->mapper_type == MAPPER_JCART) { | |
879 jcart_adjust_cycles(gen, deduction); | |
880 } | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
881 context->cycles -= deduction; |
2428 | 882 if (gen->psg->vgm) { |
883 vgm_adjust_cycles(gen->psg->vgm, deduction); | |
884 } | |
885 gen->psg->cycles -= deduction; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
886 gen->adpcm->cycle -= deduction; |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
887 if (gen->ymz) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
888 gen->ymz->cycle -= deduction; |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
889 ymf262_adjust_cycles(gen->opl, deduction); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
890 } |
2428 | 891 if (gen->reset_cycle != CYCLE_NEVER) { |
892 gen->reset_cycle -= deduction; | |
893 } | |
894 event_cycle_adjust(mclks, deduction); | |
895 if (gen->expansion) { | |
896 scd_adjust_cycle(gen->expansion, deduction); | |
897 } | |
898 gen->last_flush_cycle -= deduction; | |
899 } | |
900 } else if (mclks - gen->last_flush_cycle > gen->soft_flush_cycles) { | |
901 event_soft_flush(mclks); | |
902 gen->last_flush_cycle = mclks; | |
903 } | |
904 gen->frame_end = vdp_cycles_to_frame_end(v_context); | |
905 context->sync_cycle = gen->frame_end; | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
906 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->cycles, v_context->vcounter, v_context->hslot); |
2428 | 907 if (!address && (gen->header.enter_debugger || gen->header.save_state)) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
908 context->sync_cycle = context->cycles + 1; |
2428 | 909 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
910 adjust_int_cycle_pico(context, v_context); |
2428 | 911 if (gen->reset_cycle < context->target_cycle) { |
912 context->target_cycle = gen->reset_cycle; | |
913 } | |
914 if (address) { | |
915 if (gen->header.enter_debugger || context->wp_hit) { | |
916 if (!context->wp_hit) { | |
917 gen->header.enter_debugger = 0; | |
918 } | |
919 #ifndef IS_LIB | |
920 if (gen->header.debugger_type == DEBUGGER_NATIVE) { | |
921 debugger(context, address); | |
922 } else { | |
923 gdb_debug_enter(context, address); | |
924 } | |
925 #endif | |
926 } | |
927 if (gen->header.save_state) { | |
928 uint8_t slot = gen->header.save_state - 1; | |
929 gen->header.save_state = 0; | |
930 char *save_path = slot >= SERIALIZE_SLOT ? NULL : get_slot_name(&gen->header, slot, use_native_states ? "state" : "gst"); | |
931 if (use_native_states || slot >= SERIALIZE_SLOT) { | |
932 serialize_buffer state; | |
933 init_serialize(&state); | |
934 genesis_serialize(gen, &state, address, slot != EVENTLOG_SLOT); | |
935 if (slot == SERIALIZE_SLOT) { | |
936 gen->serialize_tmp = state.data; | |
937 gen->serialize_size = state.size; | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
938 context->sync_cycle = context->cycles; |
2428 | 939 context->should_return = 1; |
940 } else if (slot == EVENTLOG_SLOT) { | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
941 event_state(context->cycles, &state); |
2428 | 942 } else { |
943 save_to_file(&state, save_path); | |
944 free(state.data); | |
945 } | |
946 } else { | |
947 save_gst(gen, save_path, address); | |
948 } | |
949 if (slot != SERIALIZE_SLOT) { | |
950 debug_message("Saved state to %s\n", save_path); | |
951 } | |
952 free(save_path); | |
953 } else if(gen->header.save_state) { | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
954 context->sync_cycle = context->cycles + 1; |
2428 | 955 } |
956 } | |
957 return context; | |
958 } | |
959 | |
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
|
960 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
|
961 { |
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
|
962 genesis_context * gen = context->system; |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
963 if ((gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) || context->int_num > 3) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
964 vdp_context * v_context = gen->vdp; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
965 //printf("acknowledging %d @ %d:%d, vcounter: %d, hslot: %d\n", context->int_ack, context->cycles, v_context->cycles, v_context->vcounter, v_context->hslot); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
966 vdp_run_context(v_context, context->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
967 vdp_int_ack(v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
968 } |
2354
a773b8f09292
Remove old refresh hack that is causing VDPFifoTesting to have a failed test
Michael Pavone <pavone@retrodev.com>
parents:
2350
diff
changeset
|
969 |
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
|
970 //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
|
971 //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
|
972 //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
|
973 //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
|
974 //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
|
975 //additional variable delay from the use of the 6800 cycle |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
976 uint32_t cycle_count = context->cycles / context->opts->gen.clock_divider; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
977 context->cycles += 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
|
978 |
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
|
979 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
|
980 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
982 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
|
983 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
985 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
|
986 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
987 genesis_context * gen = context->system; |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
988 if (!gen->vdp_unlocked) { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
989 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
|
990 } |
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
|
991 vdp_port &= 0x1F; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
992 //printf("vdp_port write: %X, value: %X, cycle: %d\n", vdp_port, value, context->cycles); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
993 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
994 //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
|
995 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
996 |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
997 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2428 | 998 sync_components_pico(context, 0); |
999 } else { | |
1000 sync_components(context, 0); | |
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 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
|
1003 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
|
1004 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
|
1005 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
|
1006 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
|
1007 if (vdp_port < 4) { |
2571
3d14db924e57
DMA fill and copy should not block VDP data or control port writes
Michael Pavone <pavone@retrodev.com>
parents:
2568
diff
changeset
|
1008 vdp_data_port_write(v_context, 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
|
1009 } else if(vdp_port < 8) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1010 vdp_run_context_full(v_context, context->cycles); |
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
|
1011 before_cycle = v_context->cycles; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1012 blocked = vdp_control_port_write(v_context, value, context->cycles); |
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
|
1013 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
|
1014 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
|
1015 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
|
1016 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
|
1017 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
|
1018 if (v_context->cycles >= gen->frame_end) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1019 uint32_t cycle_diff = v_context->cycles - context->cycles; |
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
|
1020 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
|
1021 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
|
1022 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
|
1023 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1024 context->cycles += m68k_cycle_diff; |
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
|
1025 gen->bus_busy = 1; |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1026 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2428 | 1027 sync_components_pico(context, 0); |
1028 } else { | |
1029 sync_components(context, 0); | |
1030 } | |
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
|
1031 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
|
1032 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1033 } |
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
|
1034 |
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
|
1035 if (blocked < 0) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1036 blocked = vdp_control_port_write(v_context, value, context->cycles); |
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
|
1037 } 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
|
1038 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
|
1039 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1040 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1041 } 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
|
1042 context->sync_cycle = gen->frame_end = vdp_cycles_to_frame_end(v_context); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1043 //printf("Set sync cycle to: %d @ %d, vcounter: %d, hslot: %d\n", context->sync_cycle, context->cycles, v_context->vcounter, v_context->hslot); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1044 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1045 adjust_int_cycle_pico(context, v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1046 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1047 adjust_int_cycle(context, v_context); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
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 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } 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
|
1051 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
|
1052 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 if (v_context->cycles != before_cycle) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1054 //printf("68K paused for %d (%d) cycles at cycle %d (%d) for write\n", v_context->cycles - context->cycles, v_context->cycles - before_cycle, context->cycles, before_cycle); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1055 uint32_t cycle_diff = v_context->cycles - context->cycles; |
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
|
1056 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
|
1057 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
|
1058 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
|
1059 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1060 context->cycles += m68k_cycle_diff; |
2428 | 1061 if (gen->header.type == SYSTEM_GENESIS) { |
1062 //Lock the Z80 out of the bus until the VDP access is complete | |
1063 gen->bus_busy = 1; | |
1064 sync_z80(gen, v_context->cycles); | |
1065 gen->bus_busy = 0; | |
1066 } | |
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
|
1067 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1068 } 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
|
1069 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
|
1070 } 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
|
1071 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
|
1072 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1073 |
2391
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1074 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
|
1075 gen->refresh_counter = 0; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1076 gen->last_sync_cycle = 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
|
1077 } else { |
664c3e749428
Restore reset of refresh counter after DMA since its removal caused some regressions
Michael Pavone <pavone@retrodev.com>
parents:
2384
diff
changeset
|
1078 //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
|
1079 //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
|
1080 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
|
1081 } |
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
|
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 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
|
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 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
|
1088 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1090 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
|
1091 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1092 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
|
1093 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
|
1094 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
|
1095 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
|
1096 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
|
1097 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1098 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
|
1099 //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
|
1100 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
|
1101 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
|
1102 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
|
1103 } 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
|
1104 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
|
1105 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
|
1106 } 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
|
1107 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
|
1108 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1109 } 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
|
1110 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
|
1111 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
|
1112 } else { |
2327
9dd27530c570
Fix Z80 access to VDP debug register
Michael Pavone <pavone@retrodev.com>
parents:
2302
diff
changeset
|
1113 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
|
1114 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1116 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1118 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
|
1119 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1121 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
|
1122 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1123 genesis_context *gen = context->system; |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1124 if (!gen->vdp_unlocked) { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1125 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
|
1126 } |
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
|
1127 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
|
1128 uint16_t value; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1129 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
1130 //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
|
1131 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1132 |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1133 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2428 | 1134 sync_components_pico(context, 0); |
1135 } else { | |
1136 sync_components(context, 0); | |
1137 } | |
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
|
1138 vdp_context * v_context = gen->vdp; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1139 uint32_t before_cycle = context->cycles; |
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
|
1140 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
|
1141 if (vdp_port < 4) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1142 value = vdp_data_port_read(v_context, &context->cycles, 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
|
1143 } 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
|
1144 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
|
1145 } 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
|
1146 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
|
1147 //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
|
1148 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } 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
|
1150 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
|
1151 } else { |
1869
dc94354eab66
Fix accuracy bugs used by Novedicus to detect BlastEm/Exodus
Michael Pavone <pavone@retrodev.com>
parents:
1849
diff
changeset
|
1152 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
|
1153 } |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1154 if (context->cycles != before_cycle) { |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1155 //printf("68K paused for %d (%d) cycles at cycle %d (%d) for read\n", v_context->cycles - context->cycles, v_context->cycles - before_cycle, context->cycles, before_cycle); |
2021
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1156 //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
|
1157 genesis_context *gen = context->system; |
2428 | 1158 if (gen->header.type == SYSTEM_GENESIS) { |
1159 gen->bus_busy = 1; | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1160 sync_z80(gen, context->cycles); |
2428 | 1161 gen->bus_busy = 0; |
1162 } | |
2021
270a4c875e0a
Backed out changeset 96971b673f51
Michael Pavone <pavone@retrodev.com>
parents:
2012
diff
changeset
|
1163 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1164 |
1372
d78ef6f4fba2
Attempt at improving refresh emulation
Michael Pavone <pavone@retrodev.com>
parents:
1371
diff
changeset
|
1165 //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
|
1166 //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
|
1167 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
|
1168 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
|
1169 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1171 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
|
1172 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1174 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
|
1175 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
|
1176 } 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
|
1177 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
|
1178 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1179 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1181 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
|
1182 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1184 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
|
1185 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
|
1186 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1187 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
|
1188 //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
|
1189 //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
|
1190 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
|
1191 //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
|
1192 //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
|
1193 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1194 gen->m68k->cycles += 8 * 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
|
1195 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1196 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1198 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
|
1199 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
|
1200 //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
|
1201 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
|
1202 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
|
1203 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
|
1204 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
|
1205 } 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
|
1206 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
|
1207 } 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
|
1208 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
|
1209 } |
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
|
1210 if (context->Z80_CYCLE != before) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1211 gen->m68k->cycles += context->Z80_CYCLE - before; |
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
|
1212 } |
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
|
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 //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
|
1215 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
|
1216 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1217 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
|
1218 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1219 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1220 //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
|
1221 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
|
1222 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1223 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
|
1224 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 genesis_context * gen = context->system; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1226 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1227 //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
|
1228 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1229 |
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 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
|
1231 //Access to Z80 memory incurs a one 68K cycle wait state |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1232 context->cycles += MCLKS_PER_68K; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1233 if (!z80_enabled || z80_get_busack(gen->z80, context->cycles)) { |
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
|
1234 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
|
1235 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
|
1236 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
|
1237 #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
|
1238 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
|
1239 #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
|
1240 } else if (location < 0x6000) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1241 sync_sound(gen, context->cycles); |
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 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
|
1243 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
|
1244 } 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
|
1245 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
|
1246 } 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
|
1247 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
|
1248 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1249 } 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
|
1250 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
|
1251 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
|
1252 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
|
1253 } 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
|
1254 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
|
1255 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1256 } 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
|
1257 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
|
1258 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1259 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1260 } 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
|
1261 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
|
1262 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
|
1263 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1264 case 0x1: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1265 io_data_write(gen->io.ports, value, context->cycles); |
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
|
1266 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
|
1267 case 0x2: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1268 io_data_write(gen->io.ports+1, value, context->cycles); |
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
|
1269 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
|
1270 case 0x3: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1271 io_data_write(gen->io.ports+2, value, context->cycles); |
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
|
1272 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
|
1273 case 0x4: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1274 io_control_write(gen->io.ports, value, context->cycles); |
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
|
1275 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
|
1276 case 0x5: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1277 io_control_write(gen->io.ports+1, value, context->cycles); |
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
|
1278 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
|
1279 case 0x6: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1280 io_control_write(gen->io.ports+2, value, context->cycles); |
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
|
1281 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
|
1282 case 0x7: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1283 io_tx_write(gen->io.ports, value, context->cycles); |
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
|
1284 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
|
1285 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
|
1286 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
|
1287 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
|
1288 //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
|
1289 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
|
1290 case 0x9: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1291 io_sctrl_write(gen->io.ports, value, context->cycles); |
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
|
1292 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
|
1293 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
|
1294 case 0xA: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1295 io_tx_write(gen->io.ports + 1, value, context->cycles); |
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
|
1296 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
|
1297 case 0xC: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1298 io_sctrl_write(gen->io.ports + 1, value, context->cycles); |
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
|
1299 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
|
1300 case 0xD: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1301 io_tx_write(gen->io.ports + 2, value, context->cycles); |
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
|
1302 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
|
1303 case 0xF: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1304 io_sctrl_write(gen->io.ports + 2, value, context->cycles); |
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
|
1305 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
|
1306 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } 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
|
1308 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
|
1309 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
|
1310 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
|
1311 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
|
1312 if (z80_enabled) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1313 z80_assert_busreq(gen->z80, context->cycles); |
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
|
1314 } 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
|
1315 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
|
1316 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1317 } 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
|
1318 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
|
1319 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
|
1320 #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
|
1321 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
|
1322 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
|
1323 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
|
1324 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
|
1325 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
|
1326 #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
|
1327 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1328 if (z80_enabled) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1329 z80_clear_busreq(gen->z80, context->cycles); |
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
|
1330 } 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
|
1331 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
|
1332 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } |
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
|
1334 } else if (masked == 0x11200) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1335 sync_z80(gen, context->cycles); |
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
|
1336 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
|
1337 if (z80_enabled) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1338 z80_clear_reset(gen->z80, context->cycles); |
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
|
1339 } 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
|
1340 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
|
1341 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1342 } 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
|
1343 if (z80_enabled) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1344 z80_assert_reset(gen->z80, context->cycles); |
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
|
1345 } 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
|
1346 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
|
1347 } |
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
|
1348 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
|
1349 } |
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
|
1350 } 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
|
1351 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
|
1352 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1353 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1354 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1355 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1356 //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
|
1357 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
|
1358 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
|
1359 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1360 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1361 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
|
1362 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1363 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
|
1364 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
|
1365 } 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
|
1366 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
|
1367 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
2428 | 1370 static void* pico_io_write(uint32_t location, void *vcontext, uint8_t value) |
1371 { | |
1372 printf("Pico IO write.b %X - %X\n", location, value); | |
1373 return vcontext; | |
1374 } | |
1375 | |
1376 static void* pico_io_write_w(uint32_t location, void *vcontext, uint16_t value) | |
1377 { | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1378 uint32_t port = location & 0xFE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1379 m68k_context *context = vcontext; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1380 genesis_context *gen = context->system; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1381 if (port == 0x10) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1382 sync_sound_pico(gen, context->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1383 pico_pcm_data_write(gen->adpcm, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1384 printf("PICO ADPCM Data: %04X\n", value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1385 if (context->int_num == 3) { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1386 adjust_int_cycle_pico(context, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1387 } |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1388 } else if (port == 0x12) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1389 sync_sound_pico(gen, context->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1390 printf("PICO ADPCM Control: %04X\n", value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1391 pico_pcm_ctrl_write(gen->adpcm, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1392 adjust_int_cycle_pico(context, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1393 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1394 return pico_io_write(location, vcontext, value); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1395 } |
2428 | 1396 return vcontext; |
1397 } | |
1398 | |
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
|
1399 #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
|
1400 #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
|
1401 #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
|
1402 #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
|
1403 #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
|
1404 #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
|
1405 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1406 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
|
1407 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1409 genesis_context *gen = context->system; |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1410 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1411 //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
|
1412 gen_update_refresh_free_access(context); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1413 |
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 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
|
1415 //Access to Z80 memory incurs a one 68K cycle wait state |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1416 context->cycles += MCLKS_PER_68K; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1417 if (!z80_enabled || z80_get_busack(gen->z80, context->cycles)) { |
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
|
1418 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
|
1419 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
|
1420 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
|
1421 } else if (location < 0x6000) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1422 sync_sound(gen, context->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1423 value = ym_read_status(gen->ym, context->cycles, 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
|
1424 } 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
|
1425 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
|
1426 } 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
|
1427 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
|
1428 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
|
1429 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1430 } 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
|
1431 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
|
1432 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
|
1433 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1434 } 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
|
1435 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
|
1436 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
|
1437 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1438 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
|
1439 //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
|
1440 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
|
1441 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
|
1442 case 0x1: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1443 value = io_data_read(gen->io.ports, context->cycles); |
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
|
1444 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
|
1445 case 0x2: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1446 value = io_data_read(gen->io.ports+1, context->cycles); |
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
|
1447 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
|
1448 case 0x3: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1449 value = io_data_read(gen->io.ports+2, context->cycles); |
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
|
1450 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
|
1451 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
|
1452 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
|
1453 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
|
1454 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
|
1455 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
|
1456 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
|
1457 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
|
1458 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
|
1459 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
|
1460 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
|
1461 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
|
1462 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
|
1463 case 0x8: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1464 value = io_rx_read(gen->io.ports, context->cycles); |
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
|
1465 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
|
1466 case 0x9: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1467 value = io_sctrl_read(gen->io.ports, context->cycles); |
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
|
1468 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
|
1469 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
|
1470 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
|
1471 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
|
1472 case 0xB: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1473 value = io_rx_read(gen->io.ports + 1, context->cycles); |
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
|
1474 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
|
1475 case 0xC: |
2524
25e40370e0e4
Fix some IO port serial mode bugs
Michael Pavone <pavone@retrodev.com>
parents:
2500
diff
changeset
|
1476 value = io_sctrl_read(gen->io.ports + 1, context->cycles); |
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
|
1477 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
|
1478 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
|
1479 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
|
1480 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
|
1481 case 0xE: |
2524
25e40370e0e4
Fix some IO port serial mode bugs
Michael Pavone <pavone@retrodev.com>
parents:
2500
diff
changeset
|
1482 value = io_rx_read(gen->io.ports + 2, context->cycles); |
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
|
1483 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
|
1484 case 0xF: |
2524
25e40370e0e4
Fix some IO port serial mode bugs
Michael Pavone <pavone@retrodev.com>
parents:
2500
diff
changeset
|
1485 value = io_sctrl_read(gen->io.ports + 2, context->cycles); |
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
|
1486 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
|
1487 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
|
1488 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
|
1489 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1490 } 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
|
1491 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
|
1492 if (masked == 0x11100) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1493 value = z80_enabled ? !z80_get_busack(gen->z80, context->cycles) : !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
|
1494 value |= (get_open_bus_value(&gen->header) >> 8) & 0xFE; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1495 dprintf("Byte read of BUSREQ returned %d @ %d (reset: %d)\n", value, context->cycles, 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
|
1496 } 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
|
1497 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
|
1498 } 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
|
1499 //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
|
1500 //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
|
1501 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
|
1502 } 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
|
1503 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
|
1504 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
|
1505 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
|
1506 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1507 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1508 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1509 |
2012
b05295c2ad04
Small improvement to refresh cycle approximation
Mike Pavone <pavone@retrodev.com>
parents:
1998
diff
changeset
|
1510 //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
|
1511 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
|
1512 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
|
1513 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1514 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1515 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
|
1516 { |
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
|
1517 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
|
1518 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
|
1519 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
|
1520 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
|
1521 } 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
|
1522 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
|
1523 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
|
1524 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1525 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
|
1526 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1527 |
2428 | 1528 static uint8_t pico_io_read(uint32_t location, void *vcontext) |
1529 { | |
1530 m68k_context *m68k = vcontext; | |
1531 genesis_context *gen = m68k->system; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1532 uint16_t tmp; |
2428 | 1533 switch(location >> 1 & 0x7F) |
1534 { | |
1535 case 0: | |
1536 return gen->version_reg; | |
1537 case 1: | |
1538 return gen->pico_button_state; | |
1539 case 2: | |
1540 return gen->pico_pen_x >> 8; | |
1541 case 3: | |
1542 return gen->pico_pen_x; | |
1543 case 4: | |
1544 return gen->pico_pen_y >> 8; | |
1545 case 5: | |
1546 return gen->pico_pen_y; | |
1547 case 6: | |
1548 return gen->pico_page; | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1549 case 7: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1550 //Copera titles seem to expect bit 0 to be 0 on a Copera and 1 on a Pico |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1551 if (gen->header.type == SYSTEM_PICO) { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1552 return 1; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1553 } else { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1554 return 0; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1555 } |
2428 | 1556 case 8: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1557 //printf("uPD7759 data read @ %u\n", m68k->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1558 sync_sound_pico(gen, m68k->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1559 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
|
1560 return (location & 1) ? tmp : tmp >> 8; |
2428 | 1561 case 9: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1562 //printf("uPD7759 contro/status read @ %u\n", m68k->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1563 sync_sound_pico(gen, m68k->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1564 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
|
1565 return (location & 1) ? tmp : tmp >> 8; |
2428 | 1566 return 0; |
1567 default: | |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1568 printf("Unknown Pico IO read %X @ %u\n", location, m68k->cycles); |
2428 | 1569 return 0xFF; |
1570 } | |
1571 } | |
1572 | |
1573 static uint16_t pico_io_read_w(uint32_t location, void *vcontext) | |
1574 { | |
1575 m68k_context *m68k = vcontext; | |
1576 genesis_context *gen = m68k->system; | |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1577 uint32_t port = location & 0xFE; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1578 if (port == 0x10) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1579 sync_sound_pico(gen, m68k->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1580 return pico_pcm_data_read(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1581 } else if (port == 0x12) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1582 sync_sound_pico(gen, m68k->cycles); |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1583 return pico_pcm_ctrl_read(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
1584 } |
2428 | 1585 uint16_t value = pico_io_read(location, vcontext); |
1586 return value | (value << 8); | |
1587 } | |
1588 | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1589 static uint16_t copera_io_read_w(uint32_t location, void *vcontext) |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1590 { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1591 printf("Unhandled Copera 16-bit read %X\n", location); |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1592 return 0xFFFF; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1593 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1594 |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1595 static uint8_t copera_io_read(uint32_t location, void *vcontext) |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1596 { |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1597 uint8_t ret; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1598 m68k_context *m68k = vcontext; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1599 genesis_context *gen = m68k->system; |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1600 //FIXME: Copera sound hardware has a separate clock |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1601 switch (location & 0xFF) |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1602 { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1603 case 1: |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1604 case 5: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1605 ymz263b_run(gen->ymz, m68k->cycles); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1606 ret = ymz263b_status_read(gen->ymz); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1607 printf("Copera YMZ263 Status read - %X: %X\n", location, ret); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1608 adjust_int_cycle_pico(gen->m68k, gen->vdp); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1609 return ret; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1610 case 3: |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1611 case 7: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1612 ymz263b_run(gen->ymz, m68k->cycles); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1613 ret = ymz263b_data_read(gen->ymz, location & 4); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1614 printf("Copera YMZ263 Data read - %X: %X\n", location, ret); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1615 return ret; |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1616 case 0x28: |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1617 ret = ymf262_read_status(gen->opl, m68k->cycles, 0); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1618 printf("Copera YMF262 Status read - %X: %X\n", location, ret); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1619 return ret; |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1620 default: |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1621 printf("Unhandled Copera 8-bit read %X\n", location); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1622 return 0xFF; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1623 } |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1624 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1625 |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1626 static void* copera_io_write_w(uint32_t location, void *vcontext, uint16_t value) |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1627 { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1628 printf("Unhandled Copera 16-bit write %X: %X\n", location, value); |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1629 return vcontext; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1630 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1631 |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1632 static void* copera_io_write(uint32_t location, void *vcontext, uint8_t value) |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1633 { |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1634 m68k_context *m68k = vcontext; |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1635 genesis_context *gen = m68k->system; |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1636 //FIXME: Copera sound hardware has a separate clock |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1637 switch (location & 0xFF) |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1638 { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1639 case 1: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1640 case 5: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1641 ymz263b_run(gen->ymz, m68k->cycles); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1642 printf("Copera YMZ263 Address write - %X: %X\n", location, value); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1643 ymz263b_address_write(gen->ymz, value); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1644 break; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1645 case 3: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1646 case 7: |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1647 ymz263b_run(gen->ymz, m68k->cycles); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1648 printf("Copera YMZ263 Channel #%d Data write - %X: %X\n", ((location & 4) >> 2) + 1, location, value); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1649 ymz263b_data_write(gen->ymz, location & 4, value); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1650 adjust_int_cycle_pico(gen->m68k, gen->vdp); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1651 break; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1652 case 0x24: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1653 case 0x34: |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1654 printf("Copera YMF262 Address Part #%d write - %X: %X\n", ((location >> 4) & 1) + 1, location, value); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1655 ymf262_run(gen->opl, m68k->cycles); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1656 if (location & 0x10) { |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1657 ymf262_address_write_part2(gen->opl, value); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1658 } else { |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1659 ymf262_address_write_part1(gen->opl, value); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1660 } |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1661 break; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1662 case 0x28: |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
1663 printf("Copera YMF262 Data write - %X: %X\n", location, value); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1664 ymf262_run(gen->opl, m68k->cycles); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1665 ymf262_data_write(gen->opl, value); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1666 break; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1667 case 0x40: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1668 //Bit 4 = SCI |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1669 //Bit 5 = DIN |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1670 //Bit 6 = A0 |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1671 //Possible Bit 0-3 are the same but for the other YM7128B |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1672 printf("Copera YM7128B Write - %X: %X\n", location, value); |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1673 break; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1674 default: |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1675 printf("Unhandled Copera 8-bit write %X: %X\n", location, value); |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1676 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1677 return vcontext; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1678 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1679 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1680 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
|
1681 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1682 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
|
1683 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
|
1684 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
|
1685 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
|
1686 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
|
1687 } 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
|
1688 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
|
1689 } 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
|
1690 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
|
1691 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1692 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
|
1693 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1694 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1695 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
|
1696 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1697 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
|
1698 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
|
1699 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
|
1700 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
|
1701 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1702 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1703 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
|
1704 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1705 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
|
1706 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
|
1707 if (gen->bus_busy) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1708 context->Z80_CYCLE = gen->m68k->cycles; |
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
|
1709 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1710 //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
|
1711 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
|
1712 //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
|
1713 //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
|
1714 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1715 gen->m68k->cycles += 8 * 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
|
1716 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1717 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
|
1718 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
|
1719 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
|
1720 } |
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
|
1721 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
|
1722 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
|
1723 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
|
1724 } 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
|
1725 //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
|
1726 //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
|
1727 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
|
1728 } 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
|
1729 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
|
1730 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1731 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
|
1732 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1733 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1734 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
|
1735 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1736 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
|
1737 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
|
1738 if (gen->bus_busy) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1739 context->Z80_CYCLE = gen->m68k->cycles; |
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
|
1740 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1741 //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
|
1742 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
|
1743 //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
|
1744 //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
|
1745 // Needs a new logic analyzer capture to get the actual delay on the 68K side |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1746 gen->m68k->cycles += 8 * 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
|
1747 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1748 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
|
1749 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
|
1750 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
|
1751 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
|
1752 ((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
|
1753 } 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
|
1754 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
|
1755 } 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
|
1756 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
|
1757 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1758 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
|
1759 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1760 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1761 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
|
1762 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1763 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
|
1764 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
|
1765 |
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
|
1766 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
|
1767 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
|
1768 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 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
|
1770 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. 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 |
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
|
1772 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
|
1773 { |
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
|
1774 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
|
1775 genesis_context *gen = context->system; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1776 if (location >= 0x800000) { |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1777 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1778 gen->refresh_counter += context->cycles - 4*MCLKS_PER_68K - gen->last_sync_cycle; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1779 context->cycles += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL)); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1780 gen->refresh_counter += 4*MCLKS_PER_68K; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1781 gen->refresh_counter = gen->refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1782 gen->last_sync_cycle = context->cycles; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1783 } |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1784 |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1785 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
|
1786 //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
|
1787 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
|
1788 } 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
|
1789 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
|
1790 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
|
1791 } 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
|
1792 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
|
1793 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
|
1794 } |
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
|
1795 } 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
|
1796 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
|
1797 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
|
1798 } 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
|
1799 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
|
1800 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
|
1801 } |
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
|
1802 } 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
|
1803 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
|
1804 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
|
1805 } |
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
|
1806 } |
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
|
1807 |
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
|
1808 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
|
1809 { |
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
|
1810 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
|
1811 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
|
1812 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
|
1813 } 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
|
1814 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
|
1815 } |
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
|
1816 } |
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
|
1817 |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1818 static void check_tmss_lock(genesis_context *gen) |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1819 { |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1820 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
|
1821 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1822 |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1823 static void toggle_tmss_rom(genesis_context *gen) |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1824 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1825 m68k_context *context = gen->m68k; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1826 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
|
1827 { |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1828 uint16_t *tmp = context->mem_pointers[i]; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1829 context->mem_pointers[i] = gen->tmss_pointers[i]; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1830 gen->tmss_pointers[i] = tmp; |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1831 } |
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1832 m68k_invalidate_code_range(context, 0, 0x400000); |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1833 } |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1834 |
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
|
1835 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
|
1836 { |
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
|
1837 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
|
1838 genesis_context *gen = context->system; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1839 if (location >= 0x800000) { |
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1840 //do refresh check here so we can avoid adding a penalty for a refresh that happens during an IO area access |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1841 gen->refresh_counter += context->cycles - 4*MCLKS_PER_68K - gen->last_sync_cycle; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1842 context->cycles += REFRESH_DELAY * MCLKS_PER_68K * (gen->refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL)); |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1843 gen->refresh_counter += 4*MCLKS_PER_68K; |
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1844 gen->refresh_counter = gen->refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
1845 gen->last_sync_cycle = context->cycles; |
2228
0db9dc6a9020
Some minor refresh emulation improvements
Michael Pavone <pavone@retrodev.com>
parents:
2227
diff
changeset
|
1846 } |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1847 |
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
|
1848 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
|
1849 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
|
1850 gen->tmss_lock[location >> 1 & 1] = value; |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1851 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
|
1852 } else if (has_tmss && location == 0xA14100) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1853 value &= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1854 if (gen->tmss != value) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1855 gen->tmss = value; |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1856 toggle_tmss_rom(gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1857 } |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1858 } 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
|
1859 //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
|
1860 } 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
|
1861 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
|
1862 } |
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
|
1863 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
|
1864 } |
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
|
1865 |
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
|
1866 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
|
1867 { |
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
|
1868 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
|
1869 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
|
1870 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
|
1871 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
|
1872 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
|
1873 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
|
1874 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
|
1875 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
|
1876 } 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
|
1877 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
|
1878 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
|
1879 } |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
1880 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
|
1881 } 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
|
1882 if (location & 1) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1883 value &= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1884 if (gen->tmss != value) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1885 gen->tmss = value; |
2039
3b8e29ef1145
Add TMSS state to save states
Michael Pavone <pavone@retrodev.com>
parents:
2037
diff
changeset
|
1886 toggle_tmss_rom(gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1887 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
1888 } |
1987
71732f2f6f42
Fix handling of unmapped reads/writes to the cart/expansion port region
Mike Pavone <pavone@retrodev.com>
parents:
1980
diff
changeset
|
1889 } 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
|
1890 //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
|
1891 } 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
|
1892 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
|
1893 } |
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
|
1894 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
|
1895 } |
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
|
1896 |
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
|
1897 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
|
1898 { |
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
|
1899 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
|
1900 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
|
1901 context->master_clock = ((uint64_t)context->normal_clock * (uint64_t)percent) / 100; |
2486
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1902 if (context->header.type != SYSTEM_PICO && context->header.type != SYSTEM_COPERA) { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1903 while (context->ym->current_cycle != context->psg->cycles) { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1904 sync_sound(context, context->psg->cycles + MCLKS_PER_PSG); |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1905 } |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1906 if (context->expansion) { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1907 segacd_context *cd = context->expansion; |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1908 segacd_set_speed_percent(cd, percent); |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1909 } |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1910 ym_adjust_master_clock(context->ym, context->master_clock); |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1911 } else { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1912 while (context->adpcm->cycle != context->psg->cycles) { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1913 sync_sound_pico(context, context->psg->cycles + MCLKS_PER_PSG); |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1914 } |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1915 if (context->ymz) { |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1916 ymz263b_adjust_master_clock(context->ymz, context->master_clock); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
1917 ymf262_adjust_master_clock(context->opl, context->master_clock); |
2486
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1918 } |
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
1919 pico_pcm_adjust_master_clock(context->adpcm, context->master_clock); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
1920 } |
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
|
1921 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
|
1922 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1923 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1924 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
|
1925 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1926 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
|
1927 char * def_region = tern_find_path_default(config, "system\0default_region\0", (tern_val){.ptrval = "U"}, TVAL_PTR).ptrval; |
2623
07faf0f5466f
Add option to force use of the default region
Michael Pavone <pavone@retrodev.com>
parents:
2600
diff
changeset
|
1928 char * force_region = tern_find_path_default(config, "system\0force_region\0", (tern_val){.ptrval = "off"}, TVAL_PTR).ptrval; |
07faf0f5466f
Add option to force use of the default region
Michael Pavone <pavone@retrodev.com>
parents:
2600
diff
changeset
|
1929 |
07faf0f5466f
Add option to force use of the default region
Michael Pavone <pavone@retrodev.com>
parents:
2600
diff
changeset
|
1930 if (!info->regions || (info->regions & translate_region_char(toupper(*def_region))) || !strcmp(force_region, "on")) { |
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
|
1931 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
|
1932 } 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
|
1933 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
|
1934 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1935 } |
2428 | 1936 uint8_t is_50hz = 0; |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
1937 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2428 | 1938 if (region & REGION_E) { |
1939 is_50hz = 1; | |
1940 gen->version_reg = 0x20; | |
1941 } else if (region & REGION_J) { | |
1942 gen->version_reg = 0; | |
1943 } else { | |
1944 gen->version_reg = 0x40; | |
1945 } | |
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
|
1946 } else { |
2428 | 1947 if (region & REGION_E) { |
1948 gen->version_reg = NO_DISK | EUR; | |
1949 is_50hz = 1; | |
1950 } else if (region & REGION_J) { | |
1951 gen->version_reg = NO_DISK | JAP; | |
1952 } else { | |
1953 gen->version_reg = NO_DISK | USA; | |
1954 } | |
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
|
1955 } |
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
|
1956 |
2428 | 1957 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
|
1958 gen->normal_clock = MCLKS_PAL; |
2428 | 1959 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
|
1960 } 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
|
1961 gen->normal_clock = MCLKS_NTSC; |
2428 | 1962 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
|
1963 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1964 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
|
1965 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1966 |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1967 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
|
1968 { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1969 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
|
1970 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
|
1971 deserialize_buffer state; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1972 uint32_t pc = 0; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1973 uint8_t ret; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
1974 #ifndef NEW_CORE |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1975 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
|
1976 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
|
1977 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
|
1978 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
|
1979 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
|
1980 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
|
1981 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
|
1982 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1983 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
|
1984 } |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
1985 #endif |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1986 if (load_from_file(&state, statepath)) { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1987 genesis_deserialize(&state, gen); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1988 free(state.data); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1989 ret = 1; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1990 } else { |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1991 strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1992 pc = load_gst(gen, statepath); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1993 ret = pc != 0; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1994 } |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1995 if (ret) { |
2280
9ead0fe69d9b
Implement savestate support for Sega CD
Michael Pavone <pavone@retrodev.com>
parents:
2278
diff
changeset
|
1996 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
|
1997 } |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
1998 done: |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
1999 free(statepath); |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
2000 return ret; |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
2001 } |
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
2002 |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2003 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
|
2004 { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2005 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
|
2006 { |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2007 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
|
2008 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
|
2009 gen->m68k->should_return = 0; |
2428 | 2010 if (gen->header.type == SYSTEM_GENESIS) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2011 z80_assert_reset(gen->z80, gen->m68k->cycles); |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2012 z80_clear_busreq(gen->z80, gen->m68k->cycles); |
2428 | 2013 } |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2014 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2015 ym_reset(gen->ym); |
2016 } | |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2017 //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
|
2018 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
|
2019 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2020 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
|
2021 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
|
2022 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
|
2023 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
|
2024 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2025 } |
1980
81df9aa2de9b
Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents:
1971
diff
changeset
|
2026 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
|
2027 bindings_release_capture(); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
2028 vdp_release_framebuffer(gen->vdp); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2029 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2030 render_pause_source(gen->ym->audio); |
2031 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
2032 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
|
2033 } |
1479
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2034 } |
a568dca999b2
Fix genesis save state loading via Nuklear UI, sms probably still needs work
Michael Pavone <pavone@retrodev.com>
parents:
1478
diff
changeset
|
2035 |
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
|
2036 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
|
2037 { |
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
|
2038 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
|
2039 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
|
2040 //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
|
2041 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
|
2042 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
|
2043 if (load_from_file(&state, statefile)) { |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
2044 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
|
2045 free(state.data); |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2046 #ifdef NEW_CORE |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2047 pc = gen->m68k->pc; |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2048 #else |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
2049 //HACK |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
2050 pc = gen->m68k->last_prefetch_address; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2051 #endif |
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
|
2052 } 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
|
2053 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
|
2054 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
|
2055 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
|
2056 } |
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
|
2057 } |
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
|
2058 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
|
2059 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
|
2060 gen->header.enter_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2061 #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
|
2062 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
|
2063 #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
|
2064 } |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2065 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2066 adjust_int_cycle_pico(gen->m68k, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2067 } else { |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2068 adjust_int_cycle(gen->m68k, gen->vdp); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2069 } |
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
|
2070 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
|
2071 } 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
|
2072 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
|
2073 gen->header.enter_debugger = 0; |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2074 #ifndef IS_LIB |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2075 uint32_t address = read_word(4, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->gen, gen->m68k) << 16 |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2076 | read_word(6, (void **)gen->m68k->mem_pointers, &gen->m68k->opts->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
|
2077 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
|
2078 #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
|
2079 } |
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
|
2080 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
|
2081 } |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2082 #ifdef NEW_CORE |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2083 while (!gen->m68k->should_return) { |
2673
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2084 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2085 sync_components_pico(gen->m68k, gen->m68k->pc); |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2086 } else { |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2087 sync_components(gen->m68k, gen->m68k->pc); |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2088 } |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2089 m68k_execute(gen->m68k, gen->m68k->target_cycle); |
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2090 } |
2600
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2091 gen->m68k->should_return = 0; |
2500
d44fe974fb85
Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2499
diff
changeset
|
2092 #endif |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2093 handle_reset_requests(gen); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1420
diff
changeset
|
2094 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
|
2095 } |
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 |
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
|
2097 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
|
2098 { |
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
|
2099 genesis_context *gen = (genesis_context *)system; |
1980
81df9aa2de9b
Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents:
1971
diff
changeset
|
2100 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
|
2101 gen->header.force_release = 0; |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2102 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2428 | 2103 render_set_video_standard((gen->version_reg & 0x60) == 0x20 ? VID_PAL : VID_NTSC); |
2104 } else { | |
2105 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); | |
2106 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
2107 bindings_reacquire_capture(); |
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
2108 vdp_reacquire_framebuffer(gen->vdp); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2109 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2110 render_resume_source(gen->ym->audio); |
2111 } | |
1932
b387f1c5a1d0
WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents:
1927
diff
changeset
|
2112 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
|
2113 } |
2600
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2114 #ifdef NEW_CORE |
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2115 while (!gen->m68k->should_return) { |
2673
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2116 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2117 sync_components_pico(gen->m68k, gen->m68k->pc); |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2118 } else { |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2119 sync_components(gen->m68k, gen->m68k->pc); |
2c8f541af3c5
Get Pico games running with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2654
diff
changeset
|
2120 } |
2600
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2121 m68k_execute(gen->m68k, gen->m68k->target_cycle); |
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2122 } |
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2123 gen->m68k->should_return = 0; |
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2124 #else |
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
|
2125 resume_68k(gen->m68k); |
2600
251cc75574af
Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents:
2577
diff
changeset
|
2126 #endif |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2127 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
|
2128 } |
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
|
2129 |
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
|
2130 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
|
2131 { |
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
|
2132 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
|
2133 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
|
2134 } |
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
|
2135 |
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
|
2136 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
|
2137 { |
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
|
2138 genesis_context *gen = (genesis_context *)system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2139 gen->m68k->target_cycle = gen->m68k->cycles; |
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
|
2140 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
|
2141 } |
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
|
2142 |
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
|
2143 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
|
2144 { |
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
|
2145 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
|
2146 FILE *f; |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2147 if (gen->expansion) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2148 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
|
2149 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
|
2150 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
|
2151 if (f) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2152 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
|
2153 fclose(f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2154 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
|
2155 } |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2156 free(bram_name); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2157 if (cd->bram_cart_id < 8) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2158 bram_name = path_append(system->save_dir, "cart.bram"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2159 f = fopen(bram_name, "wb"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2160 if (f) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2161 long configured_size = 0x2000 << cd->bram_cart_id; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2162 fwrite(cd->bram_cart, 1, configured_size, f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2163 fclose(f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2164 printf("Saved BRAM cart to %s\n", bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2165 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2166 free(bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2167 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2168 } |
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
|
2169 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
|
2170 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
|
2171 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2172 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
|
2173 if (!f) { |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2174 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
|
2175 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
|
2176 } |
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
|
2177 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
|
2178 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
|
2179 } |
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
|
2180 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
|
2181 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
|
2182 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
|
2183 } |
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
|
2184 fclose(f); |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2185 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
|
2186 } |
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
|
2187 |
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
|
2188 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
|
2189 { |
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
|
2190 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
|
2191 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
|
2192 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
|
2193 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
|
2194 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
|
2195 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
|
2196 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
|
2197 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
|
2198 } |
1395
efa7225e0f07
Initial work to support parallel NOR flash and the Magistr 16
Michael Pavone <pavone@retrodev.com>
parents:
1377
diff
changeset
|
2199 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
|
2200 } |
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
|
2201 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2202 if (gen->expansion) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2203 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
|
2204 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
|
2205 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
|
2206 if (f) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2207 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
|
2208 fclose(f); |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2209 if (read > 0) { |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2210 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
|
2211 } |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2212 } else { |
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2213 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
|
2214 } |
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2215 free(bram_name); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2216 bram_name = path_append(system->save_dir, "cart.bram"); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2217 f = fopen(bram_name, "rb"); |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2218 long configured_size = 0x2000 << cd->bram_cart_id; |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2219 if (f) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2220 long existing_size = nearest_pow2(file_size(f)); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2221 if (existing_size > 1 * 1024 * 1024) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2222 existing_size = 1 * 1024 * 1024; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2223 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2224 if (existing_size != configured_size) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2225 if (existing_size > configured_size) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2226 free(cd->bram_cart); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2227 cd->bram_cart = calloc(existing_size, 1); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2228 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2229 cd->bram_cart_id = 0; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2230 while (existing_size > (0x2000 <<cd->bram_cart_id)) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2231 cd->bram_cart_id++; |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2232 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2233 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2234 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
|
2235 fclose(f); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2236 if (read > 0) { |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2237 printf("Loaded BRAM cart from %s\n", bram_name); |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2238 } |
2335
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2239 } else { |
c05b7c5e6f11
Automatically format Sega CD backup RAM
Michael Pavone <pavone@retrodev.com>
parents:
2327
diff
changeset
|
2240 segacd_format_bram(cd->bram_cart, configured_size); |
2281
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2241 } |
b9fed07f19e4
Implement BRAM cart support
Michael Pavone <pavone@retrodev.com>
parents:
2280
diff
changeset
|
2242 free(bram_name); |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
2243 } |
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
|
2244 } |
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
|
2245 |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2246 static void soft_reset(system_header *system) |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2247 { |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2248 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
|
2249 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
|
2250 double random = (double)rand()/(double)RAND_MAX; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2251 gen->reset_cycle = gen->m68k->cycles + random * MCLKS_LINE * (gen->version_reg & HZ50 ? LINES_PAL : LINES_NTSC); |
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
|
2252 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
|
2253 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
|
2254 } |
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
|
2255 } |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2256 } |
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2257 |
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
|
2258 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
|
2259 { |
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
|
2260 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
|
2261 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
|
2262 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
|
2263 } |
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
|
2264 vdp_free(gen->vdp); |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2265 memmap_chunk *map = (memmap_chunk *)gen->m68k->opts->gen.memmap; |
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2266 m68k_options_free(gen->m68k->opts); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
2267 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
|
2268 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
|
2269 free(gen->work_ram); |
2428 | 2270 if (gen->header.type == SYSTEM_GENESIS) { |
2271 z80_options_free(gen->z80->Z80_OPTS); | |
2272 free(gen->z80); | |
2273 free(gen->zram); | |
2274 } | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2275 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2276 pico_pcm_free(gen->adpcm); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2277 free(gen->adpcm); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
2278 if (gen->ymz) { |
2486
e8eba0cd5444
Implement turbo/slow for Pico and Copera
Michael Pavone <pavone@retrodev.com>
parents:
2485
diff
changeset
|
2279 ymz263b_free(gen->ymz); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
2280 free(gen->ymz); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
2281 ymf262_free(gen->opl); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
2282 } |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2283 } else { |
2428 | 2284 ym_free(gen->ym); |
2285 } | |
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
|
2286 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
|
2287 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
|
2288 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
|
2289 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
|
2290 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
|
2291 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
|
2292 } |
2248
f7e2e11f1214
Fix improper free of memory map array from rom_info
Michael Pavone <pavone@retrodev.com>
parents:
2243
diff
changeset
|
2293 free(map); |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1113
diff
changeset
|
2294 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
|
2295 } |
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
|
2296 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2297 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
|
2298 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2299 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
|
2300 io_gamepad_down(&gen->io, gamepad_num, button); |
1610 | 2301 if (gen->mapper_type == MAPPER_JCART) { |
2302 jcart_gamepad_down(gen, gamepad_num, button); | |
2303 } | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2304 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2305 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2306 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
|
2307 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2308 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
|
2309 io_gamepad_up(&gen->io, gamepad_num, button); |
1610 | 2310 if (gen->mapper_type == MAPPER_JCART) { |
2311 jcart_gamepad_up(gen, gamepad_num, button); | |
2312 } | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2313 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2314 |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2315 static void pico_update_page(genesis_context *gen) |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2316 { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2317 #ifndef IS_LIB |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2318 uint8_t page_num = 0; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2319 uint8_t page = gen->pico_page; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2320 while (page) |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2321 { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2322 page_num++; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2323 page >>= 1; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2324 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2325 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
|
2326 int x, width; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2327 if (page_num) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2328 x = 0; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2329 width = 640; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2330 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2331 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
|
2332 x = 320; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2333 width = 320; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2334 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2335 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
|
2336 //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
|
2337 //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
|
2338 page_num--; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2339 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2340 if (gen->pico_story_pages[page_num] != 0xFF) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2341 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
|
2342 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2343 uint8_t grey = page * (255 / 5); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2344 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
|
2345 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2346 render_window_refresh(gen->pico_story_window); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2347 #endif |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2348 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2349 |
2428 | 2350 static void gamepad_down_pico(system_header *system, uint8_t gamepad_num, uint8_t button) |
2351 { | |
2352 genesis_context *gen = (genesis_context *)system; | |
2353 if (gamepad_num != 1) { | |
2354 return; | |
2355 } | |
2356 //TODO: storyware display | |
2357 if (button == BUTTON_C) { | |
2358 gen->pico_page <<= 1; | |
2359 gen->pico_page |= 1; | |
2360 gen->pico_page &= 0x3F; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2361 pico_update_page(gen); |
2428 | 2362 } else if (button == BUTTON_Z) { |
2363 gen->pico_page >>= 1; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2364 pico_update_page(gen); |
2428 | 2365 } else if (button < BUTTON_B) { |
2366 gen->pico_button_state &= ~(1 << (button - 1)); | |
2367 } | |
2368 } | |
2369 | |
2370 static void gamepad_up_pico(system_header *system, uint8_t gamepad_num, uint8_t button) | |
2371 { | |
2372 genesis_context *gen = (genesis_context *)system; | |
2373 if (gamepad_num != 1) { | |
2374 return; | |
2375 } | |
2376 if (button < BUTTON_B) { | |
2377 gen->pico_button_state |= 1 << (button - 1); | |
2378 } | |
2379 return; | |
2380 } | |
2381 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2382 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
|
2383 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2384 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
|
2385 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
|
2386 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2387 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2388 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
|
2389 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2390 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
|
2391 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
|
2392 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2393 |
2428 | 2394 static void mouse_down_pico(system_header *system, uint8_t mouse_num, uint8_t button) |
2395 { | |
2396 genesis_context *gen = (genesis_context *)system; | |
2397 if (button == MOUSE_LEFT) { | |
2398 gen->pico_button_state &= ~0x80; | |
2399 } | |
2400 } | |
2401 | |
2402 static void mouse_up_pico(system_header *system, uint8_t mouse_num, uint8_t button) | |
2403 { | |
2404 genesis_context *gen = (genesis_context *)system; | |
2405 if (button == MOUSE_LEFT) { | |
2406 gen->pico_button_state |= 0x80; | |
2407 } | |
2408 } | |
2409 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2410 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
|
2411 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2412 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
|
2413 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
|
2414 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2415 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2416 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
|
2417 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2418 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
|
2419 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
|
2420 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2421 |
2428 | 2422 static void mouse_motion_absolute_pico(system_header *system, uint8_t mouse_num, uint16_t x, uint16_t y) |
2423 { | |
2424 genesis_context *gen = (genesis_context *)system; | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2425 //FIXME: coordinate translation feels a little off for storybook area |
2428 | 2426 //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
|
2427 if (y < 24) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2428 y = 24; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2429 } |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2430 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
|
2431 if (y < 320) { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2432 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
|
2433 } else { |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
2434 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
|
2435 } |
2428 | 2436 } |
2437 | |
2438 static void mouse_motion_relative_pico(system_header *system, uint8_t mouse_num, int32_t x, int32_t y) | |
2439 { | |
2440 genesis_context *gen = (genesis_context *)system; | |
2441 //TODO: scale properly | |
2442 //TODO: limit to mouse motion on emulated storyware/drawing area | |
2443 gen->pico_pen_x += x; | |
2444 gen->pico_pen_y += y; | |
2445 } | |
2446 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2447 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
|
2448 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2449 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
|
2450 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
|
2451 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2452 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2453 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
|
2454 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2455 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
|
2456 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
|
2457 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
2458 |
2428 | 2459 static void keyboard_down_pico(system_header *system, uint8_t scancode) |
2460 { | |
2461 genesis_context *gen = (genesis_context *)system; | |
2462 //TODO: Keyboard Pico emulation | |
2463 } | |
2464 | |
2465 static void keyboard_up_pico(system_header *system, uint8_t scancode) | |
2466 { | |
2467 genesis_context *gen = (genesis_context *)system; | |
2468 //TODO: Keyboard Pico emulation | |
2469 } | |
2470 | |
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
|
2471 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
|
2472 { |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2473 char *config_gain; |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2474 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
|
2475 render_audio_source_gaindb(gen->psg->audio, config_gain ? atof(config_gain) : 0.0f); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2476 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2477 config_gain = tern_find_path(config, "audio\0fm_gain\0", TVAL_PTR).ptrval; |
2478 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
|
2479 |
2556
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2480 char *config_dac = tern_find_path_default(config, "audio\0fm_dac\0", (tern_val){.ptrval="auto"}, TVAL_PTR).ptrval; |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2481 uint8_t zero_offset = 0; |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2482 if (!strcmp(config_dac, "auto")) { |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2483 zero_offset = gen->ym->status_address_mask != 0; |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2484 } else if (!strcmp(config_dac, "zero_offset")) { |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2485 zero_offset = 1; |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2486 } |
6f1eebc0a90b
Add auto option for fm_dac config variable that bases zero offset on the select MD model
Michael Pavone <pavone@retrodev.com>
parents:
2548
diff
changeset
|
2487 ym_enable_zero_offset(gen->ym, zero_offset); |
2428 | 2488 } |
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
|
2489 |
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
|
2490 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
|
2491 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
|
2492 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
|
2493 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
|
2494 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
|
2495 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
|
2496 } |
1796
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2497 } |
51417bb557b6
Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents:
1766
diff
changeset
|
2498 |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2499 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
|
2500 { |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2501 genesis_context *gen = (genesis_context *)system; |
2428 | 2502 if (gen->header.type == SYSTEM_GENESIS) { |
2503 setup_io_devices(config, &system->info, &gen->io); | |
2504 } | |
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
|
2505 set_audio_config(gen); |
2384
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2506 //sample rate may have changed |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2507 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2508 ym_adjust_master_clock(gen->ym, gen->master_clock); |
2509 } | |
2384
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2510 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
|
2511 if (gen->expansion) { |
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2512 segacd_config_updated(gen->expansion); |
03e6ac327ba0
Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents:
2354
diff
changeset
|
2513 } |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2514 } |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
2515 |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2516 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
|
2517 { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2518 genesis_context *gen = (genesis_context *)system; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2519 vgm_writer *vgm = vgm_write_open(filename, gen->version_reg & HZ50 ? 50 : 60, gen->normal_clock, gen->m68k->cycles); |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2520 if (vgm) { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2521 printf("Started logging VGM to %s\n", filename); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2522 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2488
bfd09d3367ba
Fix crash when enabling VGM recording while running Pico or Copera software
Michael Pavone <pavone@retrodev.com>
parents:
2486
diff
changeset
|
2523 sync_sound(gen, vgm->last_cycle); |
2428 | 2524 ym_vgm_log(gen->ym, gen->normal_clock, vgm); |
2488
bfd09d3367ba
Fix crash when enabling VGM recording while running Pico or Copera software
Michael Pavone <pavone@retrodev.com>
parents:
2486
diff
changeset
|
2525 } else { |
bfd09d3367ba
Fix crash when enabling VGM recording while running Pico or Copera software
Michael Pavone <pavone@retrodev.com>
parents:
2486
diff
changeset
|
2526 sync_sound_pico(gen, vgm->last_cycle); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
2527 if (gen->opl) { |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
2528 ymf262_vgm_log(gen->opl, gen->normal_clock, vgm); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
2529 } |
2428 | 2530 } |
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
|
2531 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
|
2532 gen->header.vgm_logging = 1; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2533 } else { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2534 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
|
2535 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2536 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2537 |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2538 static void stop_vgm_log(system_header *system) |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2539 { |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2540 puts("Stopped VGM log"); |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2541 genesis_context *gen = (genesis_context *)system; |
2488
bfd09d3367ba
Fix crash when enabling VGM recording while running Pico or Copera software
Michael Pavone <pavone@retrodev.com>
parents:
2486
diff
changeset
|
2542 vgm_close(gen->psg->vgm); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2543 if (gen->header.type != SYSTEM_PICO && gen->header.type != SYSTEM_COPERA) { |
2428 | 2544 gen->ym->vgm = NULL; |
2545 } | |
2546 gen->psg->vgm = NULL; | |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2547 gen->header.vgm_logging = 0; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2548 } |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2549 |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2550 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
|
2551 { |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2552 #ifndef IS_LIB |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2553 genesis_context *gen = (genesis_context *)system; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2554 if (debug_view < DEBUG_OSCILLOSCOPE) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2555 vdp_toggle_debug_view(gen->vdp, debug_view); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2556 } else if (debug_view == DEBUG_OSCILLOSCOPE) { |
2428 | 2557 if (gen->psg->scope) { |
2558 oscilloscope *scope = gen->psg->scope; | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2559 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2560 gen->adpcm->scope = NULL; |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2561 } else { |
2428 | 2562 gen->ym->scope = NULL; |
2563 } | |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2564 gen->psg->scope = NULL; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2565 if (gen->expansion) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2566 segacd_context *cd = gen->expansion; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2567 cd->pcm.scope = NULL; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2568 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2569 scope_close(scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2570 } else { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2571 oscilloscope *scope = create_oscilloscope(); |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
2572 if (gen->header.type == SYSTEM_PICO || gen->header.type == SYSTEM_COPERA) { |
2431
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
2573 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
|
2574 } else { |
2428 | 2575 ym_enable_scope(gen->ym, scope, gen->normal_clock); |
2576 } | |
2255
74112041b2c7
Proper calculation of sample rate for YM2612/PSG oscilloscope view
Michael Pavone <pavone@retrodev.com>
parents:
2254
diff
changeset
|
2577 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
|
2578 if (gen->expansion) { |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2579 segacd_context *cd = gen->expansion; |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2580 rf5c164_enable_scope(&cd->pcm, scope); |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2581 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2582 } |
2271
3ef80963c2a7
Fix stamp address mask and add WIP CD graphics debug view
Michael Pavone <pavone@retrodev.com>
parents:
2267
diff
changeset
|
2583 } 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
|
2584 scd_toggle_graphics_debug(gen->expansion); |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2585 } |
2302
0343f0d5add0
Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents:
2286
diff
changeset
|
2586 #endif |
2243
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2587 } |
0d1d5dccdd28
Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents:
2228
diff
changeset
|
2588 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2589 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
|
2590 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2591 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2592 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2593 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2594 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
|
2595 } |
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
|
2596 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2597 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2598 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2599 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2600 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
|
2601 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2602 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2603 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2604 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2605 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
|
2606 } |
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 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2608 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2609 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2610 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2611 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
|
2612 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2613 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2614 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2615 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2616 return gen->tmss_read_16(address, context); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2617 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2618 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
|
2619 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2620 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2621 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
|
2622 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2623 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2624 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2625 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2626 return gen->tmss_read_8(address, context); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2627 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2628 #ifdef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2629 return gen->tmss_buffer[address]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2630 #else |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2631 return gen->tmss_buffer[address ^ 1]; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2632 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2633 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2634 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2635 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
|
2636 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2637 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2638 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2639 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2640 address += gen->tmss_write_offset; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2641 uint16_t *dest = get_native_pointer(address, (void **)m68k->mem_pointers, &m68k->opts->gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2642 *dest = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2643 m68k_handle_code_write(address, m68k); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2644 } |
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
|
2645 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2646 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2647 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2648 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2649 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
|
2650 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2651 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2652 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2653 if (gen->tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2654 address += gen->tmss_write_offset; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2655 uint8_t *dest = get_native_pointer(address & ~1, (void **)m68k->mem_pointers, &m68k->opts->gen); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2656 #ifdef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2657 dest[address & 1] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2658 #else |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2659 dest[address & 1 ^ 1] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2660 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2661 m68k_handle_code_write(address & ~1, m68k); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2662 } |
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
|
2663 |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2664 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2665 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2666 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2667 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
|
2668 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2669 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2670 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2671 if (gen->tmss) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2672 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->opts->gen, 0, NULL); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2673 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2674 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
|
2675 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2676 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2677 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2678 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2679 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2680 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
|
2681 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2682 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2683 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2684 if (gen->tmss && (address & 1)) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2685 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->opts->gen, 0, NULL); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2686 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2687 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
|
2688 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2689 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2690 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2691 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2692 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2693 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
|
2694 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2695 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2696 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2697 if (gen->tmss) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2698 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->opts->gen, 0, NULL); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2699 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2700 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
|
2701 base[address] = value >> 8; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2702 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2703 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2704 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2705 |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2706 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
|
2707 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2708 m68k_context *m68k = context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2709 genesis_context *gen = m68k->system; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2710 if (gen->tmss && !(address & 1)) { |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
2711 memmap_chunk const *chunk = find_map_chunk(address + gen->tmss_write_offset, &m68k->opts->gen, 0, NULL); |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2712 address >>= 1; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2713 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
|
2714 base[address] = value; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2715 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2716 return context; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2717 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2718 |
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
|
2719 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
|
2720 { |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2721 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
|
2722 { 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
|
2723 { 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
|
2724 { 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
|
2725 { 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
|
2726 { 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
|
2727 }; |
2053 | 2728 |
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
|
2729 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
|
2730 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
|
2731 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
|
2732 } |
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
|
2733 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
|
2734 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
|
2735 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
|
2736 } |
2053 | 2737 |
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
|
2738 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
|
2739 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
|
2740 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
|
2741 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
|
2742 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
|
2743 gen->header.persist_save = persist_save; |
1433
c886c54d8cf1
Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents:
1428
diff
changeset
|
2744 gen->header.load_state = load_state; |
1208
95f5253e75c7
Implement soft reset in Genesis mode
Michael Pavone <pavone@retrodev.com>
parents:
1204
diff
changeset
|
2745 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
|
2746 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
|
2747 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
|
2748 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
|
2749 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
|
2750 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
|
2751 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
|
2752 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
|
2753 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
|
2754 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
|
2755 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
|
2756 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
|
2757 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
|
2758 gen->header.config_updated = config_updated; |
1690
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
2759 gen->header.serialize = serialize; |
319d90025d50
Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents:
1688
diff
changeset
|
2760 gen->header.deserialize = deserialize; |
1909
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2761 gen->header.start_vgm_log = start_vgm_log; |
508522f08e4d
Initial stab at VGM logging support
Michael Pavone <pavone@retrodev.com>
parents:
1907
diff
changeset
|
2762 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
|
2763 gen->header.toggle_debug_view = toggle_debug_view; |
1377
e587f16e7d3d
Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents:
1374
diff
changeset
|
2764 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
|
2765 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
|
2766 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
|
2767 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
|
2768 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
|
2769 if (tmss) { |
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1889
diff
changeset
|
2770 gen->version_reg |= 1; |
2037
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
2771 } else { |
b0b0c31338c3
Implement TMSS VDP lock
Michael Pavone <pavone@retrodev.com>
parents:
2034
diff
changeset
|
2772 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
|
2773 } |
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
|
2774 |
1906
2d462aa78349
Make VDP VSRAM capacity respect model selection
Michael Pavone <pavone@retrodev.com>
parents:
1904
diff
changeset
|
2775 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
|
2776 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
|
2777 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
|
2778 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
|
2779 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
|
2780 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
|
2781 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
|
2782 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
|
2783 |
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
|
2784 render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); |
1946 | 2785 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
|
2786 |
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
|
2787 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
|
2788 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
|
2789 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
|
2790 system_opts |= YM_OPT_3834; |
8312e574100a
Implement selectable YM2612/YM3834 invalid status port behavior
Michael Pavone <pavone@retrodev.com>
parents:
1902
diff
changeset
|
2791 } |
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
|
2792 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
|
2793 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2794 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
|
2795 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
|
2796 |
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
|
2797 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
|
2798 #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
|
2799 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
|
2800 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
|
2801 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
|
2802 #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
|
2803 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
|
2804 #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
|
2805 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
|
2806 #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
|
2807 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
|
2808 #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
|
2809 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2810 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
|
2811 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
|
2812 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
|
2813 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2814 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
|
2815 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
|
2816 { |
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
|
2817 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
|
2818 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
|
2819 { |
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
|
2820 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
|
2821 } |
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
|
2822 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
|
2823 { |
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
|
2824 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
|
2825 } |
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
|
2826 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
|
2827 { |
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
|
2828 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
|
2829 } |
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
|
2830 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
|
2831 { |
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
|
2832 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
|
2833 } |
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
|
2834 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
|
2835 { |
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
|
2836 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
|
2837 } |
1906
2d462aa78349
Make VDP VSRAM capacity respect model selection
Michael Pavone <pavone@retrodev.com>
parents:
1904
diff
changeset
|
2838 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
|
2839 { |
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
|
2840 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
|
2841 } |
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
|
2842 } |
2053 | 2843 |
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
|
2844 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
|
2845 } |
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
|
2846 |
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
|
2847 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
|
2848 {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
|
2849 {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
|
2850 .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
|
2851 {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
|
2852 .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
|
2853 {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
|
2854 .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
|
2855 }; |
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
|
2856 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
|
2857 |
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
|
2858 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
|
2859 { |
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
|
2860 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
|
2861 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
|
2862 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
|
2863 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
|
2864 #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
|
2865 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
|
2866 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
|
2867 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
|
2868 } |
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 #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
|
2870 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
|
2871 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
|
2872 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
|
2873 } |
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 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
|
2875 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
|
2876 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
|
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 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
|
2879 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
|
2880 |
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
|
2881 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
|
2882 gen->lock_on = lock_on; |
2053 | 2883 |
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
|
2884 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
|
2885 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
|
2886 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
|
2887 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
|
2888 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
|
2889 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
|
2890 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
|
2891 gen->save_storage = info.save_buffer; |
2286
5d3411f52d00
Fix ui.reload for locked-on ROMs
Michael Pavone <pavone@retrodev.com>
parents:
2281
diff
changeset
|
2892 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
|
2893 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
|
2894 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
|
2895 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
|
2896 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
|
2897 } 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
|
2898 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
|
2899 //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
|
2900 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2901 } 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
|
2902 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
|
2903 } |
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
|
2904 |
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
|
2905 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
|
2906 |
2053 | 2907 tern_node *model = get_model(config, SYSTEM_GENESIS); |
2908 uint8_t tmss = !strcmp(tern_find_ptr_default(model, "tmss", "off"), "on"); | |
2909 | |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
2910 //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
|
2911 uint8_t next_ptr_index = 0; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2912 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
|
2913 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
|
2914 { |
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
|
2915 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
|
2916 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
|
2917 if (!tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2918 break; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2919 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2920 } |
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
|
2921 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
|
2922 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
|
2923 } |
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
|
2924 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
|
2925 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
|
2926 if (highest_offset > tmss_min_alloc) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2927 tmss_min_alloc = highest_offset; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2928 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2929 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2930 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2931 if (tmss) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2932 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
|
2933 uint8_t *buffer = malloc(tmss_min_alloc); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2934 uint32_t tmss_size; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2935 if (is_absolute_path(tmss_path)) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2936 FILE *f = fopen(tmss_path, "rb"); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2937 if (!f) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2938 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
|
2939 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2940 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
|
2941 fclose(f); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2942 } else { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2943 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
|
2944 if (!tmp) { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2945 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
|
2946 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2947 memcpy(buffer, tmp, tmss_size); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2948 free(tmp); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2949 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2950 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
|
2951 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2952 buffer[tmss_size] = 0xFF; |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2953 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2954 #ifndef BLASTEM_BIG_ENDIAN |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2955 byteswap_rom(tmss_size, (uint16_t *)buffer); |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2956 #endif |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2957 //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
|
2958 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
|
2959 { |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2960 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
|
2961 } |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2962 //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
|
2963 //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
|
2964 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
|
2965 { |
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
|
2966 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
|
2967 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
|
2968 //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
|
2969 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
|
2970 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
|
2971 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
|
2972 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
|
2973 } |
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
|
2974 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
|
2975 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
|
2976 } 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
|
2977 //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
|
2978 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
|
2979 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
|
2980 if (info.map[i].write_16) { |
2034
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2981 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
|
2982 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
|
2983 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
|
2984 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
|
2985 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
|
2986 } 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
|
2987 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
|
2988 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
|
2989 } 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
|
2990 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
|
2991 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
2992 } |
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
|
2993 } 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
|
2994 //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
|
2995 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
|
2996 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
|
2997 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
|
2998 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
|
2999 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
|
3000 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
|
3001 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
|
3002 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
|
3003 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
|
3004 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
|
3005 } 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
|
3006 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
|
3007 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
|
3008 } 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
|
3009 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
|
3010 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
|
3011 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
3012 } 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
|
3013 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
|
3014 } |
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
|
3015 } 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
|
3016 //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
|
3017 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
|
3018 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
|
3019 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
|
3020 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
|
3021 } |
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
|
3022 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
|
3023 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
|
3024 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
|
3025 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
|
3026 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
|
3027 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
|
3028 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
|
3029 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
|
3030 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
|
3031 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
|
3032 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
|
3033 } 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
|
3034 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
|
3035 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
|
3036 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
|
3037 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
|
3038 } 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
|
3039 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
|
3040 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
3041 } 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
|
3042 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
|
3043 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
3044 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
3045 } |
8b2ef428d1aa
Implement TMSS ROM and cart mapping register
Michael Pavone <pavone@retrodev.com>
parents:
2033
diff
changeset
|
3046 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
|
3047 } |
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
|
3048 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
|
3049 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
|
3050 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
|
3051 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
|
3052 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
|
3053 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
|
3054 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
|
3055 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
|
3056 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
|
3057 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
|
3058 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
|
3059 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
|
3060 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
|
3061 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
|
3062 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
|
3063 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
|
3064 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
|
3065 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
|
3066 { |
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
|
3067 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
|
3068 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
|
3069 } |
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
|
3070 } |
2090
00b6592cad42
Fix typo that messed up Mode 1 for carts with mappers
Michael Pavone <pavone@retrodev.com>
parents:
2088
diff
changeset
|
3071 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
|
3072 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
|
3073 { |
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
|
3074 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
|
3075 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
|
3076 } |
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
|
3077 } |
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
|
3078 cd->base = 0x400000; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
3079 cd->m68k->opts->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
|
3080 } |
2248
f7e2e11f1214
Fix improper free of memory map array from rom_info
Michael Pavone <pavone@retrodev.com>
parents:
2243
diff
changeset
|
3081 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
|
3082 |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3083 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
|
3084 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
|
3085 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
|
3086 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
|
3087 } |
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
|
3088 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
|
3089 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
|
3090 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
|
3091 |
1165
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
3092 //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
|
3093 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
|
3094 { |
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
|
3095 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
|
3096 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
|
3097 } |
9fc680b35dbb
Fix crash regression for games with some kind of mapper functionality
Michael Pavone <pavone@retrodev.com>
parents:
1130
diff
changeset
|
3098 } |
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
|
3099 |
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
|
3100 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
|
3101 //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
|
3102 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
|
3103 { |
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
|
3104 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
|
3105 } |
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
|
3106 } |
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
|
3107 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
|
3108 |
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
|
3109 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
|
3110 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
|
3111 } |
22e87b739ad6
WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3112 |
1692 | 3113 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
|
3114 { |
1692 | 3115 tern_node *rom_db = get_rom_db(); |
3116 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
|
3117 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
|
3118 //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
|
3119 //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
|
3120 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
|
3121 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
|
3122 { |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
3123 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
|
3124 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
|
3125 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
3126 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
|
3127 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
|
3128 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
3129 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
|
3130 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
|
3131 break; |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
3132 } |
94cca8b8429e
Use byte in security code for region identification for Sega/Mega CD discs
Michael Pavone <pavone@retrodev.com>
parents:
2255
diff
changeset
|
3133 } |
2053 | 3134 |
1692 | 3135 segacd_context *cd = alloc_configure_segacd(media, system_opts, force_region, &info); |
3136 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
|
3137 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
|
3138 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
|
3139 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
|
3140 gen->version_reg &= ~NO_DISK; |
2053 | 3141 |
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
|
3142 gen->expansion = cd; |
2499
d74d3998482c
Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents:
2488
diff
changeset
|
3143 cd->m68k->opts->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
|
3144 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
|
3145 cd->genesis = gen; |
1692 | 3146 setup_io_devices(config, &info, &gen->io); |
2053 | 3147 |
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
|
3148 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
|
3149 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
|
3150 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
|
3151 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
|
3152 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
|
3153 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
|
3154 uint32_t num_chunks = cd_chunks + base_chunks; |
2053 | 3155 |
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
|
3156 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
|
3157 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
|
3158 //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
|
3159 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
|
3160 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
|
3161 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
|
3162 opts->address_log = (system_opts & OPT_ADDRESS_LOG) ? fopen("address.log", "w") : NULL; |
2053 | 3163 |
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
|
3164 //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
|
3165 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
|
3166 { |
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
|
3167 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
|
3168 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
|
3169 } |
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
|
3170 } |
2083
372625dd9590
Persist BRAM to file. Load BIOS relative to blastem directory
Michael Pavone <pavone@retrodev.com>
parents:
2080
diff
changeset
|
3171 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
|
3172 |
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
|
3173 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
|
3174 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
|
3175 } |
2428 | 3176 |
3177 static memmap_chunk pico_base_map[] = { | |
3178 {0xE00000, 0x1000000, 0xFFFF, .flags = MMAP_READ | MMAP_WRITE | MMAP_CODE}, | |
3179 {0xC00000, 0xE00000, 0x1FFFFF, .read_16 = (read_16_fun)vdp_port_read, .write_16 =(write_16_fun)vdp_port_write, | |
3180 .read_8 = (read_8_fun)vdp_port_read_b, .write_8 = (write_8_fun)vdp_port_write_b}, | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3181 {0x800000, 0x900000, 0xFFFFFF, .read_16 = pico_io_read_w, .write_16 = pico_io_write_w, |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3182 .read_8 = pico_io_read, .write_8 = pico_io_write}, |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3183 {0xB00000, 0xC00000, 0xFFFFFF, .read_16 = copera_io_read_w, .write_16 = copera_io_write_w, |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3184 .read_8 = copera_io_read, .write_8 = copera_io_write} |
2428 | 3185 }; |
3186 const size_t pico_base_chunks = sizeof(pico_base_map)/sizeof(*pico_base_map); | |
3187 | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3188 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, system_type stype) |
2428 | 3189 { |
3190 tern_node *rom_db = get_rom_db(); | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3191 uint32_t chunks = pico_base_chunks; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3192 if (stype == SYSTEM_PICO) { |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3193 chunks--; |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3194 } |
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3195 rom_info info = configure_rom(rom_db, rom, rom_size, lock_on, lock_on_size, pico_base_map, chunks); |
2428 | 3196 rom = info.rom; |
3197 rom_size = info.rom_size; | |
3198 #ifndef BLASTEM_BIG_ENDIAN | |
3199 byteswap_rom(nearest_pow2(rom_size), rom); | |
3200 if (lock_on) { | |
3201 byteswap_rom(nearest_pow2(lock_on_size), lock_on); | |
3202 } | |
3203 #endif | |
3204 char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval; | |
3205 if (!m68k_divider) { | |
3206 m68k_divider = "7"; | |
3207 } | |
3208 MCLKS_PER_68K = atoi(m68k_divider); | |
3209 if (!MCLKS_PER_68K) { | |
3210 MCLKS_PER_68K = 7; | |
3211 } | |
3212 genesis_context *gen = calloc(1, sizeof(genesis_context)); | |
3213 gen->header.set_speed_percent = set_speed_percent; | |
3214 gen->header.start_context = start_genesis; | |
3215 gen->header.resume_context = resume_genesis; | |
3216 gen->header.load_save = load_save; | |
3217 gen->header.persist_save = persist_save; | |
3218 gen->header.load_state = load_state; | |
3219 gen->header.soft_reset = soft_reset; | |
3220 gen->header.free_context = free_genesis; | |
3221 gen->header.get_open_bus_value = get_open_bus_value; | |
3222 gen->header.request_exit = request_exit; | |
3223 gen->header.inc_debug_mode = inc_debug_mode; | |
3224 gen->header.gamepad_down = gamepad_down_pico; | |
3225 gen->header.gamepad_up = gamepad_up_pico; | |
3226 gen->header.mouse_down = mouse_down_pico; | |
3227 gen->header.mouse_up = mouse_up_pico; | |
3228 gen->header.mouse_motion_absolute = mouse_motion_absolute_pico; | |
3229 gen->header.mouse_motion_relative = mouse_motion_relative_pico; | |
3230 gen->header.keyboard_down = keyboard_down_pico; | |
3231 gen->header.keyboard_up = keyboard_up_pico; | |
3232 gen->header.config_updated = config_updated; | |
3233 gen->header.serialize = serialize; | |
3234 gen->header.deserialize = deserialize; | |
3235 gen->header.start_vgm_log = start_vgm_log; | |
3236 gen->header.stop_vgm_log = stop_vgm_log; | |
3237 gen->header.toggle_debug_view = toggle_debug_view; | |
2459
cb62730d5c99
Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents:
2438
diff
changeset
|
3238 gen->header.type = stype; |
2428 | 3239 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
|
3240 set_region(gen, &info, force_region); |
2428 | 3241 gen->vdp_unlocked = 1; |
3242 gen->pico_button_state = 0xFF; | |
3243 | |
3244 gen->vdp = init_vdp_context((gen->version_reg & 0x60) == 0x20, 40, VDP_GENESIS); | |
3245 gen->vdp->system = &gen->header; | |
3246 gen->frame_end = vdp_cycles_to_frame_end(gen->vdp); | |
3247 char * config_cycles = tern_find_path(config, "clocks\0max_cycles\0", TVAL_PTR).ptrval; | |
3248 gen->max_cycles = config_cycles ? atoi(config_cycles) : DEFAULT_SYNC_INTERVAL; | |
3249 gen->int_latency_prev1 = MCLKS_PER_68K * 32; | |
3250 gen->int_latency_prev2 = MCLKS_PER_68K * 16; | |
3251 | |
3252 render_set_video_standard((gen->version_reg & 0x60) == 0x20 ? VID_PAL : VID_NTSC); | |
3253 | |
3254 gen->psg = calloc(1, sizeof(psg_context)); | |
3255 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
|
3256 |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3257 gen->adpcm = calloc(1, sizeof(pico_pcm)); |
61c0bfe10887
Somewhat busted support for Pico ADPCM
Michael Pavone <pavone@retrodev.com>
parents:
2429
diff
changeset
|
3258 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
|
3259 |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3260 if (stype == SYSTEM_COPERA) { |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3261 gen->ymz = calloc(1, sizeof(*gen->ymz)); |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3262 //This divider is just a guess, PCB diagram in MAME shows no other crystal |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3263 //Datasheet says the typical clock is 16.9344 MHz |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3264 //Master clock / 3 is 17.897725 MHz which is reasonably close |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
3265 //FIXME: Copera does actually have a separate crystal for these |
2466
b5640ac9aea9
Initial stab at PCM/ADPCM support in YMZ263B emulation
Michael Pavone <pavone@retrodev.com>
parents:
2460
diff
changeset
|
3266 ymz263b_init(gen->ymz, gen->master_clock, 3); |
2558
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
3267 gen->opl = calloc(1, sizeof(*gen->opl)); |
3f58fec775df
Initial work on YMF262 (aka OPL3) emulation
Michael Pavone <pavone@retrodev.com>
parents:
2556
diff
changeset
|
3268 ymf262_init(gen->opl, gen->master_clock, 3, ym_opts); |
2460
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3269 } |
a4f8fa24764b
Initial work on emulating the YMZ263B in the Copera
Michael Pavone <pavone@retrodev.com>
parents:
2459
diff
changeset
|
3270 |
2428 | 3271 gen->work_ram = calloc(2, RAM_WORDS); |
3272 if (!strcmp("random", tern_find_path_default(config, "system\0ram_init\0", (tern_val){.ptrval = "zero"}, TVAL_PTR).ptrval)) | |
3273 { | |
3274 srand(time(NULL)); | |
3275 for (int i = 0; i < RAM_WORDS; i++) | |
3276 { | |
3277 gen->work_ram[i] = rand(); | |
3278 } | |
3279 for (int i = 0; i < VRAM_SIZE; i++) | |
3280 { | |
3281 gen->vdp->vdpmem[i] = rand(); | |
3282 } | |
3283 for (int i = 0; i < SAT_CACHE_SIZE; i++) | |
3284 { | |
3285 gen->vdp->sat_cache[i] = rand(); | |
3286 } | |
3287 for (int i = 0; i < CRAM_SIZE; i++) | |
3288 { | |
3289 write_cram_internal(gen->vdp, i, rand()); | |
3290 } | |
3291 for (int i = 0; i < gen->vdp->vsram_size; i++) | |
3292 { | |
3293 gen->vdp->vsram[i] = rand(); | |
3294 } | |
3295 } | |
3296 gen->cart = rom; | |
3297 gen->lock_on = lock_on; | |
3298 gen->header.has_keyboard = 0; //TODO: Keyboard Pico emulation | |
3299 gen->mapper_type = info.mapper_type; | |
3300 gen->save_type = info.save_type; | |
3301 if (gen->save_type != SAVE_NONE) { | |
3302 gen->save_ram_mask = info.save_mask; | |
3303 gen->save_size = info.save_size; | |
3304 gen->save_storage = info.save_buffer; | |
3305 gen->header.info.save_buffer = info.save_buffer = NULL; | |
3306 gen->eeprom_map = info.eeprom_map; | |
3307 gen->num_eeprom = info.num_eeprom; | |
3308 if (gen->save_type == SAVE_I2C) { | |
3309 eeprom_init(&gen->eeprom, gen->save_storage, gen->save_size); | |
3310 } else if (gen->save_type == SAVE_NOR) { | |
3311 memcpy(&gen->nor, info.nor, sizeof(gen->nor)); | |
3312 //nor_flash_init(&gen->nor, gen->save_storage, gen->save_size, info.save_page_size, info.save_product_id, info.save_bus); | |
3313 } | |
3314 } else { | |
3315 gen->save_storage = NULL; | |
3316 } | |
3317 | |
3318 gen->mapper_start_index = info.mapper_start_index; | |
3319 //This must happen before we generate memory access functions in init_m68k_opts | |
3320 for (int i = 0; i < info.map_chunks; i++) | |
3321 { | |
3322 if (info.map[i].start == 0xE00000) { | |
3323 info.map[i].buffer = gen->work_ram; | |
3324 break; | |
3325 } | |
3326 } | |
3327 | |
3328 memmap_chunk* map = info.map; | |
3329 uint32_t map_chunks = info.map_chunks; | |
3330 info.map = gen->header.info.map = NULL; | |
3331 | |
3332 m68k_options *opts = malloc(sizeof(m68k_options)); | |
3333 init_m68k_opts(opts, map, map_chunks, MCLKS_PER_68K, sync_components_pico, int_ack); | |
3334 //TODO: Pico model selection | |
3335 //if (!strcmp(tern_find_ptr_default(model, "tas", "broken"), "broken")) { | |
3336 opts->gen.flags |= M68K_OPT_BROKEN_READ_MODIFY; | |
3337 //} | |
3338 gen->m68k = init_68k_context(opts, NULL); | |
3339 gen->m68k->system = gen; | |
3340 opts->address_log = (ym_opts & OPT_ADDRESS_LOG) ? fopen("address.log", "w") : NULL; | |
3341 | |
3342 //This must happen after the 68K context has been allocated | |
3343 for (int i = 0; i < map_chunks; i++) | |
3344 { | |
3345 if (map[i].flags & MMAP_PTR_IDX) { | |
3346 gen->m68k->mem_pointers[map[i].ptr_index] = map[i].buffer; | |
3347 } | |
3348 } | |
3349 | |
3350 if (gen->mapper_type == MAPPER_SEGA) { | |
3351 //initialize bank registers | |
3352 for (int i = 1; i < sizeof(gen->bank_regs); i++) | |
3353 { | |
3354 gen->bank_regs[i] = i; | |
3355 } | |
3356 } | |
3357 gen->reset_cycle = CYCLE_NEVER; | |
3358 | |
3359 set_audio_config(gen); | |
3360 bindings_set_mouse_mode(MOUSE_ABSOLUTE); | |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3361 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
|
3362 #ifndef IS_LIB |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3363 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
|
3364 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
|
3365 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
|
3366 tern_node *manifest = NULL; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3367 if (manifest_str) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3368 manifest = parse_config(manifest_str); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3369 if (!manifest) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3370 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
|
3371 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3372 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3373 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
|
3374 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3375 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3376 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
|
3377 if (!pages && manifest) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3378 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
|
3379 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3380 char numkey[18]; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3381 for (int i = 0; i < 7; i++) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3382 uint8_t *img_data; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3383 uint32_t img_size; |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3384 if (pages) { |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3385 sprintf(numkey, "%d", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3386 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
|
3387 if (page_path) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3388 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
|
3389 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3390 continue; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3391 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3392 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
|
3393 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3394 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
|
3395 continue; |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3396 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3397 } else { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3398 sprintf(numkey, "_%d.png", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3399 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
|
3400 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
|
3401 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3402 sprintf(numkey, "_%d.PNG", i); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3403 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
|
3404 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
|
3405 if (!img_data) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3406 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
|
3407 free(img_path); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3408 free(img_path_loud); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3409 continue; |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3410 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3411 free(img_path_loud); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3412 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3413 free(img_path); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3414 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3415 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3416 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
|
3417 if (gen->pico_story_pages[i] == 0xFF) { |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3418 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
|
3419 } |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3420 free(img_data); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3421 } |
2438
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3422 |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3423 free(manifest_name); |
bed4d3db8a3f
More flexible loading of Pico storyware assets
Michael Pavone <pavone@retrodev.com>
parents:
2437
diff
changeset
|
3424 tern_free(manifest); |
2429
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3425 pico_update_page(gen); |
da3dc881d3f0
Initial implementation of storbook artwork display
Michael Pavone <pavone@retrodev.com>
parents:
2428
diff
changeset
|
3426 #endif |
2428 | 3427 return gen; |
3428 } |