📄 sdl_sysjoystick.c
字号:
joystick->nhats=1; joystick->nbuttons=1; break; } return(0);}void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick){ int numjoystick; Uint8 hatstate; Uint32 curstate,prevstate; numjoystick=GetEnabledAtariJoystick(joystick->index); if (numjoystick==-1) return; prevstate = atarijoysticks[numjoystick].prevstate; if (joypad_ports_enabled) { Supexec(UpdateJoypads); } switch (numjoystick) { case IKBD_JOY1: case XBIOS_JOY1: { curstate = 0; if (numjoystick==IKBD_JOY1) { curstate = SDL_AtariIkbd_joystick & 0xff; } if (numjoystick==XBIOS_JOY1) { curstate = SDL_AtariXbios_joystick & 0xff; } if (curstate != prevstate) { hatstate = SDL_HAT_CENTERED; if (curstate & IKBD_JOY_LEFT) { hatstate |= SDL_HAT_LEFT; } if (curstate & IKBD_JOY_RIGHT) { hatstate |= SDL_HAT_RIGHT; } if (curstate & IKBD_JOY_UP) { hatstate |= SDL_HAT_UP; } if (curstate & IKBD_JOY_DOWN) { hatstate |= SDL_HAT_DOWN; } SDL_PrivateJoystickHat(joystick, 0, hatstate); /* Button */ if ((curstate & IKBD_JOY_FIRE) && !(prevstate & IKBD_JOY_FIRE)) { SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED); } if (!(curstate & IKBD_JOY_FIRE) && (prevstate & IKBD_JOY_FIRE)) { SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED); } } atarijoysticks[numjoystick].prevstate = curstate; } break; case PORTA_PAD: case PORTB_PAD: { int numjoypad,i; numjoypad=0; if (numjoystick==PORTB_PAD) numjoypad=1; curstate=jp_joypads[numjoypad]; if (curstate!=prevstate) { hatstate = SDL_HAT_CENTERED; if (curstate & (1<<JP_LEFT)) { hatstate |= SDL_HAT_LEFT; } if (curstate & (1<<JP_RIGHT)) { hatstate |= SDL_HAT_RIGHT; } if (curstate & (1<<JP_UP)) { hatstate |= SDL_HAT_UP; } if (curstate & (1<<JP_DOWN)) { hatstate |= SDL_HAT_DOWN; } SDL_PrivateJoystickHat(joystick, 0, hatstate); /* Buttons */ for (i=0;i<JP_NUM_BUTTONS;i++) { int button; button=1<<jp_buttons[i]; if ((curstate & button) && !(prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED); } if (!(curstate & button) && (prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED); } } } atarijoysticks[numjoystick].prevstate = curstate; } break; case PORTA_JOY0: case PORTA_JOY1: case PORTB_JOY0: case PORTB_JOY1: { int fire_shift=0,dir_shift=0; if (numjoystick==PORTA_JOY0) { fire_shift=0; dir_shift=0; } if (numjoystick==PORTA_JOY1) { fire_shift=1; dir_shift=4; } if (numjoystick==PORTB_JOY0) { fire_shift=2; dir_shift=8; } if (numjoystick==PORTB_JOY1) { fire_shift=3; dir_shift=12; } curstate = (jp_directions>>dir_shift) & 15; curstate |= ((jp_fires>>fire_shift) & 1)<<4; if (curstate != prevstate) { hatstate = SDL_HAT_CENTERED; if (curstate & PORT_JS_LEFT) { hatstate |= SDL_HAT_LEFT; } if (curstate & PORT_JS_RIGHT) { hatstate |= SDL_HAT_RIGHT; } if (curstate & PORT_JS_UP) { hatstate |= SDL_HAT_UP; } if (curstate & PORT_JS_DOWN) { hatstate |= SDL_HAT_DOWN; } SDL_PrivateJoystickHat(joystick, 0, hatstate); /* Button */ if ((curstate & PORT_JS_FIRE) && !(prevstate & PORT_JS_FIRE)) { SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED); } if (!(curstate & PORT_JS_FIRE) && (prevstate & PORT_JS_FIRE)) { SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED); } } atarijoysticks[numjoystick].prevstate = curstate; } break; case PORTA_LP: { int i; curstate = jp_lightpens[0]>>1; curstate |= (jp_lightpens[1]>>1)<<15; curstate |= (jp_fires & 3)<<30; if (curstate != prevstate) { /* X axis */ SDL_PrivateJoystickAxis(joystick,0,jp_lightpens[0] ^ 0x8000); /* Y axis */ SDL_PrivateJoystickAxis(joystick,1,jp_lightpens[1] ^ 0x8000); /* Buttons */ for (i=0;i<2;i++) { int button; button=1<<(30+i); if ((curstate & button) && !(prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED); } if (!(curstate & button) && (prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED); } } } atarijoysticks[numjoystick].prevstate = curstate; } break; case PORTA_ANPAD: case PORTB_ANPAD: { int numpaddle, i; numpaddle=0<<1; if (numjoystick==PORTB_ANPAD) numpaddle=1<<1; curstate = jp_paddles[numpaddle]>>1; curstate |= (jp_paddles[numpaddle+1]>>1)<<15; curstate |= ((jp_fires>>numpaddle) & 3)<<30; if (curstate != prevstate) { /* X axis */ SDL_PrivateJoystickAxis(joystick,0,jp_paddles[numpaddle] ^ 0x8000); /* Y axis */ SDL_PrivateJoystickAxis(joystick,1,jp_paddles[numpaddle+1] ^ 0x8000); /* Buttons */ for (i=0;i<2;i++) { int button; button=1<<(30+i); if ((curstate & button) && !(prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED); } if (!(curstate & button) && (prevstate & button)) { SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED); } } } atarijoysticks[numjoystick].prevstate = curstate; } break;#if 0 case PARA_JOY0: case PARA_JOY1: break;#endif }; return;}void SDL_SYS_JoystickClose(SDL_Joystick *joystick){ return;}void SDL_SYS_JoystickQuit(void){ SDL_numjoysticks=0; return;}/*--- Joypad I/O read/write interface ---*/#define JOYPAD_IO_BASE (0xffff9200)struct JOYPAD_IO_S { Uint16 fires; Uint16 directions; Uint16 dummy1[6]; Uint16 paddles[4]; Uint16 dummy2[4]; Uint16 lightpens[2];};#define JOYPAD_IO ((*(volatile struct JOYPAD_IO_S *)JOYPAD_IO_BASE))static void UpdateJoypads(void){ Uint16 tmp; /*--- This function is called in supervisor mode ---*/ /* Update joysticks */ jp_fires = (~(JOYPAD_IO.fires)) & 15; jp_directions = (~(JOYPAD_IO.directions)); /* Update lightpen */ tmp = JOYPAD_IO.lightpens[0] & 1023; jp_lightpens[0] = (tmp<<6) | (tmp>>4); tmp = JOYPAD_IO.lightpens[1] & 1023; jp_lightpens[1] = (tmp<<6) | (tmp>>4); /* Update paddles */ tmp = (JOYPAD_IO.paddles[0] & 255); jp_paddles[0] = (tmp<<8) | tmp; tmp = (JOYPAD_IO.paddles[1] & 255); jp_paddles[1] = (tmp<<8) | tmp; tmp = (JOYPAD_IO.paddles[2] & 255); jp_paddles[2] = (tmp<<8) | tmp; tmp = (JOYPAD_IO.paddles[3] & 255); jp_paddles[3] = (tmp<<8) | tmp; /* Update joypad 0 */ JOYPAD_IO.directions=0xfffe; jp_joypads[0]=((~(JOYPAD_IO.fires)) & 3)<<(16); JOYPAD_IO.directions=0xfffe; jp_joypads[0] |= ((~(JOYPAD_IO.directions))>>8) & 15; JOYPAD_IO.directions=0xfffd; jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+2); JOYPAD_IO.directions=0xfffd; jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<4; JOYPAD_IO.directions=0xfffb; jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+4); JOYPAD_IO.directions=0xfffb; jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<8; JOYPAD_IO.directions=0xfff7; jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+6); JOYPAD_IO.directions=0xfff7; jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<12; /* Update joypad 1 */ JOYPAD_IO.directions=0xffef; jp_joypads[1]=((~(JOYPAD_IO.fires)) & (3<<2))<<(16-2); JOYPAD_IO.directions=0xffef; jp_joypads[1] |= ((~(JOYPAD_IO.directions))>>12) & 15; JOYPAD_IO.directions=0xffdf; jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16); JOYPAD_IO.directions=0xffdf; jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<4; JOYPAD_IO.directions=0xffbf; jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+2); JOYPAD_IO.directions=0xffbf; jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<8; JOYPAD_IO.directions=0xff7f; jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+4); JOYPAD_IO.directions=0xff7f; jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<12;}#endif /* SDL_JOYSTICK_MINT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -