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