1 /*****************************************************************************\
2 Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3 This file is licensed under the Snes9x License.
4 For further information, consult the LICENSE file in the root directory.
5 \*****************************************************************************/
6
7 /***********************************************************************************
8 SNES9X for Mac OS (c) Copyright John Stiles
9
10 Snes9x for Mac OS X
11
12 (c) Copyright 2001 - 2011 zones
13 (c) Copyright 2002 - 2005 107
14 (c) Copyright 2002 PB1400c
15 (c) Copyright 2004 Alexander and Sander
16 (c) Copyright 2004 - 2005 Steven Seeger
17 (c) Copyright 2005 Ryan Vogt
18 ***********************************************************************************/
19
20
21 #include "port.h"
22 #include "controls.h"
23
24 #include "mac-prefix.h"
25 #include "mac-joypad.h"
26 #include "mac-keyboard.h"
27 #include "mac-os.h"
28 #include "mac-controls.h"
29
30 #define ASSIGN_BUTTONf(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), false)
31 #define ASSIGN_BUTTONt(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), true)
32 #define ASSIGN_POINTRf(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), false)
33 #define ASSIGN_POINTRt(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), true)
34
35 #define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7)))
36
37
S9xSetupDefaultKeymap(void)38 void S9xSetupDefaultKeymap (void)
39 {
40 s9xcommand_t cmd;
41
42 ASSIGN_BUTTONf(kMacCMapPad1PX, "Joypad1 X");
43 ASSIGN_BUTTONf(kMacCMapPad1PA, "Joypad1 A");
44 ASSIGN_BUTTONf(kMacCMapPad1PB, "Joypad1 B");
45 ASSIGN_BUTTONf(kMacCMapPad1PY, "Joypad1 Y");
46 ASSIGN_BUTTONf(kMacCMapPad1PL, "Joypad1 L");
47 ASSIGN_BUTTONf(kMacCMapPad1PR, "Joypad1 R");
48 ASSIGN_BUTTONf(kMacCMapPad1PSelect, "Joypad1 Select");
49 ASSIGN_BUTTONf(kMacCMapPad1PStart, "Joypad1 Start");
50 ASSIGN_BUTTONf(kMacCMapPad1PUp, "Joypad1 Up");
51 ASSIGN_BUTTONf(kMacCMapPad1PDown, "Joypad1 Down");
52 ASSIGN_BUTTONf(kMacCMapPad1PLeft, "Joypad1 Left");
53 ASSIGN_BUTTONf(kMacCMapPad1PRight, "Joypad1 Right");
54
55 ASSIGN_BUTTONf(kMacCMapPad2PX, "Joypad2 X");
56 ASSIGN_BUTTONf(kMacCMapPad2PA, "Joypad2 A");
57 ASSIGN_BUTTONf(kMacCMapPad2PB, "Joypad2 B");
58 ASSIGN_BUTTONf(kMacCMapPad2PY, "Joypad2 Y");
59 ASSIGN_BUTTONf(kMacCMapPad2PL, "Joypad2 L");
60 ASSIGN_BUTTONf(kMacCMapPad2PR, "Joypad2 R");
61 ASSIGN_BUTTONf(kMacCMapPad2PSelect, "Joypad2 Select");
62 ASSIGN_BUTTONf(kMacCMapPad2PStart, "Joypad2 Start");
63 ASSIGN_BUTTONf(kMacCMapPad2PUp, "Joypad2 Up");
64 ASSIGN_BUTTONf(kMacCMapPad2PDown, "Joypad2 Down");
65 ASSIGN_BUTTONf(kMacCMapPad2PLeft, "Joypad2 Left");
66 ASSIGN_BUTTONf(kMacCMapPad2PRight, "Joypad2 Right");
67
68 ASSIGN_BUTTONf(kMacCMapPad3PX, "Joypad3 X");
69 ASSIGN_BUTTONf(kMacCMapPad3PA, "Joypad3 A");
70 ASSIGN_BUTTONf(kMacCMapPad3PB, "Joypad3 B");
71 ASSIGN_BUTTONf(kMacCMapPad3PY, "Joypad3 Y");
72 ASSIGN_BUTTONf(kMacCMapPad3PL, "Joypad3 L");
73 ASSIGN_BUTTONf(kMacCMapPad3PR, "Joypad3 R");
74 ASSIGN_BUTTONf(kMacCMapPad3PSelect, "Joypad3 Select");
75 ASSIGN_BUTTONf(kMacCMapPad3PStart, "Joypad3 Start");
76 ASSIGN_BUTTONf(kMacCMapPad3PUp, "Joypad3 Up");
77 ASSIGN_BUTTONf(kMacCMapPad3PDown, "Joypad3 Down");
78 ASSIGN_BUTTONf(kMacCMapPad3PLeft, "Joypad3 Left");
79 ASSIGN_BUTTONf(kMacCMapPad3PRight, "Joypad3 Right");
80
81 ASSIGN_BUTTONf(kMacCMapPad4PX, "Joypad4 X");
82 ASSIGN_BUTTONf(kMacCMapPad4PA, "Joypad4 A");
83 ASSIGN_BUTTONf(kMacCMapPad4PB, "Joypad4 B");
84 ASSIGN_BUTTONf(kMacCMapPad4PY, "Joypad4 Y");
85 ASSIGN_BUTTONf(kMacCMapPad4PL, "Joypad4 L");
86 ASSIGN_BUTTONf(kMacCMapPad4PR, "Joypad4 R");
87 ASSIGN_BUTTONf(kMacCMapPad4PSelect, "Joypad4 Select");
88 ASSIGN_BUTTONf(kMacCMapPad4PStart, "Joypad4 Start");
89 ASSIGN_BUTTONf(kMacCMapPad4PUp, "Joypad4 Up");
90 ASSIGN_BUTTONf(kMacCMapPad4PDown, "Joypad4 Down");
91 ASSIGN_BUTTONf(kMacCMapPad4PLeft, "Joypad4 Left");
92 ASSIGN_BUTTONf(kMacCMapPad4PRight, "Joypad4 Right");
93
94 ASSIGN_BUTTONf(kMacCMapPad5PX, "Joypad5 X");
95 ASSIGN_BUTTONf(kMacCMapPad5PA, "Joypad5 A");
96 ASSIGN_BUTTONf(kMacCMapPad5PB, "Joypad5 B");
97 ASSIGN_BUTTONf(kMacCMapPad5PY, "Joypad5 Y");
98 ASSIGN_BUTTONf(kMacCMapPad5PL, "Joypad5 L");
99 ASSIGN_BUTTONf(kMacCMapPad5PR, "Joypad5 R");
100 ASSIGN_BUTTONf(kMacCMapPad5PSelect, "Joypad5 Select");
101 ASSIGN_BUTTONf(kMacCMapPad5PStart, "Joypad5 Start");
102 ASSIGN_BUTTONf(kMacCMapPad5PUp, "Joypad5 Up");
103 ASSIGN_BUTTONf(kMacCMapPad5PDown, "Joypad5 Down");
104 ASSIGN_BUTTONf(kMacCMapPad5PLeft, "Joypad5 Left");
105 ASSIGN_BUTTONf(kMacCMapPad5PRight, "Joypad5 Right");
106
107 ASSIGN_BUTTONf(kMacCMapPad6PX, "Joypad6 X");
108 ASSIGN_BUTTONf(kMacCMapPad6PA, "Joypad6 A");
109 ASSIGN_BUTTONf(kMacCMapPad6PB, "Joypad6 B");
110 ASSIGN_BUTTONf(kMacCMapPad6PY, "Joypad6 Y");
111 ASSIGN_BUTTONf(kMacCMapPad6PL, "Joypad6 L");
112 ASSIGN_BUTTONf(kMacCMapPad6PR, "Joypad6 R");
113 ASSIGN_BUTTONf(kMacCMapPad6PSelect, "Joypad6 Select");
114 ASSIGN_BUTTONf(kMacCMapPad6PStart, "Joypad6 Start");
115 ASSIGN_BUTTONf(kMacCMapPad6PUp, "Joypad6 Up");
116 ASSIGN_BUTTONf(kMacCMapPad6PDown, "Joypad6 Down");
117 ASSIGN_BUTTONf(kMacCMapPad6PLeft, "Joypad6 Left");
118 ASSIGN_BUTTONf(kMacCMapPad6PRight, "Joypad6 Right");
119
120 ASSIGN_BUTTONf(kMacCMapPad7PX, "Joypad7 X");
121 ASSIGN_BUTTONf(kMacCMapPad7PA, "Joypad7 A");
122 ASSIGN_BUTTONf(kMacCMapPad7PB, "Joypad7 B");
123 ASSIGN_BUTTONf(kMacCMapPad7PY, "Joypad7 Y");
124 ASSIGN_BUTTONf(kMacCMapPad7PL, "Joypad7 L");
125 ASSIGN_BUTTONf(kMacCMapPad7PR, "Joypad7 R");
126 ASSIGN_BUTTONf(kMacCMapPad7PSelect, "Joypad7 Select");
127 ASSIGN_BUTTONf(kMacCMapPad7PStart, "Joypad7 Start");
128 ASSIGN_BUTTONf(kMacCMapPad7PUp, "Joypad7 Up");
129 ASSIGN_BUTTONf(kMacCMapPad7PDown, "Joypad7 Down");
130 ASSIGN_BUTTONf(kMacCMapPad7PLeft, "Joypad7 Left");
131 ASSIGN_BUTTONf(kMacCMapPad7PRight, "Joypad7 Right");
132
133 ASSIGN_BUTTONf(kMacCMapPad8PX, "Joypad8 X");
134 ASSIGN_BUTTONf(kMacCMapPad8PA, "Joypad8 A");
135 ASSIGN_BUTTONf(kMacCMapPad8PB, "Joypad8 B");
136 ASSIGN_BUTTONf(kMacCMapPad8PY, "Joypad8 Y");
137 ASSIGN_BUTTONf(kMacCMapPad8PL, "Joypad8 L");
138 ASSIGN_BUTTONf(kMacCMapPad8PR, "Joypad8 R");
139 ASSIGN_BUTTONf(kMacCMapPad8PSelect, "Joypad8 Select");
140 ASSIGN_BUTTONf(kMacCMapPad8PStart, "Joypad8 Start");
141 ASSIGN_BUTTONf(kMacCMapPad8PUp, "Joypad8 Up");
142 ASSIGN_BUTTONf(kMacCMapPad8PDown, "Joypad8 Down");
143 ASSIGN_BUTTONf(kMacCMapPad8PLeft, "Joypad8 Left");
144 ASSIGN_BUTTONf(kMacCMapPad8PRight, "Joypad8 Right");
145
146 ASSIGN_BUTTONt(kMacCMapMouse1PL, "Mouse1 L");
147 ASSIGN_BUTTONt(kMacCMapMouse1PR, "Mouse1 R");
148 ASSIGN_BUTTONt(kMacCMapMouse2PL, "Mouse2 L");
149 ASSIGN_BUTTONt(kMacCMapMouse2PR, "Mouse2 R");
150
151 ASSIGN_BUTTONt(kMacCMapScopeOffscreen, "Superscope AimOffscreen");
152 ASSIGN_BUTTONt(kMacCMapScopeFire, "Superscope Fire");
153 ASSIGN_BUTTONt(kMacCMapScopeCursor, "Superscope Cursor");
154 ASSIGN_BUTTONt(kMacCMapScopeTurbo, "Superscope ToggleTurbo");
155 ASSIGN_BUTTONt(kMacCMapScopePause, "Superscope Pause");
156
157 ASSIGN_BUTTONt(kMacCMapLGun1Offscreen, "Justifier1 AimOffscreen");
158 ASSIGN_BUTTONt(kMacCMapLGun1Trigger, "Justifier1 Trigger");
159 ASSIGN_BUTTONt(kMacCMapLGun1Start, "Justifier1 Start");
160 ASSIGN_BUTTONt(kMacCMapLGun2Offscreen, "Justifier2 AimOffscreen");
161 ASSIGN_BUTTONt(kMacCMapLGun2Trigger, "Justifier2 Trigger");
162 ASSIGN_BUTTONt(kMacCMapLGun2Start, "Justifier2 Start");
163
164 ASSIGN_POINTRt(kMacCMapMouse1Pointer, "Pointer Mouse1");
165 ASSIGN_POINTRt(kMacCMapMouse2Pointer, "Pointer Mouse2");
166 ASSIGN_POINTRt(kMacCMapSuperscopePointer, "Pointer Superscope");
167 ASSIGN_POINTRt(kMacCMapJustifier1Pointer, "Pointer Justifier1");
168
169 ASSIGN_POINTRf(PseudoPointerBase, "Pointer Justifier2");
170 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 0, "ButtonToPointer 1u Med");
171 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 1, "ButtonToPointer 1d Med");
172 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 2, "ButtonToPointer 1l Med");
173 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 3, "ButtonToPointer 1r Med");
174 }
175
S9xPollButton(uint32 id,bool * pressed)176 bool S9xPollButton (uint32 id, bool *pressed)
177 {
178 #define kmControlKey 0x3B
179
180 KeyMap keys;
181
182 GetKeys(keys);
183
184 *pressed = false;
185
186 if (id & k_MO) // mouse
187 {
188 switch (id & 0xFF)
189 {
190 case 0: *pressed = ISpKeyIsPressed(kISpMouseL); break;
191 case 1: *pressed = ISpKeyIsPressed(kISpMouseR);
192 }
193 }
194 else
195 if (id & k_SS) // superscope
196 {
197 switch (id & 0xFF)
198 {
199 case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
200 case 2: *pressed = ISpKeyIsPressed(kISpScopeC) | KeyIsPressed(keys, keyCode[kKeyScopeCursor]); break;
201 case 3: *pressed = ISpKeyIsPressed(kISpScopeT) | KeyIsPressed(keys, keyCode[kKeyScopeTurbo]); break;
202 case 4: *pressed = ISpKeyIsPressed(kISpScopeP) | KeyIsPressed(keys, keyCode[kKeyScopePause]); break;
203 case 1: *pressed = ISpKeyIsPressed(kISpMouseL);
204 }
205 }
206 else
207 if (id & k_LG) // justifier
208 {
209 if (id & k_C1)
210 {
211 switch (id & 0xFF)
212 {
213 case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
214 case 1: *pressed = ISpKeyIsPressed(kISpMouseL); break;
215 case 2: *pressed = ISpKeyIsPressed(kISpMouseR);
216 }
217 }
218 else
219 {
220 switch (id & 0xFF)
221 {
222 case 0: *pressed = ISpKeyIsPressed(kISp2PStart) | KeyIsPressed(keys, keyCode[k2PStart]); break;
223 case 1: *pressed = ISpKeyIsPressed(kISp2PB) | KeyIsPressed(keys, keyCode[k2PB]); break;
224 case 2: *pressed = ISpKeyIsPressed(kISp2PA) | KeyIsPressed(keys, keyCode[k2PA]);
225 }
226 }
227 }
228
229 return (true);
230 }
231
S9xPollPointer(uint32 id,int16 * x,int16 * y)232 bool S9xPollPointer (uint32 id, int16 *x, int16 *y)
233 {
234 if (id & k_PT)
235 {
236 if ((id & k_MO) && fullscreen)
237 GetGameScreenPointer(x, y, true);
238 else
239 GetGameScreenPointer(x, y, false);
240 }
241 else
242 *x = *y = 0;
243
244 return (true);
245 }
246
S9xPollAxis(uint32 id,int16 * value)247 bool S9xPollAxis (uint32 id, int16 *value)
248 {
249 return (false);
250 }
251
S9xGetPortCommandT(const char * name)252 s9xcommand_t S9xGetPortCommandT (const char *name)
253 {
254 s9xcommand_t cmd;
255
256 memset(&cmd, 0, sizeof(cmd));
257 cmd.type = S9xBadMapping;
258
259 return (cmd);
260 }
261
S9xGetPortCommandName(s9xcommand_t command)262 char * S9xGetPortCommandName (s9xcommand_t command)
263 {
264 static char str[] = "PortCommand";
265
266 return (str);
267 }
268
S9xHandlePortCommand(s9xcommand_t cmd,int16 data1,int16 data2)269 void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2)
270 {
271 return;
272 }
273
S9xMapInput(const char * name,s9xcommand_t * cmd)274 bool8 S9xMapInput (const char *name, s9xcommand_t *cmd)
275 {
276 return (true);
277 }
278
ControlPadFlagsToS9xReportButtons(int n,uint32 p)279 void ControlPadFlagsToS9xReportButtons (int n, uint32 p)
280 {
281 uint32 base = k_HD | k_BT | k_JP | (0x100 << n);
282
283 S9xReportButton(base + 0, (p & 0x0040));
284 S9xReportButton(base + 1, (p & 0x0080));
285 S9xReportButton(base + 2, (p & 0x8000));
286 S9xReportButton(base + 3, (p & 0x4000));
287 S9xReportButton(base + 4, (p & 0x0020));
288 S9xReportButton(base + 5, (p & 0x0010));
289 S9xReportButton(base + 6, (p & 0x2000));
290 S9xReportButton(base + 7, (p & 0x1000));
291 S9xReportButton(base + 8, (p & 0x0800));
292 S9xReportButton(base + 9, (p & 0x0400));
293 S9xReportButton(base + 10, (p & 0x0200));
294 S9xReportButton(base + 11, (p & 0x0100));
295 }
296
ControlPadFlagsToS9xPseudoPointer(uint32 p)297 void ControlPadFlagsToS9xPseudoPointer (uint32 p)
298 {
299 // prevent screwiness caused by trying to move the pointer left+right or up+down
300 if ((p & 0x0c00) == 0x0c00) p &= ~0x0c00;
301 if ((p & 0x0300) == 0x0300) p &= ~0x0300;
302
303 // checks added to prevent a lack of right/down movement from breaking left/up movement
304 if (!(p & 0x0400))
305 S9xReportButton(kMacCMapPseudoPtrBase + 0, (p & 0x0800));
306 if (!(p & 0x0800))
307 S9xReportButton(kMacCMapPseudoPtrBase + 1, (p & 0x0400));
308 if (!(p & 0x0100))
309 S9xReportButton(kMacCMapPseudoPtrBase + 2, (p & 0x0200));
310 if (!(p & 0x0200))
311 S9xReportButton(kMacCMapPseudoPtrBase + 3, (p & 0x0100));
312 }
313