⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_sysjoystick.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
	int numjoystick;
	Uint32 curstate,prevstate;
	Sint16 curaxis;
	
	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) {
					/* X axis */
					if ((curstate & (IKBD_JOY_LEFT|IKBD_JOY_RIGHT)) != (prevstate & (IKBD_JOY_LEFT|IKBD_JOY_RIGHT))) {
						curaxis=0;
						if (curstate & IKBD_JOY_LEFT) {
							curaxis=-128;
						} else if (curstate & IKBD_JOY_RIGHT) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,0,curaxis);
					}
					/* Y axis */
					if ((curstate & (IKBD_JOY_UP|IKBD_JOY_DOWN)) != (prevstate & (IKBD_JOY_UP|IKBD_JOY_DOWN))) {
						curaxis=0;
						if (curstate & IKBD_JOY_UP) {
							curaxis=-128;
						} else if (curstate & IKBD_JOY_DOWN) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,1,curaxis);
					}
					/* 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==PORTA_PAD) numjoypad=0;*/
				if (numjoystick==PORTB_PAD) numjoypad=1;
				
				curstate=jp_joypads[numjoypad];
				if (curstate!=prevstate) {
					/* X axis */
					if ((curstate & ((1<<JP_LEFT)|(1<<JP_RIGHT))) != (prevstate & ((1<<JP_LEFT)|(1<<JP_RIGHT)))) {
						curaxis=0;
						if (curstate & (1<<JP_LEFT)) {
							curaxis=-128;
						} else if (curstate & (1<<JP_RIGHT)) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,0,curaxis);
					}
					/* Y axis */
					if ((curstate & ((1<<JP_UP)|(1<<JP_DOWN))) != (prevstate & ((1<<JP_UP)|(1<<JP_DOWN)))) {
						curaxis=0;
						if (curstate & (1<<JP_UP)) {
							curaxis=-128;
						} else if (curstate & (1<<JP_DOWN)) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,1,curaxis);
					}
					/* 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) {
					/* X axis */
					if ((curstate & (PORT_JS_LEFT|PORT_JS_RIGHT)) != (prevstate & (PORT_JS_LEFT|PORT_JS_RIGHT))) {
						curaxis=0;
						if (curstate & PORT_JS_LEFT) {
							curaxis=-128;
						} else if (curstate & PORT_JS_RIGHT) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,0,curaxis);
					}
					/* Y axis */
					if ((curstate & (PORT_JS_UP|PORT_JS_DOWN)) != (prevstate & (PORT_JS_UP|PORT_JS_DOWN))) {
						curaxis=0;
						if (curstate & PORT_JS_UP) {
							curaxis=-128;
						} else if (curstate & PORT_JS_DOWN) {
							curaxis=127;
						}					
						SDL_PrivateJoystickAxis(joystick,1,curaxis);
					}
					/* 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]>>8)-128);
					/* Y axis */
					SDL_PrivateJoystickAxis(joystick,1,(jp_lightpens[1]>>8)-128);
					/* 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]>>8)-128);
					/* Y axis */
					SDL_PrivateJoystickAxis(joystick,1,(jp_paddles[numpaddle+1]>>8)-128);
					/* 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -