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 'KP8','KP9','KP-','KP4','KP5','KP6','KP+','KP1'
db 'KP2','KP3','KP0','KP.',' ',' ','OEM','F11' ; 50h db 'KP2','KP3','KP0','KP.',' ',' ','OEM','F11' ; 50h
db 'F12','HOM',' UP','PGU','LFT','5DH','RGT','END' 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 %else
db 'F6 ','F7 ','F8 ','F9 ','F10','NUM','SCR','N 7' ; 40h 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 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 'N 2','N 3','N 0','N .',' ',' ','OEM','F11' ; 50h
db 'F12','59h','5Ah','5BH','5CH','5DH','5EH','5FH' db 'F12','59h','5Ah','5BH','5CH','5DH','5EH','5FH'
db '60H','61H','62H','63H','64H','65H','66H','67H' ; 80h db '60H','61H','62H','63H','64H','65H','66H','67H' ; 60h
db '68H','69H','6AH','6BH','6CH','6DH','6EH','6FH'
%endif %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' db '78H','79H','7AH','7BH','7CH','7DH','7EH','7FH'
; Keyboard continued (Direct Input) ; Keyboard continued (Direct Input)
db '80H','81H','82H','83H','84H','85H','86H','87H' ; 80h 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 'E8H','E9H','EAH','EBH','ECH','EDH','EEH','EFH'
db 'F0H','F1H','F2H','F3H','F4H','F5H','F6H','F7H' ; F0h db 'F0H','F1H','F2H','F3H','F4H','F5H','F6H','F7H' ; F0h
db 'F8H','F9H','FAH','FBH','FCH','FDH','FEH','FFH' db 'F8H','F9H','FAH','FBH','FCH','FDH','FEH','FFH'
; Joystick Stuff (Direct Input) ; Joystick Stuff
db 'J00','J01','J02','J03','J04','J05','J06','J07' db 'J00','J01','J02','J03','J04','J05','J06','J07' ; 100h
db 'J08','J09','J0A','J0B','J0C','J0D','J0E','J0F' 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 '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 '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 '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 '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 '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 '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' 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) ; 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 '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 '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 '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',' ',' ',' ',' ' db 'P2A','P2X','P2L','P2R',' ',' ',' ',' '
%endif
SECTION .text SECTION .text

View File

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