annotate sms.c @ 2528:90a40be940f7

Implement read-only SC-3000 cassette support
author Michael Pavone <pavone@retrodev.com>
date Mon, 25 Nov 2024 22:26:45 -0800
parents 8cf7cadc17ee
children a6687a6fb69d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <string.h>
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdlib.h>
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <stddef.h>
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
4 #include "config.h"
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "sms.h"
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "blastem.h"
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include "render.h"
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include "util.h"
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
9 #include "debug.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: 1433
diff changeset
10 #include "saves.h"
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
11 #include "bindings.h"
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12
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
13 #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
14 #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
15 #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
16 #define z80_handle_code_write(...)
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
17 #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
18 #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
19 #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
20 #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
21
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
22 enum {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
23 TAPE_NONE,
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
24 TAPE_STOPPED,
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
25 TAPE_PLAYING,
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
26 TAPE_RECORDING
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
27 };
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
28
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 static void *memory_io_write(uint32_t location, void *vcontext, uint8_t value)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 sms_context *sms = z80->system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 if (location & 1) {
1154
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
34 uint8_t fuzzy_ctrl_0 = sms->io.ports[0].control, fuzzy_ctrl_1 = sms->io.ports[1].control;
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
35 io_control_write(sms->io.ports, (~value) << 5 & 0x60, z80->Z80_CYCLE);
1154
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
36 fuzzy_ctrl_0 |= sms->io.ports[0].control;
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
37 io_control_write(sms->io.ports+1, (~value) << 3 & 0x60, z80->Z80_CYCLE);
1154
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
38 fuzzy_ctrl_1 |= sms->io.ports[1].control;
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
39 if (
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
40 (fuzzy_ctrl_0 & 0x40 & (sms->io.ports[0].output ^ (value << 1)) & (value << 1))
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
41 || (fuzzy_ctrl_0 & 0x40 & (sms->io.ports[1].output ^ (value >> 1)) & (value >> 1))
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
42 ) {
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
43 //TH is an output and it went from 0 -> 1
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
44 vdp_run_context(sms->vdp, z80->Z80_CYCLE);
1154
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
45 vdp_latch_hv(sms->vdp);
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
46 }
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
47 io_data_write(sms->io.ports, value << 1, z80->Z80_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
48 io_data_write(sms->io.ports + 1, value >> 1, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 } else {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 //TODO: memory control write
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 return vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 static uint8_t hv_read(uint32_t location, void *vcontext)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 sms_context *sms = z80->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
59 vdp_run_context(sms->vdp, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 uint16_t hv = vdp_hv_counter_read(sms->vdp);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 if (location & 1) {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 return hv;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 } else {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 return hv >> 8;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 static void *sms_psg_write(uint32_t location, void *vcontext, uint8_t value)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 sms_context *sms = z80->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
72 psg_run(sms->psg, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 psg_write(sms->psg, value);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 return vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 static void update_interrupts(sms_context *sms)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 uint32_t vint = vdp_next_vint(sms->vdp);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 uint32_t hint = vdp_next_hint(sms->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
81 #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
82 sms->z80->int_cycle = vint < hint ? vint : hint;
1759
6e4faa10f9ee Store sync_cycle in context rather than in a local in CPU DSL. Fix the timing of a number of instructions in new Z80 core
Michael Pavone <pavone@retrodev.com>
parents: 1752
diff changeset
83 z80_sync_cycle(sms->z80, sms->z80->sync_cycle);
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
84 #else
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 sms->z80->int_pulse_start = vint < hint ? vint : hint;
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
86 #endif
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 static uint8_t vdp_read(uint32_t location, void *vcontext)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 sms_context *sms = z80->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
93 vdp_run_context(sms->vdp, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 if (location & 1) {
1126
63cd87d910cc Clear interrupt status flags after getting the status register value rather than before
Michael Pavone <pavone@retrodev.com>
parents: 1120
diff changeset
95 uint8_t ret = vdp_control_port_read(sms->vdp);
1119
55ea7f9a4e92 Fix clearing of interrupt pending flags on control port read in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1117
diff changeset
96 sms->vdp->flags2 &= ~(FLAG2_VINT_PENDING|FLAG2_HINT_PENDING);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 update_interrupts(sms);
1126
63cd87d910cc Clear interrupt status flags after getting the status register value rather than before
Michael Pavone <pavone@retrodev.com>
parents: 1120
diff changeset
98 return ret;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 } else {
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
100 return vdp_data_port_read_pbc(sms->vdp);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 static void *vdp_write(uint32_t location, void *vcontext, uint8_t value)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 sms_context *sms = z80->system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 if (location & 1) {
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
109 vdp_run_context_full(sms->vdp, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 vdp_control_port_write_pbc(sms->vdp, value);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 update_interrupts(sms);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 } 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
113 vdp_run_context(sms->vdp, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 vdp_data_port_write_pbc(sms->vdp, value);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 return vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 static uint8_t io_read(uint32_t location, void *vcontext)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 z80_context *z80 = vcontext;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 sms_context *sms = z80->system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 if (location == 0xC0 || location == 0xDC) {
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
124 uint8_t port_a = io_data_read(sms->io.ports, z80->Z80_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
125 uint8_t port_b = io_data_read(sms->io.ports+1, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 return (port_a & 0x3F) | (port_b << 6);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 if (location == 0xC1 || location == 0xDD) {
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
129 uint8_t port_a = io_data_read(sms->io.ports, z80->Z80_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
130 uint8_t port_b = io_data_read(sms->io.ports+1, z80->Z80_CYCLE);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 return (port_a & 0x40) | (port_b >> 2 & 0xF) | (port_b << 1 & 0x80) | 0x10;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 return 0xFF;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
136 static void i8255_output_updated(i8255 *ppi, uint32_t cycle, uint32_t port, uint8_t data)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
137 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
138 if (port == 2) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
139 sms_context *sms = ppi->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
140 sms->kb_mux = data & 0x7;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
141 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
142 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
143
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
144 static void cassette_run(sms_context *sms, uint32_t cycle)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
145 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
146 if (!sms->cassette) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
147 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
148 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
149 if (cycle > sms->cassette_cycle) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
150 uint64_t diff = cycle - sms->cassette_cycle;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
151 diff *= sms->cassette_wave.sample_rate;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
152 diff /= sms->normal_clock;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
153 if (sms->cassette_state == TAPE_PLAYING) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
154 uint64_t bytes_per_sample = sms->cassette_wave.num_channels * sms->cassette_wave.bits_per_sample / 8;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
155 uint64_t offset = diff * bytes_per_sample + sms->cassette_offset;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
156 if (offset > UINT32_MAX || offset > sms->cassette->size - bytes_per_sample) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
157 sms->cassette_offset = sms->cassette->size - bytes_per_sample;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
158 } else {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
159 sms->cassette_offset = offset;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
160 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
161 static uint32_t last_displayed_seconds;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
162 uint32_t seconds = (sms->cassette_offset - (sms->cassette_wave.format_header.size + offsetof(wave_header, audio_format))) / (bytes_per_sample * sms->cassette_wave.sample_rate);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
163 if (seconds != last_displayed_seconds) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
164 last_displayed_seconds = seconds;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
165 printf("Cassette: %02d:%02d\n", seconds / 60, seconds % 60);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
166 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
167 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
168 diff *= sms->normal_clock;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
169 diff /= sms->cassette_wave.sample_rate;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
170 sms->cassette_cycle += diff;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
171 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
172 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
173
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
174 static uint8_t cassette_read(sms_context *sms, uint32_t cycle)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
175 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
176 cassette_run(sms, cycle);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
177 if (sms->cassette_state != TAPE_PLAYING) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
178 return 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
179 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
180 int64_t sample = 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
181 for (uint16_t i = 0; i < sms->cassette_wave.num_channels; i++)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
182 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
183 if (sms->cassette_wave.audio_format == 3) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
184 if (sms->cassette_wave.bits_per_sample == 64) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
185 sample += 32767.0 * ((double *)(((char *)sms->cassette->buffer) + sms->cassette_offset))[i];
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
186 } else if (sms->cassette_wave.bits_per_sample == 32) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
187 sample += 32767.0f * ((float *)(((char *)sms->cassette->buffer) + sms->cassette_offset))[i];
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
188 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
189 } else if (sms->cassette_wave.audio_format == 1) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
190 if (sms->cassette_wave.bits_per_sample == 32) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
191 sample += ((int32_t *)(((char *)sms->cassette->buffer) + sms->cassette_offset))[i];
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
192 } else if (sms->cassette_wave.bits_per_sample == 16) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
193 sample += ((int16_t *)(((char *)sms->cassette->buffer) + sms->cassette_offset))[i];
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
194 } else if (sms->cassette_wave.bits_per_sample == 8) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
195 sample += ((uint8_t *)sms->cassette->buffer)[sms->cassette_offset + i] - 0x80;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
196 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
197 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
198 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
199 uint32_t bytes_per_sample = sms->cassette_wave.num_channels * sms->cassette_wave.bits_per_sample / 8;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
200 if (sms->cassette_offset == sms->cassette->size - bytes_per_sample) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
201 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
202 puts("Cassette reached end of file, playback stoped");
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
203 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
204 return sample > 0 ? 0x80 : 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
205 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
206
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
207 static void cassette_action(system_header *header, uint8_t action)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
208 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
209 sms_context *sms = (sms_context*)header;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
210 if (!sms->cassette) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
211 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
212 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
213 cassette_run(sms, sms->z80->Z80_CYCLE);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
214 switch(action)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
215 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
216 case CASSETTE_PLAY:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
217 sms->cassette_state = TAPE_PLAYING;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
218 puts("Cassette playback started");
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
219 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
220 case CASSETTE_RECORD:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
221 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
222 case CASSETTE_STOP:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
223 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
224 puts("Cassette playback stoped");
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
225 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
226 case CASSETTE_REWIND:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
227 sms->cassette_offset = sms->cassette_wave.format_header.size + offsetof(wave_header, audio_format);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
228 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
229 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
230 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
231
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
232 static uint8_t i8255_input_poll(i8255 *ppi, uint32_t cycle, uint32_t port)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
233 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
234 if (port > 1) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
235 return 0xFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
236 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
237 sms_context *sms = ppi->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
238 if (sms->kb_mux == 7) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
239 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
240 //TODO: printer port BUSY/FAULT
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
241 uint8_t port_b = io_data_read(sms->io.ports+1, cycle);
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
242 return (port_b >> 2 & 0xF) | 0x10 | cassette_read(sms, cycle);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
243 } else {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
244 uint8_t port_a = io_data_read(sms->io.ports, cycle);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
245 uint8_t port_b = io_data_read(sms->io.ports+1, cycle);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
246 return (port_a & 0x3F) | (port_b << 6);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
247 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
248 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
249 //TODO: keyboard matrix ghosting
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
250 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
251 //TODO: printer port BUSY/FAULT
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
252 return (sms->keystate[sms->kb_mux] >> 8) | 0x10 | cassette_read(sms, cycle);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
253 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
254 return sms->keystate[sms->kb_mux];
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
255 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
256
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
257 static void update_mem_map(uint32_t location, sms_context *sms, uint8_t value)
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
258 {
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
259 z80_context *z80 = sms->z80;
1142
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
260 void *old_value;
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
261 if (location) {
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
262 uint32_t idx = location - 1;
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
263 old_value = z80->mem_pointers[idx];
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
264 z80->mem_pointers[idx] = sms->rom + (value << 14 & (sms->rom_size-1));
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
265 if (old_value != z80->mem_pointers[idx]) {
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
266 //invalidate any code we translated for the relevant bank
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
267 z80_invalidate_code_range(z80, idx ? idx * 0x4000 : 0x400, idx * 0x4000 + 0x4000);
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
268 }
5c8b1c33ca10 Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
Michael Pavone <pavone@retrodev.com>
parents: 1141
diff changeset
269 } else {
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
270 old_value = z80->mem_pointers[2];
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
271 if (value & 8) {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
272 //cartridge RAM is enabled
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
273 z80->mem_pointers[2] = sms->cart_ram + (value & 4 ? (SMS_CART_RAM_SIZE/2) : 0);
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
274 } else {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
275 //cartridge RAM is disabled
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
276 z80->mem_pointers[2] = sms->rom + (sms->bank_regs[3] << 14 & (sms->rom_size-1));
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
277 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
278 if (old_value != z80->mem_pointers[2]) {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
279 //invalidate any code we translated for the relevant bank
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
280 z80_invalidate_code_range(z80, 0x8000, 0xC000);
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
281 }
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
282 }
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
283 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
284
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
285 void *sms_sega_mapper_write(uint32_t location, void *vcontext, uint8_t value)
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
286 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
287 z80_context *z80 = vcontext;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
288 sms_context *sms = z80->system;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
289 location &= 3;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
290 sms->ram[0x1FFC + location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
291 sms->bank_regs[location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
292 update_mem_map(location, sms, value);
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
293 return vcontext;
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
294 }
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
295
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
296 void *sms_cart_ram_write(uint32_t location, void *vcontext, uint8_t value)
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
297 {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
298 z80_context *z80 = vcontext;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
299 sms_context *sms = z80->system;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
300 if (sms->bank_regs[0] & 8) {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
301 //cartridge RAM is enabled
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
302 location &= 0x3FFF;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
303 z80->mem_pointers[2][location] = value;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
304 z80_handle_code_write(0x8000 + location, z80);
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
305 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
306 return vcontext;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
307 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
308
2325
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
309 static z80_context *codemasters_write(uint8_t bank, z80_context *z80, uint8_t value)
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
310 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
311 sms_context *sms = z80->system;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
312 if (value != sms->bank_regs[bank]) {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
313 sms->bank_regs[bank] = value;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
314 value &= 0x7F;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
315 z80->mem_pointers[bank] = sms->rom + (value << 14 & (sms->rom_size-1));
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
316 z80_invalidate_code_range(z80, bank * 0x4000, bank * 0x4000 + 0x4000);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
317 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
318 return z80;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
319 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
320
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
321 void *sms_codemasters_bank0_write(uint32_t location, void *vcontext, uint8_t value)
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
322 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
323 return codemasters_write(0, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
324 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
325
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
326 void *sms_codemasters_bank1_write(uint32_t location, void *vcontext, uint8_t value)
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
327 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
328 return codemasters_write(1, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
329 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
330
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
331 void *sms_codemasters_bank2_write(uint32_t location, void *vcontext, uint8_t value)
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
332 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
333 //TODO: Handle Ernie Els Golf cart RAM
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
334 return codemasters_write(2, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
335 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
336
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
337 uint8_t debug_commands(system_header *system, char *input_buf)
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
338 {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
339 sms_context *sms = (sms_context *)system;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
340 switch(input_buf[0])
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
341 {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
342 case 'v':
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
343 if (input_buf[1] == 'r') {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
344 vdp_print_reg_explain(sms->vdp);
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
345 } else if (input_buf[1] == 's') {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
346 vdp_print_sprite_table(sms->vdp);
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
347 } else {
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
348 return 0;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
349 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
350 break;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
351 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
352 return 1;
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
353 }
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1148
diff changeset
354
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
355 static uint8_t gg_io_read(uint32_t location, void *vcontext)
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
356 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
357 z80_context *z80 = vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
358 sms_context *sms = z80->system;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
359 if (!location) {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
360 return sms->start_button_region;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
361 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
362 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
363 return 0xFF;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
364 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
365 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
366
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
367 static void *gg_io_write(uint32_t location, void *vcontext, uint8_t value)
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
368 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
369 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
370 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
371 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
372 static void *psg_pan_write(uint32_t location, void *vcontext, uint8_t value)
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
373 {
2196
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
374 z80_context *z80 = vcontext;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
375 sms_context *sms = z80->system;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
376 psg_run(sms->psg, z80->Z80_CYCLE);
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
377 sms->psg->pan = value;
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
378 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
379 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
380
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
381 static void *ppi_write(uint32_t location, void *vcontext, uint8_t value)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
382 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
383 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
384 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
385 i8255_write(location, sms->i8255, value, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
386 return vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
387 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
388
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
389 static uint8_t ppi_read(uint32_t location, void *vcontext)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
390 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
391 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
392 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
393 return i8255_read(location, sms->i8255, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
394 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
395
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
396 static void *all_write(uint32_t location, void *vcontext, uint8_t value)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
397 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
398 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
399 sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
400 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
401 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
402
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
403 static uint8_t ppi_vdp_read(uint32_t location, void *vcontext)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
404 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
405 //TODO: "corrupt" PPI value by VDP value
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
406 vdp_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
407 return ppi_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
408 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
409
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
410 static void *vdp_psg_write(uint32_t location, void *vcontext, uint8_t value)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
411 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
412 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
413 return sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
414 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
415
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
416 static void *ppi_psg_write(uint32_t location, void *vcontext, uint8_t value)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
417 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
418 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
419 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
420 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
421
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
422 static void *ppi_vdp_write(uint32_t location, void *vcontext, uint8_t value)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
423 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
424 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
425 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
426 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
427
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 static memmap_chunk io_map[] = {
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
429 {0x00, 0x40, 0xFF, .write_8 = memory_io_write},
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
430 {0x40, 0x80, 0xFF, .read_8 = hv_read, .write_8 = sms_psg_write},
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
431 {0x80, 0xC0, 0xFF, .read_8 = vdp_read, .write_8 = vdp_write},
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
432 {0xC0, 0x100,0xFF, .read_8 = io_read}
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 };
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
435 static memmap_chunk io_gg[] = {
2197
74b92e20e2ef Fix off by one in PSG pan register mapping
Michael Pavone <pavone@retrodev.com>
parents: 2196
diff changeset
436 {0x00, 0x06, 0xFF, .read_8 = gg_io_read, .write_8 = gg_io_write},
74b92e20e2ef Fix off by one in PSG pan register mapping
Michael Pavone <pavone@retrodev.com>
parents: 2196
diff changeset
437 {0x06, 0x07, 0xFF, .write_8 = psg_pan_write},
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
438 {0x08, 0x40, 0xFF, .write_8 = memory_io_write},
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
439 {0x40, 0x80, 0xFF, .read_8 = hv_read, .write_8 = sms_psg_write},
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
440 {0x80, 0xC0, 0xFF, .read_8 = vdp_read, .write_8 = vdp_write},
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
441 {0xC0, 0x100,0xFF, .read_8 = io_read}
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
442 };
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
443
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
444 static memmap_chunk io_sc[] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
445 {0x00, 0x20, 0x03, .read_8 = ppi_vdp_read, .write_8 = all_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
446 {0x20, 0x40, 0xFF, .read_8 = vdp_read, .write_8 = vdp_psg_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
447 {0x40, 0x60, 0x03, .read_8 = ppi_read, .write_8 = ppi_psg_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
448 {0x60, 0x80, 0xFF, .write_8 = sms_psg_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
449 {0x80, 0xA0, 0x03, .read_8 = ppi_vdp_read, .write_8 = ppi_vdp_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
450 {0xA0, 0xC0, 0xFF, .read_8 = vdp_read, .write_8 = vdp_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
451 {0xD0, 0x100, 0x03, .read_8 = ppi_read, .write_8 = ppi_write}
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
452 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
453
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 static void set_speed_percent(system_header * system, uint32_t percent)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 sms_context *context = (sms_context *)system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 uint32_t old_clock = context->master_clock;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 context->master_clock = ((uint64_t)context->normal_clock * (uint64_t)percent) / 100;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 psg_adjust_master_clock(context->psg, context->master_clock);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
463 void sms_serialize(sms_context *sms, serialize_buffer *buf)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
464 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
465 start_section(buf, SECTION_Z80);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
466 z80_serialize(sms->z80, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
467 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
468
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
469 start_section(buf, SECTION_VDP);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
470 vdp_serialize(sms->vdp, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
471 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
472
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
473 start_section(buf, SECTION_PSG);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
474 psg_serialize(sms->psg, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
475 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
476
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
477 start_section(buf, SECTION_SEGA_IO_1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
478 io_serialize(sms->io.ports, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
479 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
480
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
481 start_section(buf, SECTION_SEGA_IO_2);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
482 io_serialize(sms->io.ports + 1, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
483 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
484
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
485 start_section(buf, SECTION_MAIN_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
486 save_int8(buf, sizeof(sms->ram) / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
487 save_buffer8(buf, sms->ram, sizeof(sms->ram));
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
488 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
489
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
490 start_section(buf, SECTION_MAPPER);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
491 save_int8(buf, 1);//mapper type, 1 for Sega mapper
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
492 save_buffer8(buf, sms->bank_regs, sizeof(sms->bank_regs));
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
493 end_section(buf);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
494
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
495 start_section(buf, SECTION_CART_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
496 save_int8(buf, SMS_CART_RAM_SIZE / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
497 save_buffer8(buf, sms->cart_ram, SMS_CART_RAM_SIZE);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
498 end_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
499 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
500
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
501 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
502 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
503 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
504 serialize_buffer state;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
505 init_serialize(&state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
506 sms_serialize(sms, &state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
507 if (size_out) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
508 *size_out = state.size;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
509 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
510 return state.data;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
511 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
512
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
513 static void ram_deserialize(deserialize_buffer *buf, void *vsms)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
514 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
515 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
516 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
517 if (ram_size > sizeof(sms->ram)) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
518 fatal_error("State has a RAM size of %d bytes", ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
519 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
520 load_buffer8(buf, sms->ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
521 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
522
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
523 static void cart_ram_deserialize(deserialize_buffer *buf, void *vsms)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
524 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
525 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
526 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
527 if (ram_size > SMS_CART_RAM_SIZE) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
528 fatal_error("State has a cart RAM size of %d bytes", ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
529 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
530 load_buffer8(buf, sms->cart_ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
531 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
532
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
533 static void mapper_deserialize(deserialize_buffer *buf, void *vsms)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
534 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
535 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
536 uint8_t mapper_type = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
537 if (mapper_type != 1) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
538 warning("State contains an unrecognized mapper type %d, it may be from a newer version of BlastEm\n", mapper_type);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
539 return;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
540 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
541 for (int i = 0; i < sizeof(sms->bank_regs); i++)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
542 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
543 sms->bank_regs[i] = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
544 update_mem_map(i, sms, sms->bank_regs[i]);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
545 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
546 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
547
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
548 void sms_deserialize(deserialize_buffer *buf, sms_context *sms)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
549 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
550 register_section_handler(buf, (section_handler){.fun = z80_deserialize, .data = sms->z80}, SECTION_Z80);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
551 register_section_handler(buf, (section_handler){.fun = vdp_deserialize, .data = sms->vdp}, SECTION_VDP);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
552 register_section_handler(buf, (section_handler){.fun = psg_deserialize, .data = sms->psg}, SECTION_PSG);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
553 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = sms->io.ports}, SECTION_SEGA_IO_1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
554 register_section_handler(buf, (section_handler){.fun = io_deserialize, .data = sms->io.ports + 1}, SECTION_SEGA_IO_2);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
555 register_section_handler(buf, (section_handler){.fun = ram_deserialize, .data = sms}, SECTION_MAIN_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
556 register_section_handler(buf, (section_handler){.fun = mapper_deserialize, .data = sms}, SECTION_MAPPER);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
557 register_section_handler(buf, (section_handler){.fun = cart_ram_deserialize, .data = sms}, SECTION_CART_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
558 //TODO: cart RAM
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
559 while (buf->cur_pos < buf->size)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
560 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
561 load_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
562 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
563 z80_invalidate_code_range(sms->z80, 0xC000, 0x10000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
564 if (sms->bank_regs[0] & 8) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
565 //cart RAM is enabled, invalidate the region in case there is any code there
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
566 z80_invalidate_code_range(sms->z80, 0x8000, 0xC000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
567 }
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
568 free(buf->handlers);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
569 buf->handlers = NULL;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
570 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
571
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
572 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
573 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
574 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
575 deserialize_buffer buffer;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
576 init_deserialize(&buffer, data, size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
577 sms_deserialize(&buffer, sms);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
578 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
579
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
580 static void save_state(sms_context *sms, uint8_t slot)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
581 {
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: 1433
diff changeset
582 char *save_path = get_slot_name(&sms->header, slot, "state");
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
583 serialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
584 init_serialize(&state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
585 sms_serialize(sms, &state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
586 save_to_file(&state, save_path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
587 printf("Saved state to %s\n", save_path);
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: 1433
diff changeset
588 free(save_path);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
589 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
590 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
591
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
592 static uint8_t load_state_path(sms_context *sms, char *path)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
593 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
594 deserialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
595 uint8_t ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
596 if ((ret = load_from_file(&state, path))) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
597 sms_deserialize(&state, sms);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
598 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
599 printf("Loaded %s\n", path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
600 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
601 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
602 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
603
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
604 static uint8_t load_state(system_header *system, uint8_t slot)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
605 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
606 sms_context *sms = (sms_context *)system;
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
607 char *statepath = get_slot_name(system, slot, "state");
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
608 uint8_t ret;
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
609 #ifndef NEW_CORE
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
610 if (!sms->z80->native_pc) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
611 ret = get_modification_time(statepath) != 0;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
612 if (ret) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
613 system->delayed_load_slot = slot + 1;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
614 }
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
615 goto done;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
616
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
617 }
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
618 #endif
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
619 ret = load_state_path(sms, statepath);
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
620 done:
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
621 free(statepath);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
622 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
623 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
624
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 static void run_sms(system_header *system)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627 sms_context *sms = (sms_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
628 uint32_t target_cycle = sms->z80->Z80_CYCLE + 3420*16;
1184
b1147418254a Overscan is now configurable
Michael Pavone <pavone@retrodev.com>
parents: 1162
diff changeset
629 //TODO: PAL support
2200
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
630 if (sms->vdp->type == VDP_GAMEGEAR) {
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
631 render_set_video_standard(VID_GAMEGEAR);
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
632 } else {
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
633 render_set_video_standard(VID_NTSC);
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
634 }
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
635 while (!sms->should_return)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
636 {
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
637 if (system->delayed_load_slot) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
638 load_state(system, system->delayed_load_slot - 1);
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
639 system->delayed_load_slot = 0;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
640
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
641 }
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
642 if (sms->vdp->frame != sms->last_frame) {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
643 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
644 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
645 scope_render(sms->psg->scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
646 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
647 #endif
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
648 uint32_t elapsed = sms->vdp->frame - sms->last_frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
649 sms->last_frame = sms->vdp->frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
650 if (system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
651 if (elapsed >= system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
652 system->enter_debugger_frames = 0;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
653 system->enter_debugger = 1;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
654 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
655 system->enter_debugger_frames -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
656 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
657 }
2194
01ff005b08f6 Very rudimentary support for Game Gear VDP emulation
Michael Pavone <pavone@retrodev.com>
parents: 2179
diff changeset
658
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
659 if(exit_after){
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
660 if (elapsed >= exit_after) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
661 exit(0);
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
662 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
663 exit_after -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
664 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
665 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
666 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
667 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
668 if ((system->enter_debugger || sms->z80->wp_hit) && sms->z80->pc) {
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
669 if (!sms->z80->wp_hit) {
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
670 system->enter_debugger = 0;
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
671 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
672 #ifndef IS_LIB
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
673 zdebugger(sms->z80, sms->z80->pc);
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
674 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
675 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
676 #endif
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
677 #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
678 if (sms->z80->nmi_cycle == CYCLE_NEVER) {
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
679 #else
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
680 if (sms->z80->nmi_start == CYCLE_NEVER) {
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
681 #endif
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
682 uint32_t nmi = vdp_next_nmi(sms->vdp);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
683 if (nmi != CYCLE_NEVER) {
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
684 z80_assert_nmi(sms->z80, nmi);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
685 }
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
686 }
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
687
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
688 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
689 if (system->enter_debugger || sms->z80->wp_hit) {
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
690 target_cycle = sms->z80->Z80_CYCLE + 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
691 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
692 #endif
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 z80_run(sms->z80, target_cycle);
1209
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
694 if (sms->z80->reset) {
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
695 z80_clear_reset(sms->z80, sms->z80->Z80_CYCLE + 128*15);
1209
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
696 }
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
697 target_cycle = sms->z80->Z80_CYCLE;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
698 vdp_run_context(sms->vdp, target_cycle);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
699 psg_run(sms->psg, target_cycle);
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
700 cassette_run(sms, target_cycle);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
701
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
702 if (system->save_state) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
703 while (!sms->z80->pc) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
704 //advance Z80 to an instruction boundary
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
705 z80_run(sms->z80, sms->z80->Z80_CYCLE + 1);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
706 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
707 save_state(sms, system->save_state - 1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
708 system->save_state = 0;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
709 }
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
710
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
711 target_cycle += 3420*16;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 if (target_cycle > 0x10000000) {
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
713 uint32_t adjust = sms->z80->Z80_CYCLE - 3420*262*2;
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
714 io_adjust_cycles(sms->io.ports, sms->z80->Z80_CYCLE, adjust);
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1690
diff changeset
715 io_adjust_cycles(sms->io.ports+1, sms->z80->Z80_CYCLE, adjust);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716 z80_adjust_cycles(sms->z80, adjust);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 vdp_adjust_cycles(sms->vdp, adjust);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
718 sms->psg->cycles -= adjust;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
719 sms->cassette_cycle -= adjust;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 target_cycle -= adjust;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 }
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
723 if (sms->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: 1906
diff changeset
724 bindings_release_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
725 vdp_release_framebuffer(sms->vdp);
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
726 render_pause_source(sms->psg->audio);
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
727 }
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 sms->should_return = 0;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730
1401
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
731 static void resume_sms(system_header *system)
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
732 {
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
733 sms_context *sms = (sms_context *)system;
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
734 if (sms->header.force_release || render_should_release_on_exit()) {
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
735 sms->header.force_release = 0;
1932
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
736 bindings_reacquire_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
737 vdp_reacquire_framebuffer(sms->vdp);
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
738 render_resume_source(sms->psg->audio);
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
739 }
1401
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
740 run_sms(system);
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
741 }
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
742
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 static void start_sms(system_header *system, char *statefile)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 sms_context *sms = (sms_context *)system;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
746
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
747 z80_assert_reset(sms->z80, 0);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
748 z80_clear_reset(sms->z80, 128*15);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
749
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
750 if (statefile) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
751 load_state_path(sms, statefile);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
752 }
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
753
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
754 if (system->enter_debugger) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
755 system->enter_debugger = 0;
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
756 #ifndef IS_LIB
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
757 zinsert_breakpoint(sms->z80, sms->z80->pc, (uint8_t *)zdebugger);
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
758 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
759 }
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
760
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 run_sms(system);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
762 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763
1209
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
764 static void soft_reset(system_header *system)
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
765 {
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
766 sms_context *sms = (sms_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
767 z80_assert_reset(sms->z80, sms->z80->Z80_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
768 #ifndef 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
769 sms->z80->target_cycle = sms->z80->sync_cycle = sms->z80->Z80_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
770 #endif
1209
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
771 }
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
772
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
773 static void free_sms(system_header *system)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
774 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
775 sms_context *sms = (sms_context *)system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
776 vdp_free(sms->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
777 z80_options_free(sms->z80->Z80_OPTS);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
778 free(sms->z80);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
779 psg_free(sms->psg);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
780 free(sms->i8255);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 free(sms);
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
784 static uint16_t get_open_bus_value(system_header *system)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
785 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
786 return 0xFFFF;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
787 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
788
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
789 static void request_exit(system_header *system)
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
790 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 sms_context *sms = (sms_context *)system;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
792 sms->should_return = 1;
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
793 #ifndef 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
794 sms->z80->target_cycle = sms->z80->sync_cycle = sms->z80->Z80_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
795 #endif
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
798 static void inc_debug_mode(system_header *system)
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
799 {
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
800 sms_context *sms = (sms_context *)system;
1643
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1640
diff changeset
801 vdp_inc_debug_mode(sms->vdp);
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
802 }
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
803
1384
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
804 static void load_save(system_header *system)
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
805 {
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
806 //TODO: Implement me
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
807 }
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
808
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
809 static void persist_save(system_header *system)
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
810 {
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
811 //TODO: Implement me
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
812 }
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
813
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
814 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: 1555
diff changeset
815 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
816 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
817 if (gamepad_num == GAMEPAD_MAIN_UNIT) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
818 if (button == MAIN_UNIT_PAUSE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
819 vdp_pbc_pause(sms->vdp);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
820 }
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
821 } else if (sms->vdp->type == VDP_GAMEGEAR && gamepad_num == 1 && button == BUTTON_START) {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
822 sms->start_button_region &= 0x7F;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
823 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
824 io_gamepad_down(&sms->io, gamepad_num, button);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
825 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
826 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
827
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
828 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: 1555
diff changeset
829 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
830 sms_context *sms = (sms_context *)system;
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
831 if (sms->vdp->type == VDP_GAMEGEAR && gamepad_num == 1 && button == BUTTON_START) {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
832 sms->start_button_region |= 0x80;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
833 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
834 io_gamepad_up(&sms->io, gamepad_num, button);
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
835 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
836 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
837
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
838 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: 1555
diff changeset
839 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
840 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
841 io_mouse_down(&sms->io, mouse_num, button);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
842 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
843
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
844 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: 1555
diff changeset
845 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
846 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
847 io_mouse_up(&sms->io, mouse_num, button);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
848 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
849
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
850 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: 1555
diff changeset
851 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
852 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
853 io_mouse_motion_absolute(&sms->io, mouse_num, x, y);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
854 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
855
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
856 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: 1555
diff changeset
857 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
858 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
859 io_mouse_motion_relative(&sms->io, mouse_num, x, y);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
860 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
861
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
862 uint16_t scancode_map[0x90] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
863 [0x1C] = 0x0004,//A
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
864 [0x32] = 0x4008,//B
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
865 [0x21] = 0x2008,//C
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
866 [0x23] = 0x2004,//D
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
867 [0x24] = 0x2002,//E
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
868 [0x2B] = 0x3004,//F
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
869 [0x34] = 0x4004,//G
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
870 [0x33] = 0x5004,//H
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
871 [0x43] = 0x0080,//I
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
872 [0x3B] = 0x6004,//J
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
873 [0x42] = 0x0040,//K
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
874 [0x4B] = 0x1040,//L
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
875 [0x3A] = 0x6008,//M
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
876 [0x31] = 0x5008,//N
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
877 [0x44] = 0x1080,//O
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
878 [0x4D] = 0x2080,//P
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
879 [0x15] = 0x0002,//Q
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
880 [0x2D] = 0x3002,//R
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
881 [0x1B] = 0x1004,//S
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
882 [0x2C] = 0x4002,//T
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
883 [0x3C] = 0x6002,//U
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
884 [0x2A] = 0x3008,//V
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
885 [0x1D] = 0x1002,//W
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
886 [0x22] = 0x1008,//X
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
887 [0x35] = 0x5002,//Y
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
888 [0x1A] = 0x0008,//Z
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
889 [0x16] = 0x0001,//1
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
890 [0x1E] = 0x1001,//2
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
891 [0x26] = 0x2001,//3
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
892 [0x25] = 0x3001,//4
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
893 [0x2E] = 0x4001,//5
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
894 [0x36] = 0x5001,//6
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
895 [0x3D] = 0x6001,//7
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
896 [0x3E] = 0x0100,//8
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
897 [0x46] = 0x1100,//9
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
898 [0x45] = 0x2100,//0
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
899 [0x5A] = 0x5040,//return
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
900 [0x29] = 0x1010,//space
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
901 [0x0D] = 0x5800,//tab mapped to FUNC
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
902 [0x66] = 0x3010,//backspace mapped to INS/DEL
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
903 [0x4E] = 0x3100,// -
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
904 [0x55] = 0x4100,// = mapped to ^ based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
905 [0x54] = 0x4080,// [
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
906 [0x5B] = 0x4040,// ]
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
907 [0x5D] = 0x5100,// \ mapped to Yen based on position/correspondence on PC keyboards
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
908 [0x4C] = 0x2040,// ;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
909 [0x52] = 0x3040,// ' mapped to : based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
910 [0x0E] = 0x3020,// ` mapped to PI because of lack of good options
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
911 [0x41] = 0x0020,// ,
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
912 [0x49] = 0x1020,// .
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
913 [0x4A] = 0x2020,// /
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
914 [0x14] = 0x6400,//lctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
915 //rctrl is default keybind for toggle keyboard capture
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
916 //[0x18] = 0x6400,//rctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
917 [0x12] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
918 [0x59] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
919 [0x11] = 0x6200,//lalt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
920 [0x17] = 0x6200,//ralt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
921 [0x81] = 0x0010,//insert mapped to kana/dieresis key
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
922 [0x86] = 0x5020,//left arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
923 [0x87] = 0x2010,//home mapped to HOME/CLR
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
924 [0x88] = 0x6100,//end mapped to BREAK
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
925 [0x89] = 0x6040,//up arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
926 [0x8A] = 0x4020,//down arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
927 [0x8D] = 0x6020,//right arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
928 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
929
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
930 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: 1555
diff changeset
931 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
932 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
933 io_keyboard_down(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
934 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
935 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
936 sms->keystate[row] &= ~(scancode_map[scancode] & 0xFFF);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
937 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
938 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
939
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
940 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: 1555
diff changeset
941 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
942 sms_context *sms = (sms_context *)system;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
943 io_keyboard_up(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
944 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
945 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
946 sms->keystate[row] |= scancode_map[scancode] & 0xFFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
947 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
948 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
949
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
950 static void set_gain_config(sms_context *sms)
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
951 {
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
952 char *config_gain;
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
953 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: 1759
diff changeset
954 render_audio_source_gaindb(sms->psg->audio, config_gain ? atof(config_gain) : 0.0f);
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
955 }
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
956
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
957 static void config_updated(system_header *system)
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
958 {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
959 sms_context *sms = (sms_context *)system;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
960 setup_io_devices(config, &system->info, &sms->io);
2384
03e6ac327ba0 Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents: 2325
diff changeset
961 //sample rate may have changed
03e6ac327ba0 Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents: 2325
diff changeset
962 psg_adjust_master_clock(sms->psg, sms->master_clock);
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
963 }
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
964
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
965 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: 2202
diff changeset
966 {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
967 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
968 sms_context *sms = (sms_context *)system;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
969 if (debug_view < DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
970 vdp_toggle_debug_view(sms->vdp, debug_view);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
971 } else if (debug_view == DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
972 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
973 oscilloscope *scope = sms->psg->scope;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
974 sms->psg->scope = NULL;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
975 scope_close(scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
976 } else {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
977 oscilloscope *scope = create_oscilloscope();
2256
cbe1ba70c247 Fix build after scope clock fix
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
978 psg_enable_scope(sms->psg, scope, sms->normal_clock);
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
979 }
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
980 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
981 #endif
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
982 }
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
983
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
984 void load_cassette(sms_context *sms, system_media *media)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
985 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
986 sms->cassette = NULL;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
987 sms->cassette_state = TAPE_NONE;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
988 memcpy(&sms->cassette_wave, media->buffer, offsetof(wave_header, data_header));
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
989 if (memcmp(sms->cassette_wave.chunk.format, "WAVE", 4)) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
990 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
991 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
992 if (sms->cassette_wave.chunk.size < offsetof(wave_header, data_header)) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
993 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
994 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
995 if (memcmp(sms->cassette_wave.format_header.id, "fmt ", 4)) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
996 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
997 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
998 if (sms->cassette_wave.format_header.size < offsetof(wave_header, data_header) - offsetof(wave_header, audio_format)) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
999 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1000 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1001 if (sms->cassette_wave.bits_per_sample != 8 && sms->cassette_wave.bits_per_sample != 16) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1002 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1003 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1004 uint32_t data_sub_chunk = sms->cassette_wave.format_header.size + offsetof(wave_header, audio_format);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1005 if (data_sub_chunk > media->size || media->size - data_sub_chunk < sizeof(riff_sub_chunk)) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1006 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1007 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1008 memcpy(&sms->cassette_wave.data_header, ((uint8_t *)media->buffer) + data_sub_chunk, sizeof(riff_sub_chunk));
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1009 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1010 sms->cassette_offset = data_sub_chunk;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1011 sms->cassette = media;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1012 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1013
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1014 sms_context *alloc_configure_sms(system_media *media, uint32_t opts, uint8_t force_region)
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1015 {
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1016 sms_context *sms = calloc(1, sizeof(sms_context));
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1017 tern_node *rom_db = get_rom_db();
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1018 const memmap_chunk base_map[] = {
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1019 {0xC000, 0x10000, sizeof(sms->ram)-1, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram}
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 };
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1021 sms->header.info = configure_rom_sms(rom_db, media->buffer, media->size, base_map, sizeof(base_map)/sizeof(base_map[0]));
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1022 uint32_t rom_size = sms->header.info.rom_size;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1023 z80_options *zopts = malloc(sizeof(z80_options));
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1024 tern_node *model_def;
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1025 uint8_t is_gamegear = !strcasecmp(media->extension, "gg");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1026 uint8_t is_sc3000 = !strcasecmp(media->extension, "sc");
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1027 if (is_gamegear) {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1028 model_def = tern_find_node(get_systems_config(), "gg");
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1029 } else if (!strcasecmp(media->extension, "sg")) {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1030 model_def = tern_find_node(get_systems_config(), "sg1000");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1031 } else if (is_sc3000) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1032 model_def = tern_find_node(get_systems_config(), "sc3000");
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1033 } else {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1034 model_def = get_model(config, SYSTEM_SMS);
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1035 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1036 char *vdp_str = tern_find_ptr(model_def, "vdp");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1037 uint8_t vdp_type = is_gamegear ? VDP_GAMEGEAR : is_sc3000 ? VDP_TMS9918A : VDP_SMS2;
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1038 if (vdp_str) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1039 if (!strcmp(vdp_str, "sms1")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1040 vdp_type = VDP_SMS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1041 } else if (!strcmp(vdp_str, "sms2")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1042 vdp_type = VDP_SMS2;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1043 } else if (!strcmp(vdp_str, "tms9918a")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1044 vdp_type = VDP_TMS9918A;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1045 } else if (!strcmp(vdp_str, "gamegear")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1046 vdp_type = VDP_GAMEGEAR;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1047 } else if (!strcmp(vdp_str, "genesis")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1048 vdp_type = VDP_GENESIS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1049 } else {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1050 warning("Unrecognized VDP type %s\n", vdp_str);
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1051 }
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1052 }
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1053 for (uint32_t i = 0; i < sms->header.info.map_chunks; i++)
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1054 {
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1055 memmap_chunk *chunk = sms->header.info.map + i;
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1056 if ((chunk->flags == MMAP_READ) && !chunk->buffer && chunk->start > 0xC000) {
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1057 chunk->buffer = sms->ram + ((chunk->start - 0xC000) & 0x1FFF);
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1058 }
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1059 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1060 char *io_type = tern_find_ptr(model_def, "io");
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1061 if (io_type) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1062 if (!strcmp(io_type, "gamegear")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1063 is_gamegear = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1064 is_sc3000 = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1065 } else if (!strcmp(io_type, "i8255")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1066 is_gamegear = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1067 is_sc3000 = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1068 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1069 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1070 if (is_gamegear) {
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1071 init_z80_opts(zopts, sms->header.info.map, sms->header.info.map_chunks, io_gg, 6, 15, 0xFF);
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1072 sms->start_button_region = 0xC0;
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1073 } else if (is_sc3000) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1074 sms->keystate = calloc(sizeof(uint16_t), 7);
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1075 for (int i = 0; i < 7; i++)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1076 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1077 sms->keystate[i] = 0xFFF;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1078 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1079 sms->i8255 = calloc(1, sizeof(i8255));
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1080 i8255_init(sms->i8255, i8255_output_updated, i8255_input_poll);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1081 sms->i8255->system = sms;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1082 sms->kb_mux = 7;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1083 init_z80_opts(zopts, sms->header.info.map, sms->header.info.map_chunks, io_sc, 7, 15, 0xFF);
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1084 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1085 init_z80_opts(zopts, sms->header.info.map, sms->header.info.map_chunks, io_map, 4, 15, 0xFF);
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1086 }
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1087 if (is_sc3000 && media->chain) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1088 load_cassette(sms, media->chain);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1089 }
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: 1129
diff changeset
1090 sms->z80 = init_z80_context(zopts);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1091 sms->z80->system = sms;
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
1092 sms->z80->Z80_OPTS->gen.debug_cmd_handler = debug_commands;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1093
1201
aee2177a1630 Use filename for game title in SMS mode
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1094 sms->rom = media->buffer;
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1095 sms->rom_size = rom_size;
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1096 if (sms->header.info.map_chunks > 2) {
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1097 sms->z80->mem_pointers[0] = sms->rom;
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1098 sms->z80->mem_pointers[1] = sms->rom + 0x4000;
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1099 sms->z80->mem_pointers[2] = sms->rom + 0x8000;
1162
c4ea535cf57e Forgot that the expansion to 32-bit values for 16-bit addresses is not done when calling a C function to handle a memory operation. Mask on location in mapper_write was needed afterall
Michael Pavone <pavone@retrodev.com>
parents: 1154
diff changeset
1100 sms->bank_regs[1] = 0;
c4ea535cf57e Forgot that the expansion to 32-bit values for 16-bit addresses is not done when calling a C function to handle a memory operation. Mask on location in mapper_write was needed afterall
Michael Pavone <pavone@retrodev.com>
parents: 1154
diff changeset
1101 sms->bank_regs[2] = 0x4000 >> 14;
c4ea535cf57e Forgot that the expansion to 32-bit values for 16-bit addresses is not done when calling a C function to handle a memory operation. Mask on location in mapper_write was needed afterall
Michael Pavone <pavone@retrodev.com>
parents: 1154
diff changeset
1102 sms->bank_regs[3] = 0x8000 >> 14;
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1103 }
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1104
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1105 //TODO: Detect region and pick master clock based off of that
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1106 sms->normal_clock = sms->master_clock = 53693175;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1107
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1108 sms->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
1109 psg_init(sms->psg, sms->master_clock, 15*16);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1110
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1111 set_gain_config(sms);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1112
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1113 sms->vdp = init_vdp_context(0, 0, vdp_type);
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1114 sms->vdp->system = &sms->header;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1115
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1116 sms->header.info.save_type = SAVE_NONE;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1117 sms->header.info.name = strdup(media->name);
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1118
2293
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1119 tern_node *io_config_root = config;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1120 tern_node *sms_root = tern_find_node(config, "sms");
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1121 if (sms_root) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1122 tern_node *io = tern_find_node(sms_root, "io");
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1123 if (io) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1124 io_config_root = sms_root;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1125 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1126 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1127 setup_io_devices(io_config_root, &sms->header.info, &sms->io);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1128 sms->header.has_keyboard = io_has_keyboard(&sms->io) || sms->keystate;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1129
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1130 sms->header.set_speed_percent = set_speed_percent;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1131 sms->header.start_context = start_sms;
1401
b56c8c51ca5d Properly release and reacquire framebuffer pointer when switching contexts. Hopefully fixes the LOCKRECT issue some people are seeing with the SDL 2 fallback renderer
Michael Pavone <pavone@retrodev.com>
parents: 1384
diff changeset
1132 sms->header.resume_context = resume_sms;
1384
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
1133 sms->header.load_save = load_save;
1df16f5985f3 Added stub load_save and persist_save functions to SMS system so that we don't crash when switching games via the menu
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
1134 sms->header.persist_save = persist_save;
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1135 sms->header.load_state = load_state;
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1136 sms->header.free_context = free_sms;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1137 sms->header.get_open_bus_value = get_open_bus_value;
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1138 sms->header.request_exit = request_exit;
1209
5ee6b6345ea9 Implement SMS hardware soft reset (note only available on real hardware on the Genesis in PBC mode)
Michael Pavone <pavone@retrodev.com>
parents: 1201
diff changeset
1139 sms->header.soft_reset = soft_reset;
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1140 sms->header.inc_debug_mode = inc_debug_mode;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1141 sms->header.gamepad_down = gamepad_down;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1142 sms->header.gamepad_up = gamepad_up;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1143 sms->header.mouse_down = mouse_down;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1144 sms->header.mouse_up = mouse_up;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1145 sms->header.mouse_motion_absolute = mouse_motion_absolute;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1146 sms->header.mouse_motion_relative = mouse_motion_relative;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1147 sms->header.keyboard_down = keyboard_down;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1148 sms->header.keyboard_up = keyboard_up;
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1149 sms->header.config_updated = config_updated;
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1150 sms->header.serialize = serialize;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1151 sms->header.deserialize = deserialize;
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1152 sms->header.toggle_debug_view = toggle_debug_view;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1153 sms->header.cassette_action = cassette_action;
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1154 sms->header.type = SYSTEM_SMS;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1155
1117
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1156 return sms;
2134
9caebcfeac72 Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
Michael Pavone <pavone@retrodev.com>
parents: 1980
diff changeset
1157 }