📄 sdl_sysjoystick.c
字号:
break; default: 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_PAD0: case PORTA_PAD1: case PORTA_PAD2: case PORTA_PAD3: case PORTB_PAD0: case PORTB_PAD1: case PORTB_PAD2: case PORTB_PAD3: { int numjoypad,i; numjoypad = 0; switch(numjoystick) { case PORTA_PAD0: numjoypad = 0; break; case PORTA_PAD1: numjoypad = 1; break; case PORTA_PAD2: numjoypad = 2; break; case PORTA_PAD3: numjoypad = 3; break; case PORTB_PAD0: numjoypad = 4; break; case PORTB_PAD1: numjoypad = 5; break; case PORTB_PAD2: numjoypad = 6; break; case PORTB_PAD3: numjoypad = 7; break; } 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 const Uint16 joypad_masks[8*4]={ 0xfffe, 0xfffd, 0xfffb, 0xfff7, 0xfff0, 0xfff1, 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff8, 0xfff9, 0xfffa, 0xfffc, 0xffff, 0xffef, 0xffdf, 0xffbf, 0xff7f, 0xff0f, 0xff1f, 0xff2f, 0xff3f, 0xff4f, 0xff5f, 0xff6f, 0xff8f, 0xff9f, 0xffaf, 0xffcf, 0xffff};static void UpdateJoypads(void){ Uint16 tmp, i, j; Uint32 cur_fire, cur_dir; /*--- 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 joypads on teamtap port A */ for (i=0; i<4; i++) { jp_joypads[i] = 0; for (j=0; j<4; j++) { JOYPAD_IO.directions = joypad_masks[(i*4)+j]; cur_fire = (~(JOYPAD_IO.fires) & 3)<<16; cur_dir = (~(JOYPAD_IO.directions)>>8) & 15; jp_joypads[i] |= cur_fire<<(j*2); jp_joypads[i] |= cur_dir<<(j*4); } } /* Update joypads on teamtap port B */ for (i=4; i<8; i++) { jp_joypads[i] = 0; for (j=0; j<4; j++) { JOYPAD_IO.directions = joypad_masks[(i*4)+j]; cur_fire = (~(JOYPAD_IO.fires) & 0xc)<<14; cur_dir = (~(JOYPAD_IO.directions)>>12) & 15; jp_joypads[i] |= cur_fire<<(j*2); jp_joypads[i] |= cur_dir<<(j*4); } } JOYPAD_IO.directions=0xffff;}#endif /* SDL_JOYSTICK_MINT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -