fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 140 lines 3.7 kB view raw
1/***************************************************************************** 2 * pce * 3 *****************************************************************************/ 4 5/***************************************************************************** 6 * File name: src/arch/macplus/hotkey.c * 7 * Created: 2010-11-05 by Hampa Hug <hampa@hampa.ch> * 8 * Copyright: (C) 2010-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 "hook.h" 25#include "hotkey.h" 26#include "macplus.h" 27#include "msg.h" 28 29#include <lib/log.h> 30 31 32static 33int pcex_interrupt (macplus_t *sim, unsigned long val) 34{ 35 unsigned long sp; 36 unsigned long addr; 37 38 addr = 0xf80000; 39 40 if (mem_get_uint32_be (sim->mem, addr) != 0x50434558) { 41 return (1); 42 } 43 44 if (mem_get_uint32_be (sim->mem, addr + 8) < 5) { 45 return (1); 46 } 47 48 addr += mem_get_uint32_be (sim->mem, addr + 12 + 4 * 4); 49 50 sp = e68_get_areg32 (sim->cpu, 7); 51 mem_set_uint32_be (sim->mem, sp - 4, e68_get_pc (sim->cpu)); 52 mem_set_uint16_be (sim->mem, sp - 6, e68_get_sr (sim->cpu)); 53 mem_set_uint32_be (sim->mem, sp - 10, e68_get_dreg32 (sim->cpu, 0)); 54 e68_set_dreg32 (sim->cpu, 0, val); 55 e68_set_areg32 (sim->cpu, 7, sp - 10); 56 e68_set_pc_prefetch (sim->cpu, addr); 57 58 return (0); 59} 60 61int mac_set_hotkey (macplus_t *sim, pce_key_t key) 62{ 63 static const char *ins = "emu.mac.insert"; 64 65 switch (key) { 66 case PCE_KEY_F1: 67 mac_set_msg (sim, ins, "1"); 68 break; 69 70 case PCE_KEY_F2: 71 mac_set_msg (sim, ins, "2"); 72 break; 73 74 case PCE_KEY_F3: 75 mac_set_msg (sim, ins, "3"); 76 break; 77 78 case PCE_KEY_F4: 79 mac_set_msg (sim, ins, "4"); 80 break; 81 82 case PCE_KEY_F5: 83 mac_set_msg (sim, ins, "5"); 84 break; 85 86 case PCE_KEY_F6: 87 mac_set_msg (sim, ins, "6"); 88 break; 89 90 case PCE_KEY_F7: 91 mac_set_msg (sim, ins, "7"); 92 break; 93 94 case PCE_KEY_F8: 95 mac_set_msg (sim, ins, "8"); 96 break; 97 98 case PCE_KEY_K: 99 case PCE_KEY_KP_5: 100 if (sim->kbd != NULL) { 101 if (sim->kbd->keypad_mode) { 102 mac_log_deb ("keypad mode: motion\n"); 103 mac_kbd_set_keypad_mode (sim->kbd, 1); 104 } 105 else { 106 mac_log_deb ("keypad mode: keypad\n"); 107 mac_kbd_set_keypad_mode (sim->kbd, 0); 108 } 109 } 110 111 if (sim->adb_kbd != NULL) { 112 if (adb_kbd_get_keypad_mode (sim->adb_kbd)) { 113 mac_log_deb ("keypad mode: keypad\n"); 114 adb_kbd_set_keypad_mode (sim->adb_kbd, 0); 115 } 116 else { 117 mac_log_deb ("keypad mode: motion\n"); 118 adb_kbd_set_keypad_mode (sim->adb_kbd, 1); 119 } 120 } 121 break; 122 123 case PCE_KEY_I: 124 mac_interrupt (sim, 7, 1); 125 mac_interrupt (sim, 7, 0); 126 break; 127 128 case PCE_KEY_F12: 129 pcex_interrupt (sim, 0); 130 break; 131 132 default: 133 pce_log (MSG_INF, "unhandled magic key (%u)\n", 134 (unsigned) key 135 ); 136 break; 137 } 138 139 return (0); 140}