Input support update.

This commit is contained in:
n-a-c-h
2004-06-06 19:01:34 +00:00
parent f21be3ddfa
commit 790499c488
2 changed files with 180 additions and 129 deletions

View File

@@ -1018,16 +1018,16 @@ NEWSYM ScanCodeListing
db 'KP8','KP9','KP-','KP4','KP5','KP6','KP+','KP1'
db 'KP2','KP3','KP0','KP.',' ',' ','OEM','F11' ; 50h
db 'F12','HOM',' UP','PGU','LFT','5DH','RGT','END'
db 'DWN','PGD','INS','DEL','64H','65H','66H','67H' ; 80h
db 'DWN','PGD','INS','DEL','64H','65H','66H','67H' ; 60h
%else
db 'F6 ','F7 ','F8 ','F9 ','F10','NUM','SCR','N 7' ; 40h
db 'N 8','N 9','N -','N 4','N 5','N 6','N +','N 1'
db 'N 2','N 3','N 0','N .',' ',' ','OEM','F11' ; 50h
db 'F12','59h','5Ah','5BH','5CH','5DH','5EH','5FH'
db '60H','61H','62H','63H','64H','65H','66H','67H' ; 80h
db '68H','69H','6AH','6BH','6CH','6DH','6EH','6FH'
db '60H','61H','62H','63H','64H','65H','66H','67H' ; 60h
%endif
db '70H','71H','72H','73H','74H','75H','76H','77H' ; 90h
db '68H','69H','6AH','6BH','6CH','6DH','6EH','6FH'
db '70H','71H','72H','73H','74H','75H','76H','77H' ; 70h
db '78H','79H','7AH','7BH','7CH','7DH','7EH','7FH'
; Keyboard continued (Direct Input)
db '80H','81H','82H','83H','84H','85H','86H','87H' ; 80h
@@ -1046,32 +1046,44 @@ NEWSYM ScanCodeListing
db 'E8H','E9H','EAH','EBH','ECH','EDH','EEH','EFH'
db 'F0H','F1H','F2H','F3H','F4H','F5H','F6H','F7H' ; F0h
db 'F8H','F9H','FAH','FBH','FCH','FDH','FEH','FFH'
; Joystick Stuff (Direct Input)
db 'J00','J01','J02','J03','J04','J05','J06','J07'
; Joystick Stuff
db 'J00','J01','J02','J03','J04','J05','J06','J07' ; 100h
db 'J08','J09','J0A','J0B','J0C','J0D','J0E','J0F'
db 'J10','J11','J12','J13','J14','J15','J16','J17'
db 'J10','J11','J12','J13','J14','J15','J16','J17' ; 110h
db 'J18','J19','J1A','J1B','J1C','J1D','J1E','J1F'
db 'J20','J21','J22','J23','J24','J25','J26','J27'
db 'J20','J21','J22','J23','J24','J25','J26','J27' ; 120h
db 'J28','J29','J2A','J2B','J2C','J2D','J2E','J2F'
db 'J30','J31','J32','J33','J34','J35','J36','J37'
db 'J30','J31','J32','J33','J34','J35','J36','J37' ; 130h
db 'J38','J39','J3A','J3B','J3C','J3D','J3E','J3F'
db 'J40','J41','J42','J43','J44','J45','J46','J47'
db 'J40','J41','J42','J43','J44','J45','J46','J47' ; 140h
db 'J48','J49','J4A','J4B','J4C','J4D','J4E','J4F'
db 'J50','J51','J52','J53','J54','J55','J56','J57'
db 'J50','J51','J52','J53','J54','J55','J56','J57' ; 150h
db 'J58','J59','J5A','J5B','J5C','J5D','J5E','J5F'
db 'J60','J61','J62','J63','J64','J65','J66','J67'
db 'J60','J61','J62','J63','J64','J65','J66','J67' ; 160h
db 'J68','J69','J6A','J6B','J6C','J6D','J6E','J6F'
db 'J70','J71','J72','J73','J74','J75','J76','J77'
db 'J70','J71','J72','J73','J74','J75','J76','J77' ; 170h
db 'J78','J79','J7A','J7B','J7C','J7D','J7E','J7F'
%ifdef __LINUX__
; Extra Joystick Stuff
db 'J80','J81','J82','J83','J84','J85','J86','J87' ; 180h
db 'J88','J89','J8A','J8B','J8C','J8D','J8E','J8F'
db 'J90','J91','J92','J93','J94','J95','J96','J97' ; 190h
db 'J98','J99','J9A','J9B','J9C','J9D','J9E','J9F'
db 'JA0','JA1','JA2','JA3','JA4','JA5','JA6','JA7' ; 2A0h
db 'JA8','JA9','JAA','JAB','JAC','JAD','JAE','JAF'
db 'JB0','JB1','JB2','JB3','JB4','JB5','JB6','JB7' ; 2B0h
db 'JB8','JB9','JBA','JBB','JBC','JBD','JBE','JBF'
%else
; Extra Stuff (180h) (Parallel Port)
db 'PPB','PPY','PSL','PST','PUP','PDN','PLT','PRT'
db 'PPB','PPY','PSL','PST','PUP','PDN','PLT','PRT' ; 180h
db 'PPA','PPX','PPL','PPR',' ',' ',' ',' '
db 'P2B','P2Y','P2S','P2T','P2U','P2D','P2L','P2R'
db 'P2B','P2Y','P2S','P2T','P2U','P2D','P2L','P2R' ; 190h
db 'P2A','P2X','P2L','P2R',' ',' ',' ',' '
db 'PPB','PPY','PSL','PST','PUP','PDN','PLT','PRT'
db 'PPB','PPY','PSL','PST','PUP','PDN','PLT','PRT' ; 2A0h
db 'PPA','PPX','PPL','PPR',' ',' ',' ',' '
db 'P2B','P2Y','P2S','P2T','P2U','P2D','P2L','P2R'
db 'P2B','P2Y','P2S','P2T','P2U','P2D','P2L','P2R' ; 2B0h
db 'P2A','P2X','P2L','P2R',' ',' ',' ',' '
%endif
SECTION .text

View File

@@ -77,7 +77,12 @@ extern BYTE GUIHQ4X[];
/* JOYSTICK AND KEYBOARD INPUT */
SDL_Joystick *JoystickInput[5];
unsigned int AxisOffset[5] = {256 + 128 + 64}; // per joystick offsets in
unsigned int ButtonOffset[5] = {448}; // pressed. We have 128 + 64
unsigned int HatOffset[5] = {448}; // bytes for all joysticks. We
unsigned int BallOffset[5] = {448}; // can control all 5 players.
int shiftptr = 0;
int offset;
DWORD numlockptr;
extern unsigned char pressed[];
@@ -150,7 +155,6 @@ static void adjustMouseYScale(void)
int Main_Proc(void)
{
int j;
SDL_Event event;
while (SDL_PollEvent(&event))
@@ -176,7 +180,7 @@ int Main_Proc(void)
if (event.key.keysym.scancode - 8 >= 0)
{
//if (pressed[event.key.keysym.scancode - 8] != 2)
pressed[event.key.keysym.scancode - 8] = 1;
pressed[event.key.keysym.scancode - 8] = 1;
ProcessKeyBuf(event.key.keysym.sym);
}
break;
@@ -228,7 +232,6 @@ int Main_Proc(void)
MouseButton = MouseButton | event.button.button;
break;
}
break;
case SDL_MOUSEBUTTONUP:
@@ -236,132 +239,127 @@ int Main_Proc(void)
MouseButton & ~event.button.button;
break;
case SDL_JOYHATMOTION: // POV hats act as direction pad
if (event.jhat.hat == 0) // only support the first POV hat for now
{
switch (event.jhat.value)
{
case SDL_JOYHATMOTION: // POV hats act as direction pad
offset = HatOffset[event.jhat.which];
if (offset >= (256 + 128 + 64)) break;
switch (event.jhat.value)
{
case SDL_HAT_CENTERED:
pressed[0x100 + event.jhat.which * 32 + 0] = 0;
pressed[0x100 + event.jhat.which * 32 + 1] = 0;
pressed[0x100 + event.jhat.which * 32 + 2] = 0;
pressed[0x100 + event.jhat.which * 32 + 3] = 0;
break;
case SDL_HAT_UP:
pressed[0x100 + event.jhat.which * 32 + 3] = 1;
pressed[0x100 + event.jhat.which * 32 + 2] = 0;
break;
case SDL_HAT_RIGHTUP:
pressed[0x100 + event.jhat.which * 32 + 0] = 1;
pressed[0x100 + event.jhat.which * 32 + 3] = 1;
pressed[0x100 + event.jhat.which * 32 + 1] = 0;
pressed[0x100 + event.jhat.which * 32 + 2] = 0;
break;
case SDL_HAT_RIGHT:
pressed[0x100 + event.jhat.which * 32 + 0] = 1;
pressed[0x100 + event.jhat.which * 32 + 1] = 0;
break;
case SDL_HAT_RIGHTDOWN:
pressed[0x100 + event.jhat.which * 32 + 0] = 1;
pressed[0x100 + event.jhat.which * 32 + 2] = 1;
pressed[0x100 + event.jhat.which * 32 + 1] = 0;
pressed[0x100 + event.jhat.which * 32 + 3] = 0;
break;
case SDL_HAT_DOWN:
pressed[0x100 + event.jhat.which * 32 + 2] = 1;
pressed[0x100 + event.jhat.which * 32 + 3] = 0;
break;
case SDL_HAT_LEFTDOWN:
pressed[0x100 + event.jhat.which * 32 + 1] = 1;
pressed[0x100 + event.jhat.which * 32 + 2] = 1;
pressed[0x100 + event.jhat.which * 32 + 0] = 0;
pressed[0x100 + event.jhat.which * 32 + 3] = 0;
break;
case SDL_HAT_LEFT:
pressed[0x100 + event.jhat.which * 32 + 1] = 1;
pressed[0x100 + event.jhat.which * 32 + 0] = 0;
break;
case SDL_HAT_LEFTUP:
pressed[0x100 + event.jhat.which * 32 + 1] = 1;
pressed[0x100 + event.jhat.which * 32 + 3] = 1;
pressed[0x100 + event.jhat.which * 32 + 0] = 0;
pressed[0x100 + event.jhat.which * 32 + 2] = 0;
break;
}
pressed[offset] = 0;
pressed[offset + 1] = 0;
pressed[offset + 2] = 0;
pressed[offset + 3] = 0;
break;
case SDL_HAT_UP:
pressed[offset + 3] = 1;
pressed[offset + 2] = 0;
break;
case SDL_HAT_RIGHTUP:
pressed[offset] = 1;
pressed[offset + 3] = 1;
pressed[offset + 1] = 0;
pressed[offset + 2] = 0;
break;
case SDL_HAT_RIGHT:
pressed[offset] = 1;
pressed[offset + 1] = 0;
break;
case SDL_HAT_RIGHTDOWN:
pressed[offset] = 1;
pressed[offset + 2] = 1;
pressed[offset + 1] = 0;
pressed[offset + 3] = 0;
break;
case SDL_HAT_DOWN:
pressed[offset + 2] = 1;
pressed[offset + 3] = 0;
break;
case SDL_HAT_LEFTDOWN:
pressed[offset + 1] = 1;
pressed[offset + 2] = 1;
pressed[offset] = 0;
pressed[offset + 3] = 0;
break;
case SDL_HAT_LEFT:
pressed[offset + 1] = 1;
pressed[offset] = 0;
break;
case SDL_HAT_LEFTUP:
pressed[offset + 1] = 1;
pressed[offset + 3] = 1;
pressed[offset] = 0;
pressed[offset + 2] = 0;
break;
}
break;
/*
joystick trackball code untested; change the test values
if the motion is too sensitive (or not sensitive enough);
only the first trackball is supported for now. we could get
really general here, but this may break the format of 'pressed'
joystick trackball code untested; change the test
values if the motion is too sensitive (or not
sensitive enough)
*/
case SDL_JOYBALLMOTION:
//CurrentJoy = event.jball.which;
if (event.jball.ball == 0)
offset = BallOffset[event.jball.which];
offset += event.jball.ball;
if (offset >= (256 + 128 + 64)) break;
if (event.jball.xrel < -100)
{
if (event.jball.xrel < -100)
{
pressed[0x100 + event.jball.which * 32 + 6] = 0;
pressed[0x100 + event.jball.which * 32 + 7] = 1;
}
if (event.jball.xrel > 100)
{
pressed[0x100 + event.jball.which * 32 + 6] = 1;
pressed[0x100 + event.jball.which * 32 + 7] = 0;
}
if (event.jball.yrel < -100)
{
pressed[0x100 + event.jball.which * 32 + 8] = 0;
pressed[0x100 + event.jball.which * 32 + 9] = 1;
}
if (event.jball.yrel > 100)
{
pressed[0x100 + event.jball.which * 32 + 8] = 1;
pressed[0x100 + event.jball.which * 32 + 9] = 0;
pressed[offset] = 0;
pressed[offset + 1] = 1;
}
if (event.jball.xrel > 100)
{
pressed[offset] = 1;
pressed[offset + 1] = 0;
}
if (event.jball.yrel < -100)
{
pressed[offset + 2] = 0;
pressed[offset + 3] = 1;
}
if (event.jball.yrel > 100)
{
pressed[offset + 2] = 1;
pressed[offset + 3] = 0;
}
break;
case SDL_JOYAXISMOTION:
for (j = 0; j < 4; j++)
offset = AxisOffset[event.jaxis.which];
offset += event.jaxis.axis * 2;
if (offset >= (256 + 128 + 64)) break;
// printf("DEBUG axis offset: %d\n", offset);
if (event.jaxis.value < -16384)
{
if (event.jaxis.axis == j)
{
if (event.jaxis.value < -16384)
{
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 1] = 1;
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 0] = 0;
}
else if (event.jaxis.value > 16384)
{
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 0] = 1;
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 1] = 0;
}
else
{
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 0] = 0;
pressed[0x100 +
event.jaxis.which * 32 + 2 * j + 1] = 0;
}
}
pressed[offset + 1] = 1;
pressed[offset + 0] = 0;
}
else if (event.jaxis.value > 16384)
{
pressed[offset + 0] = 1;
pressed[offset + 1] = 0;
}
else
{
pressed[offset + 0] = 0;
pressed[offset + 1] = 0;
}
break;
case SDL_JOYBUTTONDOWN:
pressed[0x100 + event.jbutton.which * 32 + 16 +
event.jbutton.button] = 1;
offset = ButtonOffset[event.jbutton.which];
offset += event.jbutton.button;
// printf("DEBUG button offset: %d\n", offset);
if (offset >= (256 + 128 + 64)) break;
pressed[offset] = 1;
break;
case SDL_JOYBUTTONUP:
pressed[0x100 + event.jbutton.which * 32 + 16 +
event.jbutton.button] = 0;
offset = ButtonOffset[event.jbutton.which];
offset += event.jbutton.button;
// printf("DEBUG button offset: %d\n", offset);
if (offset >= (256 + 64)) break;
pressed[offset] = 0;
break;
case SDL_QUIT:
LinuxExit();
@@ -584,6 +582,8 @@ int ReInitSound(void)
BOOL InitJoystickInput(void)
{
int i, max_num_joysticks;
int num_axes, num_buttons, num_hats, num_balls;
int js_fail = 0;
for (i = 0; i < 5; i++)
JoystickInput[i] = NULL;
@@ -602,12 +602,51 @@ BOOL InitJoystickInput(void)
SDL_JoystickEventState(SDL_ENABLE);
if (max_num_joysticks > 5) max_num_joysticks = 5;
for (i = 0; i < max_num_joysticks; i++)
{
JoystickInput[i] = SDL_JoystickOpen(i);
printf("Joystick %i (%i Buttons): %s\n", i,
SDL_JoystickNumButtons(JoystickInput[i]),
SDL_JoystickName(i));
num_axes = SDL_JoystickNumAxes(JoystickInput[i]);
num_buttons = SDL_JoystickNumButtons(JoystickInput[i]);
num_hats = SDL_JoystickNumHats(JoystickInput[i]);
num_balls = SDL_JoystickNumBalls(JoystickInput[i]);
printf("Device %i %s\n", i, SDL_JoystickName(i));
printf(" %i axis, %i buttons, %i hats, %i balls\n",
num_axes, num_buttons, num_hats, num_balls);
if (js_fail)
{
printf("Warning: Joystick won't work.\n");
continue;
}
if (i == 0)
{
AxisOffset[0] = 256; // After key data
ButtonOffset[0] = AxisOffset[0] + num_axes * 2;
// printf("ButtonOffset %d\n", ButtonOffset[0]);
HatOffset[0] = ButtonOffset[0] + num_buttons;
// printf("HatOffset %d\n", HatOffset[0]);
BallOffset[0] = HatOffset[0] + num_hats * 4;
// printf("BallOffset %d\n", BallOffset[0]);
if ((BallOffset[0] + num_balls * 4) >= (256 + 128 + 64))
js_fail = 1;
}
else
{
AxisOffset[i] = BallOffset[i - 1] +
SDL_JoystickNumBalls(JoystickInput[i - 1]);
ButtonOffset[i] = AxisOffset[i] + num_axes * 2;
HatOffset[i] = ButtonOffset[i] + num_buttons;
BallOffset[i] = HatOffset[i] + num_hats * 4;
if ((BallOffset[i] + num_balls * 4) >= (256 + 128 + 64))
js_fail = 1;
}
if (js_fail)
{
printf("Warning: Too many buttons, axes, hats and/or Balls!\n");
printf("Warning: Joystick won't work fully.\n");
}
}
return TRUE;