2018-11-16 00:31:39 +01:00
|
|
|
/*****************************************************************************\
|
|
|
|
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
|
|
|
This file is licensed under the Snes9x License.
|
|
|
|
For further information, consult the LICENSE file in the root directory.
|
|
|
|
\*****************************************************************************/
|
2010-09-25 17:46:12 +02:00
|
|
|
|
|
|
|
/***********************************************************************************
|
|
|
|
SNES9X for Mac OS (c) Copyright John Stiles
|
|
|
|
|
|
|
|
Snes9x for Mac OS X
|
|
|
|
|
2011-04-10 15:44:28 +02:00
|
|
|
(c) Copyright 2001 - 2011 zones
|
2010-09-25 17:46:12 +02:00
|
|
|
(c) Copyright 2002 - 2005 107
|
|
|
|
(c) Copyright 2002 PB1400c
|
|
|
|
(c) Copyright 2004 Alexander and Sander
|
|
|
|
(c) Copyright 2004 - 2005 Steven Seeger
|
|
|
|
(c) Copyright 2005 Ryan Vogt
|
|
|
|
***********************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include "port.h"
|
|
|
|
#include "controls.h"
|
|
|
|
|
|
|
|
#include "mac-prefix.h"
|
|
|
|
#include "mac-joypad.h"
|
|
|
|
#include "mac-keyboard.h"
|
|
|
|
#include "mac-os.h"
|
|
|
|
#include "mac-controls.h"
|
|
|
|
|
|
|
|
#define ASSIGN_BUTTONf(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), false)
|
|
|
|
#define ASSIGN_BUTTONt(n, s) S9xMapButton (n, cmd = S9xGetCommandT(s), true)
|
|
|
|
#define ASSIGN_POINTRf(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), false)
|
|
|
|
#define ASSIGN_POINTRt(n, s) S9xMapPointer(n, cmd = S9xGetCommandT(s), true)
|
|
|
|
|
|
|
|
#define KeyIsPressed(km, k) (1 & (((unsigned char *) km) [(k) >> 3] >> ((k) & 7)))
|
|
|
|
|
|
|
|
|
|
|
|
void S9xSetupDefaultKeymap (void)
|
|
|
|
{
|
|
|
|
s9xcommand_t cmd;
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PX, "Joypad1 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PA, "Joypad1 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PB, "Joypad1 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PY, "Joypad1 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PL, "Joypad1 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PR, "Joypad1 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PSelect, "Joypad1 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PStart, "Joypad1 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PUp, "Joypad1 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PDown, "Joypad1 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PLeft, "Joypad1 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad1PRight, "Joypad1 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PX, "Joypad2 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PA, "Joypad2 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PB, "Joypad2 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PY, "Joypad2 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PL, "Joypad2 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PR, "Joypad2 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PSelect, "Joypad2 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PStart, "Joypad2 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PUp, "Joypad2 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PDown, "Joypad2 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PLeft, "Joypad2 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad2PRight, "Joypad2 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PX, "Joypad3 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PA, "Joypad3 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PB, "Joypad3 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PY, "Joypad3 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PL, "Joypad3 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PR, "Joypad3 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PSelect, "Joypad3 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PStart, "Joypad3 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PUp, "Joypad3 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PDown, "Joypad3 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PLeft, "Joypad3 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad3PRight, "Joypad3 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PX, "Joypad4 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PA, "Joypad4 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PB, "Joypad4 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PY, "Joypad4 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PL, "Joypad4 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PR, "Joypad4 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PSelect, "Joypad4 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PStart, "Joypad4 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PUp, "Joypad4 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PDown, "Joypad4 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PLeft, "Joypad4 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad4PRight, "Joypad4 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PX, "Joypad5 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PA, "Joypad5 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PB, "Joypad5 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PY, "Joypad5 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PL, "Joypad5 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PR, "Joypad5 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PSelect, "Joypad5 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PStart, "Joypad5 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PUp, "Joypad5 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PDown, "Joypad5 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PLeft, "Joypad5 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad5PRight, "Joypad5 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PX, "Joypad6 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PA, "Joypad6 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PB, "Joypad6 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PY, "Joypad6 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PL, "Joypad6 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PR, "Joypad6 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PSelect, "Joypad6 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PStart, "Joypad6 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PUp, "Joypad6 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PDown, "Joypad6 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PLeft, "Joypad6 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad6PRight, "Joypad6 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PX, "Joypad7 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PA, "Joypad7 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PB, "Joypad7 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PY, "Joypad7 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PL, "Joypad7 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PR, "Joypad7 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PSelect, "Joypad7 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PStart, "Joypad7 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PUp, "Joypad7 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PDown, "Joypad7 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PLeft, "Joypad7 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad7PRight, "Joypad7 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PX, "Joypad8 X");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PA, "Joypad8 A");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PB, "Joypad8 B");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PY, "Joypad8 Y");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PL, "Joypad8 L");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PR, "Joypad8 R");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PSelect, "Joypad8 Select");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PStart, "Joypad8 Start");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PUp, "Joypad8 Up");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PDown, "Joypad8 Down");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PLeft, "Joypad8 Left");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPad8PRight, "Joypad8 Right");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONt(kMacCMapMouse1PL, "Mouse1 L");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapMouse1PR, "Mouse1 R");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapMouse2PL, "Mouse2 L");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapMouse2PR, "Mouse2 R");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONt(kMacCMapScopeOffscreen, "Superscope AimOffscreen");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapScopeFire, "Superscope Fire");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapScopeCursor, "Superscope Cursor");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapScopeTurbo, "Superscope ToggleTurbo");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapScopePause, "Superscope Pause");
|
|
|
|
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun1Offscreen, "Justifier1 AimOffscreen");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun1Trigger, "Justifier1 Trigger");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun1Start, "Justifier1 Start");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun2Offscreen, "Justifier2 AimOffscreen");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun2Trigger, "Justifier2 Trigger");
|
|
|
|
ASSIGN_BUTTONt(kMacCMapLGun2Start, "Justifier2 Start");
|
|
|
|
|
|
|
|
ASSIGN_POINTRt(kMacCMapMouse1Pointer, "Pointer Mouse1");
|
|
|
|
ASSIGN_POINTRt(kMacCMapMouse2Pointer, "Pointer Mouse2");
|
|
|
|
ASSIGN_POINTRt(kMacCMapSuperscopePointer, "Pointer Superscope");
|
|
|
|
ASSIGN_POINTRt(kMacCMapJustifier1Pointer, "Pointer Justifier1");
|
|
|
|
|
|
|
|
ASSIGN_POINTRf(PseudoPointerBase, "Pointer Justifier2");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 0, "ButtonToPointer 1u Med");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 1, "ButtonToPointer 1d Med");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 2, "ButtonToPointer 1l Med");
|
|
|
|
ASSIGN_BUTTONf(kMacCMapPseudoPtrBase + 3, "ButtonToPointer 1r Med");
|
|
|
|
}
|
|
|
|
|
|
|
|
bool S9xPollButton (uint32 id, bool *pressed)
|
|
|
|
{
|
|
|
|
#define kmControlKey 0x3B
|
|
|
|
|
|
|
|
KeyMap keys;
|
|
|
|
|
|
|
|
GetKeys(keys);
|
|
|
|
|
|
|
|
*pressed = false;
|
|
|
|
|
|
|
|
if (id & k_MO) // mouse
|
|
|
|
{
|
|
|
|
switch (id & 0xFF)
|
|
|
|
{
|
|
|
|
case 0: *pressed = ISpKeyIsPressed(kISpMouseL); break;
|
|
|
|
case 1: *pressed = ISpKeyIsPressed(kISpMouseR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (id & k_SS) // superscope
|
|
|
|
{
|
|
|
|
switch (id & 0xFF)
|
|
|
|
{
|
|
|
|
case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
|
|
|
|
case 2: *pressed = ISpKeyIsPressed(kISpScopeC) | KeyIsPressed(keys, keyCode[kKeyScopeCursor]); break;
|
|
|
|
case 3: *pressed = ISpKeyIsPressed(kISpScopeT) | KeyIsPressed(keys, keyCode[kKeyScopeTurbo]); break;
|
|
|
|
case 4: *pressed = ISpKeyIsPressed(kISpScopeP) | KeyIsPressed(keys, keyCode[kKeyScopePause]); break;
|
|
|
|
case 1: *pressed = ISpKeyIsPressed(kISpMouseL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (id & k_LG) // justifier
|
|
|
|
{
|
|
|
|
if (id & k_C1)
|
|
|
|
{
|
|
|
|
switch (id & 0xFF)
|
|
|
|
{
|
|
|
|
case 0: *pressed = ISpKeyIsPressed(kISpOffScreen) | KeyIsPressed(keys, keyCode[kKeyOffScreen]); break;
|
|
|
|
case 1: *pressed = ISpKeyIsPressed(kISpMouseL); break;
|
|
|
|
case 2: *pressed = ISpKeyIsPressed(kISpMouseR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (id & 0xFF)
|
|
|
|
{
|
|
|
|
case 0: *pressed = ISpKeyIsPressed(kISp2PStart) | KeyIsPressed(keys, keyCode[k2PStart]); break;
|
|
|
|
case 1: *pressed = ISpKeyIsPressed(kISp2PB) | KeyIsPressed(keys, keyCode[k2PB]); break;
|
|
|
|
case 2: *pressed = ISpKeyIsPressed(kISp2PA) | KeyIsPressed(keys, keyCode[k2PA]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return (true);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool S9xPollPointer (uint32 id, int16 *x, int16 *y)
|
|
|
|
{
|
|
|
|
if (id & k_PT)
|
|
|
|
{
|
|
|
|
if ((id & k_MO) && fullscreen)
|
|
|
|
GetGameScreenPointer(x, y, true);
|
|
|
|
else
|
|
|
|
GetGameScreenPointer(x, y, false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*x = *y = 0;
|
|
|
|
|
|
|
|
return (true);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool S9xPollAxis (uint32 id, int16 *value)
|
|
|
|
{
|
|
|
|
return (false);
|
|
|
|
}
|
|
|
|
|
|
|
|
s9xcommand_t S9xGetPortCommandT (const char *name)
|
|
|
|
{
|
|
|
|
s9xcommand_t cmd;
|
|
|
|
|
2012-01-23 18:12:47 +01:00
|
|
|
memset(&cmd, 0, sizeof(cmd));
|
2010-09-25 17:46:12 +02:00
|
|
|
cmd.type = S9xBadMapping;
|
|
|
|
|
|
|
|
return (cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
char * S9xGetPortCommandName (s9xcommand_t command)
|
|
|
|
{
|
|
|
|
static char str[] = "PortCommand";
|
|
|
|
|
|
|
|
return (str);
|
|
|
|
}
|
|
|
|
|
|
|
|
void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 S9xMapInput (const char *name, s9xcommand_t *cmd)
|
|
|
|
{
|
|
|
|
return (true);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ControlPadFlagsToS9xReportButtons (int n, uint32 p)
|
|
|
|
{
|
|
|
|
uint32 base = k_HD | k_BT | k_JP | (0x100 << n);
|
|
|
|
|
|
|
|
S9xReportButton(base + 0, (p & 0x0040));
|
|
|
|
S9xReportButton(base + 1, (p & 0x0080));
|
|
|
|
S9xReportButton(base + 2, (p & 0x8000));
|
|
|
|
S9xReportButton(base + 3, (p & 0x4000));
|
|
|
|
S9xReportButton(base + 4, (p & 0x0020));
|
|
|
|
S9xReportButton(base + 5, (p & 0x0010));
|
|
|
|
S9xReportButton(base + 6, (p & 0x2000));
|
|
|
|
S9xReportButton(base + 7, (p & 0x1000));
|
|
|
|
S9xReportButton(base + 8, (p & 0x0800));
|
|
|
|
S9xReportButton(base + 9, (p & 0x0400));
|
|
|
|
S9xReportButton(base + 10, (p & 0x0200));
|
|
|
|
S9xReportButton(base + 11, (p & 0x0100));
|
|
|
|
}
|
|
|
|
|
|
|
|
void ControlPadFlagsToS9xPseudoPointer (uint32 p)
|
|
|
|
{
|
|
|
|
// prevent screwiness caused by trying to move the pointer left+right or up+down
|
|
|
|
if ((p & 0x0c00) == 0x0c00) p &= ~0x0c00;
|
|
|
|
if ((p & 0x0300) == 0x0300) p &= ~0x0300;
|
|
|
|
|
|
|
|
// checks added to prevent a lack of right/down movement from breaking left/up movement
|
|
|
|
if (!(p & 0x0400))
|
|
|
|
S9xReportButton(kMacCMapPseudoPtrBase + 0, (p & 0x0800));
|
|
|
|
if (!(p & 0x0800))
|
|
|
|
S9xReportButton(kMacCMapPseudoPtrBase + 1, (p & 0x0400));
|
|
|
|
if (!(p & 0x0100))
|
|
|
|
S9xReportButton(kMacCMapPseudoPtrBase + 2, (p & 0x0200));
|
|
|
|
if (!(p & 0x0200))
|
|
|
|
S9xReportButton(kMacCMapPseudoPtrBase + 3, (p & 0x0100));
|
|
|
|
}
|