fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 278 lines 6.2 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/arch/rc759/msg.c * 7 * Created: 2012-06-29 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2012-2021 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 "rc759.h" 25 26#include <string.h> 27 28#include <drivers/block/block.h> 29 30#include <lib/inidsk.h> 31#include <lib/log.h> 32#include <lib/monitor.h> 33#include <lib/msg.h> 34#include <lib/msgdsk.h> 35#include <lib/sysdep.h> 36 37 38extern monitor_t par_mon; 39 40 41typedef struct { 42 const char *msg; 43 44 int (*set_msg) (rc759_t *sim, const char *msg, const char *val); 45} rc759_msg_list_t; 46 47 48static 49int rc759_set_msg_disk_eject (rc759_t *sim, const char *msg, const char *val) 50{ 51 if (msg_dsk_get_disk_id (val, &sim->disk_id)) { 52 return (1); 53 } 54 55 rc759_fdc_eject_disk (&sim->fdc, sim->disk_id); 56 57 msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id); 58 59 return (0); 60} 61 62static 63int rc759_set_msg_disk_insert (rc759_t *sim, const char *msg, const char *val) 64{ 65 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) { 66 rc759_fdc_eject_disk (&sim->fdc, sim->disk_id); 67 } 68 69 if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) { 70 return (1); 71 } 72 73 rc759_fdc_insert_disk (&sim->fdc, sim->disk_id); 74 75 return (0); 76} 77 78static 79int rc759_set_msg_emu_config_save (rc759_t *sim, const char *msg, const char *val) 80{ 81 if (ini_write (val, sim->cfg)) { 82 return (1); 83 } 84 85 return (0); 86} 87 88static 89int rc759_set_msg_emu_cpu_speed (rc759_t *sim, const char *msg, const char *val) 90{ 91 unsigned f; 92 93 if (msg_get_uint (val, &f)) { 94 return (1); 95 } 96 97 rc759_set_speed (sim, f); 98 99 return (0); 100} 101 102static 103int rc759_set_msg_emu_cpu_speed_step (rc759_t *sim, const char *msg, const char *val) 104{ 105 int v; 106 unsigned speed; 107 108 if (msg_get_sint (val, &v)) { 109 return (1); 110 } 111 112 speed = sim->speed; 113 114 if (v > 0) { 115 speed = sim->speed + v; 116 } 117 else { 118 speed = -v; 119 speed = (-v < sim->speed) ? (sim->speed - -v) : 1; 120 } 121 122 rc759_set_speed (sim, speed); 123 124 return (0); 125} 126 127static 128int rc759_set_msg_emu_exit (rc759_t *sim, const char *msg, const char *val) 129{ 130 sim->brk = PCE_BRK_ABORT; 131 mon_set_terminate (&par_mon, 1); 132 return (0); 133} 134 135static 136int rc759_set_msg_emu_parport1_driver (rc759_t *sim, const char *msg, const char *val) 137{ 138 if (rc759_set_parport_driver (sim, 0, val)) { 139 return (1); 140 } 141 142 return (0); 143} 144 145static 146int rc759_set_msg_emu_parport1_file (rc759_t *sim, const char *msg, const char *val) 147{ 148 if (rc759_set_parport_file (sim, 0, val)) { 149 return (1); 150 } 151 152 return (0); 153} 154 155static 156int rc759_set_msg_emu_parport2_driver (rc759_t *sim, const char *msg, const char *val) 157{ 158 if (rc759_set_parport_driver (sim, 1, val)) { 159 return (1); 160 } 161 162 return (0); 163} 164 165static 166int rc759_set_msg_emu_parport2_file (rc759_t *sim, const char *msg, const char *val) 167{ 168 if (rc759_set_parport_file (sim, 1, val)) { 169 return (1); 170 } 171 172 return (0); 173} 174 175static 176int rc759_set_msg_emu_pause (rc759_t *sim, const char *msg, const char *val) 177{ 178 int v; 179 180 if (msg_get_bool (val, &v)) { 181 return (1); 182 } 183 184 sim->pause = v; 185 186 rc759_clock_discontinuity (sim); 187 188 return (0); 189} 190 191static 192int rc759_set_msg_emu_pause_toggle (rc759_t *sim, const char *msg, const char *val) 193{ 194 sim->pause = !sim->pause; 195 196 rc759_clock_discontinuity (sim); 197 198 return (0); 199} 200 201static 202int rc759_set_msg_emu_reset (rc759_t *sim, const char *msg, const char *val) 203{ 204 rc759_reset (sim); 205 return (0); 206} 207 208static 209int rc759_set_msg_emu_stop (rc759_t *sim, const char *msg, const char *val) 210{ 211 sim->brk = PCE_BRK_STOP; 212 return (0); 213} 214 215 216static rc759_msg_list_t set_msg_list[] = { 217 { "disk.eject", rc759_set_msg_disk_eject }, 218 { "disk.insert", rc759_set_msg_disk_insert }, 219 { "emu.config.save", rc759_set_msg_emu_config_save }, 220 { "emu.cpu.speed", rc759_set_msg_emu_cpu_speed }, 221 { "emu.cpu.speed.step", rc759_set_msg_emu_cpu_speed_step }, 222 { "emu.exit", rc759_set_msg_emu_exit }, 223 { "emu.parport1.driver", rc759_set_msg_emu_parport1_driver }, 224 { "emu.parport1.file", rc759_set_msg_emu_parport1_file }, 225 { "emu.parport2.driver", rc759_set_msg_emu_parport2_driver }, 226 { "emu.parport2.file", rc759_set_msg_emu_parport2_file }, 227 { "emu.pause", rc759_set_msg_emu_pause }, 228 { "emu.pause.toggle", rc759_set_msg_emu_pause_toggle }, 229 { "emu.reset", rc759_set_msg_emu_reset }, 230 { "emu.stop", rc759_set_msg_emu_stop }, 231 { NULL, NULL } 232}; 233 234 235int rc759_set_msg (rc759_t *sim, const char *msg, const char *val) 236{ 237 int r; 238 rc759_msg_list_t *lst; 239 240 /* a hack, for debugging only */ 241 if (sim == NULL) { 242 sim = par_sim; 243 } 244 245 if (msg == NULL) { 246 return (1); 247 } 248 249 if (val == NULL) { 250 val = ""; 251 } 252 253 lst = set_msg_list; 254 255 while (lst->msg != NULL) { 256 if (msg_is_message (lst->msg, msg)) { 257 return (lst->set_msg (sim, msg, val)); 258 } 259 260 lst += 1; 261 } 262 263 if ((r = msg_dsk_set_msg (msg, val, sim->dsks, &sim->disk_id)) >= 0) { 264 return (r); 265 } 266 267 if (sim->trm != NULL) { 268 r = trm_set_msg_trm (sim->trm, msg, val); 269 270 if (r >= 0) { 271 return (r); 272 } 273 } 274 275 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val); 276 277 return (1); 278}