1 /***********************************************************************************
2 Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3
4 (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com),
5 Jerremy Koot (jkoot@snes9x.com)
6
7 (c) Copyright 2002 - 2004 Matthew Kendora
8
9 (c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
10
11 (c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
12
13 (c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
14
15 (c) Copyright 2002 - 2006 funkyass (funkyass@spam.shaw.ca),
16 Kris Bleakley (codeviolation@hotmail.com)
17
18 (c) Copyright 2002 - 2010 Brad Jorsch (anomie@users.sourceforge.net),
19 Nach (n-a-c-h@users.sourceforge.net),
20
21 (c) Copyright 2002 - 2011 zones (kasumitokoduck@yahoo.com)
22
23 (c) Copyright 2006 - 2007 nitsuja
24
25 (c) Copyright 2009 - 2016 BearOso,
26 OV2
27
28
29 BS-X C emulator code
30 (c) Copyright 2005 - 2006 Dreamer Nom,
31 zones
32
33 C4 x86 assembler and some C emulation code
34 (c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
35 Nach,
36 zsKnight (zsknight@zsnes.com)
37
38 C4 C++ code
39 (c) Copyright 2003 - 2006 Brad Jorsch,
40 Nach
41
42 DSP-1 emulator code
43 (c) Copyright 1998 - 2006 _Demo_,
44 Andreas Naive (andreasnaive@gmail.com),
45 Gary Henderson,
46 Ivar (ivar@snes9x.com),
47 John Weidman,
48 Kris Bleakley,
49 Matthew Kendora,
50 Nach,
51 neviksti (neviksti@hotmail.com)
52
53 DSP-2 emulator code
54 (c) Copyright 2003 John Weidman,
55 Kris Bleakley,
56 Lord Nightmare (lord_nightmare@users.sourceforge.net),
57 Matthew Kendora,
58 neviksti
59
60 DSP-3 emulator code
61 (c) Copyright 2003 - 2006 John Weidman,
62 Kris Bleakley,
63 Lancer,
64 z80 gaiden
65
66 DSP-4 emulator code
67 (c) Copyright 2004 - 2006 Dreamer Nom,
68 John Weidman,
69 Kris Bleakley,
70 Nach,
71 z80 gaiden
72
73 OBC1 emulator code
74 (c) Copyright 2001 - 2004 zsKnight,
75 pagefault (pagefault@zsnes.com),
76 Kris Bleakley
77 Ported from x86 assembler to C by sanmaiwashi
78
79 SPC7110 and RTC C++ emulator code used in 1.39-1.51
80 (c) Copyright 2002 Matthew Kendora with research by
81 zsKnight,
82 John Weidman,
83 Dark Force
84
85 SPC7110 and RTC C++ emulator code used in 1.52+
86 (c) Copyright 2009 byuu,
87 neviksti
88
89 S-DD1 C emulator code
90 (c) Copyright 2003 Brad Jorsch with research by
91 Andreas Naive,
92 John Weidman
93
94 S-RTC C emulator code
95 (c) Copyright 2001 - 2006 byuu,
96 John Weidman
97
98 ST010 C++ emulator code
99 (c) Copyright 2003 Feather,
100 John Weidman,
101 Kris Bleakley,
102 Matthew Kendora
103
104 Super FX x86 assembler emulator code
105 (c) Copyright 1998 - 2003 _Demo_,
106 pagefault,
107 zsKnight
108
109 Super FX C emulator code
110 (c) Copyright 1997 - 1999 Ivar,
111 Gary Henderson,
112 John Weidman
113
114 Sound emulator code used in 1.5-1.51
115 (c) Copyright 1998 - 2003 Brad Martin
116 (c) Copyright 1998 - 2006 Charles Bilyue'
117
118 Sound emulator code used in 1.52+
119 (c) Copyright 2004 - 2007 Shay Green (gblargg@gmail.com)
120
121 S-SMP emulator code used in 1.54+
122 (c) Copyright 2016 byuu
123
124 SH assembler code partly based on x86 assembler code
125 (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
126
127 2xSaI filter
128 (c) Copyright 1999 - 2001 Derek Liauw Kie Fa
129
130 HQ2x, HQ3x, HQ4x filters
131 (c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
132
133 NTSC filter
134 (c) Copyright 2006 - 2007 Shay Green
135
136 GTK+ GUI code
137 (c) Copyright 2004 - 2016 BearOso
138
139 Win32 GUI code
140 (c) Copyright 2003 - 2006 blip,
141 funkyass,
142 Matthew Kendora,
143 Nach,
144 nitsuja
145 (c) Copyright 2009 - 2016 OV2
146
147 Mac OS GUI code
148 (c) Copyright 1998 - 2001 John Stiles
149 (c) Copyright 2001 - 2011 zones
150
151
152 Specific ports contains the works of other authors. See headers in
153 individual files.
154
155
156 Snes9x homepage: http://www.snes9x.com/
157
158 Permission to use, copy, modify and/or distribute Snes9x in both binary
159 and source form, for non-commercial purposes, is hereby granted without
160 fee, providing that this license information and copyright notice appear
161 with all copies and any derived work.
162
163 This software is provided 'as-is', without any express or implied
164 warranty. In no event shall the authors be held liable for any damages
165 arising from the use of this software or it's derivatives.
166
167 Snes9x is freeware for PERSONAL USE only. Commercial users should
168 seek permission of the copyright holders first. Commercial use includes,
169 but is not limited to, charging money for Snes9x or software derived from
170 Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
171 using Snes9x as a promotion for your commercial product.
172
173 The copyright holders request that bug fixes and improvements to the code
174 should be forwarded to them so everyone can benefit from the modifications
175 in future versions.
176
177 Super NES and Super Nintendo Entertainment System are trademarks of
178 Nintendo Co., Limited and its subsidiary companies.
179 ***********************************************************************************/
180
181 /***********************************************************************************
182 SNES9X for Mac OS (c) Copyright John Stiles
183
184 Snes9x for Mac OS X
185
186 (c) Copyright 2001 - 2011 zones
187 (c) Copyright 2002 - 2005 107
188 (c) Copyright 2002 PB1400c
189 (c) Copyright 2004 Alexander and Sander
190 (c) Copyright 2004 - 2005 Steven Seeger
191 (c) Copyright 2005 Ryan Vogt
192 ***********************************************************************************/
193
194
195 #include "port.h"
196 #include "controls.h"
197
198 #include "mac-prefix.h"
199 #include "mac-joypad.h"
200 #include "mac-keyboard.h"
201 #include "mac-os.h"
202 #include "mac-controls.h"
203
204 #define ASSIGN_BUTTONf(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), false)
205 #define ASSIGN_BUTTONt(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), true)
206 #define ASSIGN_POINTRf(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), false)
207 #define ASSIGN_POINTRt(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), true)
208
209 #define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7)))
210
211
S9xSetupDefaultKeymap(void)212 void S9xSetupDefaultKeymap (void)
213 {
214 s9xcommand_t cmd;
215
216 ASSIGN_BUTTONf(kMacCMapPad1PX, "Joypad1 X");
217 ASSIGN_BUTTONf(kMacCMapPad1PA, "Joypad1 A");
218 ASSIGN_BUTTONf(kMacCMapPad1PB, "Joypad1 B");
219 ASSIGN_BUTTONf(kMacCMapPad1PY, "Joypad1 Y");
220 ASSIGN_BUTTONf(kMacCMapPad1PL, "Joypad1 L");
221 ASSIGN_BUTTONf(kMacCMapPad1PR, "Joypad1 R");
222 ASSIGN_BUTTONf(kMacCMapPad1PSelect, "Joypad1 Select");
223 ASSIGN_BUTTONf(kMacCMapPad1PStart, "Joypad1 Start");
224 ASSIGN_BUTTONf(kMacCMapPad1PUp, "Joypad1 Up");
225 ASSIGN_BUTTONf(kMacCMapPad1PDown, "Joypad1 Down");
226 ASSIGN_BUTTONf(kMacCMapPad1PLeft, "Joypad1 Left");
227 ASSIGN_BUTTONf(kMacCMapPad1PRight, "Joypad1 Right");
228
229 ASSIGN_BUTTONf(kMacCMapPad2PX, "Joypad2 X");
230 ASSIGN_BUTTONf(kMacCMapPad2PA, "Joypad2 A");
231 ASSIGN_BUTTONf(kMacCMapPad2PB, "Joypad2 B");
232 ASSIGN_BUTTONf(kMacCMapPad2PY, "Joypad2 Y");
233 ASSIGN_BUTTONf(kMacCMapPad2PL, "Joypad2 L");
234 ASSIGN_BUTTONf(kMacCMapPad2PR, "Joypad2 R");
235 ASSIGN_BUTTONf(kMacCMapPad2PSelect, "Joypad2 Select");
236 ASSIGN_BUTTONf(kMacCMapPad2PStart, "Joypad2 Start");
237 ASSIGN_BUTTONf(kMacCMapPad2PUp, "Joypad2 Up");
238 ASSIGN_BUTTONf(kMacCMapPad2PDown, "Joypad2 Down");
239 ASSIGN_BUTTONf(kMacCMapPad2PLeft, "Joypad2 Left");
240 ASSIGN_BUTTONf(kMacCMapPad2PRight, "Joypad2 Right");
241
242 ASSIGN_BUTTONf(kMacCMapPad3PX, "Joypad3 X");
243 ASSIGN_BUTTONf(kMacCMapPad3PA, "Joypad3 A");
244 ASSIGN_BUTTONf(kMacCMapPad3PB, "Joypad3 B");
245 ASSIGN_BUTTONf(kMacCMapPad3PY, "Joypad3 Y");
246 ASSIGN_BUTTONf(kMacCMapPad3PL, "Joypad3 L");
247 ASSIGN_BUTTONf(kMacCMapPad3PR, "Joypad3 R");
248 ASSIGN_BUTTONf(kMacCMapPad3PSelect, "Joypad3 Select");
249 ASSIGN_BUTTONf(kMacCMapPad3PStart, "Joypad3 Start");
250 ASSIGN_BUTTONf(kMacCMapPad3PUp, "Joypad3 Up");
251 ASSIGN_BUTTONf(kMacCMapPad3PDown, "Joypad3 Down");
252 ASSIGN_BUTTONf(kMacCMapPad3PLeft, "Joypad3 Left");
253 ASSIGN_BUTTONf(kMacCMapPad3PRight, "Joypad3 Right");
254
255 ASSIGN_BUTTONf(kMacCMapPad4PX, "Joypad4 X");
256 ASSIGN_BUTTONf(kMacCMapPad4PA, "Joypad4 A");
257 ASSIGN_BUTTONf(kMacCMapPad4PB, "Joypad4 B");
258 ASSIGN_BUTTONf(kMacCMapPad4PY, "Joypad4 Y");
259 ASSIGN_BUTTONf(kMacCMapPad4PL, "Joypad4 L");
260 ASSIGN_BUTTONf(kMacCMapPad4PR, "Joypad4 R");
261 ASSIGN_BUTTONf(kMacCMapPad4PSelect, "Joypad4 Select");
262 ASSIGN_BUTTONf(kMacCMapPad4PStart, "Joypad4 Start");
263 ASSIGN_BUTTONf(kMacCMapPad4PUp, "Joypad4 Up");
264 ASSIGN_BUTTONf(kMacCMapPad4PDown, "Joypad4 Down");
265 ASSIGN_BUTTONf(kMacCMapPad4PLeft, "Joypad4 Left");
266 ASSIGN_BUTTONf(kMacCMapPad4PRight, "Joypad4 Right");
267
268 ASSIGN_BUTTONf(kMacCMapPad5PX, "Joypad5 X");
269 ASSIGN_BUTTONf(kMacCMapPad5PA, "Joypad5 A");
270 ASSIGN_BUTTONf(kMacCMapPad5PB, "Joypad5 B");
271 ASSIGN_BUTTONf(kMacCMapPad5PY, "Joypad5 Y");
272 ASSIGN_BUTTONf(kMacCMapPad5PL, "Joypad5 L");
273 ASSIGN_BUTTONf(kMacCMapPad5PR, "Joypad5 R");
274 ASSIGN_BUTTONf(kMacCMapPad5PSelect, "Joypad5 Select");
275 ASSIGN_BUTTONf(kMacCMapPad5PStart, "Joypad5 Start");
276 ASSIGN_BUTTONf(kMacCMapPad5PUp, "Joypad5 Up");
277 ASSIGN_BUTTONf(kMacCMapPad5PDown, "Joypad5 Down");
278 ASSIGN_BUTTONf(kMacCMapPad5PLeft, "Joypad5 Left");
279 ASSIGN_BUTTONf(kMacCMapPad5PRight, "Joypad5 Right");
280
281 ASSIGN_BUTTONf(kMacCMapPad6PX, "Joypad6 X");
282 ASSIGN_BUTTONf(kMacCMapPad6PA, "Joypad6 A");
283 ASSIGN_BUTTONf(kMacCMapPad6PB, "Joypad6 B");
284 ASSIGN_BUTTONf(kMacCMapPad6PY, "Joypad6 Y");
285 ASSIGN_BUTTONf(kMacCMapPad6PL, "Joypad6 L");
286 ASSIGN_BUTTONf(kMacCMapPad6PR, "Joypad6 R");
287 ASSIGN_BUTTONf(kMacCMapPad6PSelect, "Joypad6 Select");
288 ASSIGN_BUTTONf(kMacCMapPad6PStart, "Joypad6 Start");
289 ASSIGN_BUTTONf(kMacCMapPad6PUp, "Joypad6 Up");
290 ASSIGN_BUTTONf(kMacCMapPad6PDown, "Joypad6 Down");
291 ASSIGN_BUTTONf(kMacCMapPad6PLeft, "Joypad6 Left");
292 ASSIGN_BUTTONf(kMacCMapPad6PRight, "Joypad6 Right");
293
294 ASSIGN_BUTTONf(kMacCMapPad7PX, "Joypad7 X");
295 ASSIGN_BUTTONf(kMacCMapPad7PA, "Joypad7 A");
296 ASSIGN_BUTTONf(kMacCMapPad7PB, "Joypad7 B");
297 ASSIGN_BUTTONf(kMacCMapPad7PY, "Joypad7 Y");
298 ASSIGN_BUTTONf(kMacCMapPad7PL, "Joypad7 L");
299 ASSIGN_BUTTONf(kMacCMapPad7PR, "Joypad7 R");
300 ASSIGN_BUTTONf(kMacCMapPad7PSelect, "Joypad7 Select");
301 ASSIGN_BUTTONf(kMacCMapPad7PStart, "Joypad7 Start");
302 ASSIGN_BUTTONf(kMacCMapPad7PUp, "Joypad7 Up");
303 ASSIGN_BUTTONf(kMacCMapPad7PDown, "Joypad7 Down");
304 ASSIGN_BUTTONf(kMacCMapPad7PLeft, "Joypad7 Left");
305 ASSIGN_BUTTONf(kMacCMapPad7PRight, "Joypad7 Right");
306
307 ASSIGN_BUTTONf(kMacCMapPad8PX, "Joypad8 X");
308 ASSIGN_BUTTONf(kMacCMapPad8PA, "Joypad8 A");
309 ASSIGN_BUTTONf(kMacCMapPad8PB, "Joypad8 B");
310 ASSIGN_BUTTONf(kMacCMapPad8PY, "Joypad8 Y");
311 ASSIGN_BUTTONf(kMacCMapPad8PL, "Joypad8 L");
312 ASSIGN_BUTTONf(kMacCMapPad8PR, "Joypad8 R");
313 ASSIGN_BUTTONf(kMacCMapPad8PSelect, "Joypad8 Select");
314 ASSIGN_BUTTONf(kMacCMapPad8PStart, "Joypad8 Start");
315 ASSIGN_BUTTONf(kMacCMapPad8PUp, "Joypad8 Up");
316 ASSIGN_BUTTONf(kMacCMapPad8PDown, "Joypad8 Down");
317 ASSIGN_BUTTONf(kMacCMapPad8PLeft, "Joypad8 Left");
318 ASSIGN_BUTTONf(kMacCMapPad8PRight, "Joypad8 Right");
319
320 ASSIGN_BUTTONt(kMacCMapMouse1PL, "Mouse1 L");
321 ASSIGN_BUTTONt(kMacCMapMouse1PR, "Mouse1 R");
322 ASSIGN_BUTTONt(kMacCMapMouse2PL, "Mouse2 L");
323 ASSIGN_BUTTONt(kMacCMapMouse2PR, "Mouse2 R");
324
325 ASSIGN_BUTTONt(kMacCMapScopeOffscreen, "Superscope AimOffscreen");
326 ASSIGN_BUTTONt(kMacCMapScopeFire, "Superscope Fire");
327 ASSIGN_BUTTONt(kMacCMapScopeCursor, "Superscope Cursor");
328 ASSIGN_BUTTONt(kMacCMapScopeTurbo, "Superscope ToggleTurbo");
329 ASSIGN_BUTTONt(kMacCMapScopePause, "Superscope Pause");
330
331 ASSIGN_BUTTONt(kMacCMapLGun1Offscreen, "Justifier1 AimOffscreen");
332 ASSIGN_BUTTONt(kMacCMapLGun1Trigger, "Justifier1 Trigger");
333 ASSIGN_BUTTONt(kMacCMapLGun1Start, "Justifier1 Start");
334 ASSIGN_BUTTONt(kMacCMapLGun2Offscreen, "Justifier2 AimOffscreen");
335 ASSIGN_BUTTONt(kMacCMapLGun2Trigger, "Justifier2 Trigger");
336 ASSIGN_BUTTONt(kMacCMapLGun2Start, "Justifier2 Start");
337
338 ASSIGN_POINTRt(kMacCMapMouse1Pointer, "Pointer Mouse1");
339 ASSIGN_POINTRt(kMacCMapMouse2Pointer, "Pointer Mouse2");
340 ASSIGN_POINTRt(kMacCMapSuperscopePointer, "Pointer Superscope");
341 ASSIGN_POINTRt(kMacCMapJustifier1Pointer, "Pointer Justifier1");
342
343 ASSIGN_POINTRf(PseudoPointerBase, "Pointer Justifier2");
344 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 0, "ButtonToPointer 1u Med");
345 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 1, "ButtonToPointer 1d Med");
346 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 2, "ButtonToPointer 1l Med");
347 ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 3, "ButtonToPointer 1r Med");
348 }
349
S9xPollButton(uint32 id,bool * pressed)350 bool S9xPollButton (uint32 id, bool *pressed)
351 {
352 #define kmControlKey 0x3B
353
354 KeyMap keys;
355
356 GetKeys(keys);
357
358 *pressed = false;
359
360 if (id & k_MO) // mouse
361 {
362 switch (id & 0xFF)
363 {
364 case 0: *pressed = ISpKeyIsPressed(kISpMouseL); break;
365 case 1: *pressed = ISpKeyIsPressed(kISpMouseR);
366 }
367 }
368 else
369 if (id & k_SS) // superscope
370 {
371 switch (id & 0xFF)
372 {
373 case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
374 case 2: *pressed = ISpKeyIsPressed(kISpScopeC) | KeyIsPressed(keys, keyCode[kKeyScopeCursor]); break;
375 case 3: *pressed = ISpKeyIsPressed(kISpScopeT) | KeyIsPressed(keys, keyCode[kKeyScopeTurbo]); break;
376 case 4: *pressed = ISpKeyIsPressed(kISpScopeP) | KeyIsPressed(keys, keyCode[kKeyScopePause]); break;
377 case 1: *pressed = ISpKeyIsPressed(kISpMouseL);
378 }
379 }
380 else
381 if (id & k_LG) // justifier
382 {
383 if (id & k_C1)
384 {
385 switch (id & 0xFF)
386 {
387 case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
388 case 1: *pressed = ISpKeyIsPressed(kISpMouseL); break;
389 case 2: *pressed = ISpKeyIsPressed(kISpMouseR);
390 }
391 }
392 else
393 {
394 switch (id & 0xFF)
395 {
396 case 0: *pressed = ISpKeyIsPressed(kISp2PStart) | KeyIsPressed(keys, keyCode[k2PStart]); break;
397 case 1: *pressed = ISpKeyIsPressed(kISp2PB) | KeyIsPressed(keys, keyCode[k2PB]); break;
398 case 2: *pressed = ISpKeyIsPressed(kISp2PA) | KeyIsPressed(keys, keyCode[k2PA]);
399 }
400 }
401 }
402
403 return (true);
404 }
405
S9xPollPointer(uint32 id,int16 * x,int16 * y)406 bool S9xPollPointer (uint32 id, int16 *x, int16 *y)
407 {
408 if (id & k_PT)
409 {
410 if ((id & k_MO) && fullscreen)
411 GetGameScreenPointer(x, y, true);
412 else
413 GetGameScreenPointer(x, y, false);
414 }
415 else
416 *x = *y = 0;
417
418 return (true);
419 }
420
S9xPollAxis(uint32 id,int16 * value)421 bool S9xPollAxis (uint32 id, int16 *value)
422 {
423 return (false);
424 }
425
S9xGetPortCommandT(const char * name)426 s9xcommand_t S9xGetPortCommandT (const char *name)
427 {
428 s9xcommand_t cmd;
429
430 memset(&cmd, 0, sizeof(cmd));
431 cmd.type = S9xBadMapping;
432
433 return (cmd);
434 }
435
S9xGetPortCommandName(s9xcommand_t command)436 char * S9xGetPortCommandName (s9xcommand_t command)
437 {
438 static char str[] = "PortCommand";
439
440 return (str);
441 }
442
S9xHandlePortCommand(s9xcommand_t cmd,int16 data1,int16 data2)443 void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2)
444 {
445 return;
446 }
447
S9xMapInput(const char * name,s9xcommand_t * cmd)448 bool8 S9xMapInput (const char *name, s9xcommand_t *cmd)
449 {
450 return (true);
451 }
452
ControlPadFlagsToS9xReportButtons(int n,uint32 p)453 void ControlPadFlagsToS9xReportButtons (int n, uint32 p)
454 {
455 uint32 base = k_HD | k_BT | k_JP | (0x100 << n);
456
457 S9xReportButton(base + 0, (p & 0x0040));
458 S9xReportButton(base + 1, (p & 0x0080));
459 S9xReportButton(base + 2, (p & 0x8000));
460 S9xReportButton(base + 3, (p & 0x4000));
461 S9xReportButton(base + 4, (p & 0x0020));
462 S9xReportButton(base + 5, (p & 0x0010));
463 S9xReportButton(base + 6, (p & 0x2000));
464 S9xReportButton(base + 7, (p & 0x1000));
465 S9xReportButton(base + 8, (p & 0x0800));
466 S9xReportButton(base + 9, (p & 0x0400));
467 S9xReportButton(base + 10, (p & 0x0200));
468 S9xReportButton(base + 11, (p & 0x0100));
469 }
470
ControlPadFlagsToS9xPseudoPointer(uint32 p)471 void ControlPadFlagsToS9xPseudoPointer (uint32 p)
472 {
473 // prevent screwiness caused by trying to move the pointer left+right or up+down
474 if ((p & 0x0c00) == 0x0c00) p &= ~0x0c00;
475 if ((p & 0x0300) == 0x0300) p &= ~0x0300;
476
477 // checks added to prevent a lack of right/down movement from breaking left/up movement
478 if (!(p & 0x0400))
479 S9xReportButton(kMacCMapPseudoPtrBase + 0, (p & 0x0800));
480 if (!(p & 0x0800))
481 S9xReportButton(kMacCMapPseudoPtrBase + 1, (p & 0x0400));
482 if (!(p & 0x0100))
483 S9xReportButton(kMacCMapPseudoPtrBase + 2, (p & 0x0200));
484 if (!(p & 0x0200))
485 S9xReportButton(kMacCMapPseudoPtrBase + 3, (p & 0x0100));
486 }
487