fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/arch/ibmpc/msg.c *
7 * Created: 2004-09-25 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2004-2024 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 "ibmpc.h"
25
26#include <string.h>
27
28#include <devices/cassette.h>
29
30#include <drivers/block/block.h>
31
32#include <lib/log.h>
33#include <lib/monitor.h>
34#include <lib/msg.h>
35#include <lib/msgdsk.h>
36#include <lib/sysdep.h>
37
38
39extern monitor_t par_mon;
40
41
42typedef struct {
43 const char *msg;
44
45 int (*set_msg) (ibmpc_t *pc, const char *msg, const char *val);
46} pc_msg_list_t;
47
48
49static
50int pc_set_msg_emu_config_save (ibmpc_t *pc, const char *msg, const char *val)
51{
52 if (ini_write (val, pc->cfg)) {
53 return (1);
54 }
55
56 return (0);
57}
58
59static
60int pc_set_msg_emu_cpu_model (ibmpc_t *pc, const char *msg, const char *val)
61{
62 if (pc_set_cpu_model (pc, val)) {
63 return (1);
64 }
65
66 return (0);
67}
68
69static
70int pc_set_msg_emu_cpu_speed (ibmpc_t *pc, const char *msg, const char *val)
71{
72 unsigned f;
73
74 if (msg_get_uint (val, &f)) {
75 return (1);
76 }
77
78 pc_set_speed (pc, f);
79
80 return (0);
81}
82
83static
84int pc_set_msg_emu_cpu_speed_step (ibmpc_t *pc, const char *msg, const char *val)
85{
86 int v;
87
88 if (msg_get_sint (val, &v)) {
89 return (1);
90 }
91
92 v += (int) pc->speed_current;
93
94 if (v <= 0) {
95 v = 1;
96 }
97
98 pc_set_speed (pc, v);
99
100 return (0);
101}
102
103static
104int pc_set_msg_emu_disk_boot (ibmpc_t *pc, const char *msg, const char *val)
105{
106 unsigned v;
107
108 if (msg_get_uint (val, &v)) {
109 return (1);
110 }
111
112 pc->bootdrive = v;
113
114 return (0);
115}
116
117static
118int pc_set_msg_emu_exit (ibmpc_t *pc, const char *msg, const char *val)
119{
120 pc->brk = PCE_BRK_ABORT;
121 mon_set_terminate (&par_mon, 1);
122 return (0);
123}
124
125static
126int pc_set_msg_emu_fdc_accurate (ibmpc_t *pc, const char *msg, const char *val)
127{
128 int v;
129
130 if (msg_get_bool (val, &v)) {
131 return (1);
132 }
133
134 if (pc->fdc != NULL) {
135 pce_log (MSG_INF, "%s the FDC accurate mode\n",
136 v ? "Enabling" : "Disabling"
137 );
138
139 e8272_set_accuracy (&pc->fdc->e8272, v);
140 }
141
142 return (0);
143}
144
145static
146int pc_set_msg_emu_fdc_verbose (ibmpc_t *pc, const char *msg, const char *val)
147{
148 unsigned v;
149
150 if (msg_get_uint (val, &v)) {
151 return (1);
152 }
153
154 if (pc->fdc != NULL) {
155 pce_log (MSG_INF, "FDC verbosity level %u\n", v);
156
157 e8272_set_verbose (&pc->fdc->e8272, v);
158 }
159
160 return (0);
161}
162
163static
164int pc_set_msg_emu_par1_file (ibmpc_t *pc, const char *msg, const char *val)
165{
166 if (pc_set_parport_file (pc, 0, val)) {
167 return (1);
168 }
169
170 return (0);
171}
172
173static
174int pc_set_msg_emu_par2_file (ibmpc_t *pc, const char *msg, const char *val)
175{
176 if (pc_set_parport_file (pc, 1, val)) {
177 return (1);
178 }
179
180 return (0);
181}
182
183static
184int pc_set_msg_emu_par3_file (ibmpc_t *pc, const char *msg, const char *val)
185{
186 if (pc_set_parport_file (pc, 2, val)) {
187 return (1);
188 }
189
190 return (0);
191}
192
193static
194int pc_set_msg_emu_parport_driver (ibmpc_t *pc, const char *msg, const char *val)
195{
196 unsigned idx;
197
198 if (msg_get_prefix_uint (&val, &idx, ":", " \t")) {
199 return (1);
200 }
201
202 if (pc_set_parport_driver (pc, idx, val)) {
203 return (1);
204 }
205
206 return (0);
207}
208
209static
210int pc_set_msg_emu_parport_file (ibmpc_t *pc, const char *msg, const char *val)
211{
212 unsigned idx;
213
214 if (msg_get_prefix_uint (&val, &idx, ":", " \t")) {
215 return (1);
216 }
217
218 if (pc_set_parport_file (pc, idx, val)) {
219 return (1);
220 }
221
222 return (0);
223}
224
225static
226int pc_set_msg_emu_pause (ibmpc_t *pc, const char *msg, const char *val)
227{
228 int v;
229
230 if (msg_get_bool (val, &v)) {
231 return (1);
232 }
233
234 pc->pause = v;
235
236 pc_clock_discontinuity (pc);
237
238 return (0);
239}
240
241static
242int pc_set_msg_emu_pause_toggle (ibmpc_t *pc, const char *msg, const char *val)
243{
244 pc->pause = !pc->pause;
245
246 pc_clock_discontinuity (pc);
247
248 return (0);
249}
250
251static
252int pc_set_msg_emu_reset (ibmpc_t *pc, const char *msg, const char *val)
253{
254 pc_reset (pc);
255 return (0);
256}
257
258static
259int pc_set_msg_emu_serport_driver (ibmpc_t *pc, const char *msg, const char *val)
260{
261 unsigned idx;
262
263 if (msg_get_prefix_uint (&val, &idx, ":", " \t")) {
264 return (1);
265 }
266
267 if (pc_set_serport_driver (pc, idx, val)) {
268 return (1);
269 }
270
271 return (0);
272}
273
274static
275int pc_set_msg_emu_serport_file (ibmpc_t *pc, const char *msg, const char *val)
276{
277 unsigned idx;
278
279 if (msg_get_prefix_uint (&val, &idx, ":", " \t")) {
280 return (1);
281 }
282
283 if (pc_set_serport_file (pc, idx, val)) {
284 return (1);
285 }
286
287 return (0);
288}
289
290static
291int pc_set_msg_emu_stop (ibmpc_t *pc, const char *msg, const char *val)
292{
293 pc->brk = PCE_BRK_STOP;
294 return (0);
295}
296
297
298static pc_msg_list_t set_msg_list[] = {
299 { "emu.config.save", pc_set_msg_emu_config_save },
300 { "emu.cpu.model", pc_set_msg_emu_cpu_model },
301 { "emu.cpu.speed", pc_set_msg_emu_cpu_speed },
302 { "emu.cpu.speed.step", pc_set_msg_emu_cpu_speed_step },
303 { "emu.disk.boot", pc_set_msg_emu_disk_boot },
304 { "emu.exit", pc_set_msg_emu_exit },
305 { "emu.fdc.accurate", pc_set_msg_emu_fdc_accurate },
306 { "emu.fdc.verbose", pc_set_msg_emu_fdc_verbose },
307 { "emu.par1.file", pc_set_msg_emu_par1_file },
308 { "emu.par2.file", pc_set_msg_emu_par2_file },
309 { "emu.par3.file", pc_set_msg_emu_par3_file },
310 { "emu.parport.driver", pc_set_msg_emu_parport_driver },
311 { "emu.parport.file", pc_set_msg_emu_parport_file },
312 { "emu.pause", pc_set_msg_emu_pause },
313 { "emu.pause.toggle", pc_set_msg_emu_pause_toggle },
314 { "emu.reset", pc_set_msg_emu_reset },
315 { "emu.serport.driver", pc_set_msg_emu_serport_driver },
316 { "emu.serport.file", pc_set_msg_emu_serport_file },
317 { "emu.stop", pc_set_msg_emu_stop },
318 { NULL, NULL }
319};
320
321
322int pc_set_msg (ibmpc_t *pc, const char *msg, const char *val)
323{
324 int r;
325 pc_msg_list_t *lst;
326
327 /* a hack, for debugging only */
328 if (pc == NULL) {
329 pc = par_pc;
330 }
331
332 if (msg == NULL) {
333 return (1);
334 }
335
336 if (val == NULL) {
337 val = "";
338 }
339
340 lst = set_msg_list;
341
342 while (lst->msg != NULL) {
343 if (msg_is_message (lst->msg, msg)) {
344 return (lst->set_msg (pc, msg, val));
345 }
346
347 lst += 1;
348 }
349
350 if (pc->cas != NULL) {
351 if ((r = cas_set_msg (pc->cas, msg, val)) >= 0) {
352 return (r);
353 }
354 }
355
356 if ((r = msg_dsk_set_msg (msg, val, pc->dsk, &pc->disk_id)) >= 0) {
357 return (r);
358 }
359
360 if (pc->trm != NULL) {
361 r = trm_set_msg_trm (pc->trm, msg, val);
362
363 if (r >= 0) {
364 return (r);
365 }
366 }
367
368 if (pc->video != NULL) {
369 r = pce_video_set_msg (pc->video, msg, val);
370
371 if (r >= 0) {
372 return (r);
373 }
374 }
375
376 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val);
377
378 return (1);
379}