fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/arch/macplus/msg.c *
7 * Created: 2007-12-04 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2007-2020 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 "macplus.h"
25#include "msg.h"
26
27#include <string.h>
28
29#include <lib/log.h>
30#include <lib/monitor.h>
31#include <lib/msg.h>
32#include <lib/msgdsk.h>
33#include <lib/sysdep.h>
34
35
36extern monitor_t par_mon;
37
38
39typedef struct {
40 const char *msg;
41
42 int (*set_msg) (macplus_t *sim, const char *msg, const char *val);
43} mac_msg_list_t;
44
45
46static
47int mac_set_msg_disk_eject (macplus_t *sim, const char *msg, const char *val)
48{
49 if (msg_dsk_get_disk_id (val, &sim->disk_id)) {
50 return (1);
51 }
52
53 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) {
54 mac_iwm_flush_disk (&sim->iwm, sim->disk_id);
55 }
56
57 return (msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id));
58}
59
60static
61int mac_set_msg_disk_insert (macplus_t *sim, const char *msg, const char *val)
62{
63 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) {
64 mac_iwm_flush_disk (&sim->iwm, sim->disk_id);
65 }
66
67 if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) {
68 return (1);
69 }
70
71 mac_iwm_insert_disk (&sim->iwm, sim->disk_id);
72
73 return (0);
74}
75
76static
77int mac_set_msg_emu_cpu_model (macplus_t *sim, const char *msg, const char *val)
78{
79 if (mac_set_cpu_model (sim, val)) {
80 pce_log (MSG_ERR, "unknown CPU model (%s)\n", val);
81 return (1);
82 }
83
84 return (0);
85}
86
87static
88int mac_set_msg_emu_cpu_speed (macplus_t *sim, const char *msg, const char *val)
89{
90 unsigned f;
91
92 if (msg_get_uint (val, &f)) {
93 return (1);
94 }
95
96 mac_set_speed (sim, PCE_MAC_SPEED_USER, f);
97
98 return (0);
99}
100
101static
102int mac_set_msg_emu_cpu_speed_step (macplus_t *sim, const char *msg, const char *val)
103{
104 int v;
105
106 if (msg_get_sint (val, &v)) {
107 return (1);
108 }
109
110 v += (int) sim->speed_factor;
111
112 if (v <= 0) {
113 v = 1;
114 }
115
116 mac_set_speed (sim, PCE_MAC_SPEED_USER, v);
117
118 return (0);
119}
120
121static
122int mac_set_msg_emu_exit (macplus_t *sim, const char *msg, const char *val)
123{
124 sim->brk = PCE_BRK_ABORT;
125
126 mon_set_terminate (&par_mon, 1);
127
128 return (0);
129}
130
131static
132int mac_set_msg_emu_mac_insert (macplus_t *sim, const char *msg, const char *val)
133{
134 unsigned drv;
135
136 if (strcmp (val, "") == 0) {
137 if (sim->sony.enable) {
138 mac_sony_insert (&sim->sony, 1);
139 mac_sony_insert (&sim->sony, 2);
140 mac_sony_insert (&sim->sony, 3);
141 }
142 }
143 else {
144 if (msg_get_uint (val, &drv)) {
145 return (1);
146 }
147
148 if (sim->sony.enable) {
149 mac_sony_insert (&sim->sony, drv);
150 }
151 else {
152 mac_iwm_insert (&sim->iwm, (drv > 0) ? (drv - 1) : 0);
153 }
154 }
155
156 return (0);
157}
158
159static
160int mac_set_msg_emu_pause (macplus_t *sim, const char *msg, const char *val)
161{
162 int v;
163
164 if (msg_get_bool (val, &v)) {
165 return (1);
166 }
167
168 mac_set_pause (sim, v);
169
170 return (0);
171}
172
173static
174int mac_set_msg_emu_pause_toggle (macplus_t *sim, const char *msg, const char *val)
175{
176 mac_set_pause (sim, !sim->pause);
177
178 return (0);
179}
180
181static
182int mac_set_msg_emu_realtime (macplus_t *sim, const char *msg, const char *val)
183{
184 int v;
185
186 if (msg_get_bool (val, &v)) {
187 return (1);
188 }
189
190 mac_set_speed (sim, PCE_MAC_SPEED_USER, v ? 1 : 0);
191
192 return (0);
193}
194
195static
196int mac_set_msg_emu_realtime_toggle (macplus_t *sim, const char *msg, const char *val)
197{
198 if (sim->speed_limit[0] > 0) {
199 mac_set_speed (sim, PCE_MAC_SPEED_USER, 0);
200 }
201 else {
202 mac_set_speed (sim, PCE_MAC_SPEED_USER, 1);
203 }
204
205 return (0);
206}
207
208static
209int mac_set_msg_emu_reset (macplus_t *sim, const char *msg, const char *val)
210{
211 mac_reset (sim);
212
213 return (0);
214}
215
216static
217int mac_set_msg_emu_ser1_driver (macplus_t *sim, const char *msg, const char *val)
218{
219 if (mac_ser_set_driver (&sim->ser[0], val)) {
220 return (1);
221 }
222
223 return (0);
224}
225
226static
227int mac_set_msg_emu_ser1_file (macplus_t *sim, const char *msg, const char *val)
228{
229 if (mac_ser_set_file (&sim->ser[0], val)) {
230 return (1);
231 }
232
233 return (0);
234}
235
236static
237int mac_set_msg_emu_ser1_multi (macplus_t *sim, const char *msg, const char *val)
238{
239 unsigned v;
240
241 if (msg_get_uint (val, &v)) {
242 return (1);
243 }
244
245 e8530_set_multichar (&sim->scc, 0, v, v);
246
247 return (0);
248}
249
250static
251int mac_set_msg_emu_ser2_driver (macplus_t *sim, const char *msg, const char *val)
252{
253 if (mac_ser_set_driver (&sim->ser[1], val)) {
254 return (1);
255 }
256
257 return (0);
258}
259
260static
261int mac_set_msg_emu_ser2_file (macplus_t *sim, const char *msg, const char *val)
262{
263 if (mac_ser_set_file (&sim->ser[1], val)) {
264 return (1);
265 }
266
267 return (0);
268}
269
270static
271int mac_set_msg_emu_ser2_multi (macplus_t *sim, const char *msg, const char *val)
272{
273 unsigned v;
274
275 if (msg_get_uint (val, &v)) {
276 return (1);
277 }
278
279 e8530_set_multichar (&sim->scc, 1, v, v);
280
281 return (0);
282}
283
284static
285int mac_set_msg_emu_stop (macplus_t *sim, const char *msg, const char *val)
286{
287 mac_set_msg_trm (sim, "term.release", "1");
288
289 sim->brk = PCE_BRK_STOP;
290
291 return (0);
292}
293
294static
295int mac_set_msg_emu_video_brightness (macplus_t *sim, const char *msg, const char *val)
296{
297 unsigned br;
298
299 if (msg_get_uint (val, &br)) {
300 return (1);
301 }
302
303 if (br >= 1000) {
304 br = 255;
305 }
306 else {
307 br = (256UL * br) / 1000;
308 }
309
310 mac_video_set_brightness (sim->video, br);
311
312 return (0);
313}
314
315
316static mac_msg_list_t set_msg_list[] = {
317 { "disk.eject", mac_set_msg_disk_eject },
318 { "disk.insert", mac_set_msg_disk_insert },
319 { "emu.cpu.model", mac_set_msg_emu_cpu_model },
320 { "emu.cpu.speed", mac_set_msg_emu_cpu_speed },
321 { "emu.cpu.speed.step", mac_set_msg_emu_cpu_speed_step },
322 { "emu.exit", mac_set_msg_emu_exit },
323 { "emu.mac.insert", mac_set_msg_emu_mac_insert },
324 { "emu.pause", mac_set_msg_emu_pause },
325 { "emu.pause.toggle", mac_set_msg_emu_pause_toggle },
326 { "emu.realtime", mac_set_msg_emu_realtime },
327 { "emu.realtime.toggle", mac_set_msg_emu_realtime_toggle },
328 { "emu.reset", mac_set_msg_emu_reset },
329 { "emu.ser1.driver", mac_set_msg_emu_ser1_driver },
330 { "emu.ser1.file", mac_set_msg_emu_ser1_file },
331 { "emu.ser1.multi", mac_set_msg_emu_ser1_multi },
332 { "emu.ser2.driver", mac_set_msg_emu_ser2_driver },
333 { "emu.ser2.file", mac_set_msg_emu_ser2_file },
334 { "emu.ser2.multi", mac_set_msg_emu_ser2_multi },
335 { "emu.stop", mac_set_msg_emu_stop },
336 { "emu.video.brightness", mac_set_msg_emu_video_brightness },
337 { NULL, NULL }
338};
339
340
341int mac_set_msg (macplus_t *sim, const char *msg, const char *val)
342{
343 int r;
344 mac_msg_list_t *lst;
345
346 /* a hack, for debugging only */
347 if (sim == NULL) {
348 sim = par_sim;
349 }
350
351 if (msg == NULL) {
352 return (1);
353 }
354
355 if (val == NULL) {
356 val = "";
357 }
358
359 lst = set_msg_list;
360
361 while (lst->msg != NULL) {
362 if (msg_is_message (lst->msg, msg)) {
363 return (lst->set_msg (sim, msg, val));
364 }
365
366 lst += 1;
367 }
368
369 if ((r = msg_dsk_set_msg (msg, val, sim->dsks, &sim->disk_id)) >= 0) {
370 return (r);
371 }
372
373 if (sim->trm != NULL) {
374 if ((r = trm_set_msg_trm (sim->trm, msg, val)) >= 0) {
375 return (r);
376 }
377 }
378
379 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val);
380
381 return (1);
382}