fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 379 lines 7.5 kB view raw
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}