SDL_sysjoystick.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:17k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_sysjoystick.c,v 1.1 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. /*
  23.  * Atari Joystick/Joypad drivers
  24.  *
  25.  * Patrice Mandin
  26.  */
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <sys/cookie.h>
  31. #include <mint/osbind.h>
  32. #include "SDL_types.h"
  33. #include "SDL_error.h"
  34. #include "SDL_joystick.h"
  35. #include "SDL_sysjoystick.h"
  36. #include "SDL_joystick_c.h"
  37. #include "SDL_ikbdinterrupt_s.h"
  38. #include "SDL_xbiosevents_c.h"
  39. #include "SDL_xbiosinterrupt_s.h"
  40. /*--- Const ---*/
  41. /* We can have:
  42. 1 joystick on IKBD port 1, read via hardware I/O
  43.       or same joystick on IKBD port 1, read via xbios
  44. 2 joypads on ports A,B
  45.   or 4 joysticks on joypads ports A,B
  46.   or 1 lightpen on joypad port A
  47.   or 2 analog paddles on joypads ports A,B
  48. 2 joysticks on parallel port
  49. */
  50. enum {
  51. IKBD_JOY1=0,
  52. XBIOS_JOY1,
  53. PORTA_PAD,
  54. PORTB_PAD,
  55. PORTA_JOY0,
  56. PORTA_JOY1,
  57. PORTB_JOY0,
  58. PORTB_JOY1,
  59. PORTA_LP,
  60. PORTA_ANPAD,
  61. PORTB_ANPAD,
  62. #if 0
  63. PARA_JOY0,
  64. PARA_JOY1,
  65. #endif
  66. MAX_JOYSTICKS
  67. };
  68. enum {
  69. MCH_ST=0,
  70. MCH_STE,
  71. MCH_TT,
  72. MCH_F30
  73. };
  74. /* Joypad buttons
  75.  * Procontroller note:
  76.  * L,R are connected to 4,6
  77.  * X,Y,Z are connected to 7,8,9
  78.  */
  79. enum {
  80. JP_UP=0, JP_DOWN, JP_LEFT, JP_RIGHT,
  81. JP_KPMULT, JP_KP7, JP_KP4, JP_KP1,
  82. JP_KP0, JP_KP8, JP_KP5, JP_KP2,
  83. JP_KPNUM, JP_KP9, JP_KP6, JP_KP3,
  84. JP_PAUSE, JP_FIRE0, JP_UNDEF0, JP_FIRE1,
  85. JP_UNDEF1, JP_FIRE2, JP_UNDEF2, JP_OPTION
  86. };
  87. #define JP_NUM_BUTTONS 17
  88. #define PORT_JS_RIGHT (1<<0)
  89. #define PORT_JS_LEFT (1<<1)
  90. #define PORT_JS_DOWN (1<<2)
  91. #define PORT_JS_UP (1<<3)
  92. #define PORT_JS_FIRE (1<<4)
  93. /*--- Types ---*/
  94. typedef struct {
  95. SDL_bool enabled;
  96. unsigned char *name;
  97. Uint32 prevstate;
  98. } atarijoy_t;
  99. /*--- Variables ---*/
  100. static atarijoy_t atarijoysticks[MAX_JOYSTICKS]={
  101. {SDL_FALSE,"IKBD joystick port 1",0},
  102. {SDL_FALSE,"Xbios joystick port 1",0},
  103. {SDL_FALSE,"Joypad port A",0},
  104. {SDL_FALSE,"Joypad port B",0},
  105. {SDL_FALSE,"Joystick 0 port A",0},
  106. {SDL_FALSE,"Joystick 1 port A",0},
  107. {SDL_FALSE,"Joystick 0 port B",0},
  108. {SDL_FALSE,"Joystick 1 port B",0},
  109. {SDL_FALSE,"Lightpen port A",0},
  110. {SDL_FALSE,"Analog paddle port A",0},
  111. {SDL_FALSE,"Analog paddle port B",0}
  112. #if 0
  113. ,{SDL_FALSE,"Joystick 0 parallel port",0},
  114. {SDL_FALSE,"Joystick 1 parallel port",0}
  115. #endif
  116. };
  117. static const int jp_buttons[JP_NUM_BUTTONS]={
  118. JP_FIRE0, JP_FIRE1, JP_FIRE2, JP_PAUSE,
  119. JP_OPTION, JP_KPMULT, JP_KPNUM, JP_KP0,
  120. JP_KP1, JP_KP2, JP_KP3, JP_KP4,
  121. JP_KP5, JP_KP6, JP_KP7, JP_KP8,
  122. JP_KP9
  123. };
  124. static SDL_bool joypad_ports_enabled=SDL_FALSE;
  125. /* Updated joypad ports */
  126. static Uint16 jp_paddles[4];
  127. static Uint16 jp_lightpens[2];
  128. static Uint16 jp_directions;
  129. static Uint16 jp_fires;
  130. static Uint32 jp_joypads[2];
  131. /*--- Functions prototypes ---*/
  132. static int GetEnabledAtariJoystick(int index);
  133. static void UpdateJoypads(void);
  134. /*--- Functions ---*/
  135. int SDL_SYS_JoystickInit(void)
  136. {
  137. int i;
  138. unsigned long cookie_mch;
  139. const char *envr=getenv("SDL_JOYSTICK_ATARI");
  140. #define TEST_JOY_ENABLED(env,idstring,num) 
  141. if (strstr(env,idstring"-off")) { 
  142. atarijoysticks[num].enabled=SDL_FALSE; 
  143. if (strstr(env,idstring"-on")) { 
  144. atarijoysticks[num].enabled=SDL_TRUE; 
  145. }
  146. /* Cookie _MCH present ? if not, assume ST machine */
  147. if (Getcookie(C__MCH, &cookie_mch) != C_FOUND) {
  148. cookie_mch = MCH_ST << 16;
  149. }
  150. /* Enable some default joysticks */
  151. if ((cookie_mch == MCH_ST<<16) || ((cookie_mch>>16) == MCH_STE) ||
  152. (cookie_mch == MCH_TT<<16) || (cookie_mch == MCH_F30<<16)) {
  153. atarijoysticks[IKBD_JOY1].enabled=(SDL_AtariIkbd_enabled!=0);
  154. }
  155. if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
  156. atarijoysticks[PORTA_PAD].enabled=SDL_TRUE;
  157. atarijoysticks[PORTB_PAD].enabled=SDL_TRUE;
  158. }
  159. if (!atarijoysticks[IKBD_JOY1].enabled) {
  160. atarijoysticks[XBIOS_JOY1].enabled=(SDL_AtariXbios_enabled!=0);
  161. }
  162. /* Read environment for joysticks to enable */
  163. if (envr) {
  164. /* IKBD on any Atari, maybe clones */
  165. if ((cookie_mch == MCH_ST<<16) || ((cookie_mch>>16) == MCH_STE) ||
  166. (cookie_mch == MCH_TT<<16) || (cookie_mch == MCH_F30<<16)) {
  167. if (SDL_AtariIkbd_enabled!=0) {
  168. TEST_JOY_ENABLED(envr, "ikbd-joy1", IKBD_JOY1);
  169. }
  170. }
  171. /* Joypads ports only on STE and Falcon */
  172. if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) {
  173. TEST_JOY_ENABLED(envr, "porta-pad", PORTA_PAD);
  174. if (!atarijoysticks[PORTA_PAD].enabled) {
  175. TEST_JOY_ENABLED(envr, "porta-joy0", PORTA_JOY0);
  176. TEST_JOY_ENABLED(envr, "porta-joy1", PORTA_JOY1);
  177. if (!(atarijoysticks[PORTA_JOY0].enabled) && !(atarijoysticks[PORTA_JOY1].enabled)) {
  178. TEST_JOY_ENABLED(envr, "porta-lp", PORTA_LP);
  179. if (!atarijoysticks[PORTA_LP].enabled) {
  180. TEST_JOY_ENABLED(envr, "porta-anpad", PORTA_ANPAD);
  181. }
  182. }
  183. }
  184. TEST_JOY_ENABLED(envr, "portb-pad", PORTB_PAD);
  185. if (!atarijoysticks[PORTB_PAD].enabled) {
  186. TEST_JOY_ENABLED(envr, "portb-joy0", PORTB_JOY0);
  187. TEST_JOY_ENABLED(envr, "portb-joy1", PORTB_JOY1);
  188. if (!(atarijoysticks[PORTB_JOY0].enabled) && !(atarijoysticks[PORTB_JOY1].enabled)) {
  189. TEST_JOY_ENABLED(envr, "portb-anpad", PORTB_ANPAD);
  190. }
  191. }
  192. }
  193. if (!atarijoysticks[IKBD_JOY1].enabled) {
  194. if (SDL_AtariXbios_enabled!=0) {
  195. TEST_JOY_ENABLED(envr, "xbios-joy1", XBIOS_JOY1);
  196. }
  197. }
  198. #if 0
  199. /* Parallel port on any Atari, maybe clones */
  200. if ((cookie_mch == MCH_ST<<16) || ((cookie_mch>>16) == MCH_STE) ||
  201. (cookie_mch == MCH_TT<<16) || (cookie_mch == MCH_F30<<16)) {
  202. TEST_JOY_ENABLED(envr, "para-joy0", PARA_JOY0);
  203. TEST_JOY_ENABLED(envr, "para-joy1", PARA_JOY1);
  204. }
  205. #endif
  206. }
  207. /* Need to update joypad ports ? */
  208. joypad_ports_enabled=SDL_FALSE;
  209. for (i=PORTA_PAD;i<=PORTB_ANPAD;i++) {
  210. if (atarijoysticks[i].enabled) {
  211. joypad_ports_enabled=SDL_TRUE;
  212. break;
  213. }
  214. }
  215. SDL_numjoysticks = 0;
  216. for (i=0;i<MAX_JOYSTICKS;i++) {
  217. if (atarijoysticks[i].enabled) {
  218. ++SDL_numjoysticks;
  219. }
  220. }
  221. return(SDL_numjoysticks);
  222. }
  223. static int GetEnabledAtariJoystick(int index)
  224. {
  225. int i,j;
  226. /* Return the nth'index' enabled atari joystick */
  227. j=0;
  228. for (i=0;i<MAX_JOYSTICKS;i++) {
  229. if (!atarijoysticks[i].enabled) {
  230. continue;
  231. }
  232. if (j==index) {
  233. break;
  234. }
  235. ++j;
  236. }
  237. if (i==MAX_JOYSTICKS)
  238. return -1;
  239. return i;
  240. }
  241. const char *SDL_SYS_JoystickName(int index)
  242. {
  243. int numjoystick;
  244. numjoystick=GetEnabledAtariJoystick(index);
  245. if (numjoystick==-1)
  246. return NULL;
  247. return(atarijoysticks[numjoystick].name);
  248. }
  249. int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
  250. {
  251. int numjoystick;
  252. numjoystick=GetEnabledAtariJoystick(joystick->index);
  253. if (numjoystick==-1)
  254. return -1;
  255. if ((numjoystick==PORTA_PAD) || (numjoystick==PORTB_PAD)) {
  256. joystick->nbuttons=JP_NUM_BUTTONS;
  257. } else if ((numjoystick==PORTA_LP) || (numjoystick==PORTA_ANPAD) ||
  258. (numjoystick==PORTB_ANPAD)) {
  259. joystick->nbuttons=2;
  260. } else {
  261. joystick->nbuttons=1;
  262. }
  263. joystick->naxes=2;
  264. joystick->nballs=0;
  265. joystick->nhats=0;
  266. return(0);
  267. }
  268. void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
  269. {
  270. int numjoystick;
  271. Uint32 curstate,prevstate;
  272. Sint16 curaxis;
  273. numjoystick=GetEnabledAtariJoystick(joystick->index);
  274. if (numjoystick==-1)
  275. return;
  276. prevstate = atarijoysticks[numjoystick].prevstate;
  277. if (joypad_ports_enabled) {
  278. Supexec(UpdateJoypads);
  279. }
  280. switch (numjoystick) {
  281. case IKBD_JOY1:
  282. case XBIOS_JOY1:
  283. {
  284. curstate = 0;
  285. if (numjoystick==IKBD_JOY1) {
  286. curstate = SDL_AtariIkbd_joystick & 0xff;
  287. }
  288. if (numjoystick==XBIOS_JOY1) {
  289. curstate = SDL_AtariXbios_joystick & 0xff;
  290. }
  291. if (curstate != prevstate) {
  292. /* X axis */
  293. if ((curstate & (IKBD_JOY_LEFT|IKBD_JOY_RIGHT)) != (prevstate & (IKBD_JOY_LEFT|IKBD_JOY_RIGHT))) {
  294. curaxis=0;
  295. if (curstate & IKBD_JOY_LEFT) {
  296. curaxis=-128;
  297. } else if (curstate & IKBD_JOY_RIGHT) {
  298. curaxis=127;
  299. }
  300. SDL_PrivateJoystickAxis(joystick,0,curaxis);
  301. }
  302. /* Y axis */
  303. if ((curstate & (IKBD_JOY_UP|IKBD_JOY_DOWN)) != (prevstate & (IKBD_JOY_UP|IKBD_JOY_DOWN))) {
  304. curaxis=0;
  305. if (curstate & IKBD_JOY_UP) {
  306. curaxis=-128;
  307. } else if (curstate & IKBD_JOY_DOWN) {
  308. curaxis=127;
  309. }
  310. SDL_PrivateJoystickAxis(joystick,1,curaxis);
  311. }
  312. /* Button */
  313. if ((curstate & IKBD_JOY_FIRE) && !(prevstate & IKBD_JOY_FIRE)) {
  314. SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED);
  315. }
  316. if (!(curstate & IKBD_JOY_FIRE) && (prevstate & IKBD_JOY_FIRE)) {
  317. SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED);
  318. }
  319. }
  320. atarijoysticks[numjoystick].prevstate = curstate;
  321. }
  322. break;
  323. case PORTA_PAD:
  324. case PORTB_PAD:
  325. {
  326. int numjoypad,i;
  327. numjoypad=0;
  328. /* if (numjoystick==PORTA_PAD) numjoypad=0;*/
  329. if (numjoystick==PORTB_PAD) numjoypad=1;
  330. curstate=jp_joypads[numjoypad];
  331. if (curstate!=prevstate) {
  332. /* X axis */
  333. if ((curstate & ((1<<JP_LEFT)|(1<<JP_RIGHT))) != (prevstate & ((1<<JP_LEFT)|(1<<JP_RIGHT)))) {
  334. curaxis=0;
  335. if (curstate & (1<<JP_LEFT)) {
  336. curaxis=-128;
  337. } else if (curstate & (1<<JP_RIGHT)) {
  338. curaxis=127;
  339. }
  340. SDL_PrivateJoystickAxis(joystick,0,curaxis);
  341. }
  342. /* Y axis */
  343. if ((curstate & ((1<<JP_UP)|(1<<JP_DOWN))) != (prevstate & ((1<<JP_UP)|(1<<JP_DOWN)))) {
  344. curaxis=0;
  345. if (curstate & (1<<JP_UP)) {
  346. curaxis=-128;
  347. } else if (curstate & (1<<JP_DOWN)) {
  348. curaxis=127;
  349. }
  350. SDL_PrivateJoystickAxis(joystick,1,curaxis);
  351. }
  352. /* Buttons */
  353. for (i=0;i<JP_NUM_BUTTONS;i++) {
  354. int button;
  355. button=1<<jp_buttons[i];
  356. if ((curstate & button) && !(prevstate & button)) {
  357. SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED);
  358. }
  359. if (!(curstate & button) && (prevstate & button)) {
  360. SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED);
  361. }
  362. }
  363. }
  364. atarijoysticks[numjoystick].prevstate = curstate;
  365. }
  366. break;
  367. case PORTA_JOY0:
  368. case PORTA_JOY1:
  369. case PORTB_JOY0:
  370. case PORTB_JOY1:
  371. {
  372. int fire_shift=0,dir_shift=0;
  373. if (numjoystick==PORTA_JOY0) { fire_shift=0; dir_shift=0; }
  374. if (numjoystick==PORTA_JOY1) { fire_shift=1; dir_shift=4; }
  375. if (numjoystick==PORTB_JOY0) { fire_shift=2; dir_shift=8; }
  376. if (numjoystick==PORTB_JOY1) { fire_shift=3; dir_shift=12; }
  377. curstate = (jp_directions>>dir_shift) & 15;
  378. curstate |= ((jp_fires>>fire_shift) & 1)<<4;
  379. if (curstate != prevstate) {
  380. /* X axis */
  381. if ((curstate & (PORT_JS_LEFT|PORT_JS_RIGHT)) != (prevstate & (PORT_JS_LEFT|PORT_JS_RIGHT))) {
  382. curaxis=0;
  383. if (curstate & PORT_JS_LEFT) {
  384. curaxis=-128;
  385. } else if (curstate & PORT_JS_RIGHT) {
  386. curaxis=127;
  387. }
  388. SDL_PrivateJoystickAxis(joystick,0,curaxis);
  389. }
  390. /* Y axis */
  391. if ((curstate & (PORT_JS_UP|PORT_JS_DOWN)) != (prevstate & (PORT_JS_UP|PORT_JS_DOWN))) {
  392. curaxis=0;
  393. if (curstate & PORT_JS_UP) {
  394. curaxis=-128;
  395. } else if (curstate & PORT_JS_DOWN) {
  396. curaxis=127;
  397. }
  398. SDL_PrivateJoystickAxis(joystick,1,curaxis);
  399. }
  400. /* Button */
  401. if ((curstate & PORT_JS_FIRE) && !(prevstate & PORT_JS_FIRE)) {
  402. SDL_PrivateJoystickButton(joystick,0,SDL_PRESSED);
  403. }
  404. if (!(curstate & PORT_JS_FIRE) && (prevstate & PORT_JS_FIRE)) {
  405. SDL_PrivateJoystickButton(joystick,0,SDL_RELEASED);
  406. }
  407. }
  408. atarijoysticks[numjoystick].prevstate = curstate;
  409. }
  410. break;
  411. case PORTA_LP:
  412. {
  413. int i;
  414. curstate = jp_lightpens[0]>>1;
  415. curstate |= (jp_lightpens[1]>>1)<<15;
  416. curstate |= (jp_fires & 3)<<30;
  417. if (curstate != prevstate) {
  418. /* X axis */
  419. SDL_PrivateJoystickAxis(joystick,0,(jp_lightpens[0]>>8)-128);
  420. /* Y axis */
  421. SDL_PrivateJoystickAxis(joystick,1,(jp_lightpens[1]>>8)-128);
  422. /* Buttons */
  423. for (i=0;i<2;i++) {
  424. int button;
  425. button=1<<(30+i);
  426. if ((curstate & button) && !(prevstate & button)) {
  427. SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED);
  428. }
  429. if (!(curstate & button) && (prevstate & button)) {
  430. SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED);
  431. }
  432. }
  433. }
  434. atarijoysticks[numjoystick].prevstate = curstate;
  435. }
  436. break;
  437. case PORTA_ANPAD:
  438. case PORTB_ANPAD:
  439. {
  440. int numpaddle, i;
  441. numpaddle=0<<1;
  442. if (numjoystick==PORTB_ANPAD) numpaddle=1<<1;
  443. curstate = jp_paddles[numpaddle]>>1;
  444. curstate |= (jp_paddles[numpaddle+1]>>1)<<15;
  445. curstate |= ((jp_fires>>numpaddle) & 3)<<30;
  446. if (curstate != prevstate) {
  447. /* X axis */
  448. SDL_PrivateJoystickAxis(joystick,0,(jp_paddles[numpaddle]>>8)-128);
  449. /* Y axis */
  450. SDL_PrivateJoystickAxis(joystick,1,(jp_paddles[numpaddle+1]>>8)-128);
  451. /* Buttons */
  452. for (i=0;i<2;i++) {
  453. int button;
  454. button=1<<(30+i);
  455. if ((curstate & button) && !(prevstate & button)) {
  456. SDL_PrivateJoystickButton(joystick,i,SDL_PRESSED);
  457. }
  458. if (!(curstate & button) && (prevstate & button)) {
  459. SDL_PrivateJoystickButton(joystick,i,SDL_RELEASED);
  460. }
  461. }
  462. }
  463. atarijoysticks[numjoystick].prevstate = curstate;
  464. }
  465. break;
  466. #if 0
  467. case PARA_JOY0:
  468. case PARA_JOY1:
  469. break;
  470. #endif
  471. };
  472. return;
  473. }
  474. void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
  475. {
  476. return;
  477. }
  478. void SDL_SYS_JoystickQuit(void)
  479. {
  480. SDL_numjoysticks=0;
  481. return;
  482. }
  483. /*--- Joypad I/O read/write interface ---*/
  484. #define JOYPAD_IO_BASE (0xffff9200)
  485. struct JOYPAD_IO_S {
  486. Uint16 fires;
  487. Uint16 directions;
  488. Uint16 dummy1[6];
  489. Uint16 paddles[4];
  490. Uint16 dummy2[4];
  491. Uint16 lightpens[2];
  492. };
  493. #define JOYPAD_IO ((*(volatile struct JOYPAD_IO_S *)JOYPAD_IO_BASE))
  494. static void UpdateJoypads(void)
  495. {
  496. Uint16 tmp;
  497. /*--- This function is called in supervisor mode ---*/
  498. /* Update joysticks */
  499. jp_fires = (~(JOYPAD_IO.fires)) & 15;
  500. jp_directions = (~(JOYPAD_IO.directions));
  501. /* Update lightpen */
  502. tmp = JOYPAD_IO.lightpens[0] & 1023;
  503. jp_lightpens[0] = (tmp<<6) | (tmp>>4);
  504. tmp = JOYPAD_IO.lightpens[1] & 1023;
  505. jp_lightpens[1] = (tmp<<6) | (tmp>>4);
  506. /* Update paddles */
  507. tmp = (JOYPAD_IO.paddles[0] & 255);
  508. jp_paddles[0] = (tmp<<8) | tmp;
  509. tmp = (JOYPAD_IO.paddles[1] & 255);
  510. jp_paddles[1] = (tmp<<8) | tmp;
  511. tmp = (JOYPAD_IO.paddles[2] & 255);
  512. jp_paddles[2] = (tmp<<8) | tmp;
  513. tmp = (JOYPAD_IO.paddles[3] & 255);
  514. jp_paddles[3] = (tmp<<8) | tmp;
  515. /* Update joypad 0 */
  516. JOYPAD_IO.directions=0xfffe;
  517. jp_joypads[0]=((~(JOYPAD_IO.fires)) & 3)<<(16);
  518. JOYPAD_IO.directions=0xfffe;
  519. jp_joypads[0] |= ((~(JOYPAD_IO.directions))>>8) & 15;
  520. JOYPAD_IO.directions=0xfffd;
  521. jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+2);
  522. JOYPAD_IO.directions=0xfffd;
  523. jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<4;
  524. JOYPAD_IO.directions=0xfffb;
  525. jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+4);
  526. JOYPAD_IO.directions=0xfffb;
  527. jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<8;
  528. JOYPAD_IO.directions=0xfff7;
  529. jp_joypads[0] |= ((~(JOYPAD_IO.fires)) & 3)<<(16+6);
  530. JOYPAD_IO.directions=0xfff7;
  531. jp_joypads[0] |= (((~(JOYPAD_IO.directions))>>8) & 15)<<12;
  532. /* Update joypad 1 */
  533. JOYPAD_IO.directions=0xffef;
  534. jp_joypads[1]=((~(JOYPAD_IO.fires)) & (3<<2))<<(16-2);
  535. JOYPAD_IO.directions=0xffef;
  536. jp_joypads[1] |= ((~(JOYPAD_IO.directions))>>12) & 15;
  537. JOYPAD_IO.directions=0xffdf;
  538. jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16);
  539. JOYPAD_IO.directions=0xffdf;
  540. jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<4;
  541. JOYPAD_IO.directions=0xffbf;
  542. jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+2);
  543. JOYPAD_IO.directions=0xffbf;
  544. jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<8;
  545. JOYPAD_IO.directions=0xff7f;
  546. jp_joypads[1] |= ((~(JOYPAD_IO.fires)) & (3<<2))<<(16+4);
  547. JOYPAD_IO.directions=0xff7f;
  548. jp_joypads[1] |= (((~(JOYPAD_IO.directions))>>12) & 15)<<12;
  549. }