annotate sms.c @ 2540:544f59d9b419

Paste support for remaining SC-3000 export characters
author Michael Pavone <pavone@retrodev.com>
date Thu, 28 Nov 2024 21:14:44 -0800
parents a01c30bef250
children fde99836e453
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
2539
a01c30bef250 Adjust paste delay to be compatible with Home BASIC
Michael Pavone <pavone@retrodev.com>
parents: 2538
diff changeset
29 #define PASTE_DELAY (3420 * 22)
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
30
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
31 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
32 {
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 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
34 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
35 if (location & 1) {
1154
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
36 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
37 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
38 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
39 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
40 fuzzy_ctrl_1 |= sms->io.ports[1].control;
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
41 if (
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
42 (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
43 || (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
44 ) {
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
45 //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
46 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
47 vdp_latch_hv(sms->vdp);
c83ec07ddbac Implemented Mode 4 H conter latching
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
48 }
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
49 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
50 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
51 } 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
52 //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
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 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
55 }
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 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
58 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 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
60 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
61 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
62 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
63 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
64 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
65 } 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
66 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
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 }
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 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
71 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 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
73 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
74 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
75 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
76 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
77 }
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 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
80 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 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
82 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
83 #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
84 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
85 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
86 #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
87 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
88 #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
89 }
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 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
92 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 } 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
102 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
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 }
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 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
107 {
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 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
109 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
110 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
111 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
112 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
113 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
114 } 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
115 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
116 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
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 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
119 }
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 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
122 {
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 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
124 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
125 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
126 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
127 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
128 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
129 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 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
131 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
132 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
133 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
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 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
136 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
138 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
139 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
140 if (port == 2) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
141 sms_context *sms = ppi->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
142 sms->kb_mux = data & 0x7;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
143 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
144 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
145
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
146 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
147 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
148 if (!sms->cassette) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
149 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
150 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
151 if (cycle > sms->cassette_cycle) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
152 uint64_t diff = cycle - sms->cassette_cycle;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
153 diff *= sms->cassette_wave.sample_rate;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
154 diff /= sms->normal_clock;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
155 if (sms->cassette_state == TAPE_PLAYING) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
156 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
157 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
158 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
159 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
160 } else {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
161 sms->cassette_offset = offset;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
162 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
163 static uint32_t last_displayed_seconds;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
164 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
165 if (seconds != last_displayed_seconds) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
166 last_displayed_seconds = seconds;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
167 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
168 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
169 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
170 diff *= sms->normal_clock;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
171 diff /= sms->cassette_wave.sample_rate;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
172 sms->cassette_cycle += diff;
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 }
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 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
177 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
178 cassette_run(sms, cycle);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
179 if (sms->cassette_state != TAPE_PLAYING) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
180 return 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
181 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
182 int64_t sample = 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
183 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
184 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
185 if (sms->cassette_wave.audio_format == 3) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
186 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
187 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
188 } 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
189 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
190 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
191 } 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
192 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
193 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
194 } 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
195 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
196 } 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
197 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
198 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
199 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
200 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
201 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
202 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
203 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
204 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
205 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
206 return sample > 0 ? 0x80 : 0;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
207 }
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 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
210 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
211 sms_context *sms = (sms_context*)header;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
212 if (!sms->cassette) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
213 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
214 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
215 cassette_run(sms, sms->z80->Z80_CYCLE);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
216 switch(action)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
217 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
218 case CASSETTE_PLAY:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
219 sms->cassette_state = TAPE_PLAYING;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
220 puts("Cassette playback started");
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_RECORD:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
223 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
224 case CASSETTE_STOP:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
225 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
226 puts("Cassette playback stoped");
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
227 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
228 case CASSETTE_REWIND:
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
229 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
230 break;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
231 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
232 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
233
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
234 typedef struct {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
235 uint8_t main;
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
236 uint8_t mod;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
237 uint8_t before;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
238 uint8_t after;
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
239 } cp_keys;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
240
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
241 #define SIMPLE(cp, sc) case cp: return (cp_keys){sc}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
242 #define MAYBE_SHIFT(cp, sc) case cp: return (cp_keys){sc, shift}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
243 #define SHIFTED(cp, sc) case cp: return (cp_keys){sc, 0x12}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
244 #define ACCENTED(cp, sc) case cp: return (cp_keys){sc, 0x81}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
245 #define GRAPHIC(cp, sc) case cp: return (cp_keys){sc, .before=0x11, .after=0x11}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
246 #define SHIFTED_GRAPHIC(cp, sc) case cp: return (cp_keys){sc, 0x12, .before=0x11, .after=0x11}
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
247
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
248 static cp_keys cp_to_keys(int cp)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
249 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
250 uint8_t shift = 0;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
251 if (cp >= 'a' && cp <= 'z') {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
252 shift = 0x12;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
253 cp -= 'a' - 'A';
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
254 } else if (cp >= '!' && cp <= ')') {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
255 shift = 0x12;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
256 cp += '1' - '!';
2536
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
257 } else if (cp >= 0xE0 && cp <= 0xFC && cp != 0xF7) {
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
258 //accented latin letters only have a single case (Latin-1 block)
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
259 cp -= 0xE0 - 0xC0;
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
260 } else if (cp >= 0x100 && cp <= 0x16D && (cp & 1)) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
261 //accented latin letters only have a single case (Latin Extended-A block)
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
262 cp &= ~1;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
263 } else if (cp >= 0x1CD && cp <= 0x1D4 && !(cp & 1)) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
264 cp--;
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
265 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
266 switch (cp)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
267 {
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
268 SIMPLE('0', 0x45);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
269 MAYBE_SHIFT('1', 0x16);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
270 MAYBE_SHIFT('2', 0x1E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
271 MAYBE_SHIFT('3', 0x26);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
272 MAYBE_SHIFT('4', 0x25);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
273 MAYBE_SHIFT('5', 0x2E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
274 MAYBE_SHIFT('6', 0x36);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
275 MAYBE_SHIFT('7', 0x3D);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
276 MAYBE_SHIFT('8', 0x3E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
277 MAYBE_SHIFT('9', 0x46);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
278 MAYBE_SHIFT('A', 0x1C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
279 MAYBE_SHIFT('B', 0x32);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
280 MAYBE_SHIFT('C', 0x21);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
281 MAYBE_SHIFT('D', 0x23);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
282 MAYBE_SHIFT('E', 0x24);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
283 MAYBE_SHIFT('F', 0x2B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
284 MAYBE_SHIFT('G', 0x34);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
285 MAYBE_SHIFT('H', 0x33);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
286 MAYBE_SHIFT('I', 0x43);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
287 MAYBE_SHIFT('J', 0x3B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
288 MAYBE_SHIFT('K', 0x42);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
289 MAYBE_SHIFT('L', 0x4B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
290 MAYBE_SHIFT('M', 0x3A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
291 MAYBE_SHIFT('N', 0x31);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
292 MAYBE_SHIFT('O', 0x44);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
293 MAYBE_SHIFT('P', 0x4D);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
294 MAYBE_SHIFT('Q', 0x15);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
295 MAYBE_SHIFT('R', 0x2D);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
296 MAYBE_SHIFT('S', 0x1B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
297 MAYBE_SHIFT('T', 0x2C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
298 MAYBE_SHIFT('U', 0x3C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
299 MAYBE_SHIFT('V', 0x2A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
300 MAYBE_SHIFT('W', 0x1D);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
301 MAYBE_SHIFT('X', 0x22);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
302 MAYBE_SHIFT('Y', 0x35);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
303 MAYBE_SHIFT('Z', 0x1A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
304 SIMPLE('-', 0x4E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
305 SHIFTED('=', 0x4E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
306 SIMPLE(';', 0x4C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
307 SHIFTED('+', 0x4C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
308 SIMPLE(':', 0x52);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
309 SHIFTED('*', 0x52);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
310 SIMPLE(',', 0x41);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
311 SHIFTED('<', 0x41);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
312 SIMPLE('.', 0x49);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
313 SHIFTED('>', 0x49);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
314 SIMPLE('/', 0x4A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
315 SHIFTED('?', 0x4A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
316 SIMPLE('^', 0x55);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
317 SHIFTED('~', 0x55);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
318 SIMPLE('[', 0x54);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
319 SHIFTED('{', 0x54);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
320 SIMPLE(']', 0x5B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
321 SHIFTED('}', 0x5B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
322 SIMPLE('@', 0x85);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
323 SHIFTED('`', 0x85);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
324 SIMPLE('\n', 0x5A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
325 SIMPLE(' ', 0x29);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
326 SIMPLE(0xA5, 0x5D);//¥
2536
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
327 case 0xA6: //¦ (broken bar)
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
328 SHIFTED('|', 0x5D);//|
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
329 //Accented latin letters will only work right with export BASIC
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
330 ACCENTED(0xA1, 0x32);//¡
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
331 ACCENTED(0xA3, 0x5D);//£
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
332 ACCENTED(0xBF, 0x2A);//¿
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
333 ACCENTED(0xC0, 0x1D);//À
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
334 ACCENTED(0xC1, 0x15);//Á
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
335 ACCENTED(0xC2, 0x16);//Â
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
336 ACCENTED(0xC3, 0x23);//Ã
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
337 ACCENTED(0xC4, 0x1C);//Ä
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
338 ACCENTED(0xC5, 0x1B);//Å
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
339 ACCENTED(0xC7, 0x21);//Ç
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
340 case 0xC6: return (cp_keys){0x31, 0x81, .after=0x24};//Æ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
341 ACCENTED(0xC8, 0x2D);//È
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
342 ACCENTED(0xC9, 0x24);//É
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
343 ACCENTED(0xCA, 0x26);//Ê
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
344 ACCENTED(0xCB, 0x2E);//Ë
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
345 ACCENTED(0xCC, 0x44);//Ì
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
346 ACCENTED(0xCD, 0x4B);//Í
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
347 ACCENTED(0xCE, 0x49);//Î
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
348 ACCENTED(0xCF, 0x4C);//Ï
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
349 ACCENTED(0xD1, 0x2C);//Ñ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
350 ACCENTED(0xD2, 0x85);//Ò
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
351 ACCENTED(0xD3, 0x4D);//Ó
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
352 ACCENTED(0xD4, 0x45);//Ô
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
353 ACCENTED(0xD5, 0x0E);//Õ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
354 ACCENTED(0xD6, 0x52);//Ö
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
355 //character in font doesn't really look like a phi to me
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
356 //but Wikipedia lists it as such and it's between other Greek chars
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
357 case 0x3A6: //Φ
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
358 ACCENTED(0xD8, 0x54);//Ø
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
359 ACCENTED(0xD9, 0x43);//Ù
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
360 ACCENTED(0xDA, 0x3C);//Ú
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
361 ACCENTED(0xDB, 0x3D);//Û
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
362 ACCENTED(0xDC, 0x42);//Ü
2536
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
363 GRAPHIC(0xF7, 0x0E);//÷
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
364 //Latin Extended-A
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
365 ACCENTED(0x100, 0x2B);//Ā
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
366 case 0x1CD: //Ǎ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
367 ACCENTED(0x102, 0x1E);//Ă
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
368 ACCENTED(0x112, 0x36);//Ē
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
369 case 0x11A: //Ě
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
370 ACCENTED(0x114, 0x25);//Ĕ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
371 ACCENTED(0x12A, 0x4A);//Ī
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
372 case 0x1CF: //Ǐ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
373 ACCENTED(0x12C, 0x46);//Ĭ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
374 case 0x1D1: //Ǒ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
375 ACCENTED(0x14E, 0x4E);//Ŏ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
376 ACCENTED(0x16A, 0x41);//Ū
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
377 case 0x1D3: //Ǔ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
378 ACCENTED(0x16C, 0x3E);//Ŭ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
379 //Greek and Coptic
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
380 ACCENTED(0x3A3, 0x5B);//Σ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
381 ACCENTED(0x3A9, 0x3A);//Ω
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
382 ACCENTED(0x3B1, 0x34);//α
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
383 ACCENTED(0x3B2, 0x33);//β
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
384 ACCENTED(0x3B8, 0x3B);//θ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
385 ACCENTED(0x3BB, 0x22);//λ
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
386 case 0xB5://µ
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
387 ACCENTED(0x3BC, 0x1A);//μ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
388 SHIFTED(0x3C0, 0x0E);//π
2538
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
389 //Arrows
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
390 GRAPHIC(0x2190, 0x46);//←
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
391 GRAPHIC(0x2191, 0x3E);//↑
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
392 //Box drawing
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
393 GRAPHIC(0x2500, 0x1E);//─
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
394 GRAPHIC(0x2501, 0x34);//━
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
395 GRAPHIC(0x2502, 0x26);//│
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
396 GRAPHIC(0x2503, 0x2C);//┃
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
397 GRAPHIC(0x250C, 0x15);//┌
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
398 GRAPHIC(0x2510, 0x1D);//┐
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
399 GRAPHIC(0x2514, 0x1C);//└
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
400 GRAPHIC(0x2518, 0x1B);//┘
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
401 SHIFTED_GRAPHIC(0x251C, 0x15);//├
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
402 SHIFTED_GRAPHIC(0x2524, 0x1B);//┤
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
403 SHIFTED_GRAPHIC(0x252C, 0x1D);//┬
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
404 SHIFTED_GRAPHIC(0x2534, 0x1C);//┴
2538
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
405 SHIFTED_GRAPHIC(0x256D, 0x24);//╭
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
406 SHIFTED_GRAPHIC(0x256E, 0x2D);//╮
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
407 SHIFTED_GRAPHIC(0x256F, 0x2B);//╯
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
408 SHIFTED_GRAPHIC(0x2570, 0x23);//╰
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
409 GRAPHIC(0x253C, 0x16);//┼
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
410 GRAPHIC(0x2571, 0x4E);//╱
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
411 GRAPHIC(0x2572, 0x5D);//╲
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
412 GRAPHIC(0x2573, 0x55);//╳
2536
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
413 //Block Elements
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
414 SHIFTED_GRAPHIC(0x2580, 0x32);//▀ upper half
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
415 SHIFTED_GRAPHIC(0x2581, 0x1A);//▁ lower 1/8th
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
416 SHIFTED_GRAPHIC(0x2582, 0x22);//▂ lower 1/4th
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
417 SHIFTED_GRAPHIC(0x2584, 0x21);//▄ lower half
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
418 GRAPHIC(0x2588, 0x2A);//█ full block
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
419 GRAPHIC(0x258C, 0x32);//▌ left half
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
420 GRAPHIC(0x258D, 0x31);//▍ left 3/8ths (Sega character is 1/3rd)
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
421 GRAPHIC(0x258F, 0x3A);//▏ left 1/8th (Sega character is 1/6th)
2538
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
422 GRAPHIC(0x2590, 0x21);//▐ right half
2536
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
423 SHIFTED_GRAPHIC(0x2592, 0x2A);//▒
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
424 SHIFTED_GRAPHIC(0x2594, 0x3A);//▔ upper 1/8th
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
425 GRAPHIC(0x2595, 0x1A);//▕ right 1/8th (Sega character is 1/6th)
0d8e3e65327f Implement paste support for block elements and a couple of missing Latin-1 chars
Michael Pavone <pavone@retrodev.com>
parents: 2535
diff changeset
426 GRAPHIC(0x259E, 0x33);//▞
2538
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
427 //Geometric Shapes
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
428 SHIFTED_GRAPHIC(0x25CB, 0x3C);//○
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
429 SHIFTED_GRAPHIC(0x25CF, 0x3B);//●
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
430 GRAPHIC(0x25E2, 0x24);//◢
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
431 GRAPHIC(0x25E3, 0x2D);//◣
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
432 GRAPHIC(0x25E4, 0x2B);//◤
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
433 GRAPHIC(0x25E5, 0x23);//◥
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
434 SHIFTED_GRAPHIC(0x25DC, 0x24);//◜
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
435 SHIFTED_GRAPHIC(0x25DD, 0x2D);//◝
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
436 SHIFTED_GRAPHIC(0x25DE, 0x2B);//◞
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
437 SHIFTED_GRAPHIC(0x25DF, 0x23);//◟
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
438 //Miscellaneous Symbols
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
439 GRAPHIC(0x263B, 0x3B);//☻
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
440 GRAPHIC(0x2660, 0x25);//♠
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
441 GRAPHIC(0x2663, 0x3D);//♣
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
442 GRAPHIC(0x2665, 0x2E);//♥
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
443 GRAPHIC(0x2666, 0x36);//♦
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
444 //Miscellaneous Symbos and Pictographs
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
445 GRAPHIC(0x1F47E, 0x42);//👾
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
446 //Transport and Map Symbols
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
447 SHIFTED_GRAPHIC(0x1F697, 0x33);//🚗
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
448 SHIFTED_GRAPHIC(0x1F698, 0x35);//🚘
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
449 //Symbols for legacy computing
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
450 SHIFTED_GRAPHIC(0x1FB82, 0x31);//🮂 upper 1/4th
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
451 GRAPHIC(0x1FB88, 0x22);//🮈 right 3/8ths (Sega character is 1/3rd)
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
452 case 0x1FB8C: //🮌 left half medium shade
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
453 SHIFTED_GRAPHIC(0x1FB8D, 0x2C);//🮍 right half medium shade, Sega char is sort of in the middle
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
454 case 0x1FB8E://🮎 upper half medium shade
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
455 SHIFTED_GRAPHIC(0x1FB8F, 0x34);//🮏 lower half medium shade, Sega char is sort of in the middle
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
456 GRAPHIC(0x1FBC5, 0x35);//🯅 stick figure
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
457 GRAPHIC(0x1FBCF, 0x31);//🯏 left 1/3rd
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
458 default: return (cp_keys){0};
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
459 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
460 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
461
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
462 static void advance_paste_buffer(sms_context *sms, const char *paste)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
463 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
464 if (!*paste) {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
465 free(sms->header.paste_buffer);
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
466 sms->header.paste_buffer = NULL;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
467 } else {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
468 sms->header.paste_cur_char = paste - sms->header.paste_buffer;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
469 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
470 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
471
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
472 enum {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
473 PASTE_BEFORE,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
474 PASTE_MAIN,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
475 PASTE_AFTER,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
476 PASTE_BEFORE_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
477 PASTE_MAIN_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
478 PASTE_AFTER_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
479 PASTE_TOGGLE_UP
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
480 };
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
481
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
482
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
483 static uint8_t paste_internal(sms_context *sms, uint8_t prev_key)
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
484 {
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
485 const char *paste = sms->header.paste_buffer + sms->header.paste_cur_char;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
486 int cp = utf8_codepoint(&paste);
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
487 cp_keys keys = {0};
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
488 if (cp == 'N' || cp == 'n') {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
489 const char *tmp = paste;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
490 int next = utf8_codepoint(&tmp);
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
491 if (next == 0x302) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
492 keys = (cp_keys){0x35, 0x81};//N̂ (N with circumflex above)
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
493 paste = tmp;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
494 }
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
495 }
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
496 if (!keys.main) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
497 keys = cp_to_keys(cp);
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
498 }
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
499 if (!keys.main) {
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
500 advance_paste_buffer(sms, paste);
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
501 return 0;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
502 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
503 switch (sms->paste_state)
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
504 {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
505 default:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
506 case PASTE_BEFORE:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
507 if (sms->paste_toggle != keys.before) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
508 if (sms->paste_toggle) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
509 sms->header.keyboard_down(&sms->header, sms->paste_toggle);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
510 sms->paste_state = PASTE_TOGGLE_UP;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
511 return sms->paste_toggle;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
512 } else {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
513 if (prev_key == keys.before) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
514 return 0;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
515 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
516 sms->header.keyboard_down(&sms->header, keys.before);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
517 sms->paste_state = PASTE_BEFORE_UP;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
518 return keys.before;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
519 }
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
520 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
521 case PASTE_MAIN:
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
522 if (prev_key == keys.main) {
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
523 // we're pressing the key that was just released, we need to wait to the next scan
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
524 return 0;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
525 }
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
526 sms->header.keyboard_down(&sms->header, keys.main);
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
527 if (keys.mod) {
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
528 sms->header.keyboard_down(&sms->header, keys.mod);
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
529 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
530 sms->paste_state = PASTE_MAIN_UP;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
531 return keys.main;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
532 case PASTE_AFTER:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
533 if (prev_key == keys.after) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
534 return 0;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
535 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
536 sms->header.keyboard_down(&sms->header, keys.after);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
537 sms->paste_state = PASTE_AFTER_UP;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
538 return keys.after;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
539 case PASTE_BEFORE_UP:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
540 sms->header.keyboard_up(&sms->header, keys.before);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
541 sms->paste_state = PASTE_MAIN;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
542 return keys.before;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
543 case PASTE_MAIN_UP:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
544 sms->header.keyboard_up(&sms->header, keys.main);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
545 if (keys.mod) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
546 sms->header.keyboard_up(&sms->header, keys.mod);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
547 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
548 if (keys.after && keys.after != keys.before) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
549 sms->paste_state = PASTE_AFTER;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
550 } else {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
551 sms->paste_toggle = keys.after;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
552 sms->paste_state = PASTE_BEFORE;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
553 advance_paste_buffer(sms, paste);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
554 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
555 return keys.main;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
556 case PASTE_AFTER_UP:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
557 sms->header.keyboard_up(&sms->header, keys.after);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
558 sms->paste_state = PASTE_BEFORE;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
559 advance_paste_buffer(sms, paste);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
560 return keys.after;
2537
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
561 case PASTE_TOGGLE_UP: {
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
562 sms->header.keyboard_up(&sms->header, sms->paste_toggle);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
563 sms->paste_state = PASTE_BEFORE;
2537
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
564 uint8_t ret = sms->paste_toggle;
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
565 sms->paste_toggle = 0;
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
566 return ret;
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
567 }
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
568 }
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
569 }
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
570
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
571 static void process_paste(sms_context *sms, uint32_t cycle)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
572 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
573 if (sms->header.paste_buffer && cycle > sms->last_paste_cycle && cycle - sms->last_paste_cycle >= PASTE_DELAY) {
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
574
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
575 uint8_t main_key;
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
576 if ((main_key = paste_internal(sms, 0))) {
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
577 sms->last_paste_cycle = cycle;
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
578 if (sms->header.paste_buffer && !sms->paste_state) {
2534
35dbe1873c8f Speed up pasting and do some prep for pasting characters that need keys pressed in sequence
Michael Pavone <pavone@retrodev.com>
parents: 2532
diff changeset
579 paste_internal(sms, main_key);
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
580 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
581 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
582 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
583 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
584
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
585 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
586 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
587 if (port > 1) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
588 return 0xFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
589 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
590 sms_context *sms = ppi->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
591 if (sms->kb_mux == 7) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
592 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
593 //TODO: printer port BUSY/FAULT
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
594 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
595 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
596 } else {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
597 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
598 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
599 return (port_a & 0x3F) | (port_b << 6);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
600 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
601 }
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
602 process_events();
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
603 process_paste(sms, cycle);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
604 //TODO: keyboard matrix ghosting
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
605 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
606 //TODO: printer port BUSY/FAULT
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
607 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
608 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
609 return sms->keystate[sms->kb_mux];
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
610 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
611
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
612 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
613 {
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
614 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
615 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
616 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
617 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
618 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
619 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
620 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
621 //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
622 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
623 }
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
624 } 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
625 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
626 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
627 //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
628 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
629 } 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
630 //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
631 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
632 }
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
633 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
634 //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
635 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
636 }
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
637 }
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
638 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
639
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
640 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
641 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
642 z80_context *z80 = vcontext;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
643 sms_context *sms = z80->system;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
644 location &= 3;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
645 sms->ram[0x1FFC + location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
646 sms->bank_regs[location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
647 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
648 return vcontext;
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
649 }
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
650
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
651 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
652 {
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
653 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
654 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
655 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
656 //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
657 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
658 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
659 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
660 }
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
661 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
662 }
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
663
2325
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
664 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
665 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
666 sms_context *sms = z80->system;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
667 if (value != sms->bank_regs[bank]) {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
668 sms->bank_regs[bank] = value;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
669 value &= 0x7F;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
670 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
671 z80_invalidate_code_range(z80, bank * 0x4000, bank * 0x4000 + 0x4000);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
672 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
673 return z80;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
674 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
675
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
676 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
677 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
678 return codemasters_write(0, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
679 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
680
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
681 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
682 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
683 return codemasters_write(1, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
684 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
685
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
686 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
687 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
688 //TODO: Handle Ernie Els Golf cart RAM
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
689 return codemasters_write(2, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
690 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
691
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
692 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
693 {
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
694 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
695 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
696 {
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
697 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
698 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
699 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
700 } 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
701 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
702 } 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
703 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
704 }
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
705 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
706 }
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
707 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
708 }
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
709
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
710 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
711 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
712 z80_context *z80 = vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
713 sms_context *sms = z80->system;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
714 if (!location) {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
715 return sms->start_button_region;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
716 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
717 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
718 return 0xFF;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
719 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
720 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
721
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
722 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
723 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
724 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
725 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
726 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
727 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
728 {
2196
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
729 z80_context *z80 = vcontext;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
730 sms_context *sms = z80->system;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
731 psg_run(sms->psg, z80->Z80_CYCLE);
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
732 sms->psg->pan = value;
2527
7e1215d17571 Log Game Gear PSG Pan to VGM
Michael Pavone <pavone@retrodev.com>
parents: 2525
diff changeset
733 if (sms->psg->vgm) {
7e1215d17571 Log Game Gear PSG Pan to VGM
Michael Pavone <pavone@retrodev.com>
parents: 2525
diff changeset
734 vgm_gg_pan_write(sms->psg->vgm, sms->psg->cycles, sms->psg->pan);
7e1215d17571 Log Game Gear PSG Pan to VGM
Michael Pavone <pavone@retrodev.com>
parents: 2525
diff changeset
735 }
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
736 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
737 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
738
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
739 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
740 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
741 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
742 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
743 i8255_write(location, sms->i8255, value, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
744 return vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
745 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
746
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
747 static uint8_t ppi_read(uint32_t location, void *vcontext)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
748 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
749 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
750 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
751 return i8255_read(location, sms->i8255, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
752 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
753
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
754 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
755 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
756 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
757 sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
758 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
759 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
760
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
761 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
762 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
763 //TODO: "corrupt" PPI value by VDP value
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
764 vdp_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
765 return ppi_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
766 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
767
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
768 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
769 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
770 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
771 return sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
772 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
773
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
774 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
775 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
776 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
777 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
778 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
779
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
780 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
781 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
782 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
783 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
784 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
785
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
786 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
787 {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
788 {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
789 {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
790 {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
791 };
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
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
793 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
794 {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
795 {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
796 {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
797 {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
798 {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
799 {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
800 };
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
801
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
802 static memmap_chunk io_sc[] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
803 {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
804 {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
805 {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
806 {0x60, 0x80, 0xFF, .write_8 = sms_psg_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
807 {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
808 {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
809 {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
810 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
811
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
812 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
813 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814 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
815 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
816 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
817
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 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
819 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
820
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
821 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
822 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
823 start_section(buf, SECTION_Z80);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
824 z80_serialize(sms->z80, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
825 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
826
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
827 start_section(buf, SECTION_VDP);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
828 vdp_serialize(sms->vdp, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
829 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
830
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
831 start_section(buf, SECTION_PSG);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
832 psg_serialize(sms->psg, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
833 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
834
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
835 start_section(buf, SECTION_SEGA_IO_1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
836 io_serialize(sms->io.ports, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
837 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
838
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
839 start_section(buf, SECTION_SEGA_IO_2);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
840 io_serialize(sms->io.ports + 1, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
841 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
842
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
843 start_section(buf, SECTION_MAIN_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
844 save_int8(buf, sizeof(sms->ram) / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
845 save_buffer8(buf, sms->ram, sizeof(sms->ram));
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
846 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
847
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
848 start_section(buf, SECTION_MAPPER);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
849 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
850 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
851 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
852
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
853 start_section(buf, SECTION_CART_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
854 save_int8(buf, SMS_CART_RAM_SIZE / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
855 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
856 end_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
857 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
858
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
859 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
860 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
861 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
862 serialize_buffer state;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
863 init_serialize(&state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
864 sms_serialize(sms, &state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
865 if (size_out) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
866 *size_out = state.size;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
867 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
868 return state.data;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
869 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
870
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
871 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
872 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
873 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
874 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
875 if (ram_size > sizeof(sms->ram)) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
876 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
877 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
878 load_buffer8(buf, sms->ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
879 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
880
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
881 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
882 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
883 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
884 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
885 if (ram_size > SMS_CART_RAM_SIZE) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
886 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
887 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
888 load_buffer8(buf, sms->cart_ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
889 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
890
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
891 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
892 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
893 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
894 uint8_t mapper_type = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
895 if (mapper_type != 1) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
896 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
897 return;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
898 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
899 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
900 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
901 sms->bank_regs[i] = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
902 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
903 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
904 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
905
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
906 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
907 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
908 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
909 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
910 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
911 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
912 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
913 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
914 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
915 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
916 //TODO: cart RAM
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
917 while (buf->cur_pos < buf->size)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
918 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
919 load_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
920 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
921 z80_invalidate_code_range(sms->z80, 0xC000, 0x10000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
922 if (sms->bank_regs[0] & 8) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
923 //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
924 z80_invalidate_code_range(sms->z80, 0x8000, 0xC000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
925 }
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
926 free(buf->handlers);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
927 buf->handlers = NULL;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
928 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
929
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
930 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
931 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
932 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
933 deserialize_buffer buffer;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
934 init_deserialize(&buffer, data, size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
935 sms_deserialize(&buffer, sms);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
936 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
937
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
938 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
939 {
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
940 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
941 serialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
942 init_serialize(&state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
943 sms_serialize(sms, &state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
944 save_to_file(&state, save_path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
945 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
946 free(save_path);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
947 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
948 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
949
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
950 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
951 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
952 deserialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
953 uint8_t ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
954 if ((ret = load_from_file(&state, path))) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
955 sms_deserialize(&state, sms);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
956 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
957 printf("Loaded %s\n", path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
958 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
959 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
960 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
961
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
962 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
963 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
964 sms_context *sms = (sms_context *)system;
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
965 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
966 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
967 #ifndef NEW_CORE
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
968 if (!sms->z80->native_pc) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
969 ret = get_modification_time(statepath) != 0;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
970 if (ret) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
971 system->delayed_load_slot = slot + 1;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
972 }
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
973 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
974
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
975 }
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
976 #endif
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
977 ret = load_state_path(sms, statepath);
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
978 done:
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
979 free(statepath);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
980 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
981 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
982
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
983 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
984 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
985 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
986 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
987 //TODO: PAL support
2200
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
988 if (sms->vdp->type == VDP_GAMEGEAR) {
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
989 render_set_video_standard(VID_GAMEGEAR);
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
990 } else {
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
991 render_set_video_standard(VID_NTSC);
f11f4399d64b Crop display in game gear mode
Michael Pavone <pavone@retrodev.com>
parents: 2197
diff changeset
992 }
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
993 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
994 {
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
995 if (system->delayed_load_slot) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
996 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
997 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
998
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
999 }
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1000 if (sms->vdp->frame != sms->last_frame) {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1001 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1002 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1003 scope_render(sms->psg->scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1004 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1005 #endif
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1006 uint32_t elapsed = sms->vdp->frame - sms->last_frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1007 sms->last_frame = sms->vdp->frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1008 if (system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1009 if (elapsed >= system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1010 system->enter_debugger_frames = 0;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1011 system->enter_debugger = 1;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1012 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1013 system->enter_debugger_frames -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1014 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1015 }
2194
01ff005b08f6 Very rudimentary support for Game Gear VDP emulation
Michael Pavone <pavone@retrodev.com>
parents: 2179
diff changeset
1016
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1017 if(exit_after){
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1018 if (elapsed >= exit_after) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1019 exit(0);
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1020 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1021 exit_after -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1022 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1023 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1024 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1025 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1026 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
1027 if (!sms->z80->wp_hit) {
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1028 system->enter_debugger = 0;
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1029 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1030 #ifndef IS_LIB
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1031 zdebugger(sms->z80, sms->z80->pc);
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1032 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1033 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1034 #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
1035 #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
1036 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
1037 #else
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1038 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
1039 #endif
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1040 uint32_t nmi = vdp_next_nmi(sms->vdp);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1041 if (nmi != CYCLE_NEVER) {
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1042 z80_assert_nmi(sms->z80, nmi);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1043 }
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1044 }
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1045
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1046 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1047 if (system->enter_debugger || sms->z80->wp_hit) {
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1048 target_cycle = sms->z80->Z80_CYCLE + 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1049 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1050 #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
1051 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
1052 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
1053 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
1054 }
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
1055 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
1056 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
1057 psg_run(sms->psg, target_cycle);
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1058 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
1059
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1060 if (system->save_state) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1061 while (!sms->z80->pc) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1062 //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
1063 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
1064 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1065 save_state(sms, system->save_state - 1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1066 system->save_state = 0;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1067 }
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
1068
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1069 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
1070 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
1071 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
1072 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
1073 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
1074 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
1075 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
1076 sms->psg->cycles -= adjust;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1077 sms->cassette_cycle -= adjust;
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1078 if (sms->last_paste_cycle > adjust) {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1079 sms->last_paste_cycle -= adjust;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1080 } else {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1081 sms->last_paste_cycle = 0;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1082 }
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1083 if (sms->psg->vgm) {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1084 vgm_adjust_cycles(sms->psg->vgm, adjust);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1085 }
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
1086 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
1087 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1088 }
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
1089 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
1090 bindings_release_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
1091 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
1092 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
1093 }
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
1094 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
1095 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1096
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
1097 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
1098 {
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
1099 sms_context *sms = (sms_context *)system;
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
1100 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
1101 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
1102 bindings_reacquire_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
1103 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
1104 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
1105 }
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
1106 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
1107 }
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
1108
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
1109 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
1110 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1111 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
1112
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1113 z80_assert_reset(sms->z80, 0);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1114 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
1115
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1116 if (statefile) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1117 load_state_path(sms, statefile);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1118 }
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
1119
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1120 if (system->enter_debugger) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1121 system->enter_debugger = 0;
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1122 #ifndef IS_LIB
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1123 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
1124 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1125 }
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
1126
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
1127 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
1128 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1129
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
1130 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
1131 {
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
1132 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
1133 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
1134 #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
1135 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
1136 #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
1137 }
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
1138
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
1139 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
1140 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1141 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
1142 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
1143 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
1144 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
1145 psg_free(sms->psg);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1146 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
1147 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
1148 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1149
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1150 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
1151 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1152 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
1153 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1154
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1155 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
1156 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1157 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
1158 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
1159 #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
1160 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
1161 #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
1162 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1163
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1164 static void inc_debug_mode(system_header *system)
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1165 {
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1166 sms_context *sms = (sms_context *)system;
1643
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1640
diff changeset
1167 vdp_inc_debug_mode(sms->vdp);
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1168 }
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1169
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
1170 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
1171 {
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
1172 //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
1173 }
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
1174
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
1175 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
1176 {
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
1177 //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
1178 }
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
1179
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1180 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
1181 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1182 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
1183 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
1184 if (button == MAIN_UNIT_PAUSE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1185 vdp_pbc_pause(sms->vdp);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1186 }
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1187 } 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
1188 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
1189 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1190 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
1191 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1192 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1193
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1194 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
1195 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1196 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
1197 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
1198 sms->start_button_region |= 0x80;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1199 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1200 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
1201 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1202 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1203
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1204 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
1205 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1206 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
1207 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
1208 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1209
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1210 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
1211 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1212 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
1213 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
1214 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1215
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1216 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
1217 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1218 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
1219 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
1220 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1221
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1222 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
1223 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1224 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
1225 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
1226 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1227
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1228 uint16_t scancode_map[0x90] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1229 [0x1C] = 0x0004,//A
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1230 [0x32] = 0x4008,//B
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1231 [0x21] = 0x2008,//C
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1232 [0x23] = 0x2004,//D
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1233 [0x24] = 0x2002,//E
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1234 [0x2B] = 0x3004,//F
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1235 [0x34] = 0x4004,//G
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1236 [0x33] = 0x5004,//H
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1237 [0x43] = 0x0080,//I
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1238 [0x3B] = 0x6004,//J
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1239 [0x42] = 0x0040,//K
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1240 [0x4B] = 0x1040,//L
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1241 [0x3A] = 0x6008,//M
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1242 [0x31] = 0x5008,//N
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1243 [0x44] = 0x1080,//O
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1244 [0x4D] = 0x2080,//P
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1245 [0x15] = 0x0002,//Q
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1246 [0x2D] = 0x3002,//R
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1247 [0x1B] = 0x1004,//S
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1248 [0x2C] = 0x4002,//T
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1249 [0x3C] = 0x6002,//U
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1250 [0x2A] = 0x3008,//V
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1251 [0x1D] = 0x1002,//W
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1252 [0x22] = 0x1008,//X
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1253 [0x35] = 0x5002,//Y
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1254 [0x1A] = 0x0008,//Z
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1255 [0x16] = 0x0001,//1
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1256 [0x1E] = 0x1001,//2
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1257 [0x26] = 0x2001,//3
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1258 [0x25] = 0x3001,//4
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1259 [0x2E] = 0x4001,//5
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1260 [0x36] = 0x5001,//6
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1261 [0x3D] = 0x6001,//7
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1262 [0x3E] = 0x0100,//8
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1263 [0x46] = 0x1100,//9
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1264 [0x45] = 0x2100,//0
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1265 [0x5A] = 0x5040,//return
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1266 [0x29] = 0x1010,//space
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1267 [0x0D] = 0x5800,//tab mapped to FUNC
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1268 [0x66] = 0x3010,//backspace mapped to INS/DEL
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1269 [0x4E] = 0x3100,// -
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1270 [0x55] = 0x4100,// = mapped to ^ based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1271 [0x54] = 0x4080,// [
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1272 [0x5B] = 0x4040,// ]
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1273 [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
1274 [0x4C] = 0x2040,// ;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1275 [0x52] = 0x3040,// ' mapped to : based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1276 [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
1277 [0x41] = 0x0020,// ,
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1278 [0x49] = 0x1020,// .
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1279 [0x4A] = 0x2020,// /
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1280 [0x14] = 0x6400,//lctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1281 //rctrl is default keybind for toggle keyboard capture
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1282 //[0x18] = 0x6400,//rctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1283 [0x12] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1284 [0x59] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1285 [0x11] = 0x6200,//lalt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1286 [0x17] = 0x6200,//ralt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1287 [0x81] = 0x0010,//insert mapped to kana/dieresis key
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1288 [0x86] = 0x5020,//left arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1289 [0x87] = 0x2010,//home mapped to HOME/CLR
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1290 [0x88] = 0x6100,//end mapped to BREAK
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1291 [0x89] = 0x6040,//up arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1292 [0x8A] = 0x4020,//down arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1293 [0x8D] = 0x6020,//right arrow
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1294 [0x85] = 0x3080,//del mapped to @ because of lack of good options
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1295 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1296
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1297 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
1298 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1299 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
1300 io_keyboard_down(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1301 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1302 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1303 sms->keystate[row] &= ~(scancode_map[scancode] & 0xFFF);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1304 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1305 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1306
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1307 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
1308 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1309 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
1310 io_keyboard_up(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1311 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1312 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1313 sms->keystate[row] |= scancode_map[scancode] & 0xFFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1314 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1315 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1316
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1317 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
1318 {
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1319 char *config_gain;
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1320 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
1321 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
1322 }
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1323
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1324 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
1325 {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1326 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
1327 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
1328 //sample rate may have changed
03e6ac327ba0 Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents: 2325
diff changeset
1329 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
1330 }
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1331
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1332 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
1333 {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1334 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1335 sms_context *sms = (sms_context *)system;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1336 if (debug_view < DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1337 vdp_toggle_debug_view(sms->vdp, debug_view);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1338 } else if (debug_view == DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1339 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1340 oscilloscope *scope = sms->psg->scope;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1341 sms->psg->scope = NULL;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1342 scope_close(scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1343 } else {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1344 oscilloscope *scope = create_oscilloscope();
2256
cbe1ba70c247 Fix build after scope clock fix
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
1345 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
1346 }
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1347 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1348 #endif
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1349 }
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1350
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1351 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
1352 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1353 sms->cassette = NULL;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1354 sms->cassette_state = TAPE_NONE;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1355 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
1356 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
1357 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1358 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1359 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
1360 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1361 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1362 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
1363 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1364 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1365 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
1366 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1367 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1368 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
1369 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1370 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1371 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
1372 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
1373 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1374 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1375 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
1376 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1377 sms->cassette_offset = data_sub_chunk;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1378 sms->cassette = media;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1379 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1380
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1381 static void start_vgm_log(system_header *system, char *filename)
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1382 {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1383 sms_context *sms = (sms_context *)system;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1384 //TODO: 50 Hz support
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1385 vgm_writer *vgm = vgm_write_open(filename, 60, sms->normal_clock, sms->z80->Z80_CYCLE);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1386 if (vgm) {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1387 printf("Started logging VGM to %s\n", filename);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1388 psg_run(sms->psg, sms->z80->Z80_CYCLE);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1389 psg_vgm_log(sms->psg, sms->normal_clock, vgm);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1390 sms->header.vgm_logging = 1;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1391 } else {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1392 printf("Failed to start logging to %s\n", filename);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1393 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1394 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1395
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1396 static void stop_vgm_log(system_header *system)
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1397 {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1398 puts("Stopped VGM log");
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1399 sms_context *sms = (sms_context *)system;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1400 vgm_close(sms->psg->vgm);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1401 sms->psg->vgm = NULL;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1402 sms->header.vgm_logging = 0;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1403 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1404
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1405 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
1406 {
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
1407 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
1408 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
1409 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
1410 {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
1411 };
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1412 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
1413 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
1414 z80_options *zopts = malloc(sizeof(z80_options));
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1415 tern_node *model_def;
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1416 uint8_t is_gamegear = !strcasecmp(media->extension, "gg");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1417 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
1418 if (is_gamegear) {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1419 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
1420 } else if (!strcasecmp(media->extension, "sg")) {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1421 model_def = tern_find_node(get_systems_config(), "sg1000");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1422 } else if (is_sc3000) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1423 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
1424 } else {
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1425 model_def = get_model(config, SYSTEM_SMS);
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1426 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1427 char *vdp_str = tern_find_ptr(model_def, "vdp");
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1428 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
1429 if (vdp_str) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1430 if (!strcmp(vdp_str, "sms1")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1431 vdp_type = VDP_SMS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1432 } 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
1433 vdp_type = VDP_SMS2;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1434 } 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
1435 vdp_type = VDP_TMS9918A;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1436 } 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
1437 vdp_type = VDP_GAMEGEAR;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1438 } 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
1439 vdp_type = VDP_GENESIS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1440 } else {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1441 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
1442 }
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1443 }
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1444 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
1445 {
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1446 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
1447 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
1448 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
1449 }
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1450 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1451 char *io_type = tern_find_ptr(model_def, "io");
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1452 if (io_type) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1453 if (!strcmp(io_type, "gamegear")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1454 is_gamegear = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1455 is_sc3000 = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1456 } else if (!strcmp(io_type, "i8255")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1457 is_gamegear = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1458 is_sc3000 = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1459 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1460 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1461 if (is_gamegear) {
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1462 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
1463 sms->start_button_region = 0xC0;
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1464 } else if (is_sc3000) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1465 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
1466 for (int i = 0; i < 7; i++)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1467 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1468 sms->keystate[i] = 0xFFF;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1469 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1470 sms->i8255 = calloc(1, sizeof(i8255));
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1471 i8255_init(sms->i8255, i8255_output_updated, i8255_input_poll);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1472 sms->i8255->system = sms;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1473 sms->kb_mux = 7;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1474 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
1475 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1476 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
1477 }
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1478 if (is_sc3000 && media->chain) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1479 load_cassette(sms, media->chain);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1480 }
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
1481 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
1482 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
1483 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
1484
1201
aee2177a1630 Use filename for game title in SMS mode
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1485 sms->rom = media->buffer;
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1486 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
1487 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
1488 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
1489 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
1490 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
1491 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
1492 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
1493 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
1494 }
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
1495
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
1496 //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
1497 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
1498
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
1499 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
1500 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
1501
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1502 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
1503
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1504 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
1505 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
1506
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1507 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
1508 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
1509
2293
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1510 tern_node *io_config_root = config;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1511 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
1512 if (sms_root) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1513 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
1514 if (io) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1515 io_config_root = sms_root;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1516 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1517 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1518 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
1519 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
1520
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
1521 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
1522 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
1523 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
1524 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
1525 sms->header.persist_save = persist_save;
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1526 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
1527 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
1528 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
1529 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
1530 sms->header.soft_reset = soft_reset;
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1531 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
1532 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
1533 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
1534 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
1535 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
1536 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
1537 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
1538 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
1539 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
1540 sms->header.config_updated = config_updated;
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1541 sms->header.serialize = serialize;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1542 sms->header.deserialize = deserialize;
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1543 sms->header.start_vgm_log = start_vgm_log;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1544 sms->header.stop_vgm_log = stop_vgm_log;
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1545 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
1546 sms->header.cassette_action = cassette_action;
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1547 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
1548
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
1549 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
1550 }