fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 382 lines 8.1 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/arch/macplus/msg.c * 7 * Created: 2007-12-04 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2007-2020 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 "macplus.h" 25#include "msg.h" 26 27#include <string.h> 28 29#include <lib/log.h> 30#include <lib/monitor.h> 31#include <lib/msg.h> 32#include <lib/msgdsk.h> 33#include <lib/sysdep.h> 34 35 36extern monitor_t par_mon; 37 38 39typedef struct { 40 const char *msg; 41 42 int (*set_msg) (macplus_t *sim, const char *msg, const char *val); 43} mac_msg_list_t; 44 45 46static 47int mac_set_msg_disk_eject (macplus_t *sim, const char *msg, const char *val) 48{ 49 if (msg_dsk_get_disk_id (val, &sim->disk_id)) { 50 return (1); 51 } 52 53 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) { 54 mac_iwm_flush_disk (&sim->iwm, sim->disk_id); 55 } 56 57 return (msg_dsk_emu_disk_eject (val, sim->dsks, &sim->disk_id)); 58} 59 60static 61int mac_set_msg_disk_insert (macplus_t *sim, const char *msg, const char *val) 62{ 63 if (dsks_get_disk (sim->dsks, sim->disk_id) != NULL) { 64 mac_iwm_flush_disk (&sim->iwm, sim->disk_id); 65 } 66 67 if (msg_dsk_emu_disk_insert (val, sim->dsks, sim->disk_id)) { 68 return (1); 69 } 70 71 mac_iwm_insert_disk (&sim->iwm, sim->disk_id); 72 73 return (0); 74} 75 76static 77int mac_set_msg_emu_cpu_model (macplus_t *sim, const char *msg, const char *val) 78{ 79 if (mac_set_cpu_model (sim, val)) { 80 pce_log (MSG_ERR, "unknown CPU model (%s)\n", val); 81 return (1); 82 } 83 84 return (0); 85} 86 87static 88int mac_set_msg_emu_cpu_speed (macplus_t *sim, const char *msg, const char *val) 89{ 90 unsigned f; 91 92 if (msg_get_uint (val, &f)) { 93 return (1); 94 } 95 96 mac_set_speed (sim, PCE_MAC_SPEED_USER, f); 97 98 return (0); 99} 100 101static 102int mac_set_msg_emu_cpu_speed_step (macplus_t *sim, const char *msg, const char *val) 103{ 104 int v; 105 106 if (msg_get_sint (val, &v)) { 107 return (1); 108 } 109 110 v += (int) sim->speed_factor; 111 112 if (v <= 0) { 113 v = 1; 114 } 115 116 mac_set_speed (sim, PCE_MAC_SPEED_USER, v); 117 118 return (0); 119} 120 121static 122int mac_set_msg_emu_exit (macplus_t *sim, const char *msg, const char *val) 123{ 124 sim->brk = PCE_BRK_ABORT; 125 126 mon_set_terminate (&par_mon, 1); 127 128 return (0); 129} 130 131static 132int mac_set_msg_emu_mac_insert (macplus_t *sim, const char *msg, const char *val) 133{ 134 unsigned drv; 135 136 if (strcmp (val, "") == 0) { 137 if (sim->sony.enable) { 138 mac_sony_insert (&sim->sony, 1); 139 mac_sony_insert (&sim->sony, 2); 140 mac_sony_insert (&sim->sony, 3); 141 } 142 } 143 else { 144 if (msg_get_uint (val, &drv)) { 145 return (1); 146 } 147 148 if (sim->sony.enable) { 149 mac_sony_insert (&sim->sony, drv); 150 } 151 else { 152 mac_iwm_insert (&sim->iwm, (drv > 0) ? (drv - 1) : 0); 153 } 154 } 155 156 return (0); 157} 158 159static 160int mac_set_msg_emu_pause (macplus_t *sim, const char *msg, const char *val) 161{ 162 int v; 163 164 if (msg_get_bool (val, &v)) { 165 return (1); 166 } 167 168 mac_set_pause (sim, v); 169 170 return (0); 171} 172 173static 174int mac_set_msg_emu_pause_toggle (macplus_t *sim, const char *msg, const char *val) 175{ 176 mac_set_pause (sim, !sim->pause); 177 178 return (0); 179} 180 181static 182int mac_set_msg_emu_realtime (macplus_t *sim, const char *msg, const char *val) 183{ 184 int v; 185 186 if (msg_get_bool (val, &v)) { 187 return (1); 188 } 189 190 mac_set_speed (sim, PCE_MAC_SPEED_USER, v ? 1 : 0); 191 192 return (0); 193} 194 195static 196int mac_set_msg_emu_realtime_toggle (macplus_t *sim, const char *msg, const char *val) 197{ 198 if (sim->speed_limit[0] > 0) { 199 mac_set_speed (sim, PCE_MAC_SPEED_USER, 0); 200 } 201 else { 202 mac_set_speed (sim, PCE_MAC_SPEED_USER, 1); 203 } 204 205 return (0); 206} 207 208static 209int mac_set_msg_emu_reset (macplus_t *sim, const char *msg, const char *val) 210{ 211 mac_reset (sim); 212 213 return (0); 214} 215 216static 217int mac_set_msg_emu_ser1_driver (macplus_t *sim, const char *msg, const char *val) 218{ 219 if (mac_ser_set_driver (&sim->ser[0], val)) { 220 return (1); 221 } 222 223 return (0); 224} 225 226static 227int mac_set_msg_emu_ser1_file (macplus_t *sim, const char *msg, const char *val) 228{ 229 if (mac_ser_set_file (&sim->ser[0], val)) { 230 return (1); 231 } 232 233 return (0); 234} 235 236static 237int mac_set_msg_emu_ser1_multi (macplus_t *sim, const char *msg, const char *val) 238{ 239 unsigned v; 240 241 if (msg_get_uint (val, &v)) { 242 return (1); 243 } 244 245 e8530_set_multichar (&sim->scc, 0, v, v); 246 247 return (0); 248} 249 250static 251int mac_set_msg_emu_ser2_driver (macplus_t *sim, const char *msg, const char *val) 252{ 253 if (mac_ser_set_driver (&sim->ser[1], val)) { 254 return (1); 255 } 256 257 return (0); 258} 259 260static 261int mac_set_msg_emu_ser2_file (macplus_t *sim, const char *msg, const char *val) 262{ 263 if (mac_ser_set_file (&sim->ser[1], val)) { 264 return (1); 265 } 266 267 return (0); 268} 269 270static 271int mac_set_msg_emu_ser2_multi (macplus_t *sim, const char *msg, const char *val) 272{ 273 unsigned v; 274 275 if (msg_get_uint (val, &v)) { 276 return (1); 277 } 278 279 e8530_set_multichar (&sim->scc, 1, v, v); 280 281 return (0); 282} 283 284static 285int mac_set_msg_emu_stop (macplus_t *sim, const char *msg, const char *val) 286{ 287 mac_set_msg_trm (sim, "term.release", "1"); 288 289 sim->brk = PCE_BRK_STOP; 290 291 return (0); 292} 293 294static 295int mac_set_msg_emu_video_brightness (macplus_t *sim, const char *msg, const char *val) 296{ 297 unsigned br; 298 299 if (msg_get_uint (val, &br)) { 300 return (1); 301 } 302 303 if (br >= 1000) { 304 br = 255; 305 } 306 else { 307 br = (256UL * br) / 1000; 308 } 309 310 mac_video_set_brightness (sim->video, br); 311 312 return (0); 313} 314 315 316static mac_msg_list_t set_msg_list[] = { 317 { "disk.eject", mac_set_msg_disk_eject }, 318 { "disk.insert", mac_set_msg_disk_insert }, 319 { "emu.cpu.model", mac_set_msg_emu_cpu_model }, 320 { "emu.cpu.speed", mac_set_msg_emu_cpu_speed }, 321 { "emu.cpu.speed.step", mac_set_msg_emu_cpu_speed_step }, 322 { "emu.exit", mac_set_msg_emu_exit }, 323 { "emu.mac.insert", mac_set_msg_emu_mac_insert }, 324 { "emu.pause", mac_set_msg_emu_pause }, 325 { "emu.pause.toggle", mac_set_msg_emu_pause_toggle }, 326 { "emu.realtime", mac_set_msg_emu_realtime }, 327 { "emu.realtime.toggle", mac_set_msg_emu_realtime_toggle }, 328 { "emu.reset", mac_set_msg_emu_reset }, 329 { "emu.ser1.driver", mac_set_msg_emu_ser1_driver }, 330 { "emu.ser1.file", mac_set_msg_emu_ser1_file }, 331 { "emu.ser1.multi", mac_set_msg_emu_ser1_multi }, 332 { "emu.ser2.driver", mac_set_msg_emu_ser2_driver }, 333 { "emu.ser2.file", mac_set_msg_emu_ser2_file }, 334 { "emu.ser2.multi", mac_set_msg_emu_ser2_multi }, 335 { "emu.stop", mac_set_msg_emu_stop }, 336 { "emu.video.brightness", mac_set_msg_emu_video_brightness }, 337 { NULL, NULL } 338}; 339 340 341int mac_set_msg (macplus_t *sim, const char *msg, const char *val) 342{ 343 int r; 344 mac_msg_list_t *lst; 345 346 /* a hack, for debugging only */ 347 if (sim == NULL) { 348 sim = par_sim; 349 } 350 351 if (msg == NULL) { 352 return (1); 353 } 354 355 if (val == NULL) { 356 val = ""; 357 } 358 359 lst = set_msg_list; 360 361 while (lst->msg != NULL) { 362 if (msg_is_message (lst->msg, msg)) { 363 return (lst->set_msg (sim, msg, val)); 364 } 365 366 lst += 1; 367 } 368 369 if ((r = msg_dsk_set_msg (msg, val, sim->dsks, &sim->disk_id)) >= 0) { 370 return (r); 371 } 372 373 if (sim->trm != NULL) { 374 if ((r = trm_set_msg_trm (sim->trm, msg, val)) >= 0) { 375 return (r); 376 } 377 } 378 379 pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val); 380 381 return (1); 382}