annotate sms.c @ 2604:c768bbd912f1

Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
author Michael Pavone <pavone@retrodev.com>
date Thu, 13 Feb 2025 23:07:31 -0800
parents 251cc75574af
children
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}
2541
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
247 #define KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x81}
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
248 #define SHIFTED_KANA(cp, sc) case cp: return (cp_keys){sc, 0x12, .before=0x81, .after=0x81}
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
249 #define DAKUTEN_KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x85}
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
250 #define MARU_KANA(cp, sc) case cp: return (cp_keys){sc, .before=0x81, .after=0x54}
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
251
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
252 static cp_keys cp_to_keys(int cp)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
253 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
254 uint8_t shift = 0;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
255 if (cp >= 'a' && cp <= 'z') {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
256 shift = 0x12;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
257 cp -= 'a' - 'A';
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
258 } else if (cp >= '!' && cp <= ')') {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
259 shift = 0x12;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
260 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
261 } 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
262 //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
263 cp -= 0xE0 - 0xC0;
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
264 } 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
265 //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
266 cp &= ~1;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
267 } 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
268 cp--;
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
269 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
270 switch (cp)
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
271 {
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
272 SIMPLE('0', 0x45);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
273 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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282 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
283 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
284 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
285 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
286 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
287 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
288 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
289 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
290 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
291 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
292 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
293 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
294 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
295 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
296 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
297 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
298 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
299 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
300 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
301 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
302 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
303 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
304 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
305 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
306 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
307 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
308 SIMPLE('-', 0x4E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
309 SHIFTED('=', 0x4E);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
310 SIMPLE(';', 0x4C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
311 SHIFTED('+', 0x4C);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
312 SIMPLE(':', 0x52);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
313 SHIFTED('*', 0x52);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
314 SIMPLE(',', 0x41);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
315 SHIFTED('<', 0x41);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
316 SIMPLE('.', 0x49);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
317 SHIFTED('>', 0x49);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
318 SIMPLE('/', 0x4A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
319 SHIFTED('?', 0x4A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
320 SIMPLE('^', 0x55);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
321 SHIFTED('~', 0x55);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
322 SIMPLE('[', 0x54);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
323 SHIFTED('{', 0x54);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
324 SIMPLE(']', 0x5B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
325 SHIFTED('}', 0x5B);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
326 SIMPLE('@', 0x85);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
327 SHIFTED('`', 0x85);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
328 SIMPLE('\n', 0x5A);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
329 SIMPLE(' ', 0x29);
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
330 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
331 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
332 SHIFTED('|', 0x5D);//|
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
333 //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
334 ACCENTED(0xA1, 0x32);//¡
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
335 ACCENTED(0xA3, 0x5D);//£
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
336 ACCENTED(0xBF, 0x2A);//¿
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
337 ACCENTED(0xC0, 0x1D);//À
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
338 ACCENTED(0xC1, 0x15);//Á
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
339 ACCENTED(0xC2, 0x16);//Â
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
340 ACCENTED(0xC3, 0x23);//Ã
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
341 ACCENTED(0xC4, 0x1C);//Ä
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
342 ACCENTED(0xC5, 0x1B);//Å
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
343 ACCENTED(0xC7, 0x21);//Ç
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
344 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
345 ACCENTED(0xC8, 0x2D);//È
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
346 ACCENTED(0xC9, 0x24);//É
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
347 ACCENTED(0xCA, 0x26);//Ê
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
348 ACCENTED(0xCB, 0x2E);//Ë
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
349 ACCENTED(0xCC, 0x44);//Ì
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
350 ACCENTED(0xCD, 0x4B);//Í
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
351 ACCENTED(0xCE, 0x49);//Î
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
352 ACCENTED(0xCF, 0x4C);//Ï
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
353 ACCENTED(0xD1, 0x2C);//Ñ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
354 ACCENTED(0xD2, 0x85);//Ò
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
355 ACCENTED(0xD3, 0x4D);//Ó
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
356 ACCENTED(0xD4, 0x45);//Ô
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
357 ACCENTED(0xD5, 0x0E);//Õ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
358 ACCENTED(0xD6, 0x52);//Ö
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
359 //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
360 //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
361 case 0x3A6: //Φ
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
362 ACCENTED(0xD8, 0x54);//Ø
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
363 ACCENTED(0xD9, 0x43);//Ù
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
364 ACCENTED(0xDA, 0x3C);//Ú
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
365 ACCENTED(0xDB, 0x3D);//Û
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
366 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
367 GRAPHIC(0xF7, 0x0E);//÷
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
368 //Latin Extended-A
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
369 ACCENTED(0x100, 0x2B);//Ā
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
370 case 0x1CD: //Ǎ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
371 ACCENTED(0x102, 0x1E);//Ă
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
372 ACCENTED(0x112, 0x36);//Ē
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
373 case 0x11A: //Ě
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
374 ACCENTED(0x114, 0x25);//Ĕ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
375 ACCENTED(0x12A, 0x4A);//Ī
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
376 case 0x1CF: //Ǐ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
377 ACCENTED(0x12C, 0x46);//Ĭ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
378 case 0x1D1: //Ǒ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
379 ACCENTED(0x14E, 0x4E);//Ŏ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
380 ACCENTED(0x16A, 0x41);//Ū
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
381 case 0x1D3: //Ǔ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
382 ACCENTED(0x16C, 0x3E);//Ŭ
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
383 //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
384 ACCENTED(0x3A3, 0x5B);//Σ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
385 ACCENTED(0x3A9, 0x3A);//Ω
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
386 ACCENTED(0x3B1, 0x34);//α
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
387 ACCENTED(0x3B2, 0x33);//β
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
388 ACCENTED(0x3B8, 0x3B);//θ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
389 ACCENTED(0x3BB, 0x22);//λ
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
390 case 0xB5://µ
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
391 ACCENTED(0x3BC, 0x1A);//μ
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
392 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
393 //Arrows
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
394 GRAPHIC(0x2190, 0x46);//←
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
395 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
396 //Box drawing
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
397 GRAPHIC(0x2500, 0x1E);//─
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
398 GRAPHIC(0x2501, 0x34);//━
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
399 GRAPHIC(0x2502, 0x26);//│
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
400 GRAPHIC(0x2503, 0x2C);//┃
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
401 GRAPHIC(0x250C, 0x15);//┌
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
402 GRAPHIC(0x2510, 0x1D);//┐
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
403 GRAPHIC(0x2514, 0x1C);//└
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
404 GRAPHIC(0x2518, 0x1B);//┘
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
405 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
406 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
407 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
408 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
409 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
410 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
411 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
412 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
413 GRAPHIC(0x253C, 0x16);//┼
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
414 GRAPHIC(0x2571, 0x4E);//╱
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
415 GRAPHIC(0x2572, 0x5D);//╲
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
416 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
417 //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
418 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
419 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431 //Geometric Shapes
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
432 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
433 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
434 GRAPHIC(0x25E2, 0x24);//◢
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
435 GRAPHIC(0x25E3, 0x2D);//◣
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
436 GRAPHIC(0x25E4, 0x2B);//◤
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
437 GRAPHIC(0x25E5, 0x23);//◥
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
438 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
439 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
440 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
441 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
442 //Miscellaneous Symbols
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
443 GRAPHIC(0x263B, 0x3B);//☻
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
444 GRAPHIC(0x2660, 0x25);//♠
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
445 GRAPHIC(0x2663, 0x3D);//♣
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
446 GRAPHIC(0x2665, 0x2E);//♥
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
447 GRAPHIC(0x2666, 0x36);//♦
2541
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
448 //CJK Punctuation
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
449 SHIFTED_KANA(0x3002, 0x49);//。
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
450 SHIFTED_KANA(0x300C, 0x54);//「
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
451 SHIFTED_KANA(0x300D, 0x5B);//」
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
452 //Hiragana (for diacritics shared with Katakana)
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
453 case 0xFF9E://゙ (half-width)
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
454 case 0x3099:// (combining)
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
455 KANA(0x309B, 0x85);//゛
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
456 case 0xFF9F://゚ (half-width)
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
457 case 0x309A:// (combining)
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
458 KANA(0x309C, 0x54);//゜
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
459 //Katakana
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
460 SHIFTED(0x30A0, 0x4E);//Katakana double hyphen, translate to =
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
461 case 0x30A1://ァ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
462 KANA(0x30A2, 0x26);//ア
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
463 case 0x30A3://ィ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
464 KANA(0x30A4, 0x24);//イ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
465 case 0x30A5://ゥ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
466 KANA(0x30A6, 0x25);//ウ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
467 case 0x30A7://ェ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
468 KANA(0x30A8, 0x2E);//エ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
469 case 0x30A9://ォ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
470 KANA(0x30AA, 0x36);//オ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
471 case 0x30F5://ヵ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
472 KANA(0x30AB, 0x2C);//カ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
473 DAKUTEN_KANA(0x30AC, 0x2C);//ガ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
474 KANA(0x30AD, 0x34);//キ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
475 DAKUTEN_KANA(0x30AE, 0x34);//ギ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
476 KANA(0x30AF, 0x33);//ク
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
477 DAKUTEN_KANA(0x30B0, 0x33);//グ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
478 case 0x30F6://ヶ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
479 KANA(0x30B1, 0x52);//ケ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
480 DAKUTEN_KANA(0x30B2, 0x52);//ゲ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
481 KANA(0x30B3, 0x32);//コ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
482 DAKUTEN_KANA(0x30B4, 0x32);//ゴ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
483 KANA(0x30B5, 0x22);//サ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
484 DAKUTEN_KANA(0x30B6, 0x22);//ザ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
485 KANA(0x30B7, 0x23);//シ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
486 DAKUTEN_KANA(0x30B8, 0x23);//ジ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
487 KANA(0x30B9, 0x2D);//ス
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
488 DAKUTEN_KANA(0x30BA, 0x2D);//ズ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
489 KANA(0x30BB, 0x4D);//セ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
490 DAKUTEN_KANA(0x30BC, 0x4D);//ゼ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
491 KANA(0x30BD, 0x21);//ソ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
492 DAKUTEN_KANA(0x30BE, 0x21);//ゾ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
493 KANA(0x30BF, 0x15);//タ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
494 DAKUTEN_KANA(0x30C0, 0x15);//ダ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
495 KANA(0x30C1, 0x1C);//チ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
496 DAKUTEN_KANA(0x30C2, 0x1C);//ヂ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
497 case 0x30C3://ッ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
498 KANA(0x30C4, 0x1A);//ツ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
499 DAKUTEN_KANA(0x30C5, 0x1A);//ヅ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
500 KANA(0x30C6, 0x1D);//テ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
501 DAKUTEN_KANA(0x30C7, 0x1D);//デ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
502 KANA(0x30C8, 0x1B);//ト
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
503 DAKUTEN_KANA(0x30C9, 0x1B);//ド
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
504 KANA(0x30CA, 0x3C);//ナ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
505 KANA(0x30CB, 0x43);//ニ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
506 KANA(0x30CC, 0x16);//ヌ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
507 KANA(0x30CD, 0x41);//ネ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
508 KANA(0x30CE, 0x42);//ノ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
509 KANA(0x30CF, 0x2B);//ハ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
510 DAKUTEN_KANA(0x30D0, 0x2B);//バ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
511 MARU_KANA(0x30D1, 0x2B);//パ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
512 KANA(0x30D2, 0x2A);//ヒ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
513 DAKUTEN_KANA(0x30D3, 0x2A);//ビ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
514 MARU_KANA(0x30D4, 0x2A);//ピ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
515 KANA(0x30D5, 0x1E);//フ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
516 DAKUTEN_KANA(0x30D6, 0x1E);//ブ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
517 MARU_KANA(0x30D7, 0x1E);//プ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
518 KANA(0x30D8, 0x55);//ヘ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
519 DAKUTEN_KANA(0x30D9,0x55);//ベ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
520 MARU_KANA(0x30DA, 0x55);//ペ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
521 KANA(0x30DB, 0x4E);//ホ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
522 DAKUTEN_KANA(0x30DC,0x4E);//ボ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
523 MARU_KANA(0x30DD, 0x4E);//ポ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
524 KANA(0x30DE, 0x3B);//マ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
525 KANA(0x30DF, 0x31);//ミ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
526 KANA(0x30E0, 0x5B);//ム
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
527 KANA(0x30E1, 0x4A);//メ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
528 KANA(0x30E2, 0x3A);//モ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
529 case 0x30E3://ャ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
530 KANA(0x30E4, 0x3D);//ヤ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
531 case 0x30E5://ュ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
532 KANA(0x30E6, 0x3E);//ユ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
533 case 0x30E7://ョ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
534 KANA(0x30E8, 0x46);//ヨ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
535 KANA(0x30E9, 0x44);//ラ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
536 KANA(0x30EA, 0x4B);//リ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
537 KANA(0x30EB, 0x49);//ル
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
538 KANA(0x30EC, 0x4C);//レ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
539 KANA(0x30ED, 0x0E);//ロ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
540 case 0x30EE://ヮ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
541 KANA(0x30EF, 0x45);//ワ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
542 SHIFTED_KANA(0x30F2, 0x45);//ヲ
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
543 KANA(0x30F3, 0x35);//ン
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
544 SHIFTED_KANA(0x30FB, 0x4A);//・
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
545 KANA(0x30FC, 0x5D);//ー
2542
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
546 //CJK Unified Ideographs
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
547 GRAPHIC(0x571F, 0x85);//土
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
548 GRAPHIC(0x5E74, 0x4B);//年
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
549 GRAPHIC(0x65E5, 0x52);//日
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
550 GRAPHIC(0x6708, 0x4C);//月
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
551 GRAPHIC(0x6728, 0x44);//木
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
552 GRAPHIC(0x6C34, 0x43);//水
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
553 GRAPHIC(0x706B, 0x3C);//火
062f0ac1fe7e Implement SC-3000 kanji paste
Michael Pavone <pavone@retrodev.com>
parents: 2541
diff changeset
554 GRAPHIC(0x91D1, 0x4D);//金
2538
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
555 //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
556 GRAPHIC(0x1F47E, 0x42);//👾
0bba312f94f7 Implement paste for the rest of the SC-3000 graphic characters
Michael Pavone <pavone@retrodev.com>
parents: 2537
diff changeset
557 //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
558 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
559 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
560 //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
561 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
562 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
563 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
564 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
565 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
566 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
567 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
568 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
569 default: return (cp_keys){0};
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
570 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
571 }
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 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
574 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
575 if (!*paste) {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
576 free(sms->header.paste_buffer);
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
577 sms->header.paste_buffer = NULL;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
578 } else {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
579 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
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
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
583 enum {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
584 PASTE_BEFORE,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
585 PASTE_MAIN,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
586 PASTE_AFTER,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
587 PASTE_BEFORE_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
588 PASTE_MAIN_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
589 PASTE_AFTER_UP,
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
590 PASTE_TOGGLE_UP
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
591 };
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
592
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
593
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
594 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
595 {
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
596 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
597 int cp = utf8_codepoint(&paste);
2540
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
598 cp_keys keys = {0};
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
599 if (cp == 'N' || cp == 'n') {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
600 const char *tmp = paste;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
601 int next = utf8_codepoint(&tmp);
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
602 if (next == 0x302) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
603 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
604 paste = tmp;
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
605 }
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
606 }
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
607 if (!keys.main) {
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
608 keys = cp_to_keys(cp);
544f59d9b419 Paste support for remaining SC-3000 export characters
Michael Pavone <pavone@retrodev.com>
parents: 2539
diff changeset
609 }
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
610 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
611 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
612 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
613 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
614 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
615 {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
616 default:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
617 case PASTE_BEFORE:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
618 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
619 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
620 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
621 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
622 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
623 } else {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
624 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
625 return 0;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
626 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
627 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
628 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
629 return keys.before;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
630 }
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
631 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
632 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
633 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
634 // 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
635 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
636 }
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
637 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
638 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
639 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
640 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
641 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
642 return keys.main;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
643 case PASTE_AFTER:
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
644 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
645 return 0;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
646 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
647 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
648 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
649 return keys.after;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
650 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
651 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
652 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
653 return keys.before;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
654 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
655 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
656 if (keys.mod) {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
657 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
658 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
659 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
660 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
661 } else {
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
662 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
663 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
664 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
665 }
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
666 return keys.main;
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
667 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
668 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
669 sms->paste_state = PASTE_BEFORE;
2541
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
670 if (keys.before == 0x81 && (keys.after == 0x85 || keys.after == 0x54)) {
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
671 //special handling for DAKUTEN_KANA and MARU_KANA
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
672 sms->paste_toggle = keys.before;
fde99836e453 Impelement SC-3000 katakana pasting
Michael Pavone <pavone@retrodev.com>
parents: 2540
diff changeset
673 }
2535
0c6519125a28 Implement paste support for box drawing chars and Latin-1 character Æ
Michael Pavone <pavone@retrodev.com>
parents: 2534
diff changeset
674 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
675 return keys.after;
2537
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
676 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
677 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
678 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
679 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
680 sms->paste_toggle = 0;
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
681 return ret;
da4f297d9581 Fix untoggling of toggle modifier in SC-3000 paste
Michael Pavone <pavone@retrodev.com>
parents: 2536
diff changeset
682 }
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
683 }
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
684 }
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
685
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
686 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
687 {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
688 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
689
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
690 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
691 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
692 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
693 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
694 paste_internal(sms, main_key);
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
695 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
696 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
697 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
698 }
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
699
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
700 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
701 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
702 if (port > 1) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
703 return 0xFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
704 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
705 sms_context *sms = ppi->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
706 if (sms->kb_mux == 7) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
707 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
708 //TODO: printer port BUSY/FAULT
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
709 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
710 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
711 } else {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
712 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
713 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
714 return (port_a & 0x3F) | (port_b << 6);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
715 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
716 }
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
717 process_events();
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
718 process_paste(sms, cycle);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
719 //TODO: keyboard matrix ghosting
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
720 if (port) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
721 //TODO: printer port BUSY/FAULT
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
722 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
723 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
724 return sms->keystate[sms->kb_mux];
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
725 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
726
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
727 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
728 {
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
729 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
730 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
731 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
732 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
733 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
734 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
735 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
736 //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
737 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
738 }
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
739 } 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
740 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
741 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
742 //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
743 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
744 } 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
745 //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
746 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
747 }
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
748 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
749 //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
750 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
751 }
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
752 }
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
753 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
754
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
755 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
756 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
757 z80_context *z80 = vcontext;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
758 sms_context *sms = z80->system;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
759 location &= 3;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
760 sms->ram[0x1FFC + location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
761 sms->bank_regs[location] = value;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
762 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
763 return vcontext;
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
764 }
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
765
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
766 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
767 {
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
768 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
769 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
770 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
771 //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
772 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
773 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
774 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
775 }
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
776 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
777 }
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
778
2325
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
779 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
780 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
781 sms_context *sms = z80->system;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
782 if (value != sms->bank_regs[bank]) {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
783 sms->bank_regs[bank] = value;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
784 value &= 0x7F;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
785 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
786 z80_invalidate_code_range(z80, bank * 0x4000, bank * 0x4000 + 0x4000);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
787 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
788 return z80;
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
789 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
790
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
791 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
792 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
793 return codemasters_write(0, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
794 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
795
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
796 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
797 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
798 return codemasters_write(1, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
799 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
800
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
801 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
802 {
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
803 //TODO: Handle Ernie Els Golf cart RAM
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
804 return codemasters_write(2, vcontext, value);
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
805 }
26597f9805b4 Initial Codemasters mapper support
Michael Pavone <pavone@retrodev.com>
parents: 2321
diff changeset
806
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
807 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
808 {
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
809 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
810 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
811 {
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
812 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
813 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
814 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
815 } 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
816 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
817 } 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
818 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
819 }
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
820 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
821 }
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
822 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
823 }
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
824
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
825 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
826 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
827 z80_context *z80 = vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
828 sms_context *sms = z80->system;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
829 if (!location) {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
830 return sms->start_button_region;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
831 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
832 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
833 return 0xFF;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
834 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
835 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
836
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
837 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
838 {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
839 //TODO: implement link port
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
840 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
841 }
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
842 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
843 {
2196
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
844 z80_context *z80 = vcontext;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
845 sms_context *sms = z80->system;
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
846 psg_run(sms->psg, z80->Z80_CYCLE);
2648081f3100 Implement Game Gear PSG panning
Michael Pavone <pavone@retrodev.com>
parents: 2195
diff changeset
847 sms->psg->pan = value;
2527
7e1215d17571 Log Game Gear PSG Pan to VGM
Michael Pavone <pavone@retrodev.com>
parents: 2525
diff changeset
848 if (sms->psg->vgm) {
7e1215d17571 Log Game Gear PSG Pan to VGM
Michael Pavone <pavone@retrodev.com>
parents: 2525
diff changeset
849 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
850 }
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
851 return vcontext;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
852 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
853
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
854 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
855 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
856 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
857 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
858 i8255_write(location, sms->i8255, value, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
859 return vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
860 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
861
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
862 static uint8_t ppi_read(uint32_t location, void *vcontext)
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
863 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
864 z80_context *z80 = vcontext;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
865 sms_context *sms = z80->system;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
866 return i8255_read(location, sms->i8255, z80->Z80_CYCLE);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
867 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
868
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
869 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
870 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
871 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
872 sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
873 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
874 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
875
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
876 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
877 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
878 //TODO: "corrupt" PPI value by VDP value
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
879 vdp_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
880 return ppi_read(location, vcontext);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
881 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
882
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
883 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
884 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
885 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
886 return sms_psg_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
887 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
888
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
889 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
890 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
891 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
892 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
893 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
894
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
895 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
896 {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
897 vdp_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
898 return ppi_write(location, vcontext, value);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
899 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
900
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
901 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
902 {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
903 {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
904 {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
905 {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
906 };
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
907
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
908 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
909 {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
910 {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
911 {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
912 {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
913 {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
914 {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
915 };
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
916
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
917 static memmap_chunk io_sc[] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
918 {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
919 {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
920 {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
921 {0x60, 0x80, 0xFF, .write_8 = sms_psg_write},
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
922 {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
923 {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
924 {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
925 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
926
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
927 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
928 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
929 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
930 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
931 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
932
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
933 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
934 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
935
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
936 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
937 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
938 start_section(buf, SECTION_Z80);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
939 z80_serialize(sms->z80, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
940 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
941
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
942 start_section(buf, SECTION_VDP);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
943 vdp_serialize(sms->vdp, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
944 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
945
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
946 start_section(buf, SECTION_PSG);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
947 psg_serialize(sms->psg, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
948 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
949
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
950 start_section(buf, SECTION_SEGA_IO_1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
951 io_serialize(sms->io.ports, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
952 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
953
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
954 start_section(buf, SECTION_SEGA_IO_2);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
955 io_serialize(sms->io.ports + 1, buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
956 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
957
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
958 start_section(buf, SECTION_MAIN_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
959 save_int8(buf, sizeof(sms->ram) / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
960 save_buffer8(buf, sms->ram, sizeof(sms->ram));
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
961 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
962
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
963 start_section(buf, SECTION_MAPPER);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
964 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
965 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
966 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
967
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
968 start_section(buf, SECTION_CART_RAM);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
969 save_int8(buf, SMS_CART_RAM_SIZE / 1024);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
970 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
971 end_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
972 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
973
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
974 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
975 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
976 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
977 serialize_buffer state;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
978 init_serialize(&state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
979 sms_serialize(sms, &state);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
980 if (size_out) {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
981 *size_out = state.size;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
982 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
983 return state.data;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
984 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
985
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
986 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
987 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
988 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
989 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
990 if (ram_size > sizeof(sms->ram)) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
991 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
992 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
993 load_buffer8(buf, sms->ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
994 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
995
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
996 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
997 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
998 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
999 uint32_t ram_size = load_int8(buf) * 1024;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1000 if (ram_size > SMS_CART_RAM_SIZE) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1001 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
1002 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1003 load_buffer8(buf, sms->cart_ram, ram_size);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1004 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1005
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1006 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
1007 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1008 sms_context *sms = vsms;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1009 uint8_t mapper_type = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1010 if (mapper_type != 1) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1011 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
1012 return;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1013 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1014 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
1015 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1016 sms->bank_regs[i] = load_int8(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1017 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
1018 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1019 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1020
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1021 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
1022 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1023 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
1024 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
1025 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
1026 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
1027 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
1028 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
1029 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
1030 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
1031 //TODO: cart RAM
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1032 while (buf->cur_pos < buf->size)
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1033 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1034 load_section(buf);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1035 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1036 z80_invalidate_code_range(sms->z80, 0xC000, 0x10000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1037 if (sms->bank_regs[0] & 8) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1038 //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
1039 z80_invalidate_code_range(sms->z80, 0x8000, 0xC000);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1040 }
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1041 free(buf->handlers);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1042 buf->handlers = NULL;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1043 }
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1044
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1045 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
1046 {
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1047 sms_context *sms = (sms_context *)sys;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1048 deserialize_buffer buffer;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1049 init_deserialize(&buffer, data, size);
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1050 sms_deserialize(&buffer, sms);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1051 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1052
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1053 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
1054 {
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
1055 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
1056 serialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1057 init_serialize(&state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1058 sms_serialize(sms, &state);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1059 save_to_file(&state, save_path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1060 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
1061 free(save_path);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1062 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1063 }
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 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
1066 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1067 deserialize_buffer state;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1068 uint8_t ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1069 if ((ret = load_from_file(&state, path))) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1070 sms_deserialize(&state, sms);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1071 free(state.data);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1072 printf("Loaded %s\n", path);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1073 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1074 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1075 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1076
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1077 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
1078 {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1079 sms_context *sms = (sms_context *)system;
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1080 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
1081 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
1082 #ifndef NEW_CORE
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1083 if (!sms->z80->native_pc) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1084 ret = get_modification_time(statepath) != 0;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1085 if (ret) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1086 system->delayed_load_slot = slot + 1;
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1087 }
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1088 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
1089
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1090 }
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
1091 #endif
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1092 ret = load_state_path(sms, statepath);
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1093 done:
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1094 free(statepath);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1095 return ret;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1096 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1097
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
1098 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
1099 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1100 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
1101 uint32_t target_cycle = sms->z80->Z80_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
1102 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
1103 {
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1104 if (system->delayed_load_slot) {
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1105 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
1106 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
1107
1480
8464a3f09b94 Get SMS savestates working in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1478
diff changeset
1108 }
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1109 if (sms->vdp->frame != sms->last_frame) {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1110 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1111 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1112 scope_render(sms->psg->scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1113 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1114 #endif
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1115 uint32_t elapsed = sms->vdp->frame - sms->last_frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1116 sms->last_frame = sms->vdp->frame;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1117 if (system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1118 if (elapsed >= system->enter_debugger_frames) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1119 system->enter_debugger_frames = 0;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1120 system->enter_debugger = 1;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1121 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1122 system->enter_debugger_frames -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1123 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1124 }
2194
01ff005b08f6 Very rudimentary support for Game Gear VDP emulation
Michael Pavone <pavone@retrodev.com>
parents: 2179
diff changeset
1125
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1126 if(exit_after){
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1127 if (elapsed >= exit_after) {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1128 exit(0);
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1129 } else {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1130 exit_after -= elapsed;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1131 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1132 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2134
diff changeset
1133 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1134 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1135 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
1136 if (!sms->z80->wp_hit) {
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1137 system->enter_debugger = 0;
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1138 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1139 #ifndef IS_LIB
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1140 zdebugger(sms->z80, sms->z80->pc);
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1141 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1142 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1143 #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
1144 #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
1145 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
1146 #else
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1147 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
1148 #endif
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1149 uint32_t nmi = vdp_next_nmi(sms->vdp);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1150 if (nmi != CYCLE_NEVER) {
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1151 z80_assert_nmi(sms->z80, nmi);
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1152 }
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1153 }
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1154
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1155 #ifndef NEW_CORE
2424
767ec72acca7 Avoid conflicts between watchpoints and normal debugger entry
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1156 if (system->enter_debugger || sms->z80->wp_hit) {
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1157 target_cycle = sms->z80->Z80_CYCLE + 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2384
diff changeset
1158 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2424
diff changeset
1159 #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
1160 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
1161 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
1162 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
1163 }
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
1164 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
1165 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
1166 psg_run(sms->psg, target_cycle);
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1167 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
1168
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1169 if (system->save_state) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1170 while (!sms->z80->pc) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1171 //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
1172 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
1173 }
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1174 save_state(sms, system->save_state - 1);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1175 system->save_state = 0;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1176 }
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
1177
1377
e587f16e7d3d Implemented SMS pause button
Michael Pavone <pavone@retrodev.com>
parents: 1371
diff changeset
1178 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
1179 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
1180 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
1181 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
1182 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
1183 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
1184 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
1185 sms->psg->cycles -= adjust;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1186 sms->cassette_cycle -= adjust;
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1187 if (sms->last_paste_cycle > adjust) {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1188 sms->last_paste_cycle -= adjust;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1189 } else {
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1190 sms->last_paste_cycle = 0;
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1191 }
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1192 if (sms->psg->vgm) {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1193 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
1194 }
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
1195 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
1196 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1197 }
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
1198 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
1199 bindings_release_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
1200 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
1201 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
1202 }
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
1203 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
1204 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1205
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
1206 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
1207 {
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
1208 sms_context *sms = (sms_context *)system;
1980
81df9aa2de9b Less hacky run on audio thread mode
Michael Pavone <pavone@retrodev.com>
parents: 1932
diff changeset
1209 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
1210 sms->header.force_release = 0;
2600
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1211 //TODO: PAL support
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1212 if (sms->vdp->type == VDP_GAMEGEAR) {
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1213 render_set_video_standard(VID_GAMEGEAR);
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1214 } else {
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1215 render_set_video_standard(VID_NTSC);
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1216 }
1932
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
1217 bindings_reacquire_capture();
b387f1c5a1d0 WIP new sync mode that runs emulation on audio thread
Michael Pavone <pavone@retrodev.com>
parents: 1906
diff changeset
1218 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
1219 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
1220 }
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
1221 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
1222 }
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
1223
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
1224 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
1225 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1226 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
1227
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1228 z80_assert_reset(sms->z80, 0);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1229 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
1230
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1231 if (statefile) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1232 load_state_path(sms, statefile);
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1233 }
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
1234
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1235 if (system->enter_debugger) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1236 system->enter_debugger = 0;
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1237 #ifndef IS_LIB
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1238 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
1239 #endif
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1126
diff changeset
1240 }
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
1241
2600
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1242 //TODO: PAL support
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1243 if (sms->vdp->type == VDP_GAMEGEAR) {
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1244 render_set_video_standard(VID_GAMEGEAR);
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1245 } else {
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1246 render_set_video_standard(VID_NTSC);
251cc75574af Basic emscripten support
Michael Pavone <pavone@retrodev.com>
parents: 2544
diff changeset
1247 }
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
1248 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
1249 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1250
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
1251 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
1252 {
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
1253 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
1254 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
1255 #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
1256 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
1257 #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
1258 }
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
1259
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
1260 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
1261 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1262 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
1263 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
1264 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
1265 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
1266 psg_free(sms->psg);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1267 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
1268 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
1269 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1270
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1271 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
1272 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1273 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
1274 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1275
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1276 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
1277 {
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1278 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
1279 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
1280 #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
1281 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
1282 #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
1283 }
928a65750345 Initial support for Genesis/Megadrive PBC mode. VDP still needs Mode 4 to be useful.
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1284
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1285 static void inc_debug_mode(system_header *system)
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1286 {
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1287 sms_context *sms = (sms_context *)system;
1643
6909c5d0bbb5 Removed old VDP debug functionality
Michael Pavone <pavone@retrodev.com>
parents: 1640
diff changeset
1288 vdp_inc_debug_mode(sms->vdp);
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1289 }
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1290
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
1291 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
1292 {
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
1293 //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
1294 }
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
1295
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
1296 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
1297 {
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
1298 //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
1299 }
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
1300
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1301 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
1302 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1303 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
1304 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
1305 if (button == MAIN_UNIT_PAUSE) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1306 vdp_pbc_pause(sms->vdp);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1307 }
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1308 } 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
1309 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
1310 } else {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1311 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
1312 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1313 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1314
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1315 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
1316 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1317 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
1318 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
1319 sms->start_button_region |= 0x80;
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1320 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1321 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
1322 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1323 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1324
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1325 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
1326 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1327 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
1328 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
1329 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1330
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1331 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
1332 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1333 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
1334 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
1335 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1336
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1337 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
1338 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1339 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
1340 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
1341 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1342
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1343 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
1344 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1345 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
1346 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
1347 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1348
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1349 uint16_t scancode_map[0x90] = {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1350 [0x1C] = 0x0004,//A
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1351 [0x32] = 0x4008,//B
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1352 [0x21] = 0x2008,//C
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1353 [0x23] = 0x2004,//D
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1354 [0x24] = 0x2002,//E
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1355 [0x2B] = 0x3004,//F
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1356 [0x34] = 0x4004,//G
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1357 [0x33] = 0x5004,//H
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1358 [0x43] = 0x0080,//I
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1359 [0x3B] = 0x6004,//J
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1360 [0x42] = 0x0040,//K
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1361 [0x4B] = 0x1040,//L
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1362 [0x3A] = 0x6008,//M
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1363 [0x31] = 0x5008,//N
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1364 [0x44] = 0x1080,//O
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1365 [0x4D] = 0x2080,//P
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1366 [0x15] = 0x0002,//Q
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1367 [0x2D] = 0x3002,//R
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1368 [0x1B] = 0x1004,//S
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1369 [0x2C] = 0x4002,//T
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1370 [0x3C] = 0x6002,//U
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1371 [0x2A] = 0x3008,//V
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1372 [0x1D] = 0x1002,//W
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1373 [0x22] = 0x1008,//X
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1374 [0x35] = 0x5002,//Y
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1375 [0x1A] = 0x0008,//Z
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1376 [0x16] = 0x0001,//1
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1377 [0x1E] = 0x1001,//2
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1378 [0x26] = 0x2001,//3
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1379 [0x25] = 0x3001,//4
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1380 [0x2E] = 0x4001,//5
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1381 [0x36] = 0x5001,//6
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1382 [0x3D] = 0x6001,//7
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1383 [0x3E] = 0x0100,//8
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1384 [0x46] = 0x1100,//9
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1385 [0x45] = 0x2100,//0
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1386 [0x5A] = 0x5040,//return
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1387 [0x29] = 0x1010,//space
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1388 [0x0D] = 0x5800,//tab mapped to FUNC
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1389 [0x66] = 0x3010,//backspace mapped to INS/DEL
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1390 [0x4E] = 0x3100,// -
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1391 [0x55] = 0x4100,// = mapped to ^ based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1392 [0x54] = 0x4080,// [
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1393 [0x5B] = 0x4040,// ]
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1394 [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
1395 [0x4C] = 0x2040,// ;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1396 [0x52] = 0x3040,// ' mapped to : based on position
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1397 [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
1398 [0x41] = 0x0020,// ,
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1399 [0x49] = 0x1020,// .
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1400 [0x4A] = 0x2020,// /
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1401 [0x14] = 0x6400,//lctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1402 //rctrl is default keybind for toggle keyboard capture
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1403 //[0x18] = 0x6400,//rctrl mapped to ctrl
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1404 [0x12] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1405 [0x59] = 0x6800,//lshift mapped to shift
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1406 [0x11] = 0x6200,//lalt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1407 [0x17] = 0x6200,//ralt mapped to GRAPH
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1408 [0x81] = 0x0010,//insert mapped to kana/dieresis key
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1409 [0x86] = 0x5020,//left arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1410 [0x87] = 0x2010,//home mapped to HOME/CLR
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1411 [0x88] = 0x6100,//end mapped to BREAK
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1412 [0x89] = 0x6040,//up arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1413 [0x8A] = 0x4020,//down arrow
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1414 [0x8D] = 0x6020,//right arrow
2532
f4a471730ba4 Implement clipboard paste for SC-3000
Michael Pavone <pavone@retrodev.com>
parents: 2529
diff changeset
1415 [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
1416 };
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1417
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1418 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
1419 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1420 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
1421 io_keyboard_down(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1422 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1423 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1424 sms->keystate[row] &= ~(scancode_map[scancode] & 0xFFF);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1425 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1426 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1427
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1428 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
1429 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1430 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
1431 io_keyboard_up(&sms->io, scancode);
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1432 if (sms->keystate && scancode < 0x90 && scancode_map[scancode]) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1433 uint16_t row = scancode_map[scancode] >> 12;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1434 sms->keystate[row] |= scancode_map[scancode] & 0xFFF;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1435 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1436 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1555
diff changeset
1437
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1438 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
1439 {
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1440 char *config_gain;
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1441 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
1442 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
1443 }
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1444
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1445 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
1446 {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1447 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
1448 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
1449 //sample rate may have changed
03e6ac327ba0 Handle changes to sample rate while content is running
Michael Pavone <pavone@retrodev.com>
parents: 2325
diff changeset
1450 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
1451 }
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1452
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1453 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
1454 {
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1455 #ifndef IS_LIB
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1456 sms_context *sms = (sms_context *)system;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1457 if (debug_view < DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1458 vdp_toggle_debug_view(sms->vdp, debug_view);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1459 } else if (debug_view == DEBUG_OSCILLOSCOPE) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1460 if (sms->psg->scope) {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1461 oscilloscope *scope = sms->psg->scope;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1462 sms->psg->scope = NULL;
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1463 scope_close(scope);
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1464 } else {
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1465 oscilloscope *scope = create_oscilloscope();
2256
cbe1ba70c247 Fix build after scope clock fix
Michael Pavone <pavone@retrodev.com>
parents: 2243
diff changeset
1466 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
1467 }
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1468 }
2302
0343f0d5add0 Fix libretro build for real
Michael Pavone <pavone@retrodev.com>
parents: 2293
diff changeset
1469 #endif
2243
0d1d5dccdd28 Initial implementation of oscilloscope debug view
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
1470 }
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1471
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1472 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
1473 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1474 sms->cassette = NULL;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1475 sms->cassette_state = TAPE_NONE;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1476 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
1477 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
1478 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1479 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1480 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
1481 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1482 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1483 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
1484 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1485 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1486 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
1487 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1488 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1489 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
1490 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1491 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1492 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
1493 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
1494 return;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1495 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1496 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
1497 sms->cassette_state = TAPE_STOPPED;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1498 sms->cassette_offset = data_sub_chunk;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1499 sms->cassette = media;
2544
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1500 sms->cassette_cycle = sms->z80->Z80_CYCLE;
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1501 }
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1502
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1503 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
1504 {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1505 sms_context *sms = (sms_context *)system;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1506 //TODO: 50 Hz support
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1507 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
1508 if (vgm) {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1509 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
1510 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
1511 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
1512 sms->header.vgm_logging = 1;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1513 } else {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1514 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
1515 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1516 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1517
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1518 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
1519 {
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1520 puts("Stopped VGM log");
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1521 sms_context *sms = (sms_context *)system;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1522 vgm_close(sms->psg->vgm);
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1523 sms->psg->vgm = NULL;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1524 sms->header.vgm_logging = 0;
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1525 }
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1526
2544
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1527 static void lockon_change(system_header *system, system_media *media)
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1528 {
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1529 sms_context *sms = (sms_context *)system;
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1530 load_cassette(sms, media);
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1531 }
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1532
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1533 sms_context *alloc_configure_sms(system_media *media, system_type stype, uint32_t opts, uint8_t force_region)
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1534 {
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
1535 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
1536 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
1537 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
1538 {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
1539 };
2320
8016dbb0fcde Initial work on ROM DB support for SMS/GG games
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
1540 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
1541 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
1542 z80_options *zopts = malloc(sizeof(z80_options));
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1543 tern_node *model_def;
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1544 uint8_t vdp_type = VDP_SMS2;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1545 switch (stype)
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1546 {
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1547 case SYSTEM_GAME_GEAR:
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1548 model_def = tern_find_node(get_systems_config(), "gg");
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1549 vdp_type = VDP_GAMEGEAR;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1550 break;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1551 case SYSTEM_SG1000:
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1552 model_def = tern_find_node(get_systems_config(), "sg1000");
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1553 vdp_type = VDP_TMS9918A;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1554 break;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1555 case SYSTEM_SC3000:
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1556 model_def = tern_find_node(get_systems_config(), "sc3000");
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1557 vdp_type = VDP_TMS9918A;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1558 break;
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1559 default:
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1560 model_def = get_model(config, SYSTEM_SMS);
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1561 break;
2257
1e626d0ecf9c WIP SG-1000/TMS9918A mode support
Michael Pavone <pavone@retrodev.com>
parents: 2256
diff changeset
1562 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1563 char *vdp_str = tern_find_ptr(model_def, "vdp");
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1564 if (vdp_str) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1565 if (!strcmp(vdp_str, "sms1")) {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1566 vdp_type = VDP_SMS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1567 } 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
1568 vdp_type = VDP_SMS2;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1569 } 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
1570 vdp_type = VDP_TMS9918A;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1571 } 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
1572 vdp_type = VDP_GAMEGEAR;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1573 } 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
1574 vdp_type = VDP_GENESIS;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1575 } else {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1576 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
1577 }
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1578 }
2321
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1579 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
1580 {
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1581 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
1582 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
1583 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
1584 }
2eda5f81f91e More fully baked ROM db support for SMS
Michael Pavone <pavone@retrodev.com>
parents: 2320
diff changeset
1585 }
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1586 uint8_t is_gamegear = stype == SYSTEM_GAME_GEAR, is_sc3000 = stype == SYSTEM_SC3000;
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1587 char *io_type = tern_find_ptr(model_def, "io");
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1588 if (io_type) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1589 if (!strcmp(io_type, "gamegear")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1590 is_gamegear = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1591 is_sc3000 = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1592 } else if (!strcmp(io_type, "i8255")) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1593 is_gamegear = 0;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1594 is_sc3000 = 1;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1595 }
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1596 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2200
diff changeset
1597 if (is_gamegear) {
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1598 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
1599 sms->start_button_region = 0xC0;
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1600 } else if (is_sc3000) {
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1601 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
1602 for (int i = 0; i < 7; i++)
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1603 {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1604 sms->keystate[i] = 0xFFF;
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1605 }
2521
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1606 sms->i8255 = calloc(1, sizeof(i8255));
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1607 i8255_init(sms->i8255, i8255_output_updated, i8255_input_poll);
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1608 sms->i8255->system = sms;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1609 sms->kb_mux = 7;
8cf7cadc17ee Initial SC-3000 support
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
1610 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
1611 } else {
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1612 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
1613 }
2528
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1614 if (is_sc3000 && media->chain) {
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1615 load_cassette(sms, media->chain);
90a40be940f7 Implement read-only SC-3000 cassette support
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1616 }
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
1617 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
1618 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
1619 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
1620
1201
aee2177a1630 Use filename for game title in SMS mode
Michael Pavone <pavone@retrodev.com>
parents: 1184
diff changeset
1621 sms->rom = media->buffer;
1141
7e199bebde2f Initial support for Sega's family of SMS mappers
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1622 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
1623 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
1624 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
1625 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
1626 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
1627 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
1628 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
1629 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
1630 }
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
1631
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
1632 //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
1633 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
1634
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
1635 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
1636 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
1637
1796
51417bb557b6 Configurable gain for overall output and individual components
Michael Pavone <pavone@retrodev.com>
parents: 1759
diff changeset
1638 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
1639
2195
40290a923886 Implement Game Gear start button and region register
Michael Pavone <pavone@retrodev.com>
parents: 2194
diff changeset
1640 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
1641 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
1642
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
1643 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
1644 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
1645
2293
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1646 tern_node *io_config_root = config;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1647 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
1648 if (sms_root) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1649 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
1650 if (io) {
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1651 io_config_root = sms_root;
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1652 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1653 }
3e0d463eb9b3 Actually use SMS specific controller config
Michael Pavone <pavone@retrodev.com>
parents: 2257
diff changeset
1654 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
1655 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
1656
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
1657 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
1658 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
1659 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
1660 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
1661 sms->header.persist_save = persist_save;
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1401
diff changeset
1662 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
1663 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
1664 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
1665 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
1666 sms->header.soft_reset = soft_reset;
1120
e9369d6f0101 Somewhat broken implementation of Mode 4
Michael Pavone <pavone@retrodev.com>
parents: 1119
diff changeset
1667 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
1668 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
1669 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
1670 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
1671 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
1672 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
1673 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
1674 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
1675 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
1676 sms->header.config_updated = config_updated;
1690
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1677 sms->header.serialize = serialize;
319d90025d50 Implement serialization/deserialization in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1688
diff changeset
1678 sms->header.deserialize = deserialize;
2525
1843adbe9899 Support VGM logging for Sega 8-bit systems
Michael Pavone <pavone@retrodev.com>
parents: 2521
diff changeset
1679 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
1680 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
1681 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
1682 sms->header.cassette_action = cassette_action;
2604
c768bbd912f1 Give sega 8-bit consoles separate system_type enum values and allow selecting them from the command line
Michael Pavone <pavone@retrodev.com>
parents: 2600
diff changeset
1683 sms->header.type = stype;
2544
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1684 if (is_sc3000) {
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1685 sms->header.lockon_change = lockon_change;
99e59fdddbc3 Better cassette tape UX
Michael Pavone <pavone@retrodev.com>
parents: 2542
diff changeset
1686 }
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
1687
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
1688 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
1689 }