Joy.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2016 RWS Inc, All Rights Reserved
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of version 2 of the GNU General Public License as published by
  7. // the Free Software Foundation
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License along
  15. // with this program; if not, write to the Free Software Foundation, Inc.,
  16. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. //
  20. // joy.cpp
  21. //
  22. // History:
  23. // 08/29/95 JMI Started.
  24. //
  25. //
  26. //////////////////////////////////////////////////////////////////////////////
  27. //
  28. // Handles keyboard emulation of joystick stuff.
  29. //
  30. //////////////////////////////////////////////////////////////////////////////
  31. #include "common/system.h"
  32. #include "common/bjoy.h"
  33. #include "common/bkey.h"
  34. #include "common/bdebug.h"
  35. #include "joy/joy.h"
  36. //////////////////////////////////////////////////////////////////////////////
  37. // Macros.
  38. //////////////////////////////////////////////////////////////////////////////
  39. #define NUM_JOYSTICKS 2
  40. #define NUM_BUTTONS 4
  41. #define NUM_DIRS 6
  42. //////////////////////////////////////////////////////////////////////////////
  43. // Module specific (static) variables.
  44. //////////////////////////////////////////////////////////////////////////////
  45. static JOYSTATE ms_ajsCurr[NUM_JOYSTICKS]; // Current joystick state.
  46. static JOYSTATE ms_ajsPrev[NUM_JOYSTICKS]; // Previous joystick state.
  47. static UCHAR ms_aucButKeys[NUM_JOYSTICKS][NUM_BUTTONS] = { 0, };
  48. static UCHAR ms_aucDirKeys[NUM_JOYSTICKS][NUM_DIRS] = { 0, };
  49. //////////////////////////////////////////////////////////////////////////////
  50. // Externally callable functions.
  51. //////////////////////////////////////////////////////////////////////////////
  52. //////////////////////////////////////////////////////////////////////////////
  53. //
  54. // Sets the ucKey as the key representing usState on sJoy joystick.
  55. // Returns 0 on success.
  56. //
  57. //////////////////////////////////////////////////////////////////////////////
  58. extern short Joy_SetKey(short sJoy, UCHAR ucKey, USHORT usState)
  59. {
  60. short sRes = 0; // Assume success.
  61. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  62. // Get portion for buttons.
  63. USHORT usButState = (usState & JOY_BUT);
  64. // If any buttons represented . . .
  65. if (usButState != 0)
  66. {
  67. // For every bit represented store this key.
  68. for (short i = 0; i < sizeof(ms_aucButKeys[sJoy]); i++)
  69. {
  70. if (usButState & (0x0001 << i))
  71. {
  72. ms_aucButKeys[sJoy][i] = ucKey;
  73. }
  74. }
  75. }
  76. // Get portion for dirs.
  77. USHORT usDirState = (usState & JOY_DIR_STATES);
  78. // If any directionss represented . . .
  79. if (usDirState != 0)
  80. {
  81. // For every bit represented store this key.
  82. for (short i = 0; i < sizeof(ms_aucDirKeys[sJoy]); i++)
  83. {
  84. if (usDirState & (0x0010 << i))
  85. {
  86. ms_aucDirKeys[sJoy][i] = ucKey;
  87. }
  88. }
  89. }
  90. return sRes;
  91. }
  92. //////////////////////////////////////////////////////////////////////////////
  93. //
  94. // Updates joystick sJoy's current state and makes the current state the
  95. // previous.
  96. // Returns 0 on success.
  97. //
  98. //////////////////////////////////////////////////////////////////////////////
  99. extern short Joy_Update(short sJoy)
  100. {
  101. short sRes = 0; // Assume success.
  102. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  103. if (Blu_UpdateJoy(sJoy) == 0)
  104. {
  105. // Copy current state to previous.
  106. ms_ajsPrev[sJoy] = ms_ajsCurr[sJoy];
  107. // Get new state.
  108. Blu_GetJoyState(sJoy, &ms_ajsCurr[sJoy]);
  109. KEYBOARD kb;
  110. // Get key state.
  111. if (Blu_GetKeyboard(&kb) == 0)
  112. {
  113. // Update for keys.
  114. UCHAR uc;
  115. // Buttons:
  116. for (short i = 0; i < sizeof(ms_aucButKeys[sJoy]); i++)
  117. {
  118. // Get key.
  119. uc = ms_aucButKeys[sJoy][i];
  120. if (BITINDEXARRAY(kb.auc,uc))
  121. {
  122. ms_ajsCurr[sJoy].us |= (0x0001 << i);
  123. }
  124. }
  125. // Directions:
  126. for (i = 0; i < sizeof(ms_aucDirKeys[sJoy]); i++)
  127. {
  128. // Get key.
  129. uc = ms_aucDirKeys[sJoy][i];
  130. if (BITINDEXARRAY(kb.auc,uc))
  131. {
  132. ms_ajsCurr[sJoy].us |= (0x0010 << i);
  133. }
  134. }
  135. }
  136. else
  137. {
  138. TRACE("Joy_Update(): Unable to get keyboard state.\n");
  139. sRes = -2;
  140. }
  141. }
  142. else
  143. {
  144. TRACE("Joy_Update(): Unable to get joystick state.\n");
  145. sRes = -1;
  146. }
  147. return sRes;
  148. }
  149. //////////////////////////////////////////////////////////////////////////////
  150. //
  151. // Puts the coordinates of joystick sJoy's position in your longs.
  152. // Returns nothing.
  153. //
  154. //////////////////////////////////////////////////////////////////////////////
  155. extern void Joy_GetPos(short sJoy, long *px, long *py, long *pz)
  156. {
  157. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  158. Blu_GetJoyPos(sJoy, px, py, pz);
  159. }
  160. //////////////////////////////////////////////////////////////////////////////
  161. //
  162. // Puts the coordinates of the previous joystick sJoy's position in your longs.
  163. // Returns nothing.
  164. //
  165. //////////////////////////////////////////////////////////////////////////////
  166. extern void Joy_GetPrevPos(short sJoy, long *px, long *py, long *pz)
  167. {
  168. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  169. Blu_GetJoyPrevPos(sJoy, px, py, pz);
  170. }
  171. //////////////////////////////////////////////////////////////////////////////
  172. //
  173. // Returns the current joystick sJoy's state.
  174. //
  175. //////////////////////////////////////////////////////////////////////////////
  176. extern USHORT Joy_GetState(short sJoy)
  177. {
  178. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  179. return ms_ajsCurr[sJoy].us;
  180. }
  181. //////////////////////////////////////////////////////////////////////////////
  182. //
  183. // Returns the previous joystick sJoy's state.
  184. //
  185. //////////////////////////////////////////////////////////////////////////////
  186. extern USHORT Joy_GetPrevState(short sJoy)
  187. {
  188. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  189. return ms_ajsPrev[sJoy].us;
  190. }
  191. //////////////////////////////////////////////////////////////////////////////
  192. //
  193. // Places the current joystick sJoy's state in pjs.
  194. //
  195. //////////////////////////////////////////////////////////////////////////////
  196. extern void Joy_GetState(short sJoy, PJOYSTATE pjs)
  197. {
  198. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  199. *pjs = ms_ajsCurr[sJoy];
  200. }
  201. //////////////////////////////////////////////////////////////////////////////
  202. //
  203. // Places the previous joystick sJoy's state in pjs.
  204. //
  205. //////////////////////////////////////////////////////////////////////////////
  206. extern void Joy_GetPrevState(short sJoy, PJOYSTATE pjs)
  207. {
  208. ASSERT(sJoy >= 0 && sJoy < NUM_JOYSTICKS);
  209. *pjs = ms_ajsPrev[sJoy];
  210. }
  211. //////////////////////////////////////////////////////////////////////////////
  212. // EOF
  213. //////////////////////////////////////////////////////////////////////////////