From 790499c488b19fa4e4264213af5651d123944809 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Sun, 6 Jun 2004 19:01:34 +0000 Subject: [PATCH] Input support update. --- zsnes/src/linux/sdlintrf.asm | 48 ++++--- zsnes/src/linux/sdllink.c | 261 ++++++++++++++++++++--------------- 2 files changed, 180 insertions(+), 129 deletions(-) diff --git a/zsnes/src/linux/sdlintrf.asm b/zsnes/src/linux/sdlintrf.asm index cb38f24f..274aa4fe 100644 --- a/zsnes/src/linux/sdlintrf.asm +++ b/zsnes/src/linux/sdlintrf.asm @@ -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 'P2A','P2X','P2L','P2R',' ',' ',' ',' ' + db 'P2B','P2Y','P2S','P2T','P2U','P2D','P2L','P2R' ; 2B0h + db 'P2A','P2X','P2L','P2R',' ',' ',' ',' ' +%endif SECTION .text diff --git a/zsnes/src/linux/sdllink.c b/zsnes/src/linux/sdllink.c index 717be5ef..52d56013 100644 --- a/zsnes/src/linux/sdllink.c +++ b/zsnes/src/linux/sdllink.c @@ -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;