home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / crossplatform / emulators / MacOS / mac64-04.hqx / MAC64-04.SEA / C64 / SOURCE / Keyboard.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-01  |  5.5 KB  |  238 lines  |  [TEXT/KAHL]

  1. /*
  2.     cOMMODORE 64 eMULATOR V0.4      eARLE f. pHILHOWER iii 
  3.     cOPYRIGHT (c) 1993-4            (ST916W9R@DUNX1.OCS.DREXEL.EDU)
  4.  
  5.     tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  6.     IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  7.     THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
  8.     (AT YOUR OPTION) ANY LATER VERSION.
  9.  
  10.     tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  11.     BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  12.     merchantability OR fitness for a particular purpose.  sEE THE
  13.     gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  14.  
  15.     yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  16.     ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
  17.     fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
  18. */
  19.  
  20. #INCLUDE "pROCESSOR.H"
  21. #INCLUDE "kEYBOARD.H"
  22. #INCLUDE "sTACK.H"
  23.  
  24. BYTE KEYsCAN[8];
  25. BYTE SCANcODE[256];
  26.  
  27. STATIC VOID sETUPsCANcODES()
  28. {$7b}
  29. INT X;
  30. BYTE Y, Z;
  31.  
  32. FOR (X=0; X<256; X++)
  33. {$7b}
  34. Z=255;
  35. Y=X^255;
  36. IF (Y&1) Z &=KEYsCAN[0];
  37. IF (Y&2) Z &=KEYsCAN[1];
  38. IF (Y&4) Z &=KEYsCAN[2];
  39. IF (Y&8) Z &=KEYsCAN[3];
  40. IF (Y&16) Z &=KEYsCAN[4];
  41. IF (Y&32) Z &=KEYsCAN[5];
  42. IF (Y&64) Z &=KEYsCAN[6];
  43. IF (Y&128) Z &=KEYsCAN[7];
  44. SCANcODE[X]=Z;
  45. {$7d}
  46. {$7d}
  47.  
  48. VOID aPPLEsCANkEYBOARD(BYTE CHR, INT MODIFIERS)
  49. {$7b}
  50. /* cLEAR OUT THE SCANCODES */
  51. KEYsCAN[0]=KEYsCAN[1]=KEYsCAN[2]=KEYsCAN[3]=KEYsCAN[4]=KEYsCAN[5]=KEYsCAN[6]=KEYsCAN[7]=255;
  52.  
  53. IF (CHR==13)
  54. {$7b}
  55. /* return */
  56. KEYsCAN[0] -=2;
  57. IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
  58. sETUPsCANcODES();
  59. RETURN;
  60. {$7d}
  61.  
  62. IF (CHR==0X08)
  63. {$7b}
  64. /* delete */
  65. KEYsCAN[0] -= 1;
  66. IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
  67. sETUPsCANcODES();
  68. RETURN;
  69. {$7d}
  70.  
  71. IF (CHR==0X1B)
  72. {$7b}
  73. /* run/stop */
  74. KEYsCAN[7]-=128;
  75. sETUPsCANcODES();
  76. RETURN;
  77. {$7d}
  78.  
  79. IF (CHR=='{$60}')
  80. {$7b}
  81. /* run/stop - restore */
  82. KEYsCAN[7]-=128;
  83. pUSHwORD(PC);
  84. pUSH(FLAGS);
  85. PC=wORDaT(nmitO);
  86. sETUPsCANcODES();
  87. RETURN;
  88. {$7d}
  89.  
  90. IF (MODIFIERS&OPTIONkEY)
  91. {$7b}
  92. SWITCH(CHR)
  93. {$7b}
  94. /* f1, f2 */
  95. CASE 0XAA: KEYsCAN[1]-=128;
  96. CASE 0XC1: KEYsCAN[0]-=16; BREAK;
  97.  
  98. /* f3, f4 */
  99. CASE 0XA2: KEYsCAN[1]-=128;
  100. CASE 0XA3: KEYsCAN[0]-=32; BREAK;
  101.  
  102. /* f5, f6 */
  103. CASE 0XA4: KEYsCAN[1]-=128;
  104. CASE 0XB0: KEYsCAN[0]-=64; BREAK;
  105.  
  106. /* f7, f8 */
  107. CASE 0XA5: KEYsCAN[1]-=128;
  108. CASE 0XA6: KEYsCAN[0]-=8; BREAK;
  109. {$7d}
  110. sETUPsCANcODES();
  111. RETURN;
  112. {$7d}
  113.  
  114. IF (CHR==' ')
  115. {$7b}
  116. /* space */
  117. IF (MODIFIERS&SHIFTkEY) KEYsCAN[1]-=128;
  118. KEYsCAN[7]-=16;
  119. sETUPsCANcODES();
  120. RETURN;
  121. {$7d}
  122.  
  123. IF ((CHR>=1)&&(CHR<=26))
  124. {$7b}
  125. /* mAKE control DOWN, MUNGE THE CHARS UP INTO ascii FOR FOLLOWING */
  126. KEYsCAN[7]-=4;
  127. CHR +=64+32;
  128. {$7d}
  129.  
  130. IF (((CHR>='a')&&(CHR<='z')){$7c}{$7c}((CHR>='A')&&(CHR<='Z')))
  131. {$7b}
  132. IF (CHR<'A') KEYsCAN[1] -= 128;
  133. ELSE CHR -=32;
  134.  
  135. SWITCH (CHR)
  136. {$7b}
  137. CASE 'a' : KEYsCAN[1]-=4; BREAK;
  138. CASE 'b' : KEYsCAN[3]-=16; BREAK;
  139. CASE 'c' : KEYsCAN[2]-=16; BREAK;
  140. CASE 'd' : KEYsCAN[2]-=4; BREAK;
  141. CASE 'e' : KEYsCAN[1]-=64; BREAK;
  142. CASE 'f' : KEYsCAN[2]-=32; BREAK;
  143. CASE 'g' : KEYsCAN[3]-=4; BREAK;
  144. CASE 'h' : KEYsCAN[3]-=32; BREAK;
  145. CASE 'i' : KEYsCAN[4]-=2; BREAK;
  146. CASE 'j' : KEYsCAN[4]-=4; BREAK;
  147. CASE 'k' : KEYsCAN[4]-=32; BREAK;
  148. CASE 'l' : KEYsCAN[5]-=4; BREAK;
  149. CASE 'm' : KEYsCAN[4]-=16; BREAK;
  150. CASE 'n' : KEYsCAN[4]-=128; BREAK;
  151. CASE 'o' : KEYsCAN[4]-=64; BREAK;
  152. CASE 'p' : KEYsCAN[5]-=2; BREAK;
  153. CASE 'q' : KEYsCAN[7]-=64; BREAK;
  154. CASE 'r' : KEYsCAN[2]-=2; BREAK;
  155. CASE 's' : KEYsCAN[1]-=32; BREAK;
  156. CASE 't' : KEYsCAN[2]-=64; BREAK;
  157. CASE 'u' : KEYsCAN[3]-=64; BREAK;
  158. CASE 'v' : KEYsCAN[3]-=128; BREAK;
  159. CASE 'w' : KEYsCAN[1]-=2; BREAK;
  160. CASE 'x' : KEYsCAN[2]-=128; BREAK;
  161. CASE 'y' : KEYsCAN[3]-=2; BREAK;
  162. CASE 'z' : KEYsCAN[1]-=16; BREAK;
  163. {$7d}
  164. sETUPsCANcODES();
  165. RETURN;
  166. {$7d}
  167. ELSE IF ((CHR>='0')&&(CHR<='9'))
  168. {$7b}
  169. SWITCH(CHR)
  170. {$7b}
  171. CASE '0': KEYsCAN[4]-=8; BREAK;
  172. CASE '1': KEYsCAN[7]-=1; BREAK;
  173. CASE '2': KEYsCAN[7]-=8; BREAK;
  174. CASE '3': KEYsCAN[1]-=1; BREAK;
  175. CASE '4': KEYsCAN[1]-=8; BREAK;
  176. CASE '5': KEYsCAN[2]-=1; BREAK;
  177. CASE '6': KEYsCAN[2]-=8; BREAK;
  178. CASE '7': KEYsCAN[3]-=1; BREAK;
  179. CASE '8': KEYsCAN[3]-=8; BREAK;
  180. CASE '9': KEYsCAN[4]-=1; BREAK;
  181. {$7d}
  182. sETUPsCANcODES();
  183. RETURN;
  184. {$7d}
  185. ELSE IF ((CHR>=0X1C)&&(CHR<=0X1F))
  186. {$7b}
  187. SWITCH (CHR)
  188. {$7b}
  189. /* up/down */
  190. CASE 0X1C: KEYsCAN[1] -=128;
  191. CASE 0X1D: KEYsCAN[0] -=4; BREAK;
  192. /* left/right */
  193. CASE 0X1E: KEYsCAN[1] -=128;
  194. CASE 0X1F: KEYsCAN[0] -=128; BREAK;
  195. {$7d}
  196. sETUPsCANcODES();
  197. RETURN;
  198. {$7d}
  199. ELSE IF ((CHR>='!')&&(CHR<='/'))
  200. {$7b}
  201. SWITCH (CHR)
  202. {$7b}
  203. CASE '!': KEYsCAN[1] -=128; KEYsCAN[7] -=1; BREAK;
  204. CASE '"': KEYsCAN[1] -=128; KEYsCAN[7] -=8; BREAK;
  205. CASE '#': KEYsCAN[1] -=128; KEYsCAN[1] -=1; BREAK;
  206. CASE '$': KEYsCAN[1] -=128; KEYsCAN[1] -=8; BREAK;
  207. CASE '%': KEYsCAN[1] -=128; KEYsCAN[2] -=1; BREAK;
  208. CASE '&': KEYsCAN[1] -=128; KEYsCAN[2] -=8; BREAK;
  209. CASE 39 : KEYsCAN[1] -=128; KEYsCAN[3] -=1; BREAK;
  210. CASE '(': KEYsCAN[1] -=128; KEYsCAN[3] -=8; BREAK;
  211. CASE ')': KEYsCAN[1] -=128; KEYsCAN[4] -=1; BREAK;
  212. CASE '*': KEYsCAN[6] -=2; BREAK;
  213. CASE '+': KEYsCAN[5] -=1; BREAK;
  214. CASE ',': KEYsCAN[5] -=128; BREAK;
  215. CASE '-': KEYsCAN[5] -=8; BREAK;
  216. CASE '.': KEYsCAN[5] -=16; BREAK;
  217. CASE '/': KEYsCAN[6] -=128; BREAK;
  218. {$7d}
  219. sETUPsCANcODES();
  220. RETURN;
  221. {$7d}
  222. ELSE IF ((CHR>=':')&&(CHR<='@')) 
  223. {$7b}
  224. SWITCH (CHR)
  225. {$7b}
  226. CASE ';': KEYsCAN[6]-=4;
  227. CASE ':': KEYsCAN[5]-=32; BREAK;
  228. CASE '<': KEYsCAN[1]-=128; KEYsCAN[5]-=128; BREAK;
  229. CASE '=': KEYsCAN[6]-=32; BREAK;
  230. CASE '>': KEYsCAN[1]-=128; KEYsCAN[5]-=16; BREAK;
  231. CASE '?': KEYsCAN[1]-=128; KEYsCAN[6]-=128; BREAK;
  232. CASE '@': KEYsCAN[5]-=64; BREAK;
  233. {$7d}
  234. sETUPsCANcODES();
  235. RETURN;
  236. {$7d}
  237. {$7d}
  238.