annotate sms.c @ 2535:0c6519125a28

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