WWInterrupt.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include "WWInterruptP.h"
  5. #include "WonX.h"
  6. /*****************************************************************************/
  7. /* メンバ関数の定義 */
  8. /*****************************************************************************/
  9. /*===========================================================================*/
  10. /* WWInterruptVector クラスのもの */
  11. /*===========================================================================*/
  12. static int WWInterruptVector_GetNumber(WWInterruptVector v)
  13. { return (v->number); }
  14. static WWInterruptCallback WWInterruptVector_GetCallback(WWInterruptVector v)
  15. { return (v->callback); }
  16. static int WWInterruptVector_GetCS(WWInterruptVector v)
  17. { return (v->cs); }
  18. static int WWInterruptVector_GetDS(WWInterruptVector v)
  19. { return (v->ds); }
  20. static int WWInterruptVector_SetNumber(WWInterruptVector v, int number)
  21. { return (v->number = number); }
  22. static WWInterruptCallback WWInterruptVector_SetCallback(WWInterruptVector v,
  23. WWInterruptCallback cb)
  24. { return (v->callback = cb); }
  25. static int WWInterruptVector_SetCS(WWInterruptVector v, int cs)
  26. { return (v->cs = cs); }
  27. static int WWInterruptVector_SetDS(WWInterruptVector v, int ds)
  28. { return (v->ds = ds); }
  29. static int WWInterruptVector_ExecuteCallback(WWInterruptVector vector)
  30. {
  31. if (vector->callback == NULL) return (1);
  32. (*(vector->callback))();
  33. return (0);
  34. }
  35. static WWInterruptVector WWInterruptVector_Create(int number)
  36. {
  37. WWInterruptVector vector;
  38. vector = (WWInterruptVector)malloc(sizeof(_WWInterruptVector));
  39. if (vector == NULL)
  40. WonX_Error("WWInterruptVector_Create", "Cannot allocate memory.");
  41. WWInterruptVector_SetNumber(vector, number);
  42. WWInterruptVector_SetCallback(vector, NULL);
  43. WWInterruptVector_SetCS(vector, 0);
  44. WWInterruptVector_SetDS(vector, 0);
  45. return (vector);
  46. }
  47. static WWInterruptVector WWInterruptVector_Destroy(WWInterruptVector vector)
  48. {
  49. if (vector == NULL)
  50. WonX_Error("WWInterruptVector_Destroy", "Object is not created.");
  51. free(vector);
  52. return (NULL);
  53. }
  54. /*===========================================================================*/
  55. /* WWInterrupt クラスのもの */
  56. /*===========================================================================*/
  57. static WWInterruptVector WWInterrupt_GetVector(WWInterrupt interrupt,
  58. int number)
  59. {
  60. if ((number < 0) || (number > 7))
  61. WonX_Error("WWInterrupt_SetVector", "Invalid interrupt number.");
  62. return (interrupt->vector[number]);
  63. }
  64. static WWInterruptVector WWInterrupt_SetVector(WWInterrupt interrupt,
  65. int number,
  66. WWInterruptVector vector)
  67. {
  68. if ((number < 0) || (number > 7))
  69. WonX_Error("WWInterrupt_SetVector", "Invalid interrupt number.");
  70. return (interrupt->vector[number] = vector);
  71. }
  72. int WWInterrupt_GetNumber(WWInterrupt interrupt, int num)
  73. {
  74. return (WWInterruptVector_GetNumber(WWInterrupt_GetVector(interrupt, num)));
  75. }
  76. WWInterruptCallback WWInterrupt_GetCallback(WWInterrupt interrupt, int n)
  77. {
  78. return (WWInterruptVector_GetCallback(WWInterrupt_GetVector(interrupt, n)));
  79. }
  80. int WWInterrupt_GetCS(WWInterrupt interrupt, int number)
  81. {
  82. return (WWInterruptVector_GetCS(WWInterrupt_GetVector(interrupt, number)));
  83. }
  84. int WWInterrupt_GetDS(WWInterrupt interrupt, int number)
  85. {
  86. return (WWInterruptVector_GetDS(WWInterrupt_GetVector(interrupt, number)));
  87. }
  88. WWInterruptCallback WWInterrupt_SetCallback(WWInterrupt interrupt, int num,
  89. WWInterruptCallback callback)
  90. {
  91. return (WWInterruptVector_SetCallback(WWInterrupt_GetVector(interrupt, num),
  92. callback));
  93. }
  94. int WWInterrupt_SetCS(WWInterrupt interrupt, int num, int cs)
  95. {
  96. return (WWInterruptVector_SetCS(WWInterrupt_GetVector(interrupt, num), cs));
  97. }
  98. int WWInterrupt_SetDS(WWInterrupt interrupt, int num, int ds)
  99. {
  100. return (WWInterruptVector_SetDS(WWInterrupt_GetVector(interrupt, num), ds));
  101. }
  102. int WWInterrupt_ExecuteCallback(WWInterrupt i, int n)
  103. {
  104. return (WWInterruptVector_ExecuteCallback(WWInterrupt_GetVector(i, n)));
  105. }
  106. /*---------------------------------------------------------------------------*/
  107. /* Number の取得 */
  108. /*---------------------------------------------------------------------------*/
  109. int WWInterrupt_GetSendReadyNumber(WWInterrupt interrupt)
  110. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_SENDREADY)); }
  111. int WWInterrupt_GetKeyNumber(WWInterrupt interrupt)
  112. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_KEY)); }
  113. int WWInterrupt_GetCasetteNumber(WWInterrupt interrupt)
  114. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_CASETTE)); }
  115. int WWInterrupt_GetReceiveReadyNumber(WWInterrupt interrupt)
  116. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_RECEIVEREADY)); }
  117. int WWInterrupt_GetDisplineNumber(WWInterrupt interrupt)
  118. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_DISPLINE)); }
  119. int WWInterrupt_GetTimerCountUpNumber(WWInterrupt interrupt)
  120. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_TIMER_COUNTUP)); }
  121. int WWInterrupt_GetVBlankNumber(WWInterrupt interrupt)
  122. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_VBLANK)); }
  123. int WWInterrupt_GetHBlankCountUpNumber(WWInterrupt interrupt)
  124. { return (WWInterrupt_GetNumber(interrupt, SYS_INT_HBLANK_COUNTUP)); }
  125. /*---------------------------------------------------------------------------*/
  126. /* コールバック関数の取得 */
  127. /*---------------------------------------------------------------------------*/
  128. WWInterruptCallback WWInterrupt_GetSendReadyCallback(WWInterrupt interrupt)
  129. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_SENDREADY)); }
  130. WWInterruptCallback WWInterrupt_GetKeyCallback(WWInterrupt interrupt)
  131. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_KEY)); }
  132. WWInterruptCallback WWInterrupt_GetCasetteCallback(WWInterrupt interrupt)
  133. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_CASETTE)); }
  134. WWInterruptCallback WWInterrupt_GetReceiveReadyCallback(WWInterrupt interrupt)
  135. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_RECEIVEREADY)); }
  136. WWInterruptCallback WWInterrupt_GetDisplineCallback(WWInterrupt interrupt)
  137. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_DISPLINE)); }
  138. WWInterruptCallback WWInterrupt_GetTimerCountUpCallback(WWInterrupt interrupt)
  139. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_TIMER_COUNTUP)); }
  140. WWInterruptCallback WWInterrupt_GetVBlankCallback(WWInterrupt interrupt)
  141. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_VBLANK)); }
  142. WWInterruptCallback WWInterrupt_GetHBlankCountUpCallback(WWInterrupt interrupt)
  143. { return (WWInterrupt_GetCallback(interrupt, SYS_INT_HBLANK_COUNTUP)); }
  144. /*---------------------------------------------------------------------------*/
  145. /* CS の取得 */
  146. /*---------------------------------------------------------------------------*/
  147. int WWInterrupt_GetSendReadyCS(WWInterrupt interrupt)
  148. { return (WWInterrupt_GetCS(interrupt, SYS_INT_SENDREADY)); }
  149. int WWInterrupt_GetKeyCS(WWInterrupt interrupt)
  150. { return (WWInterrupt_GetCS(interrupt, SYS_INT_KEY)); }
  151. int WWInterrupt_GetCasetteCS(WWInterrupt interrupt)
  152. { return (WWInterrupt_GetCS(interrupt, SYS_INT_CASETTE)); }
  153. int WWInterrupt_GetReceiveReadyCS(WWInterrupt interrupt)
  154. { return (WWInterrupt_GetCS(interrupt, SYS_INT_RECEIVEREADY)); }
  155. int WWInterrupt_GetDisplineCS(WWInterrupt interrupt)
  156. { return (WWInterrupt_GetCS(interrupt, SYS_INT_DISPLINE)); }
  157. int WWInterrupt_GetTimerCountUpCS(WWInterrupt interrupt)
  158. { return (WWInterrupt_GetCS(interrupt, SYS_INT_TIMER_COUNTUP)); }
  159. int WWInterrupt_GetVBlankCS(WWInterrupt interrupt)
  160. { return (WWInterrupt_GetCS(interrupt, SYS_INT_VBLANK)); }
  161. int WWInterrupt_GetHBlankCountUpCS(WWInterrupt interrupt)
  162. { return (WWInterrupt_GetCS(interrupt, SYS_INT_HBLANK_COUNTUP)); }
  163. /*---------------------------------------------------------------------------*/
  164. /* DS の取得 */
  165. /*---------------------------------------------------------------------------*/
  166. int WWInterrupt_GetSendReadyDS(WWInterrupt interrupt)
  167. { return (WWInterrupt_GetDS(interrupt, SYS_INT_SENDREADY)); }
  168. int WWInterrupt_GetKeyDS(WWInterrupt interrupt)
  169. { return (WWInterrupt_GetDS(interrupt, SYS_INT_KEY)); }
  170. int WWInterrupt_GetCasetteDS(WWInterrupt interrupt)
  171. { return (WWInterrupt_GetDS(interrupt, SYS_INT_CASETTE)); }
  172. int WWInterrupt_GetReceiveReadyDS(WWInterrupt interrupt)
  173. { return (WWInterrupt_GetDS(interrupt, SYS_INT_RECEIVEREADY)); }
  174. int WWInterrupt_GetDisplineDS(WWInterrupt interrupt)
  175. { return (WWInterrupt_GetDS(interrupt, SYS_INT_DISPLINE)); }
  176. int WWInterrupt_GetTimerCountUpDS(WWInterrupt interrupt)
  177. { return (WWInterrupt_GetDS(interrupt, SYS_INT_TIMER_COUNTUP)); }
  178. int WWInterrupt_GetVBlankDS(WWInterrupt interrupt)
  179. { return (WWInterrupt_GetDS(interrupt, SYS_INT_VBLANK)); }
  180. int WWInterrupt_GetHBlankCountUpDS(WWInterrupt interrupt)
  181. { return (WWInterrupt_GetDS(interrupt, SYS_INT_HBLANK_COUNTUP)); }
  182. /*---------------------------------------------------------------------------*/
  183. /* コールバック関数の設定 */
  184. /*---------------------------------------------------------------------------*/
  185. WWInterruptCallback WWInterrupt_SetSendReadyCallback(WWInterrupt interrupt,
  186. WWInterruptCallback f)
  187. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_SENDREADY, f)); }
  188. WWInterruptCallback WWInterrupt_SetKeyCallback(WWInterrupt interrupt,
  189. WWInterruptCallback f)
  190. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_KEY, f)); }
  191. WWInterruptCallback WWInterrupt_SetCasetteCallback(WWInterrupt interrupt,
  192. WWInterruptCallback f)
  193. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_CASETTE, f)); }
  194. WWInterruptCallback WWInterrupt_SetReceiveReadyCallback(WWInterrupt interrupt,
  195. WWInterruptCallback f)
  196. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_RECEIVEREADY, f)); }
  197. WWInterruptCallback WWInterrupt_SetDisplineCallback(WWInterrupt interrupt,
  198. WWInterruptCallback f)
  199. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_DISPLINE, f)); }
  200. WWInterruptCallback WWInterrupt_SetTimerCountUpCallback(WWInterrupt interrupt,
  201. WWInterruptCallback f)
  202. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_TIMER_COUNTUP, f)); }
  203. WWInterruptCallback WWInterrupt_SetVBlankCallback(WWInterrupt interrupt,
  204. WWInterruptCallback f)
  205. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_VBLANK, f)); }
  206. WWInterruptCallback WWInterrupt_SetHBlankCountUpCallback(WWInterrupt interrupt,
  207. WWInterruptCallback f)
  208. { return (WWInterrupt_SetCallback(interrupt, SYS_INT_HBLANK_COUNTUP, f)); }
  209. /*---------------------------------------------------------------------------*/
  210. /* CS の設定 */
  211. /*---------------------------------------------------------------------------*/
  212. int WWInterrupt_SetSendReadyCS(WWInterrupt interrupt, int cs)
  213. { return (WWInterrupt_SetCS(interrupt, SYS_INT_SENDREADY, cs)); }
  214. int WWInterrupt_SetKeyCS(WWInterrupt interrupt, int cs)
  215. { return (WWInterrupt_SetCS(interrupt, SYS_INT_KEY, cs)); }
  216. int WWInterrupt_SetCasetteCS(WWInterrupt interrupt, int cs)
  217. { return (WWInterrupt_SetCS(interrupt, SYS_INT_CASETTE, cs)); }
  218. int WWInterrupt_SetReceiveReadyCS(WWInterrupt interrupt, int cs)
  219. { return (WWInterrupt_SetCS(interrupt, SYS_INT_RECEIVEREADY, cs)); }
  220. int WWInterrupt_SetDisplineCS(WWInterrupt interrupt, int cs)
  221. { return (WWInterrupt_SetCS(interrupt, SYS_INT_DISPLINE, cs)); }
  222. int WWInterrupt_SetTimerCountUpCS(WWInterrupt interrupt, int cs)
  223. { return (WWInterrupt_SetCS(interrupt, SYS_INT_TIMER_COUNTUP, cs)); }
  224. int WWInterrupt_SetVBlankCS(WWInterrupt interrupt, int cs)
  225. { return (WWInterrupt_SetCS(interrupt, SYS_INT_VBLANK, cs)); }
  226. int WWInterrupt_SetHBlankCountUpCS(WWInterrupt interrupt, int cs)
  227. { return (WWInterrupt_SetCS(interrupt, SYS_INT_HBLANK_COUNTUP, cs)); }
  228. /*---------------------------------------------------------------------------*/
  229. /* DS の設定 */
  230. /*---------------------------------------------------------------------------*/
  231. int WWInterrupt_SetSendReadyDS(WWInterrupt interrupt, int ds)
  232. { return (WWInterrupt_SetDS(interrupt, SYS_INT_SENDREADY, ds)); }
  233. int WWInterrupt_SetKeyDS(WWInterrupt interrupt, int ds)
  234. { return (WWInterrupt_SetDS(interrupt, SYS_INT_KEY, ds)); }
  235. int WWInterrupt_SetCasetteDS(WWInterrupt interrupt, int ds)
  236. { return (WWInterrupt_SetDS(interrupt, SYS_INT_CASETTE, ds)); }
  237. int WWInterrupt_SetReceiveReadyDS(WWInterrupt interrupt, int ds)
  238. { return (WWInterrupt_SetDS(interrupt, SYS_INT_RECEIVEREADY, ds)); }
  239. int WWInterrupt_SetDisplineDS(WWInterrupt interrupt, int ds)
  240. { return (WWInterrupt_SetDS(interrupt, SYS_INT_DISPLINE, ds)); }
  241. int WWInterrupt_SetTimerCountUpDS(WWInterrupt interrupt, int ds)
  242. { return (WWInterrupt_SetDS(interrupt, SYS_INT_TIMER_COUNTUP, ds)); }
  243. int WWInterrupt_SetVBlankDS(WWInterrupt interrupt, int ds)
  244. { return (WWInterrupt_SetDS(interrupt, SYS_INT_VBLANK, ds)); }
  245. int WWInterrupt_SetHBlankCountUpDS(WWInterrupt interrupt, int ds)
  246. { return (WWInterrupt_SetDS(interrupt, SYS_INT_HBLANK_COUNTUP, ds)); }
  247. /*---------------------------------------------------------------------------*/
  248. /* コールバック関数の実行 */
  249. /*---------------------------------------------------------------------------*/
  250. int WWInterrupt_ExecuteSendReadyCallback(WWInterrupt interrupt)
  251. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_SENDREADY)); }
  252. int WWInterrupt_ExecuteKeyCallback(WWInterrupt interrupt)
  253. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_KEY)); }
  254. int WWInterrupt_ExecuteCasetteCallback(WWInterrupt interrupt)
  255. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_CASETTE)); }
  256. int WWInterrupt_ExecuteReceiveReadyCallback(WWInterrupt interrupt)
  257. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_RECEIVEREADY)); }
  258. int WWInterrupt_ExecuteDisplineCallback(WWInterrupt interrupt)
  259. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_DISPLINE)); }
  260. int WWInterrupt_ExecuteTimerCountUpCallback(WWInterrupt interrupt)
  261. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_TIMER_COUNTUP)); }
  262. int WWInterrupt_ExecuteVBlankCallback(WWInterrupt interrupt)
  263. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_VBLANK)); }
  264. int WWInterrupt_ExecuteHBlankCountUpCallback(WWInterrupt interrupt)
  265. { return (WWInterrupt_ExecuteCallback(interrupt, SYS_INT_HBLANK_COUNTUP)); }
  266. /*---------------------------------------------------------------------------*/
  267. /* オブジェクトの作成 */
  268. /*---------------------------------------------------------------------------*/
  269. WWInterrupt WWInterrupt_Create()
  270. {
  271. WWInterrupt interrupt;
  272. int i;
  273. interrupt = (WWInterrupt)malloc(sizeof(_WWInterrupt));
  274. if (interrupt == NULL)
  275. WonX_Error("WWInterrupt_Create", "Cannot allocate memory.");
  276. for (i = 0; i < 8; i++)
  277. WWInterrupt_SetVector(interrupt, i, WWInterruptVector_Create(i));
  278. return (interrupt);
  279. }
  280. /*---------------------------------------------------------------------------*/
  281. /* オブジェクトの削除 */
  282. /*---------------------------------------------------------------------------*/
  283. WWInterrupt WWInterrupt_Destroy(WWInterrupt interrupt)
  284. {
  285. int i;
  286. WWInterruptVector vector;
  287. if (interrupt == NULL)
  288. WonX_Error("WWInterrupt_Destroy", "Object is not created.");
  289. for (i = 0; i < 8; i++) {
  290. vector = WWInterrupt_GetVector(interrupt, i);
  291. if (vector != NULL)
  292. WWInterrupt_SetVector(interrupt, i, WWInterruptVector_Destroy(vector));
  293. }
  294. free(interrupt);
  295. return (NULL);
  296. }
  297. /*****************************************************************************/
  298. /* ここまで */
  299. /*****************************************************************************/
  300. /*****************************************************************************/
  301. /* End of File. */
  302. /*****************************************************************************/