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