fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/arch/rc759/msg.c *
7 * Created: 2012-06-29 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2012-2021 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include "main.h"
24#include "rc759.h"
25
26#include <string.h>
27
28#include <drivers/block/block.h>
29
30#include <lib/inidsk.h>
31#include <lib/log.h>
32#include <lib/monitor.h>
33#include <lib/msg.h>
34#include <lib/msgdsk.h>
35#include <lib/sysdep.h>
36
37
38extern monitor_t par_mon;
39
40
41typedef struct {
42 const char *msg;
43
44 int (*set_msg) (rc759_t *sim, const char *msg, const char *val);
45} rc759_msg_list_t;
46
47
48static
49int rc759_set_msg_disk_eject (rc759_t *sim, const char *msg, const char *val)
50{
51 if (msg_dsk_get_disk_id (val, &sim->disk_id)) {
52 return (1);
53 }
54
55 rc759_fdc_eject_disk (&sim->fdc, sim->disk_id);
56
57 msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id);
58
59 return (0);
60}
61
62static
63int rc759_set_msg_disk_insert (rc759_t *sim, const char *msg, const char *val)
64{
65 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) {
66 rc759_fdc_eject_disk (&sim->fdc, sim->disk_id);
67 }
68
69 if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) {
70 return (1);
71 }
72
73 rc759_fdc_insert_disk (&sim->fdc, sim->disk_id);
74
75 return (0);
76}
77
78static
79int rc759_set_msg_emu_config_save (rc759_t *sim, const char *msg, const char *val)
80{
81 if (ini_write (val, sim->cfg)) {
82 return (1);
83 }
84
85 return (0);
86}
87
88static
89int rc759_set_msg_emu_cpu_speed (rc759_t *sim, const char *msg, const char *val)
90{
91 unsigned f;
92
93 if (msg_get_uint (val, &f)) {
94 return (1);
95 }
96
97 rc759_set_speed (sim, f);
98
99 return (0);
100}
101
102static
103int rc759_set_msg_emu_cpu_speed_step (rc759_t *sim, const char *msg, const char *val)
104{
105 int v;
106 unsigned speed;
107
108 if (msg_get_sint (val, &v)) {
109 return (1);
110 }
111
112 speed = sim->speed;
113
114 if (v > 0) {
115 speed = sim->speed + v;
116 }
117 else {
118 speed = -v;
119 speed = (-v < sim->speed) ? (sim->speed - -v) : 1;
120 }
121
122 rc759_set_speed (sim, speed);
123
124 return (0);
125}
126
127static
128int rc759_set_msg_emu_exit (rc759_t *sim, const char *msg, const char *val)
129{
130 sim->brk = PCE_BRK_ABORT;
131 mon_set_terminate (&par_mon, 1);
132 return (0);
133}
134
135static
136int rc759_set_msg_emu_parport1_driver (rc759_t *sim, const char *msg, const char *val)
137{
138 if (rc759_set_parport_driver (sim, 0, val)) {
139 return (1);
140 }
141
142 return (0);
143}
144
145static
146int rc759_set_msg_emu_parport1_file (rc759_t *sim, const char *msg, const char *val)
147{
148 if (rc759_set_parport_file (sim, 0, val)) {
149 return (1);
150 }
151
152 return (0);
153}
154
155static
156int rc759_set_msg_emu_parport2_driver (rc759_t *sim, const char *msg, const char *val)
157{
158 if (rc759_set_parport_driver (sim, 1, val)) {
159 return (1);
160 }
161
162 return (0);
163}
164
165static
166int rc759_set_msg_emu_parport2_file (rc759_t *sim, const char *msg, const char *val)
167{
168 if (rc759_set_parport_file (sim, 1, val)) {
169 return (1);
170 }
171
172 return (0);
173}
174
175static
176int rc759_set_msg_emu_pause (rc759_t *sim, const char *msg, const char *val)
177{
178 int v;
179
180 if (msg_get_bool (val, &v)) {
181 return (1);
182 }
183
184 sim->pause = v;
185
186 rc759_clock_discontinuity (sim);
187
188 return (0);
189}
190
191static
192int rc759_set_msg_emu_pause_toggle (rc759_t *sim, const char *msg, const char *val)
193{
194 sim->pause = !sim->pause;
195
196 rc759_clock_discontinuity (sim);
197
198 return (0);
199}
200
201static
202int rc759_set_msg_emu_reset (rc759_t *sim, const char *msg, const char *val)
203{
204 rc759_reset (sim);
205 return (0);
206}
207
208static
209int rc759_set_msg_emu_stop (rc759_t *sim, const char *msg, const char *val)
210{
211 sim->brk = PCE_BRK_STOP;
212 return (0);
213}
214
215
216static rc759_msg_list_t set_msg_list[] = {
217 { "disk.eject", rc759_set_msg_disk_eject },
218 { "disk.insert", rc759_set_msg_disk_insert },
219 { "emu.config.save", rc759_set_msg_emu_config_save },
220 { "emu.cpu.speed", rc759_set_msg_emu_cpu_speed },
221 { "emu.cpu.speed.step", rc759_set_msg_emu_cpu_speed_step },
222 { "emu.exit", rc759_set_msg_emu_exit },
223 { "emu.parport1.driver", rc759_set_msg_emu_parport1_driver },
224 { "emu.parport1.file", rc759_set_msg_emu_parport1_file },
225 { "emu.parport2.driver", rc759_set_msg_emu_parport2_driver },
226 { "emu.parport2.file", rc759_set_msg_emu_parport2_file },
227 { "emu.pause", rc759_set_msg_emu_pause },
228 { "emu.pause.toggle", rc759_set_msg_emu_pause_toggle },
229 { "emu.reset", rc759_set_msg_emu_reset },
230 { "emu.stop", rc759_set_msg_emu_stop },
231 { NULL, NULL }
232};
233
234
235int rc759_set_msg (rc759_t *sim, const char *msg, const char *val)
236{
237 int r;
238 rc759_msg_list_t *lst;
239
240 /* a hack, for debugging only */
241 if (sim == NULL) {
242 sim = par_sim;
243 }
244
245 if (msg == NULL) {
246 return (1);
247 }
248
249 if (val == NULL) {
250 val = "";
251 }
252
253 lst = set_msg_list;
254
255 while (lst->msg != NULL) {
256 if (msg_is_message (lst->msg, msg)) {
257 return (lst->set_msg (sim, msg, val));
258 }
259
260 lst += 1;
261 }
262
263 if ((r = msg_dsk_set_msg (msg, val, sim->dsks, &sim->disk_id)) >= 0) {
264 return (r);
265 }
266
267 if (sim->trm != NULL) {
268 r = trm_set_msg_trm (sim->trm, msg, val);
269
270 if (r >= 0) {
271 return (r);
272 }
273 }
274
275 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val);
276
277 return (1);
278}