Subversion Repositories pentevo

Rev

Rev 644 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. #include <avr/pgmspace.h>
  2. #include <avr/eeprom.h>
  3.  
  4. #include "pins.h"
  5. #include "mytypes.h"
  6.  
  7. #include "getfaraddress.h"
  8. #include "main.h"
  9. #include "zx.h"
  10. #include "kbmap.h"
  11. #include "rs232.h"
  12.  
  13. const UBYTE default_kbmap[] PROGMEM =
  14. {
  15. NO_KEY,NO_KEY, // 00
  16. NO_KEY,NO_KEY, // 01 F9
  17. NO_KEY,NO_KEY, // 02
  18. NO_KEY,NO_KEY, // 03 F5
  19. NO_KEY,NO_KEY, // 04 F3
  20. NO_KEY,NO_KEY, // 05 F1
  21. NO_KEY,NO_KEY, // 06 F2
  22. NO_KEY,NO_KEY, // 07 F12
  23. NO_KEY,NO_KEY, // 08
  24. NO_KEY,NO_KEY, // 09 F10
  25. NO_KEY,NO_KEY, // 0A F8
  26. NO_KEY,NO_KEY, // 0B F6
  27. NO_KEY,NO_KEY, // 0C F4
  28. KEY_CS,KEY_SP, // 0D TAB
  29. KEY_CS,KEY_1 , // 0E ~
  30. NO_KEY,NO_KEY, // 0F
  31.  
  32. NO_KEY,NO_KEY, // 10
  33. NO_KEY,NO_KEY, // 11 ALT
  34. KEY_CS,NO_KEY, // 12 LSHIFT
  35. NO_KEY,NO_KEY, // 13
  36. NO_KEY,NO_KEY, // 14 LCTRL
  37. KEY_Q ,NO_KEY, // 15 Q
  38. KEY_1 ,NO_KEY, // 16 1
  39. NO_KEY,NO_KEY, // 17
  40. NO_KEY,NO_KEY, // 18
  41. NO_KEY,NO_KEY, // 19
  42. KEY_Z ,NO_KEY, // 1A Z
  43. KEY_S ,NO_KEY, // 1B S
  44. KEY_A ,NO_KEY, // 1C A
  45. KEY_W ,NO_KEY, // 1D W
  46. KEY_2 ,NO_KEY, // 1E 2
  47. NO_KEY,NO_KEY, // 1F
  48.  
  49. NO_KEY,NO_KEY, // 20
  50. KEY_C ,NO_KEY, // 21 C
  51. KEY_X ,NO_KEY, // 22 X
  52. KEY_D ,NO_KEY, // 23 D
  53. KEY_E ,NO_KEY, // 24 E
  54. KEY_4 ,NO_KEY, // 25 4
  55. KEY_3 ,NO_KEY, // 26 3
  56. NO_KEY,NO_KEY, // 27
  57. NO_KEY,NO_KEY, // 28
  58. KEY_SP,NO_KEY, // 29 SPACE
  59. KEY_V ,NO_KEY, // 2A V
  60. KEY_F ,NO_KEY, // 2B F
  61. KEY_T ,NO_KEY, // 2C T
  62. KEY_R ,NO_KEY, // 2D R
  63. KEY_5 ,NO_KEY, // 2E 5
  64. NO_KEY,NO_KEY, // 2F
  65.  
  66. NO_KEY,NO_KEY, // 30
  67. KEY_N ,NO_KEY, // 31 N
  68. KEY_B ,NO_KEY, // 32 B
  69. KEY_H ,NO_KEY, // 33 H
  70. KEY_G ,NO_KEY, // 34 G
  71. KEY_Y ,NO_KEY, // 35 Y
  72. KEY_6 ,NO_KEY, // 36 6
  73. NO_KEY,NO_KEY, // 37
  74. NO_KEY,NO_KEY, // 38
  75. NO_KEY,NO_KEY, // 39
  76. KEY_M ,NO_KEY, // 3A M
  77. KEY_J ,NO_KEY, // 3B J
  78. KEY_U ,NO_KEY, // 3C U
  79. KEY_7 ,NO_KEY, // 3D 7
  80. KEY_8 ,NO_KEY, // 3E 8
  81. NO_KEY,NO_KEY, // 3F
  82.  
  83. NO_KEY,NO_KEY, // 40
  84. KEY_SS,KEY_N , // 41 ,
  85. KEY_K ,NO_KEY, // 42 K
  86. KEY_I ,NO_KEY, // 43 I
  87. KEY_O ,NO_KEY, // 44 O
  88. KEY_0 ,NO_KEY, // 45 0
  89. KEY_9 ,NO_KEY, // 46 9
  90. NO_KEY,NO_KEY, // 47
  91. NO_KEY,NO_KEY, // 48
  92. KEY_SS,KEY_M , // 49 .
  93. KEY_SS,KEY_C , // 4A /
  94. KEY_L ,NO_KEY, // 4B L
  95. KEY_SS,KEY_Z , // 4C :
  96. KEY_P ,NO_KEY, // 4D P
  97. KEY_SS,KEY_J , // 4E -
  98. NO_KEY,NO_KEY, // 4F
  99.  
  100. NO_KEY,NO_KEY, // 50
  101. NO_KEY,NO_KEY, // 51
  102. KEY_SS,KEY_P , // 52 "
  103. NO_KEY,NO_KEY, // 53
  104. KEY_SS,KEY_8 , // 54 [
  105. KEY_SS,KEY_K , // 55 +
  106. NO_KEY,NO_KEY, // 56
  107. NO_KEY,NO_KEY, // 57
  108. KEY_CS,KEY_2 , // 58 CAPSLOCK
  109. KEY_SS,NO_KEY, // 59 RSHIFT
  110. KEY_EN,NO_KEY, // 5A ENTER
  111. KEY_SS,KEY_9 , // 5B ]
  112. NO_KEY,NO_KEY, // 5C
  113. KEY_SS,KEY_CS, // 5D backslash
  114. NO_KEY,NO_KEY, // 5E
  115. NO_KEY,NO_KEY, // 5F
  116.  
  117. NO_KEY,NO_KEY, // 60
  118. KEY_SS,KEY_CS, // 61 backslash
  119. NO_KEY,NO_KEY, // 62
  120. NO_KEY,NO_KEY, // 63
  121. NO_KEY,NO_KEY, // 64
  122. NO_KEY,NO_KEY, // 65
  123. KEY_CS,KEY_0 , // 66 BACKSPACE
  124. NO_KEY,NO_KEY, // 67
  125. NO_KEY,NO_KEY, // 68
  126. KEY_1 ,NO_KEY, // 69 keypad 1
  127. NO_KEY,NO_KEY, // 6A
  128. KEY_4 ,NO_KEY, // 6B keypad 4
  129. KEY_7 ,NO_KEY, // 6C keypad 7
  130. NO_KEY,NO_KEY, // 6D
  131. NO_KEY,NO_KEY, // 6E
  132. NO_KEY,NO_KEY, // 6F
  133.  
  134. KEY_0 ,NO_KEY, // 70 keypad 0
  135. KEY_SS,KEY_M , // 71 keypad .
  136. KEY_2 ,NO_KEY, // 72 keypad 2
  137. KEY_5 ,NO_KEY, // 73 keypad 5
  138. KEY_6 ,NO_KEY, // 74 keypad 6
  139. KEY_8 ,NO_KEY, // 75 keypad 8
  140. CLRKYS,NO_KEY, // 76 ESC
  141. NO_KEY,NO_KEY, // 77 Num Lock
  142. NO_KEY,NO_KEY, // 78 F11
  143. KEY_SS,KEY_K , // 79 keypad +
  144. KEY_3 ,NO_KEY, // 7A keypad 3
  145. KEY_SS,KEY_J , // 7B keypad -
  146. KEY_SS,KEY_B , // 7C keypad *
  147. KEY_9 ,NO_KEY, // 7D keypad 9
  148. NO_KEY,NO_KEY, // 7E Scroll Lock
  149. NO_KEY,NO_KEY  // 7F F7 !!!Warning real code is 0x83 is (converted to 0x7F)
  150. };
  151.  
  152. const UBYTE default_kbmap_E0[] PROGMEM =
  153. {
  154. NO_KEY,NO_KEY, // 00
  155. NO_KEY,NO_KEY, // 01
  156. NO_KEY,NO_KEY, // 02
  157. NO_KEY,NO_KEY, // 03
  158. NO_KEY,NO_KEY, // 04
  159. NO_KEY,NO_KEY, // 05
  160. NO_KEY,NO_KEY, // 06
  161. NO_KEY,NO_KEY, // 07
  162. NO_KEY,NO_KEY, // 08
  163. NO_KEY,NO_KEY, // 09
  164. NO_KEY,NO_KEY, // 0A
  165. NO_KEY,NO_KEY, // 0B
  166. NO_KEY,NO_KEY, // 0C
  167. NO_KEY,NO_KEY, // 0D
  168. NO_KEY,NO_KEY, // 0E
  169. NO_KEY,NO_KEY, // 0F
  170.  
  171. NO_KEY,NO_KEY, // 10
  172. NO_KEY,NO_KEY, // 11 ALT GR
  173. NO_KEY,NO_KEY, // 12
  174. NO_KEY,NO_KEY, // 13
  175. NO_KEY,NO_KEY, // 14 RCTRL
  176. NO_KEY,NO_KEY, // 15
  177. NO_KEY,NO_KEY, // 16
  178. NO_KEY,NO_KEY, // 17
  179. NO_KEY,NO_KEY, // 18
  180. NO_KEY,NO_KEY, // 19
  181. NO_KEY,NO_KEY, // 1A
  182. NO_KEY,NO_KEY, // 1B
  183. NO_KEY,NO_KEY, // 1C
  184. NO_KEY,NO_KEY, // 1D
  185. NO_KEY,NO_KEY, // 1E
  186. NO_KEY,NO_KEY, // 1F LEFT WINDOWS
  187.  
  188. NO_KEY,NO_KEY, // 20
  189. NO_KEY,NO_KEY, // 21 multimedia Volume -
  190. NO_KEY,NO_KEY, // 22
  191. NO_KEY,NO_KEY, // 23
  192. NO_KEY,NO_KEY, // 24
  193. NO_KEY,NO_KEY, // 25
  194. NO_KEY,NO_KEY, // 26
  195. NO_KEY,NO_KEY, // 27 RIGHT WINDOWS
  196. NO_KEY,NO_KEY, // 28
  197. NO_KEY,NO_KEY, // 29
  198. NO_KEY,NO_KEY, // 2A
  199. NO_KEY,NO_KEY, // 2B
  200. NO_KEY,NO_KEY, // 2C
  201. NO_KEY,NO_KEY, // 2D
  202. NO_KEY,NO_KEY, // 2E
  203. NO_KEY,NO_KEY, // 2F APPLICATION
  204.  
  205. NO_KEY,NO_KEY, // 30
  206. NO_KEY,NO_KEY, // 31
  207. NO_KEY,NO_KEY, // 32 multimedia Volume +
  208. NO_KEY,NO_KEY, // 33
  209. NO_KEY,NO_KEY, // 34 multimedia Play/Pause
  210. NO_KEY,NO_KEY, // 35
  211. NO_KEY,NO_KEY, // 36
  212. NO_KEY,NO_KEY, // 37 POWER
  213. NO_KEY,NO_KEY, // 38
  214. NO_KEY,NO_KEY, // 39
  215. NO_KEY,NO_KEY, // 3A
  216. NO_KEY,NO_KEY, // 3B multimedia Stop
  217. NO_KEY,NO_KEY, // 3C
  218. NO_KEY,NO_KEY, // 3D
  219. NO_KEY,NO_KEY, // 3E
  220. NO_KEY,NO_KEY, // 3F SLEEP
  221.  
  222. NO_KEY,NO_KEY, // 40
  223. NO_KEY,NO_KEY, // 41
  224. NO_KEY,NO_KEY, // 42
  225. NO_KEY,NO_KEY, // 43
  226. NO_KEY,NO_KEY, // 44
  227. NO_KEY,NO_KEY, // 45
  228. NO_KEY,NO_KEY, // 46
  229. NO_KEY,NO_KEY, // 47
  230. NO_KEY,NO_KEY, // 48
  231. NO_KEY,NO_KEY, // 49
  232. KEY_SS,KEY_V , // 4A keypad /
  233. NO_KEY,NO_KEY, // 4B
  234. NO_KEY,NO_KEY, // 4C
  235. NO_KEY,NO_KEY, // 4D
  236. NO_KEY,NO_KEY, // 4E
  237. NO_KEY,NO_KEY, // 4F
  238.  
  239. NO_KEY,NO_KEY, // 50 multimedia Active
  240. NO_KEY,NO_KEY, // 51
  241. NO_KEY,NO_KEY, // 52
  242. NO_KEY,NO_KEY, // 53
  243. NO_KEY,NO_KEY, // 54
  244. NO_KEY,NO_KEY, // 55
  245. NO_KEY,NO_KEY, // 56
  246. NO_KEY,NO_KEY, // 57
  247. NO_KEY,NO_KEY, // 58
  248. NO_KEY,NO_KEY, // 59
  249. KEY_EN,NO_KEY, // 5A keypad ENTER
  250. NO_KEY,NO_KEY, // 5B
  251. NO_KEY,NO_KEY, // 5C
  252. NO_KEY,NO_KEY, // 5D
  253. NO_KEY,NO_KEY, // 5E WAKE
  254. NO_KEY,NO_KEY, // 5F
  255.  
  256. NO_KEY,NO_KEY, // 60
  257. NO_KEY,NO_KEY, // 61
  258. NO_KEY,NO_KEY, // 62
  259. NO_KEY,NO_KEY, // 63
  260. NO_KEY,NO_KEY, // 64
  261. NO_KEY,NO_KEY, // 65
  262. NO_KEY,NO_KEY, // 66
  263. NO_KEY,NO_KEY, // 67
  264. NO_KEY,NO_KEY, // 68
  265. KEY_SS,KEY_E , // 69 END
  266. NO_KEY,NO_KEY, // 6A
  267. KEY_CS,KEY_5 , // 6B LEFT
  268. KEY_SS,KEY_Q , // 6C HOME
  269. NO_KEY,NO_KEY, // 6D
  270. NO_KEY,NO_KEY, // 6E
  271. NO_KEY,NO_KEY, // 6F
  272.  
  273. KEY_SS,KEY_W , // 70 INS
  274. KEY_CS,KEY_9 , // 71 DEL
  275. KEY_CS,KEY_6 , // 72 DOWN
  276. NO_KEY,NO_KEY, // 73
  277. KEY_CS,KEY_8 , // 74 RIGHT
  278. KEY_CS,KEY_7 , // 75 UP
  279. CLRKYS,NO_KEY, // 76 ESC
  280. NO_KEY,NO_KEY, // 77
  281. NO_KEY,NO_KEY, // 78
  282. NO_KEY,NO_KEY, // 79
  283. KEY_CS,KEY_4 , // 7A PGDN
  284. NO_KEY,NO_KEY, // 7B
  285. NO_KEY,NO_KEY, // 7C Print Screen
  286. KEY_CS,KEY_3 , // 7D PGUP
  287. NO_KEY,NO_KEY, // 7E
  288. NO_KEY,NO_KEY  // 7F
  289. };
  290.  
  291. /** User map offset in EEPROM */
  292. #define user_kbmap 0
  293. /** User map (extent E0) offset in EEPROM */
  294. #define user_kbmap_E0 256
  295.  
  296. //for loading user map (pointer to start eeprom)
  297. //const void* saved_kbmap = (void*)0;
  298.  
  299. //pointers to map
  300. //UBYTE* kbmap;
  301. //UBYTE* kbmap_E0;
  302.  
  303. //if want Log than comment next string
  304. #undef LOGENABLE
  305.  
  306. void kbmap_init(void)
  307. {
  308.         //set pointers
  309. //      kbmap = dbuf;
  310. //      kbmap_E0 = dbuf + sizeof(default_kbmap);
  311.  
  312. #ifdef LOGENABLE
  313.         to_log("kbmap_init start\r\n");
  314. #endif
  315.         //wait for eeprom
  316.         eeprom_busy_wait();
  317.  
  318. #ifdef LOGENABLE
  319.         to_log("eeprom OK\r\n");
  320. #endif
  321.  
  322.         //read signature from eeprom
  323. //      eeprom_read_block(dbuf, saved_kbmap, 2);
  324.  
  325.         //check signature
  326.         if ( (eeprom_read_byte((UBYTE*)user_kbmap)=='K') &&
  327.              (eeprom_read_byte((UBYTE*)user_kbmap+1)=='B') )
  328.         {
  329.                 //read from eeprom
  330. //              eeprom_read_block(kbmap, saved_kbmap, sizeof(default_kbmap)+sizeof(default_kbmap_E0));
  331. //              kbmap[0] = NO_KEY ;
  332. //              kbmap[1] = NO_KEY ;
  333.                 flags_ex_register |= FLAG_EX_PS2KEYBOARD_MAP;
  334. #ifdef LOGENABLE
  335.                 to_log("KBMAP:EEPROM\r\n");
  336. #endif
  337.         }
  338.         else
  339.         {
  340.                 //set default
  341. //              memcpy_P(kbmap, default_kbmap, sizeof(default_kbmap));
  342. //              memcpy_P(kbmap_E0, default_kbmap_E0, sizeof(default_kbmap_E0));
  343. #ifdef LOGENABLE
  344.                 to_log("KBMAP:DEFAULT\r\n");
  345. #endif
  346.         }
  347. }
  348.  
  349. KBMAP_VALUE kbmap_get(UBYTE scancode, UBYTE was_E0)
  350. {
  351.         KBMAP_VALUE ret = {{NO_KEY,NO_KEY}};
  352.  
  353.         if( scancode < 0x7F )
  354.         {
  355.                 if( flags_ex_register&FLAG_EX_PS2KEYBOARD_MAP )
  356.                 {
  357.                         //user map
  358.                         if ( scancode )
  359.                         {
  360.                                 //wait for eeprom
  361.                                 eeprom_busy_wait();
  362.  
  363.                                 UWORD tblptr = scancode*2 + ( (was_E0)?user_kbmap_E0:user_kbmap );
  364.                                 ret.tb.b1 = eeprom_read_byte((UBYTE*)tblptr++ );
  365.                                 ret.tb.b2 = eeprom_read_byte((UBYTE*)tblptr );
  366.                         }
  367.                 }
  368.                 else
  369.                 {
  370.                         //default map
  371.                         ULONG tblptr = scancode*2;
  372.                         if( was_E0 )
  373.                         {
  374.                                 tblptr += GET_FAR_ADDRESS(default_kbmap_E0);
  375.                         }
  376.                         else
  377.                         {
  378.                                 tblptr += GET_FAR_ADDRESS(default_kbmap);
  379.                         }
  380.                         ret.tb.b1 = pgm_read_byte_far( tblptr++ );
  381.                         ret.tb.b2 = pgm_read_byte_far( tblptr );
  382.                 }
  383.         }
  384. #ifdef LOGENABLE
  385. {
  386.         char log_map[] = "MP..:..,..\r\n";
  387.         UBYTE b = scancode;
  388.         log_map[2] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  389.         log_map[3] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  390.         b = ret.tb.b1;
  391.         log_map[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  392.         log_map[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  393.         b = ret.tb.b2;
  394.         log_map[8] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10;
  395.         log_map[9] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10;
  396.         to_log(log_map);
  397. }
  398. #endif
  399.         return ret;
  400. }
  401.