fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/arch/atarist/msg.c *
7 * Created: 2011-03-17 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2011-2019 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 "atarist.h"
25#include "msg.h"
26#include "video.h"
27#include "viking.h"
28
29#include <string.h>
30
31#include <lib/inidsk.h>
32#include <lib/log.h>
33#include <lib/monitor.h>
34#include <lib/msg.h>
35#include <lib/msgdsk.h>
36#include <lib/string.h>
37#include <lib/sysdep.h>
38
39
40extern monitor_t par_mon;
41
42
43typedef struct {
44 const char *msg;
45
46 int (*set_msg) (atari_st_t *sim, const char *msg, const char *val);
47} st_msg_list_t;
48
49
50static
51int st_set_msg_disk_eject (atari_st_t *sim, const char *msg, const char *val)
52{
53 if (msg_dsk_get_disk_id (val, &sim->disk_id)) {
54 return (1);
55 }
56
57 st_fdc_eject_disk (&sim->fdc, sim->disk_id);
58
59 msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id);
60
61 return (0);
62}
63
64static
65int st_set_msg_disk_insert (atari_st_t *sim, const char *msg, const char *val)
66{
67 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) {
68 st_fdc_eject_disk (&sim->fdc, sim->disk_id);
69 }
70
71 if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) {
72 return (1);
73 }
74
75 st_fdc_insert_disk (&sim->fdc, sim->disk_id);
76
77 return (0);
78}
79
80static
81int st_set_msg_emu_cpu_model (atari_st_t *sim, const char *msg, const char *val)
82{
83 if (st_set_cpu_model (sim, val)) {
84 pce_log (MSG_ERR, "unknown CPU model (%s)\n", val);
85 return (1);
86 }
87
88 return (0);
89}
90
91static
92int st_set_msg_emu_cpu_speed (atari_st_t *sim, const char *msg, const char *val)
93{
94 unsigned f;
95
96 if (msg_get_uint (val, &f)) {
97 return (1);
98 }
99
100 st_set_speed (sim, f);
101
102 return (0);
103}
104
105static
106int st_set_msg_emu_cpu_speed_step (atari_st_t *sim, const char *msg, const char *val)
107{
108 int v;
109
110 if (msg_get_sint (val, &v)) {
111 return (1);
112 }
113
114 v += (int) sim->speed_factor;
115
116 if (v <= 0) {
117 v = 1;
118 }
119
120 st_set_speed (sim, v);
121
122 return (0);
123}
124
125static
126int st_set_msg_emu_exit (atari_st_t *sim, const char *msg, const char *val)
127{
128 sim->brk = PCE_BRK_ABORT;
129
130 mon_set_terminate (&par_mon, 1);
131
132 return (0);
133}
134
135static
136int set_fdc_ro_rw (atari_st_t *sim, const char *msg, const char *val, int wprot)
137{
138 unsigned i, drv, msk;
139
140 if ((*val == 0) || (strcmp (val, "all") == 0)) {
141 msk = 3;
142 }
143 else {
144 if (msg_get_uint (val, &drv)) {
145 return (1);
146 }
147
148 if (drv > 1) {
149 return (1);
150 }
151
152 msk = 1U << drv;
153 }
154
155 for (i = 0; i < 2; i++) {
156 if (msk & (1U << i)) {
157 pce_log (MSG_INF,
158 "setting drive %u to %s\n",
159 i, wprot ? "RO" : "RW"
160 );
161 st_fdc_set_wprot (&sim->fdc, i, wprot);
162 }
163 }
164
165 return (0);
166}
167
168static
169int st_set_msg_emu_fdc_ro (atari_st_t *sim, const char *msg, const char *val)
170{
171 return (set_fdc_ro_rw (sim, msg, val, 1));
172}
173
174static
175int st_set_msg_emu_fdc_rw (atari_st_t *sim, const char *msg, const char *val)
176{
177 return (set_fdc_ro_rw (sim, msg, val, 0));
178}
179
180static
181int st_set_msg_emu_midi_file (atari_st_t *sim, const char *msg, const char *val)
182{
183 return (st_smf_set_file (&sim->smf, val));
184}
185
186static
187int st_set_msg_emu_par_driver (atari_st_t *sim, const char *msg, const char *val)
188{
189 char_drv_t *drv;
190
191 if (*val == 0) {
192 drv = NULL;
193 }
194 else {
195 if ((drv = chr_open (val)) == NULL) {
196 return (1);
197 }
198 }
199
200 st_set_parport_drv (sim, drv);
201
202 return (0);
203}
204
205static
206int st_set_msg_emu_par_file (atari_st_t *sim, const char *msg, const char *val)
207{
208 int r;
209 char *driver;
210
211 if (*val == 0) {
212 st_set_parport_drv (sim, NULL);
213 return (0);
214 }
215
216 driver = str_cat_alloc ("stdio:file=", val);
217
218 r = st_set_msg_emu_par_driver (sim, msg, driver);
219
220 free (driver);
221
222 return (r);
223}
224
225static
226int st_set_msg_emu_pause (atari_st_t *sim, const char *msg, const char *val)
227{
228 int v;
229
230 if (msg_get_bool (val, &v)) {
231 return (1);
232 }
233
234 st_set_pause (sim, v);
235
236 return (0);
237}
238
239static
240int st_set_msg_emu_pause_toggle (atari_st_t *sim, const char *msg, const char *val)
241{
242 st_set_pause (sim, !sim->pause);
243
244 return (0);
245}
246
247static
248int st_set_msg_emu_psg_aym_file (atari_st_t *sim, const char *msg, const char *val)
249{
250 if (st_psg_set_aym (&sim->psg, val)) {
251 pce_log (MSG_ERR, "*** failed to open AYM file (%s)\n", val);
252 return (1);
253 }
254
255 return (0);
256}
257
258static
259int st_set_msg_emu_psg_aym_res (atari_st_t *sim, const char *msg, const char *val)
260{
261 unsigned long r;
262
263 if (msg_get_ulng (val, &r)) {
264 return (1);
265 }
266
267 st_psg_set_aym_resolution (&sim->psg, r);
268
269 return (0);
270}
271
272static
273int st_set_msg_emu_psg_driver (atari_st_t *sim, const char *msg, const char *val)
274{
275 if (st_psg_set_driver (&sim->psg, val)) {
276 st_log_deb (MSG_ERR, "*** failed to open sound driver (%s)\n", val);
277 return (1);
278 }
279
280 return (0);
281}
282
283static
284int st_set_msg_emu_psg_lowpass (atari_st_t *sim, const char *msg, const char *val)
285{
286 unsigned long f;
287
288 if (msg_get_ulng (val, &f)) {
289 return (1);
290 }
291
292 st_psg_set_lowpass (&sim->psg, f);
293
294 return (0);
295}
296
297static
298int st_set_msg_emu_realtime (atari_st_t *sim, const char *msg, const char *val)
299{
300 int v;
301
302 if (msg_get_bool (val, &v)) {
303 return (1);
304 }
305
306 st_set_speed (sim, v ? 1 : 0);
307
308 return (0);
309}
310
311static
312int st_set_msg_emu_realtime_toggle (atari_st_t *sim, const char *msg, const char *val)
313{
314 if (sim->speed_factor > 0) {
315 st_set_speed (sim, 0);
316 }
317 else {
318 st_set_speed (sim, 1);
319 }
320
321 return (0);
322}
323
324static
325int st_set_msg_emu_reset (atari_st_t *sim, const char *msg, const char *val)
326{
327 st_reset (sim);
328
329 return (0);
330}
331
332static
333int st_set_msg_emu_ser_driver (atari_st_t *sim, const char *msg, const char *val)
334{
335 if (sim->serport_drv != NULL) {
336 chr_close (sim->serport_drv);
337 }
338
339 sim->serport_drv = chr_open (val);
340
341 if (sim->serport_drv == NULL) {
342 return (1);
343 }
344
345 return (0);
346}
347
348static
349int st_set_msg_emu_ser_file (atari_st_t *sim, const char *msg, const char *val)
350{
351 int r;
352 char *driver;
353
354 driver = str_cat_alloc ("stdio:file=", val);
355
356 r = st_set_msg_emu_ser_driver (sim, msg, driver);
357
358 free (driver);
359
360 return (r);
361}
362
363static
364int st_set_msg_emu_stop (atari_st_t *sim, const char *msg, const char *val)
365{
366 st_set_msg_trm (sim, "term.release", "1");
367
368 sim->brk = PCE_BRK_STOP;
369
370 return (0);
371}
372
373static
374int st_set_msg_emu_viking (atari_st_t *sim, const char *msg, const char *val)
375{
376 int v;
377
378 if (msg_get_bool (val, &v)) {
379 return (1);
380 }
381
382 if (v) {
383 sim->video_viking = 1;
384 st_video_set_terminal (sim->video, NULL);
385 st_viking_set_terminal (sim->viking, sim->trm);
386 }
387 else {
388 sim->video_viking = 0;
389 st_video_set_terminal (sim->video, sim->trm);
390 st_viking_set_terminal (sim->viking, NULL);
391 }
392
393 return (0);
394}
395
396static
397int st_set_msg_emu_viking_toggle (atari_st_t *sim, const char *msg, const char *val)
398{
399 if (sim->viking == NULL) {
400 return (0);
401 }
402
403 if (sim->video_viking) {
404 sim->video_viking = 0;
405 st_video_set_terminal (sim->video, sim->trm);
406 st_viking_set_terminal (sim->viking, NULL);
407 }
408 else {
409 sim->video_viking = 1;
410 st_video_set_terminal (sim->video, NULL);
411 st_viking_set_terminal (sim->viking, sim->trm);
412 }
413
414 return (0);
415}
416
417
418static st_msg_list_t set_msg_list[] = {
419 { "disk.eject", st_set_msg_disk_eject },
420 { "disk.insert", st_set_msg_disk_insert },
421 { "emu.cpu.model", st_set_msg_emu_cpu_model },
422 { "emu.cpu.speed", st_set_msg_emu_cpu_speed },
423 { "emu.cpu.speed.step", st_set_msg_emu_cpu_speed_step },
424 { "emu.exit", st_set_msg_emu_exit },
425 { "emu.fdc.ro", st_set_msg_emu_fdc_ro },
426 { "emu.fdc.rw", st_set_msg_emu_fdc_rw },
427 { "emu.midi.file", st_set_msg_emu_midi_file },
428 { "emu.par.driver", st_set_msg_emu_par_driver },
429 { "emu.par.file", st_set_msg_emu_par_file },
430 { "emu.pause", st_set_msg_emu_pause },
431 { "emu.pause.toggle", st_set_msg_emu_pause_toggle },
432 { "emu.psg.aym.file", st_set_msg_emu_psg_aym_file },
433 { "emu.psg.aym.res", st_set_msg_emu_psg_aym_res },
434 { "emu.psg.driver", st_set_msg_emu_psg_driver },
435 { "emu.psg.lowpass", st_set_msg_emu_psg_lowpass },
436 { "emu.realtime", st_set_msg_emu_realtime },
437 { "emu.realtime.toggle", st_set_msg_emu_realtime_toggle },
438 { "emu.reset", st_set_msg_emu_reset },
439 { "emu.ser.driver", st_set_msg_emu_ser_driver },
440 { "emu.ser.file", st_set_msg_emu_ser_file },
441 { "emu.stop", st_set_msg_emu_stop },
442 { "emu.viking", st_set_msg_emu_viking },
443 { "emu.viking.toggle", st_set_msg_emu_viking_toggle },
444 { NULL, NULL }
445};
446
447
448int st_set_msg (atari_st_t *sim, const char *msg, const char *val)
449{
450 int r;
451 st_msg_list_t *lst;
452
453 /* a hack, for debugging only */
454 if (sim == NULL) {
455 sim = par_sim;
456 }
457
458 if (msg == NULL) {
459 return (1);
460 }
461
462 if (val == NULL) {
463 val = "";
464 }
465
466 lst = set_msg_list;
467
468 while (lst->msg != NULL) {
469 if (msg_is_message (lst->msg, msg)) {
470 return (lst->set_msg (sim, msg, val));
471 }
472
473 lst += 1;
474 }
475
476 if ((r = msg_dsk_set_msg (msg, val, sim->dsks, &sim->disk_id)) >= 0) {
477 return (r);
478 }
479
480 if (sim->trm != NULL) {
481 r = trm_set_msg_trm (sim->trm, msg, val);
482
483 if (r >= 0) {
484 return (r);
485 }
486 }
487
488 if (msg_is_prefix ("term", msg)) {
489 return (1);
490 }
491
492 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val);
493
494 return (1);
495}