fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
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}