Advertisement
Guest User

sugarless_1.1_3.diff

a guest
Aug 20th, 2019
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 206.59 KB | None | 0 0
  1. diff sugarless1.1/config.h sugarless3/config.h
  2. 1,132c1,161
  3. < // Fichero de configuracion del firmware de Sugarless +2
  4. <
  5. < #define membrane13x11 // Desactivado para membranas de 5x8 si se quiere ahorrar tiempo de proceso del avr
  6. <
  7. < #define atmega2560 // Activado para Arduino Mega
  8. < //#define atmega128 // Activado para Atmega128
  9. <
  10. < #define PA 1 //
  11. < #define PB 2 //
  12. < #define PC 3 //
  13. < #define PD 4 //
  14. < #define PE 5 //
  15. < #define PG 7 //
  16. < #define PH 8 //
  17. < #define PL 12 //
  18. <
  19. < #define ROWS8 8       //Numero de Filas de teclado 8x5
  20. < #define COLS5 5       //Numero de Columnas de teclado 8x5
  21. <
  22. < #define ROWS 13       //Numero de Filas de teclado 13x11
  23. < #define COLS 11       //Numero de Columnas de teclado 13x11
  24. <
  25. < // Mapa de la matriz
  26. < // 1x1 = '1', 1x2 = '2'
  27. < // 2x1 = 'Q', 2x2 = 'W'
  28. < // ...
  29. <
  30. < #ifdef atmega128
  31. <
  32. < #define LED_ON                PORTA |= (1<<4)
  33. < #define LED_OFF               PORTA &= ~(1<<4)
  34. < #define LED_CONFIG            DDRA |= (1<<4)
  35. <
  36. < #define KBEXT_BIDIR_ON        PORTF |= (1<<1)
  37. < #define KBEXT_BIDIR_OFF       PORTF &= ~(1<<1)
  38. < #define KBEXT_BIDIR_CONFIG    DDRF |= (1<<1)
  39. <
  40. < #define POWER_ON          PORTA |= (1<<7)
  41. < #define POWER_OFF         PORTA &= ~(1<<7)
  42. < #define POWER_CONFIG      DDRA |= (1<<7)
  43. <
  44. < #define RESET_ON          DDRA |= (1<<5); PORTA &= ~(1<<5) // GND
  45. < #define RESET_OFF         DDRA &= ~(1<<5); PORTA |= (1<<5) // HI-Z
  46. <
  47. < #define SYSTEM_PIN            6
  48. < #define SYSTEM_BCD            PA
  49. <
  50. < #define PS2_DAT               PF3
  51. < #define PS2_CLK               PF2
  52. <
  53. < #define PS2_PORT          PORTF
  54. < #define PS2_DDR               DDRF
  55. < #define PS2_PIN               PINF
  56. <
  57. < //{PC3, PC1, PG1, PD7, PD5, PD3, PD1, PG4, PB7, PB5, PB3};
  58. < uint8_t pinsC[COLS] = { 3,  1,  1,  7,  5,  3,  1,  4,  7,  5,  3 };
  59. < uint8_t bcdC[COLS] = { PC, PC, PG, PD, PD, PD, PD, PG, PB, PB, PB };
  60. <
  61. < //{PB4, PB6, PG3, PD0, PD2, PD4, PD6, PG0, PC0, PC2, PC4, PC6, PC7};
  62. < uint8_t pinsR[ROWS] = { 4,  6,  3,  0,  2,  4,  6,  0,  0,  2,  4,  6,  7 };
  63. < uint8_t bcdR[ROWS] = { PB, PB, PG, PD, PD, PD, PD, PG, PC, PC, PC, PC, PC };
  64. <
  65. < //{PE5(1), PE4(2), PE3(3), PE2(4), PE1(6), PE0(7), PC5(9)};
  66. < uint8_t pinsJOY2PS2[7] = { 5, 4, 3, 2, 1, 0, 5 };
  67. < uint8_t bcdJOY2PS2[7] = { PE, PE, PE, PE, PE, PC};
  68. <
  69. < uint8_t TZX_ROOT_PIN = 2, TZX_ROOT_BCD = PB;
  70. < uint8_t TZX_UP_PIN = 1, TZX_UP_BCD = PB;
  71. < uint8_t TZX_DOWN_PIN = 0, TZX_DOWN_BCD = PB;
  72. < uint8_t TZX_PLAY_PIN = 7, TZX_PLAY_BCD = PE;
  73. < uint8_t TZX_STOP_PIN = 6, TZX_STOP_BCD = PE;
  74. <
  75. < #endif
  76. <
  77. < #ifdef atmega2560
  78. <
  79. < #define LED_ON                PORTL |= (1<<0)
  80. < #define LED_OFF               PORTL &= ~(1<<0)
  81. < #define LED_CONFIG            DDRB |= (1<<7)
  82. <
  83. < #define KBEXT_BIDIR_ON      PORTB |= (1<<3)
  84. < #define KBEXT_BIDIR_OFF     PORTB &= ~(1<<3)
  85. < #define KBEXT_BIDIR_CONFIG  DDRB |= (1<<3)
  86. <
  87. < #define POWER_ON          PORTB |= (1<<2)
  88. < #define POWER_OFF         PORTB &= ~(1<<2)
  89. < #define POWER_CONFIG      DDRB |= (1<<2)
  90. <
  91. < #define RESET_ON          DDRB |= (1<<0); PORTB &= ~(1<<0) // GND
  92. < #define RESET_OFF         DDRB &= ~(1<<0); PORTB |= (1<<0) // HI-Z
  93. <
  94. < #define SYSTEM_PIN            1
  95. < #define SYSTEM_BCD            PB
  96. <
  97. < #define PS2_DAT               PF3
  98. < #define PS2_CLK               PF2
  99. <
  100. < #define PS2_PORT          PORTF
  101. < #define PS2_DDR               DDRF
  102. < #define PS2_PIN               PINF
  103. <
  104. < //{PL7, PG1, PD7, PC1, PC3, PC5, PC7, PA6, PA4, PA2, PA0};
  105. < uint8_t pinsC[COLS] = { 7,  1,  7,  1,  3,  5,  7,  6,  4,  2,  0 };
  106. < uint8_t bcdC[COLS] = { PL, PG, PD, PC, PC, PC, PC, PA, PA, PA, PA };
  107. <
  108. < //{PA1, PA3, PA5, PA7, PC6, PC4, PC2, PC0, PG2, PG0, PL6, PL4, PL2};
  109. < uint8_t pinsR[ROWS] = { 1,  3,  5,  7,  6,  4,  2,  0,  2,  0,  6,  4,  2 };
  110. < uint8_t bcdR[ROWS] = { PA, PA, PA, PA, PC, PC, PC, PC, PG, PG, PL, PL, PL };
  111. <
  112. < //{PH4(1), PH5(2), PH6(3), PB4(4), PB5(6), PB6(7), PL5(9)};
  113. < uint8_t pinsJOY2PS2[7] = { 4, 5, 6, 4, 5, 6, 5 };
  114. < uint8_t bcdJOY2PS2[7] = { PH, PH, PH, PB, PB, PB, PL };
  115. <
  116. < uint8_t TZX_ROOT_PIN = 4, TZX_ROOT_BCD = PE;
  117. < uint8_t TZX_UP_PIN = 5, TZX_UP_BCD = PE;
  118. < uint8_t TZX_DOWN_PIN = 5, TZX_DOWN_BCD = PG;
  119. < uint8_t TZX_PLAY_PIN = 3, TZX_PLAY_BCD = PE;
  120. < uint8_t TZX_STOP_PIN = 3, TZX_STOP_BCD = PH;
  121. <
  122. < #endif
  123. <
  124. < /* --> Futura adaptacion Famicom DB9, requiere adaptador
  125. < #define   FAM_DAT (1<<pinsJOY2PS2[1])
  126. < #define   FAM_LAT (1<<pinsJOY2PS2[2])
  127. < #define   FAM_CLK (1<<pinsJOY2PS2[3])
  128. <
  129. < #define   FAM_DAT_BCD (1<<bcdJOY2PS2[1])
  130. < #define   FAM_LAT_BCD (1<<bcdJOY2PS2[2])
  131. < #define   FAM_CLK_BCD (1<<bcdJOY2PS2[3])
  132. <
  133. < #define FAMDELAY  24 //12
  134. < */
  135. \ No newline at end of file
  136. ---
  137. > // Fichero de configuracion del firmware de Sugarless +2
  138. >
  139. > #define delay_specialkeys 20
  140. > //#define membrane13x11 // Desactivado para membranas de 5x8 si se quiere ahorrar tiempo de proceso del avr
  141. >
  142. > #define atmega2560 // Activado para Arduino Mega
  143. > //#define atmega128 // Activado para Atmega128
  144. >
  145. > #define symbols_cpc
  146. > #define symbols_msx
  147. > #define symbols_c16_c64
  148. > #define symbols_at8
  149. > #define symbols_bbc
  150. > #define symbols_aco
  151. > #define symbols_ap2
  152. > #define symbols_vic
  153. > #define symbols_ori
  154. > #define symbols_sam
  155. > #define symbols_jup
  156. > #define symbols_ht8
  157. > #define symbols_galak
  158. > #define symbols_multi
  159. > #define symbols_pc
  160. > #define PA 1 //
  161. > #define PB 2 //
  162. > #define PC 3 //
  163. > #define PD 4 //
  164. > #define PE 5 //
  165. > #define PG 7 //
  166. > #define PH 8 //
  167. > #define PL 12 //
  168. >
  169. > #define ROWS8 8       //Numero de Filas de teclado 8x5
  170. > #define COLS5 5       //Numero de Columnas de teclado 8x5
  171. >
  172. > #define ROWS 13       //Numero de Filas de teclado 13x11
  173. > #define COLS 11       //Numero de Columnas de teclado 13x11
  174. >
  175. > // Mapa de la matriz
  176. > // 1x1 = '1', 1x2 = '2'
  177. > // 2x1 = 'Q', 2x2 = 'W'
  178. > // ...
  179. >
  180. > #ifdef atmega128
  181. >
  182. > #define LED_ON              PORTA |= (1<<4)
  183. > #define LED_OFF             PORTA &= ~(1<<4)
  184. > #define LED_CONFIG          DDRA |= (1<<4)
  185. >
  186. > #define KBEXT_BIDIR_ON      PORTF |= (1<<1)
  187. > #define KBEXT_BIDIR_OFF     PORTF &= ~(1<<1)
  188. > #define KBEXT_BIDIR_CONFIG  DDRF |= (1<<1)
  189. >
  190. > #define POWER_ON            PORTA |= (1<<7)
  191. > #define POWER_OFF           PORTA &= ~(1<<7)
  192. > #define POWER_CONFIG        DDRA |= (1<<7)
  193. >
  194. > #define RESET_ON            DDRA |= (1<<5); PORTA &= ~(1<<5) // GND
  195. > #define RESET_OFF           DDRA &= ~(1<<5); PORTA |= (1<<5) // HI-Z
  196. >
  197. > #define SYSTEM_PIN          6
  198. > #define SYSTEM_BCD          PA
  199. >
  200. > #define PS2_DAT               PF3
  201. > #define PS2_CLK               PF2
  202. >
  203. > #define PS2_PORT            PORTF
  204. > #define PS2_DDR             DDRF
  205. > #define PS2_PIN             PINF
  206. >
  207. > //{PC3, PC1, PG1, PD7, PD5, PD3, PD1, PG4, PB7, PB5, PB3};
  208. > uint8_t pinsC[COLS] = { 3,  1,  1,  7,  5,  3,  1,  4,  7,  5,  3 };
  209. > uint8_t bcdC[COLS] = { PC, PC, PG, PD, PD, PD, PD, PG, PB, PB, PB };
  210. >
  211. > //{PB4, PB6, PG3, PD0, PD2, PD4, PD6, PG0, PC0, PC2, PC4, PC6, PC7};
  212. > uint8_t pinsR[ROWS] = { 4,  6,  3,  0,  2,  4,  6,  0,  0,  2,  4,  6,  7 };
  213. > uint8_t bcdR[ROWS] = { PB, PB, PG, PD, PD, PD, PD, PG, PC, PC, PC, PC, PC };
  214. >
  215. > //{PE5(1), PE4(2), PE3(3), PE2(4), PE1(6), PE0(7), PC5(9)};
  216. > uint8_t pinsJOY2PS2[7] = { 5, 4, 3, 2, 1, 0, 5 };
  217. > uint8_t bcdJOY2PS2[7] = { PE, PE, PE, PE, PE, PC};
  218. >
  219. > #define FAM_DAT_PIN         PINE
  220. > #define FAM_DAT_DDR         DDRE
  221. > #define FAM_LAT_DDR         DDRE
  222. > #define FAM_CLK_DDR         DDRE
  223. > #define FAM_DAT_PORT        PORTE
  224. > #define FAM_LAT_PORT        PORTE
  225. > #define FAM_CLK_PORT        PORTE
  226. >
  227. > uint8_t TZX_ROOT_PIN = 2, TZX_ROOT_BCD = PB;
  228. > uint8_t TZX_UP_PIN = 1, TZX_UP_BCD = PB;
  229. > uint8_t TZX_DOWN_PIN = 0, TZX_DOWN_BCD = PB;
  230. > uint8_t TZX_PLAY_PIN = 7, TZX_PLAY_BCD = PE;
  231. > uint8_t TZX_STOP_PIN = 6, TZX_STOP_BCD = PE;
  232. >
  233. > #endif
  234. >
  235. > #ifdef atmega2560
  236. >
  237. > #define LED_ON              PORTL |= (1<<0)
  238. > #define LED_OFF             PORTL &= ~(1<<0)
  239. > #define LED_CONFIG          DDRB |= (1<<7)
  240. >
  241. > #define KBEXT_BIDIR_ON      PORTB |= (1<<3)
  242. > #define KBEXT_BIDIR_OFF     PORTB &= ~(1<<3)
  243. > #define KBEXT_BIDIR_CONFIG  DDRB |= (1<<3)
  244. >
  245. > #define POWER_ON            PORTB |= (1<<2)
  246. > #define POWER_OFF           PORTB &= ~(1<<2)
  247. > #define POWER_CONFIG        DDRB |= (1<<2)
  248. >
  249. > #define RESET_ON            DDRB |= (1<<0); PORTB &= ~(1<<0) // GND
  250. > #define RESET_OFF           DDRB &= ~(1<<0); PORTB |= (1<<0) // HI-Z
  251. >
  252. > #define SYSTEM_PIN          1
  253. > #define SYSTEM_BCD          PB
  254. >
  255. > #define PS2_DAT             PF3
  256. > #define PS2_CLK             PF2
  257. >
  258. > #define PS2_PORT            PORTF
  259. > #define PS2_DDR             DDRF
  260. > #define PS2_PIN             PINF
  261. >
  262. > //{PL7, PG1, PD7, PC1, PC3, PC5, PC7, PA6, PA4, PA2, PA0};
  263. > uint8_t pinsC[COLS] = { 7,  1,  7,  1,  3,  5,  7,  6,  4,  2,  0 };
  264. > uint8_t bcdC[COLS] = { PL, PG, PD, PC, PC, PC, PC, PA, PA, PA, PA };
  265. >
  266. > //{PA1, PA3, PA5, PA7, PC6, PC4, PC2, PC0, PG2, PG0, PL6, PL4, PL2};
  267. > uint8_t pinsR[ROWS] = { 1,  3,  5,  7,  6,  4,  2,  0,  2,  0,  6,  4,  2 };
  268. > uint8_t bcdR[ROWS] = { PA, PA, PA, PA, PC, PC, PC, PC, PG, PG, PL, PL, PL };
  269. >
  270. > //{PH4(1), PH5(2), PH6(3), PB4(4), PB5(6), PB6(7), PL5(9)};
  271. > uint8_t pinsJOY2PS2[7] = { 4, 5, 6, 4, 5, 6, 5 };
  272. > uint8_t bcdJOY2PS2[7] = { PH, PH, PH, PB, PB, PB, PL };
  273. >
  274. > #define   FAM_DAT_PIN         PINH
  275. > #define   FAM_DAT_DDR         DDRH
  276. > #define   FAM_LAT_DDR         DDRH
  277. > #define   FAM_CLK_DDR         DDRB
  278. > #define   FAM_DAT_PORT        PORTH
  279. > #define   FAM_LAT_PORT        PORTH
  280. > #define   FAM_CLK_PORT        PORTB
  281. >
  282. > uint8_t TZX_ROOT_PIN = 4, TZX_ROOT_BCD = PE;
  283. > uint8_t TZX_UP_PIN = 5, TZX_UP_BCD = PE;
  284. > uint8_t TZX_DOWN_PIN = 5, TZX_DOWN_BCD = PG;
  285. > uint8_t TZX_PLAY_PIN = 3, TZX_PLAY_BCD = PE;
  286. > uint8_t TZX_STOP_PIN = 3, TZX_STOP_BCD = PH;
  287. >
  288. > #endif
  289. >
  290. > uint8_t opqa_cursors_m = 0; // Solo "1" en teclados de tipo gomas o 48K, "0" para teclados tipo Spectrum+ 128K, +2, +2A, ...
  291. >
  292. > // Famicom DB9 comun
  293. > #define   FAM_DAT (1<<pinsJOY2PS2[1])
  294. > #define   FAM_LAT (1<<pinsJOY2PS2[2])
  295. > #define   FAM_CLK (1<<pinsJOY2PS2[3])
  296. >
  297. > #define FAMDELAY    24
  298. diff sugarless1.1/keymaps.h sugarless3/keymaps.h
  299. 13c13
  300. < const uint8_t version[8] = { 1,4,0,5,2,0,1,8 }; //DDMMAAAA
  301. ---
  302. > const uint8_t version[8] = { 0,7,0,6,2,0,1,9 }; //DDMMAAAA
  303. 63c63
  304. <                                               //
  305. ---
  306. > //
  307. 76c76
  308. <                                               //
  309. ---
  310. > //
  311. 94c94
  312. <                                               //
  313. ---
  314. > //
  315. 115d114
  316. < #define KEY_DELETE 0x71
  317. 122c121,123
  318. <                                               //Especiales, requieren E0
  319. ---
  320. > //Especiales, requieren E0
  321. > #define KEY_INS       0x70
  322. > #define KEY_DELETE  0x71
  323. 124a126
  324. > #define KEY_HOME    0x6C
  325. 134c136,137
  326. <                                               //Fin Especiales
  327. ---
  328. > #define KEY_END     0x69
  329. > //Fin Especiales
  330. 194a198
  331. > #define KEY_BLOQNUM 0x77
  332. 197,198c201,202
  333. < #define KEY_MENOS 0x4E //Drcha del 0
  334. < #define KEY_IGUAL 0x55 //Izda de Backspace
  335. ---
  336. > #define KEY_MENOS   0x4E //Drcha del 0
  337. > #define KEY_IGUAL   0x55 //Izda de Backspace
  338. 209c213
  339. <                                               //SCANCODES SET 1
  340. ---
  341. > //SCANCODES SET 1
  342. 219c223
  343. <                                               //Especiales, requieren E0
  344. ---
  345. > //Especiales, requieren E0
  346. 238c242
  347. <                                               //Fin Especiales
  348. ---
  349. > //Fin Especiales
  350. 298a303
  351. > #define KS1_BLOQNUM 0x45
  352. 301,302c306,307
  353. < #define KS1_MENOS 0x0C //Drcha del 0
  354. < #define KS1_IGUAL 0x0D //Izda de Backspace
  355. ---
  356. > #define KS1_MENOS   0x0C //Drcha del 0
  357. > #define KS1_IGUAL   0x0D //Izda de Backspace
  358. 312a318,347
  359. > #define KS1PAD_MENOS     0x4A // Keypad -
  360. > #define KS1PAD_MAS       0x4E // Keypad +
  361. > #define KS1PAD_ASTERISK  0x37 // Keypad *
  362. >
  363. > #define KS1PAD_0     0x52 // Keypad 0
  364. > #define KS1PAD_1     0x4F // Keypad 1
  365. > #define KS1PAD_2     0x50 // Keypad 2
  366. > #define KS1PAD_3     0x51 // Keypad 3
  367. > #define KS1PAD_4     0x4B // Keypad 4
  368. > #define KS1PAD_5     0x4C // Keypad 5
  369. > #define KS1PAD_6     0x4D // Keypad 6
  370. > #define KS1PAD_7     0x47 // Keypad 7
  371. > #define KS1PAD_8     0x48 // Keypad 8
  372. > #define KS1PAD_9     0x49 // Keypad 9
  373. >
  374. > #define KEYPAD_MENOS     0x7B // Keypad -
  375. > #define KEYPAD_MAS       0x79 // Keypad +
  376. > #define KEYPAD_ASTERISK  0x7C // Keypad *
  377. >
  378. > #define KEYPAD_0         0x70 // Keypad 0
  379. > #define KEYPAD_1         0x69 // Keypad 1
  380. > #define KEYPAD_2         0x72 // Keypad 2
  381. > #define KEYPAD_3         0x7A // Keypad 3
  382. > #define KEYPAD_4         0x6B // Keypad 4
  383. > #define KEYPAD_5         0x73 // Keypad 5
  384. > #define KEYPAD_6         0x74 // Keypad 6
  385. > #define KEYPAD_7         0x6C // Keypad 7
  386. > #define KEYPAD_8         0x75 // Keypad 8
  387. > #define KEYPAD_9         0x7D // Keypad 9
  388. >
  389. 316,322c351,357
  390. < #define MODO_D       pcxt
  391. < #define MODO_E       kbext
  392. < #define MODO_F       -1
  393. < #define MODO_G       -1
  394. < #define MODO_H       -1
  395. < #define MODO_I       -1
  396. < #define MODO_J       -1
  397. ---
  398. > #define MODO_D       sms
  399. > #define MODO_E       c16
  400. > #define MODO_F       ht8
  401. > #define MODO_G       galak
  402. > #define MODO_H       multi
  403. > #define MODO_I       pcxt
  404. > #define MODO_J       kbext
  405. 366a402,403
  406. > const uint8_t joy_atarismd[12] = { KEY_J, KEY_O, KEY_Y, KEY_SPACE, KEY_A, KEY_T, KEY_A, KEY_R, KEY_I, KEY_S, KEY_M, KEY_D };
  407. > const uint8_t joy_famicom[11] = { KEY_J, KEY_O, KEY_Y, KEY_SPACE, KEY_F, KEY_A, KEY_M, KEY_I, KEY_C, KEY_O, KEY_M };
  408. 368c405
  409. < typedef enum { zx, cpc, msx, c64, at8, bbc, aco, ap2, vic, ori, sam, jup, pc, pcxt, kbext } KBMODE;
  410. ---
  411. > typedef enum { zx, cpc, msx, c64, at8, bbc, aco, ap2, vic, ori, sam, jup, sms, c16, ht8, galak, multi, pc, pcxt, kbext } KBMODE;
  412. 372,385c409,422
  413. <   { KEY_1,      KEY_2,      KEY_3,      KEY_4,      KEY_5,            0,          0,          0,          0,             0,             0 },
  414. <   { KEY_Q,      KEY_W,      KEY_E,      KEY_R,      KEY_T,            0,          0,          0,          0,             0,             0 },
  415. <   { KEY_A,      KEY_S,      KEY_D,      KEY_F,      KEY_G,            0,          0,          0,          0,             0,             0 },
  416. <   { KEY_0,      KEY_9,      KEY_8,      KEY_7,      KEY_6,            0,          0,          0,          0,             0,             0 },
  417. <   { KEY_P,      KEY_O,      KEY_I,      KEY_U,      KEY_Y,            0,          0,          0,          0,             0,             0 },
  418. <   { 0,      KEY_Z,      KEY_X,      KEY_C,      KEY_V,            0,          0,          0,          0,             0,             0 },
  419. <   { KEY_ENTER,      KEY_L,      KEY_K,      KEY_J,      KEY_H,            0,          0,          0,          0,             0,             0 },
  420. <   { KEY_SPACE,          0,      KEY_M,      KEY_N,      KEY_B,            0,          0,          0,          0,             0,             0 },
  421. <   // Teclas extendidas +2A/+3
  422. <   { 0,          0,          0,          0,          0,            0,          0,          0,         0,    KEY_COMILLA,   KEY_PTOCOMA },
  423. <   { 0,          0,          0,          0,          0,    KEY_PUNTO,   KEY_COMA,          0,         0,              0,             0 },
  424. <   { 0,          0,          0,          0,          0,       KEY_F3,     KEY_F4,     KEY_F1,  KEY_CAPS,              0,      KEY_LEFT },
  425. <   { 0,          0,          0,          0,          0,    KEY_RIGHT,     KEY_UP, KEY_BACKSP,   KEY_F9,               0,      KEY_DOWN },
  426. <   { 0,          0,          0,          0,          0,            0,          0, KEY_ESCAPE,   KEY_TAB,              0,             0 }
  427. ---
  428. > {      KEY_1,      KEY_2,      KEY_3,      KEY_4,      KEY_5,            0,          0,          0,          0,             0,             0 },
  429. > {      KEY_Q,      KEY_W,      KEY_E,      KEY_R,      KEY_T,            0,          0,          0,          0,             0,             0 },
  430. > {      KEY_A,      KEY_S,      KEY_D,      KEY_F,      KEY_G,            0,          0,          0,          0,             0,             0 },
  431. > {      KEY_0,      KEY_9,      KEY_8,      KEY_7,      KEY_6,            0,          0,          0,          0,             0,             0 },
  432. > {      KEY_P,      KEY_O,      KEY_I,      KEY_U,      KEY_Y,            0,          0,          0,          0,             0,             0 },
  433. > {          0,      KEY_Z,      KEY_X,      KEY_C,      KEY_V,            0,          0,          0,          0,             0,             0 },
  434. > {  KEY_ENTER,      KEY_L,      KEY_K,      KEY_J,      KEY_H,            0,          0,          0,          0,             0,             0 },
  435. > {  KEY_SPACE,          0,      KEY_M,      KEY_N,      KEY_B,            0,          0,          0,          0,             0,             0 },
  436. > // Teclas extendidas +2A/+3
  437. > {          0,          0,          0,          0,          0,            0,          0,          0,         0,    KEY_COMILLA,   KEY_PTOCOMA },
  438. > {          0,          0,          0,          0,          0,    KEY_PUNTO,   KEY_COMA,          0,         0,              0,             0 },
  439. > {          0,          0,          0,          0,          0,       KEY_F3,     KEY_F4,     KEY_F1,  KEY_CAPS,              0,      KEY_LEFT },
  440. > {          0,          0,          0,          0,          0,    KEY_RIGHT,     KEY_UP, KEY_BACKSP,   KEY_F9,               0,      KEY_DOWN },
  441. > {          0,          0,          0,          0,          0,            0,          0, KEY_ESCAPE,   KEY_TAB,              0,             0 }
  442. 389,396c426,433
  443. <   { KEY_1,          KEY_2,          KEY_3,          KEY_4,          KEY_5 },
  444. <   { KEY_Q,          KEY_W,          KEY_E,          KEY_R,          KEY_T },
  445. <   { KEY_A,          KEY_S,          KEY_D,          KEY_F,          KEY_G },
  446. <   { KEY_0,          KEY_9,          KEY_8,          KEY_7,          KEY_6 },
  447. <   { KEY_P,          KEY_O,          KEY_I,          KEY_U,          KEY_Y },
  448. <   { 0,              KEY_Z,          KEY_X,          KEY_C,          KEY_V },
  449. <   { KEY_ENTER,      KEY_L,          KEY_K,          KEY_J,          KEY_H },
  450. <   { KEY_SPACE,      0,              KEY_M,          KEY_N,          KEY_B }
  451. ---
  452. > {      KEY_1,      KEY_2,      KEY_3,      KEY_4,      KEY_5 },
  453. > {      KEY_Q,      KEY_W,      KEY_E,      KEY_R,      KEY_T },
  454. > {      KEY_A,      KEY_S,      KEY_D,      KEY_F,      KEY_G },
  455. > {      KEY_0,      KEY_9,      KEY_8,      KEY_7,      KEY_6 },
  456. > {      KEY_P,      KEY_O,      KEY_I,      KEY_U,      KEY_Y },
  457. > {          0,      KEY_Z,      KEY_X,      KEY_C,      KEY_V },
  458. > {  KEY_ENTER,      KEY_L,      KEY_K,      KEY_J,      KEY_H },
  459. > {  KEY_SPACE,          0,      KEY_M,      KEY_N,      KEY_B }
  460. 400,407c437,444
  461. <   { KEY_F2,     KEY_CAPS,   0,          0,   KEY_LEFT },
  462. <   { 0,          0,          0,          0,          0 },
  463. <   { 0,          0,          0,          0,          0 },
  464. <   { KEY_BACKSP, 0,  KEY_RIGHT,     KEY_UP,   KEY_DOWN },
  465. <   { 0,          0,          0,          0,          0 },
  466. <   { 0,          0,          0,          0,          0 },
  467. <   { KEY_TAB,    0,          0,          0,          0 },
  468. <   { KEY_ESCAPE, 0,          0,          0,          0 }
  469. ---
  470. > {     KEY_F2,   KEY_CAPS,          0,          0,   KEY_LEFT },
  471. > {          0,          0,          0,          0,          0 },
  472. > {          0,          0,          0,          0,          0 },
  473. > { KEY_BACKSP,          0,  KEY_RIGHT,     KEY_UP,   KEY_DOWN },
  474. > {          0,          0,          0,          0,          0 },
  475. > {          0,          0,          0,          0,          0 },
  476. > {    KEY_TAB,          0,          0,          0,          0 },
  477. > { KEY_ESCAPE,          0,          0,          0,          0 }
  478. 410,417c447,454
  479. <   { KS1_1,          KS1_2,          KS1_3,          KS1_4,          KS1_5 },
  480. <   { KS1_Q,          KS1_W,          KS1_E,          KS1_R,          KS1_T },
  481. <   { KS1_A,          KS1_S,          KS1_D,          KS1_F,          KS1_G },
  482. <   { KS1_0,          KS1_9,          KS1_8,          KS1_7,          KS1_6 },
  483. <   { KS1_P,          KS1_O,          KS1_I,          KS1_U,          KS1_Y },
  484. <   { 0,              KS1_Z,          KS1_X,          KS1_C,          KS1_V },
  485. <   { KS1_ENTER,      KS1_L,          KS1_K,          KS1_J,          KS1_H },
  486. <   { KS1_SPACE,      0,              KS1_M,          KS1_N,          KS1_B }
  487. ---
  488. > {      KS1_1,      KS1_2,      KS1_3,      KS1_4,      KS1_5 },
  489. > {      KS1_Q,      KS1_W,      KS1_E,      KS1_R,      KS1_T },
  490. > {      KS1_A,      KS1_S,      KS1_D,      KS1_F,      KS1_G },
  491. > {      KS1_0,      KS1_9,      KS1_8,      KS1_7,      KS1_6 },
  492. > {      KS1_P,      KS1_O,      KS1_I,      KS1_U,      KS1_Y },
  493. > {          0,      KS1_Z,      KS1_X,      KS1_C,      KS1_V },
  494. > {  KS1_ENTER,      KS1_L,      KS1_K,      KS1_J,      KS1_H },
  495. > {  KS1_SPACE,          0,      KS1_M,      KS1_N,      KS1_B }
  496. 420,427c457,464
  497. <   { KS1_F2,     KS1_CAPS,          0,       0,   KS1_LEFT },
  498. <   { 0,                 0,          0,       0,          0 },
  499. <   { 0,                 0,          0,       0,          0 },
  500. <   { KS1_BACKSP,        0,  KS1_RIGHT,       0,   KS1_DOWN },
  501. <   { 0,                 0,          0,       0,          0 },
  502. <   { 0,                 0,          0,       0,          0 },
  503. <   { KS1_TAB,           0,          0,       0,          0 },
  504. <   { KS1_ESCAPE,        0,          0,       0,          0 }
  505. ---
  506. > {     KS1_F2,   KS1_CAPS,          0,          0,   KS1_LEFT },
  507. > {          0,          0,          0,          0,          0 },
  508. > {          0,          0,          0,          0,          0 },
  509. > { KS1_BACKSP,          0,  KS1_RIGHT,     KS1_UP,   KS1_DOWN },
  510. > {          0,          0,          0,          0,          0 },
  511. > {          0,          0,          0,          0,          0 },
  512. > {    KS1_TAB,          0,          0,          0,          0 },
  513. > { KS1_ESCAPE,          0,          0,          0,          0 }
  514. 428a466
  515. >
  516. 430,437c468,475
  517. <   { KS1_1,              KS1_2,          KS1_3,          KS1_4,         KS1_5 },
  518. <   { 0,                      0,              0,       KS1_COMA,     KS1_PUNTO },
  519. <   { KS1_TLD,      KS1_BKSLASH,    KS1_BKSLASH,    KS1_ACORCHE,   KS1_CCORCHE },
  520. <   { KS1_MENOS,          KS1_0,          KS1_9,    KS1_COMILLA,         KS1_7 },
  521. <   { KS1_COMILLA,  KS1_CCORCHE,              0,    KS1_CCORCHE,   KS1_ACORCHE },
  522. <   { 0,            KS1_PTOCOMA,              0,      KS1_SLASH,     KS1_SLASH },
  523. <   { 0,              KS1_IGUAL,      KS1_IGUAL,      KS1_MENOS,         KS1_6 },
  524. <   { 0,                      0,      KS1_PUNTO,       KS1_COMA,         KS1_8 }
  525. ---
  526. > {      KS1_1,      KS1_2,      KS1_3,      KS1_4,      KS1_5 },
  527. > {    KS1_TLD,    KS1_TLD,  KS1_IGUAL,   KS1_LESS,   KS1_LESS },
  528. > {        126,      KS1_1,    KS1_TLD,KS1_COMILLA,KS1_BKSLASH },
  529. > {  KS1_SLASH,      KS1_9,      KS1_8,  KS1_MENOS,      KS1_6 },
  530. > {      KS1_2,   KS1_COMA,  KS1_IGUAL,KS1_CCORCHE,KS1_ACORCHE },
  531. > {          0,  KS1_PUNTO,        156,  KS1_MENOS,      KS1_7 },
  532. > {          0,      KS1_0,KS1_CCORCHE,  KS1_SLASH,KS1_ACORCHE },
  533. > {          0,          0,  KS1_PUNTO,   KS1_COMA,KS1_CCORCHE }
  534. 440,447c478,485
  535. <   { 1,              1,              1,              1,              1 },
  536. <   { 0,              0,              0,              1,              1 },
  537. <   { 1,              1,              0,              1,              1 },
  538. <   { 1,              1,              1,              0,              1 },
  539. <   { 1,              0,              0,              0,              0 },
  540. <   { 0,              1,              0,              1,              0 },
  541. <   { 0,              0,              1,              0,              1 },
  542. <   { 0,              0,              0,              0,              1 }
  543. ---
  544. > {          1,          8,          8,          1,          1 },
  545. > {          0,          1,          0,          0,          1 },
  546. > {       0x40,          8,          8,          8,          8 },
  547. > {          1,          1,          1,          0,          1 },
  548. > {          1,          1,          1,          8,          8 },
  549. > {          0,          1,       0x40,          1,          1 },
  550. > {          0,          1,          0,          0,          1 },
  551. > {          0,          0,          0,          0,          1 }
  552. 448a487
  553. >
  554. 450,457c489,496
  555. <   { MODO_1,          MODO_2,          MODO_3,          MODO_4,          MODO_5 },
  556. <   { MODO_Q,          MODO_W,          MODO_E,          MODO_R,          MODO_T },
  557. <   { MODO_A,          MODO_S,          MODO_D,          MODO_F,          MODO_G },
  558. <   { MODO_0,          MODO_9,          MODO_8,          MODO_7,          MODO_6 },
  559. <   { MODO_P,          MODO_O,          MODO_I,          MODO_U,          MODO_Y },
  560. <   { MODO_SS,         MODO_Z,          MODO_X,          MODO_C,          MODO_V },
  561. <   { MODO_ENTER,      MODO_L,          MODO_K,          MODO_J,          MODO_H },
  562. <   { MODO_SPACE,      MODO_CS,         MODO_M,          MODO_N,          MODO_B }
  563. ---
  564. > {     MODO_1,     MODO_2,     MODO_3,     MODO_4,     MODO_5 },
  565. > {     MODO_Q,     MODO_W,     MODO_E,     MODO_R,     MODO_T },
  566. > {     MODO_A,     MODO_S,     MODO_D,     MODO_F,     MODO_G },
  567. > {     MODO_0,     MODO_9,     MODO_8,     MODO_7,     MODO_6 },
  568. > {     MODO_P,     MODO_O,     MODO_I,     MODO_U,     MODO_Y },
  569. > {    MODO_SS,     MODO_Z,     MODO_X,     MODO_C,     MODO_V },
  570. > { MODO_ENTER,     MODO_L,     MODO_K,     MODO_J,     MODO_H },
  571. > { MODO_SPACE,    MODO_CS,     MODO_M,     MODO_N,     MODO_B }
  572. 463,474c502,518
  573. < const uint8_t nomCPC[] = { 3,KEY_C,KEY_P,KEY_C,4 };
  574. < const uint8_t nomMSX[] = { 3,KEY_M,KEY_S,KEY_X,4 };
  575. < const uint8_t nomC64[] = { 3,KEY_C,KEY_6,KEY_4,4 };
  576. < const uint8_t nomAT8[] = { 5,KEY_A,KEY_T,KEY_A,KEY_R,KEY_I,4 };
  577. < const uint8_t nomBBC[] = { 3,KEY_B,KEY_B,KEY_C,4 };
  578. < const uint8_t nomACO[] = { 5,KEY_A,KEY_C,KEY_O,KEY_R,KEY_N,4 };
  579. < const uint8_t nomVIC[] = { 3,KEY_V,KEY_I,KEY_C,4 };
  580. < const uint8_t nomORI[] = { 4,KEY_O,KEY_R,KEY_I,KEY_C,4 };
  581. < const uint8_t nomSAM[] = { 3,KEY_S,KEY_A,KEY_M,4 };
  582. < const uint8_t nomJUP[] = { 7,KEY_J,KEY_U,KEY_P,KEY_I,KEY_T,KEY_E,KEY_R,4 };
  583. < const uint8_t nomAP2[] = { 5,KEY_A,KEY_P,KEY_P,KEY_L,KEY_E,4 };
  584. < const uint8_t nomPC[] = { 2,KEY_P,KEY_C,4 };
  585. ---
  586. > const uint8_t nomCPC[] = { 3,KEY_C,KEY_P,KEY_C,4};
  587. > const uint8_t nomMSX[] = { 3,KEY_M,KEY_S,KEY_X,4};
  588. > const uint8_t nomC64[] = { 3,KEY_C,KEY_6,KEY_4,4};
  589. > const uint8_t nomC16[] = { 3,KEY_C,KEY_1,KEY_6,4 };
  590. > const uint8_t nomHT8[] = { 5,KEY_T,KEY_R,KEY_S, KEY_8, KEY_0,6 };
  591. > const uint8_t nomAT8[] = { 5,KEY_A,KEY_T,KEY_A,KEY_R,KEY_I,4};
  592. > const uint8_t nomBBC[] = { 3,KEY_B,KEY_B,KEY_C,4};
  593. > const uint8_t nomACO[] = { 5,KEY_A,KEY_C,KEY_O,KEY_R,KEY_N,4};
  594. > const uint8_t nomVIC[] = { 3,KEY_V,KEY_I,KEY_C,4};
  595. > const uint8_t nomORI[] = { 4,KEY_O,KEY_R,KEY_I,KEY_C,4};
  596. > const uint8_t nomSAM[] = { 3,KEY_S,KEY_A,KEY_M,4};
  597. > const uint8_t nomJUP[] = { 7,KEY_J,KEY_U,KEY_P,KEY_I,KEY_T,KEY_E,KEY_R,4};
  598. > const uint8_t nomAP2[] = { 5,KEY_A,KEY_P,KEY_P,KEY_L,KEY_E,4};
  599. > const uint8_t nomPC[] = { 4,KEY_P,KEY_C,KEY_X,KEY_T,4};
  600. > const uint8_t nomSMS[] = { 3,KEY_S,KEY_M,KEY_S,4 };
  601. > const uint8_t nomGALAK[] = { 9,KEY_G,KEY_A,KEY_L,KEY_A,KEY_K,KEY_S,KEY_I,KEY_J,KEY_A,4 };
  602. > const uint8_t nomMULTI[] = { 9,KEY_M,KEY_U,KEY_L,KEY_T,KEY_I,KEY_C,KEY_O,KEY_M,KEY_P,4 };
  603. 479,490c523,534
  604. <   uint8_t     up;             // 0
  605. <   uint8_t     down;           // 1
  606. <   uint8_t     left;           // 2
  607. <   uint8_t     right;          // 3
  608. <   uint8_t     select;         // 4
  609. <   uint8_t     start;          // 5
  610. <   uint8_t     button1;        // 6
  611. <   uint8_t     button2;        // 7
  612. <   uint8_t     button3;        // 8
  613. <   uint8_t     button4;        // 9
  614. <   uint8_t     button5;        // 10
  615. <   uint8_t     button6;        // 11
  616. ---
  617. >     uint8_t     up;             // 0
  618. >     uint8_t     down;           // 1
  619. >     uint8_t     left;           // 2
  620. >     uint8_t     right;          // 3
  621. >     uint8_t     select;         // 4
  622. >     uint8_t     start;          // 5
  623. >     uint8_t     button1;        // 6
  624. >     uint8_t     button2;        // 7
  625. >     uint8_t     button3;        // 8
  626. >     uint8_t     button4;        // 9
  627. >     uint8_t     button5;        // 10
  628. >     uint8_t     button6;        // 11
  629. 494,506d537
  630. <
  631. <   JOY_Q,          // UP
  632. <   JOY_A,          // DOWN
  633. <   JOY_O,          // LEFT
  634. <   JOY_P,          // RIGHT
  635. <   JOY_5,          // SELECT
  636. <   JOY_1,          // START
  637. <   JOY_SPACE,      // BUTTON 1
  638. <   JOY_X,          // BUTTON 2
  639. <   JOY_M,          // BUTTON 3
  640. <   JOY_D,          // BUTTON 4
  641. <   JOY_F,          // BUTTON 5
  642. <   JOY_C           // BUTTON 6
  643. 507a539,550
  644. >     JOY_Q,                      // UP
  645. >     JOY_A,                      // DOWN
  646. >     JOY_O,                      // LEFT
  647. >     JOY_P,                      // RIGHT
  648. >     JOY_5,                      // SELECT
  649. >     JOY_1,                      // START
  650. >     JOY_SPACE,                  // BUTTON 1
  651. >     JOY_X,                      // BUTTON 2
  652. >     JOY_M,                      // BUTTON 3
  653. >     JOY_D,                      // BUTTON 4
  654. >     JOY_F,                      // BUTTON 5
  655. >     JOY_C                       // BUTTON 6
  656. diff sugarless1.1/sugarless.ino sugarless3/sugarless.ino
  657. 8a9
  658. > Gracias a @desUBIkado por hacer de Betatester y proporcionar nuevas ideas para la última versión de ZXUnoPS2.
  659. 9a11
  660. >
  661. 19a22,23
  662. > #define uchar unsigned char
  663. >
  664. 36a41
  665. > uint8_t opqa_numbers = 0;
  666. 53c58
  667. < //uint8_t modo=0; //Modo teclado 0=ZX NATIVO / 1=CPC MAPEADO /2=MSX MAPEADO
  668. ---
  669. >
  670. 55a61
  671. > uint8_t funcion = 0;
  672. 59,66c65,72
  673. < unsigned char hostdata = 0;
  674. < unsigned char hostdataAnt;
  675. < unsigned char codeset = 2;
  676. < unsigned char antighosting = 0;
  677. < unsigned char kbescucha = 0;
  678. < uint32_t      timeout_escucha = 0;
  679. < uint16_t      typematic = 0;
  680. < uint16_t      typematicfirst = 0;
  681. ---
  682. > unsigned char hostdata = 0;
  683. > unsigned char hostdataAnt;
  684. > unsigned char codeset = 2;
  685. > unsigned char antighosting = 0;
  686. > unsigned char kbescucha = 0;
  687. > uint32_t timeout_escucha = 0;
  688. > uint16_t typematic = 0;
  689. > uint16_t typematicfirst = 0;
  690. 68,69c74,77
  691. < uint8_t       typematic_codeaux = 0;
  692. < uint8_t       kbalt = 0;
  693. ---
  694. > uint8_t typematic_codeaux = 0;
  695. > uint8_t kbcontrol = 0, kbalt = 0, kbshift = 0, kblwin = 0, kbaltgr = 0;
  696. > uint8_t prevf0 = 0;
  697. > uint8_t famicom = 0;
  698. 72c80
  699. < unsigned char CAPS_SHIFT = KEY_LSHIFT;  //Caps Shift   (NO necesita E0)
  700. ---
  701. > unsigned char CAPS_SHIFT = KEY_LSHIFT; //Caps Shift   (NO necesita E0)
  702. 75c83
  703. <                                       //Caps Shift (CAPS_SHIFT)
  704. ---
  705. > //Caps Shift (CAPS_SHIFT)
  706. 79c87
  707. <                                       //Symbol Shift (SYMBOL_SHIFT)
  708. ---
  709. > //Symbol Shift (SYMBOL_SHIFT)
  710. 83c91
  711. <                                       //SPACE (Escape)
  712. ---
  713. > //SPACE (Escape)
  714. 87c95
  715. <                                       //ENTER
  716. ---
  717. > //ENTER
  718. 91c99
  719. <                                       //Row 1..5
  720. ---
  721. > //Row 1..5
  722. 93c101
  723. <                                       //Cols 1..5
  724. ---
  725. > //Cols 1..5
  726. 100c108
  727. <                                       //Row 6..0
  728. ---
  729. > //Row 6..0
  730. 102c110
  731. <                                       //Cols 6..0
  732. ---
  733. > //Cols 6..0
  734. 109c117
  735. <                                       //Row Q-T
  736. ---
  737. > //Row Q-T
  738. 111c119
  739. <                                       //Cols Q-T
  740. ---
  741. > //Cols Q-T
  742. 118c126
  743. <                                       //Row Y-P
  744. ---
  745. > //Row Y-P
  746. 120c128
  747. <                                       //Cols Y-P
  748. ---
  749. > //Cols Y-P
  750. 127c135
  751. <                                       //Row A-G
  752. ---
  753. > //Row A-G
  754. 129c137
  755. <                                       //Cols A-G
  756. ---
  757. > //Cols A-G
  758. 136c144
  759. <                                       //Row H-L
  760. ---
  761. > //Row H-L
  762. 138c146
  763. <                                       //Cols H-L
  764. ---
  765. > //Cols H-L
  766. 144c152
  767. <                                       //Row Z-V
  768. ---
  769. > //Row Z-V
  770. 146c154
  771. <                                       //Cols Z-V
  772. ---
  773. > //Cols Z-V
  774. 152c160
  775. <                                       //Row B-M
  776. ---
  777. > //Row B-M
  778. 154c162
  779. <                                       //Cols B-M
  780. ---
  781. > //Cols B-M
  782. 160,161c168,172
  783. < static    report_t        p1, p1prev;
  784. < static  uint8_t           p1selectnesclon, p1startnesclon;
  785. ---
  786. > static    report_t p1, p1prev;
  787. > static  uint8_t p1selectnesclon, p1startnesclon;
  788. >
  789. > void sendPS2(unsigned char code);
  790. > void pulsa_y_suelta_teclas_modificadoras(uint8_t control, uint8_t alt, uint8_t shift, uint8_t altgr, uint8_t lwin);
  791. 165,171c176,182
  792. <   switch (bcd) {
  793. <   case PA:  if (stat) DDRA &= ~_BV(pin); else DDRA |= _BV(pin); break;
  794. <   case PB:  if (stat) DDRB &= ~_BV(pin); else DDRB |= _BV(pin); break;
  795. <   case PC:  if (stat) DDRC &= ~_BV(pin); else DDRC |= _BV(pin); break;
  796. <   case PD:  if (stat) DDRD &= ~_BV(pin); else DDRD |= _BV(pin); break;
  797. <   case PE:  if (stat) DDRE &= ~_BV(pin); else DDRE |= _BV(pin); break;
  798. <   case PG:  if (stat) DDRG &= ~_BV(pin); else DDRG |= _BV(pin); break;
  799. ---
  800. >     switch (bcd) {
  801. >         case PA:  if (stat) DDRA &= ~_BV(pin); else DDRA |= _BV(pin); break;
  802. >         case PB:  if (stat) DDRB &= ~_BV(pin); else DDRB |= _BV(pin); break;
  803. >         case PC:  if (stat) DDRC &= ~_BV(pin); else DDRC |= _BV(pin); break;
  804. >         case PD:  if (stat) DDRD &= ~_BV(pin); else DDRD |= _BV(pin); break;
  805. >         case PE:  if (stat) DDRE &= ~_BV(pin); else DDRE |= _BV(pin); break;
  806. >         case PG:  if (stat) DDRG &= ~_BV(pin); else DDRG |= _BV(pin); break;
  807. 173,174c184,185
  808. <   case PH:  if (stat) DDRH &= ~_BV(pin); else DDRH |= _BV(pin); break;
  809. <   case PL:  if (stat) DDRL &= ~_BV(pin); else DDRL |= _BV(pin); break;
  810. ---
  811. >         case PH:  if (stat) DDRH &= ~_BV(pin); else DDRH |= _BV(pin); break;
  812. >         case PL:  if (stat) DDRL &= ~_BV(pin); else DDRL |= _BV(pin); break;
  813. 176c187
  814. <   }
  815. ---
  816. >     }
  817. 181,187c192,198
  818. <   switch (bcd) {
  819. <   case PA:  if (!(PINA & (1 << pin))) return 1; else return 0; break;
  820. <   case PB:  if (!(PINB & (1 << pin))) return 1; else return 0; break;
  821. <   case PC:  if (!(PINC & (1 << pin))) return 1; else return 0; break;
  822. <   case PD:  if (!(PIND & (1 << pin))) return 1; else return 0; break;
  823. <   case PE:  if (!(PINE & (1 << pin))) return 1; else return 0; break;
  824. <   case PG:  if (!(PING & (1 << pin))) return 1; else return 0; break;
  825. ---
  826. >     switch (bcd) {
  827. >         case PA:  if (!(PINA & (1 << pin))) return 1; else return 0; break;
  828. >         case PB:  if (!(PINB & (1 << pin))) return 1; else return 0; break;
  829. >         case PC:  if (!(PINC & (1 << pin))) return 1; else return 0; break;
  830. >         case PD:  if (!(PIND & (1 << pin))) return 1; else return 0; break;
  831. >         case PE:  if (!(PINE & (1 << pin))) return 1; else return 0; break;
  832. >         case PG:  if (!(PING & (1 << pin))) return 1; else return 0; break;
  833. 189,190c200,201
  834. <   case PH:  if (!(PINH & (1 << pin))) return 1; else return 0; break;
  835. <   case PL:  if (!(PINL & (1 << pin))) return 1; else return 0; break;
  836. ---
  837. >         case PH:  if (!(PINH & (1 << pin))) return 1; else return 0; break;
  838. >         case PL:  if (!(PINL & (1 << pin))) return 1; else return 0; break;
  839. 192,193c203,204
  840. <   }
  841. <   return 0;
  842. ---
  843. >     }
  844. >     return 0;
  845. 198,206c209,216
  846. <   switch (bcd) {
  847. <
  848. <   case PA:  if (!stat) PORTA &= ~_BV(pin); else PORTA |= _BV(pin); break;
  849. <   case PB:  if (!stat) PORTB &= ~_BV(pin); else PORTB |= _BV(pin); break;
  850. <   case PC:  if (!stat) PORTC &= ~_BV(pin); else PORTC |= _BV(pin); break;
  851. <   case PD:  if (!stat) PORTD &= ~_BV(pin); else PORTD |= _BV(pin); break;
  852. <   case PE:  if (!stat) PORTE &= ~_BV(pin); else PORTE |= _BV(pin); break;
  853. <   case PG:  if (!stat) PORTG &= ~_BV(pin); else PORTG |= _BV(pin); break;
  854. <
  855. ---
  856. >     switch (bcd) {
  857. >         case PA:  if (!stat) PORTA &= ~_BV(pin); else PORTA |= _BV(pin); break;
  858. >         case PB:  if (!stat) PORTB &= ~_BV(pin); else PORTB |= _BV(pin); break;
  859. >         case PC:  if (!stat) PORTC &= ~_BV(pin); else PORTC |= _BV(pin); break;
  860. >         case PD:  if (!stat) PORTD &= ~_BV(pin); else PORTD |= _BV(pin); break;
  861. >         case PE:  if (!stat) PORTE &= ~_BV(pin); else PORTE |= _BV(pin); break;
  862. >         case PG:  if (!stat) PORTG &= ~_BV(pin); else PORTG |= _BV(pin); break;
  863. >
  864. 208,209c218,219
  865. <   case PH:  if (!stat) PORTH &= ~_BV(pin); else PORTH |= _BV(pin); break;
  866. <   case PL:  if (!stat) PORTL &= ~_BV(pin); else PORTL |= _BV(pin); break;
  867. ---
  868. >         case PH:  if (!stat) PORTH &= ~_BV(pin); else PORTH |= _BV(pin); break;
  869. >         case PL:  if (!stat) PORTL &= ~_BV(pin); else PORTL |= _BV(pin); break;
  870. 211c221
  871. <   }
  872. ---
  873. >     }
  874. 216,217c226,227
  875. <   if (mode) PS2_DDR &= ~_BV(pin); //Hi-Entrada
  876. <   else     PS2_DDR |= _BV(pin);  //Low-Salilda
  877. ---
  878. >     if (mode) PS2_DDR &= ~_BV(pin); //Hi-Entrada
  879. >     else      PS2_DDR |= _BV(pin);  //Low-Salilda
  880. 223,257c233,267
  881. <   if (p1.up & p1.down)
  882. <   {
  883. <       p1.select = 1;
  884. <       p1selectnesclon = 1;
  885. <       p1.up = 0;
  886. <       p1.down = 0;
  887. <   }
  888. <   else
  889. <   {
  890. <       if (p1selectnesclon)
  891. <       {
  892. <           p1.select = 0;
  893. <           p1selectnesclon = 0;
  894. <       }
  895. <       p1.up = p1.up & !p1prev.select;
  896. <       p1.down = p1.down & !p1prev.select;
  897. <   }
  898. <
  899. <   if (p1.left & p1.right)
  900. <   {
  901. <       p1.start = 1;
  902. <       p1startnesclon = 1;
  903. <       p1.left = 0;
  904. <       p1.right = 0;
  905. <   }
  906. <   else
  907. <   {
  908. <       if (p1startnesclon)
  909. <       {
  910. <           p1.start = 0;
  911. <           p1startnesclon = 0;
  912. <       }
  913. <       p1.left = p1.left & !p1prev.start;
  914. <       p1.right = p1.right & !p1prev.start;
  915. <   }
  916. ---
  917. >     if (p1.up & p1.down)
  918. >     {
  919. >         p1.select = 1;
  920. >         p1selectnesclon = 1;
  921. >         p1.up = 0;
  922. >         p1.down = 0;
  923. >     }
  924. >     else
  925. >     {
  926. >         if (p1selectnesclon)
  927. >         {
  928. >             p1.select = 0;
  929. >             p1selectnesclon = 0;
  930. >         }
  931. >         p1.up = p1.up & !p1prev.select;
  932. >         p1.down = p1.down & !p1prev.select;
  933. >     }
  934. >
  935. >     if (p1.left & p1.right)
  936. >     {
  937. >         p1.start = 1;
  938. >         p1startnesclon = 1;
  939. >         p1.left = 0;
  940. >         p1.right = 0;
  941. >     }
  942. >     else
  943. >     {
  944. >         if (p1startnesclon)
  945. >         {
  946. >             p1.start = 0;
  947. >             p1startnesclon = 0;
  948. >         }
  949. >         p1.left = p1.left & !p1prev.start;
  950. >         p1.right = p1.right & !p1prev.start;
  951. >     }
  952. 262,321c272,331
  953. <   // Get D-PAD, B, C buttons state
  954. <   pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  955. <   _delay_us(14);
  956. <
  957. <   p1.up = pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]); // Up
  958. <   p1.down = pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]);  // Down
  959. <   p1.left = pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]);  // Left
  960. <   p1.right = pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]); // Right
  961. <
  962. <   pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);
  963. <   _delay_us(14);
  964. <   if (pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]) & pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]))    // if L/R low then Megadrive pad detected
  965. <   {
  966. <
  967. <       p1.button1 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]);    // Button A
  968. <       p1.start = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]);      // Start
  969. <
  970. <       pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  971. <       _delay_us(14);
  972. <       p1.button2 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]);    // Button B
  973. <       p1.button3 = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]);    // Button C
  974. <       pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);
  975. <       _delay_us(14);
  976. <
  977. <       pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);              // select high
  978. <       _delay_us(14);
  979. <       pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);              // select low
  980. <       _delay_us(14);
  981. <
  982. <       // U/D/L/R are low if six button controller
  983. <       if (pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]) & pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]) &
  984. <           pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]) & pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]))
  985. <       {
  986. <           pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);          // select high
  987. <           _delay_us(14);
  988. <
  989. <           p1.button6 = pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]);    // Button Z
  990. <           p1.button5 = pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]);    // Button Y
  991. <           p1.button4 = pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]);    // Button X
  992. <           p1.select = pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]); // Select (Mode)
  993. <
  994. <           pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);              // select low
  995. <           _delay_us(14);
  996. <           pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);              // select high
  997. <           _delay_us(14);
  998. <           pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);              // select low
  999. <
  1000. <       }
  1001. <
  1002. <       // Delay needed for settling joystick down
  1003. <       _delay_us(2000);
  1004. <
  1005. <   }
  1006. <   else
  1007. <   {
  1008. <       p1.button1 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]);    // Button A
  1009. <       p1.button2 = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]);    // Button B
  1010. <   }
  1011. <   pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  1012. <   _delay_us(14);
  1013. ---
  1014. >     // Get D-PAD, B, C buttons state
  1015. >     pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  1016. >     _delay_us(14);
  1017. >
  1018. >     p1.up = pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]);      // Up
  1019. >     p1.down = pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]);  // Down
  1020. >     p1.left = pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]);  // Left
  1021. >     p1.right = pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]); // Right
  1022. >
  1023. >     pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);
  1024. >     _delay_us(14);
  1025. >     if (pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]) & pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]))  // if L/R low then Megadrive pad detected
  1026. >     {
  1027. >
  1028. >         p1.button1 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]); // Button A
  1029. >         p1.start = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]);   // Start
  1030. >
  1031. >         pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  1032. >         _delay_us(14);
  1033. >         p1.button2 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]); // Button B
  1034. >         p1.button3 = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]); // Button C
  1035. >         pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);
  1036. >         _delay_us(14);
  1037. >
  1038. >         pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);           // select high
  1039. >         _delay_us(14);
  1040. >         pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);           // select low
  1041. >         _delay_us(14);
  1042. >
  1043. >         // U/D/L/R are low if six button controller
  1044. >         if (pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]) & pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]) &
  1045. >             pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]) & pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]))
  1046. >         {
  1047. >             pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);              // select high
  1048. >             _delay_us(14);
  1049. >
  1050. >             p1.button6 = pinStat(pinsJOY2PS2[0], bcdJOY2PS2[0]);    // Button Z
  1051. >             p1.button5 = pinStat(pinsJOY2PS2[1], bcdJOY2PS2[1]);    // Button Y
  1052. >             p1.button4 = pinStat(pinsJOY2PS2[2], bcdJOY2PS2[2]);    // Button X
  1053. >             p1.select = pinStat(pinsJOY2PS2[3], bcdJOY2PS2[3]);     // Select (Mode)
  1054. >
  1055. >             pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);              // select low
  1056. >             _delay_us(14);
  1057. >             pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);              // select high
  1058. >             _delay_us(14);
  1059. >             pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], LO);              // select low
  1060. >
  1061. >         }
  1062. >
  1063. >         // Delay needed for settling joystick down
  1064. >         _delay_us(2000);
  1065. >
  1066. >     }
  1067. >     else
  1068. >     {
  1069. >         p1.button1 = pinStat(pinsJOY2PS2[4], bcdJOY2PS2[4]);        // Button A
  1070. >         p1.button2 = pinStat(pinsJOY2PS2[6], bcdJOY2PS2[6]);        // Button B
  1071. >     }
  1072. >     pinPut(pinsJOY2PS2[5], bcdJOY2PS2[5], HI);
  1073. >     _delay_us(14);
  1074. 325d334
  1075. < /* --> Futura adaptacion Famicom DB9, requiere adaptador
  1076. 328c337
  1077. <   uchar i = 0, j;
  1078. ---
  1079. >     uchar i = 0, j;
  1080. 330,338c339,347
  1081. <   for (j = 0; j < 8; j++)
  1082. <   {
  1083. <       i = i >> 1;
  1084. <       if (pinStat(FAM_DAT, FAM_DAT_BCD)) i |= (1 << 7);   // button pressed
  1085. <       pinPut(FAM_CLK, FAM_CLK_BCD, LO);                   // clock low
  1086. <       _delay_us(FAMDELAY);
  1087. <       pinPut(FAM_CLK, FAM_CLK_BCD, HI);                   // clock high
  1088. <       _delay_us(FAMDELAY);
  1089. <   }
  1090. ---
  1091. >     for (j = 0; j < 8; j++)
  1092. >     {
  1093. >         i = i >> 1;
  1094. >         if (!(FAM_DAT_PIN & FAM_DAT)) i |= (1 << 7);                // button pressed
  1095. >         FAM_CLK_PORT &= ~(FAM_CLK);                                 // clock low
  1096. >         _delay_us(FAMDELAY);
  1097. >         FAM_CLK_PORT |= FAM_CLK;                                    // clock high
  1098. >         _delay_us(FAMDELAY);
  1099. >     }
  1100. 340c349
  1101. <   return i;
  1102. ---
  1103. >     return i;
  1104. 345,395c354,384
  1105. <   static  uchar   vbmode = 0;         // Virtual Boy mode flag
  1106. <
  1107. <   uchar   byte0, byte1, byte2;
  1108. <
  1109. <   pinSet(FAM_DAT, FAM_DAT_BCD, HI);   // Data as input
  1110. <   pinPut(FAM_DAT, FAM_DAT_BCD, HI);   // with pull-up
  1111. <
  1112. <   pinSet(FAM_LAT, FAM_LAT_BCD, LO);   // Latch as output
  1113. <   pinPut(FAM_LAT, FAM_LAT_BCD, HI);   // starting high
  1114. <
  1115. <   pinSet(FAM_CLK, FAM_CLK_BCD, LO);   // Clock as output
  1116. <   pinPut(FAM_CLK, FAM_CLK_BCD, HI);   // starting high
  1117. <
  1118. <   _delay_us(FAMDELAY * 2);            // latch pulse
  1119. <   pinPut(FAM_LAT, FAM_LAT_BCD, LO);   // latch low again
  1120. <   _delay_us(FAMDELAY);                // settle time
  1121. <
  1122. <   byte0 = FamicomReadByte();
  1123. <   byte1 = FamicomReadByte();
  1124. <   byte2 = FamicomReadByte();
  1125. <
  1126. <   // Common to all controllers
  1127. <   p1.right = byte0 & (1 << 7);
  1128. <   p1.left = byte0 & (1 << 6);
  1129. <   p1.down = byte0 & (1 << 5);
  1130. <   p1.up = byte0 & (1 << 4);
  1131. <   p1.start = byte0 & (1 << 3);
  1132. <   p1.select = byte0 & (1 << 2);
  1133. <
  1134. <   if ((byte1 & 0xC0) == 0xC0) // Famicom mode
  1135. <   {
  1136. <       if (byte1 != 0xff) vbmode = 1;  // Virtual Boy detection
  1137. <
  1138. <       if (vbmode == 0)                // Famicom
  1139. <       {
  1140. <           p1.button1 = byte0 & (1 << 0);
  1141. <           p1.button2 = byte0 & (1 << 1);
  1142. <       }
  1143. <   }
  1144. <   else if ((byte1 & 0xf0) == 0)       // Super Famicom mode or no pad
  1145. <   {
  1146. <       vbmode = 0;
  1147. <
  1148. <       p1.button1 = byte1 & (1 << 0);
  1149. <       p1.button2 = byte0 & (1 << 0);
  1150. <       p1.button3 = byte1 & (1 << 1);
  1151. <       p1.button4 = byte0 & (1 << 1);
  1152. <       p1.button5 = byte1 & (1 << 2);
  1153. <       p1.button6 = byte1 & (1 << 3);
  1154. <   }
  1155. <   else vbmode = 0;
  1156. ---
  1157. >     uchar   byte0;
  1158. >
  1159. >     FAM_DAT_DDR &= ~(FAM_DAT);          // Data as input
  1160. >     FAM_DAT_PORT |= FAM_DAT;            // with pull-up
  1161. >
  1162. >     FAM_LAT_DDR |= FAM_LAT;             // Latch as output
  1163. >     FAM_LAT_PORT |= FAM_LAT;            // starting high
  1164. >
  1165. >     FAM_CLK_DDR |= FAM_CLK;             // Clock as output
  1166. >     FAM_CLK_PORT |= FAM_CLK;            // starting high
  1167. >
  1168. >     _delay_us(FAMDELAY * 2);            // latch pulse
  1169. >     FAM_LAT_PORT &= ~(FAM_LAT);         // latch low again
  1170. >     _delay_us(FAMDELAY);                // settle time
  1171. >
  1172. >     byte0 = FamicomReadByte();
  1173. >
  1174. >     p1.button1 = (byte0 & (1 << 0));    // A
  1175. >     p1.button2 = (byte0 & (1 << 1));    // B
  1176. >     p1.select = (byte0 & (1 << 2));     // Select
  1177. >     p1.start = (byte0 & (1 << 3));      // Start
  1178. >     p1.up = (byte0 & (1 << 4));           // Up
  1179. >     p1.down = (byte0 & (1 << 5));       // Down
  1180. >     p1.left = (byte0 & (1 << 6));       // Left
  1181. >     p1.right = (byte0 & (1 << 7));      // Right
  1182. >
  1183. >     FAM_LAT_DDR &= ~(FAM_LAT);          // Latch as input
  1184. >     FAM_LAT_PORT |= FAM_LAT;            // with pull-up
  1185. >
  1186. >     FAM_CLK_DDR &= ~(FAM_CLK);          // Clock  as input
  1187. >     FAM_CLK_PORT |= FAM_CLK;            // with pull-up
  1188. 398d386
  1189. < */
  1190. 402,405c390,393
  1191. <   PS2_PORT &= ~_BV(PS2_DAT); //A 0
  1192. <   PS2_PORT &= ~_BV(PS2_CLK); //A 0
  1193. <   ps2Mode(PS2_DAT, HI);
  1194. <   ps2Mode(PS2_CLK, HI);
  1195. ---
  1196. >     PS2_PORT &= ~_BV(PS2_DAT); //A 0
  1197. >     PS2_PORT &= ~_BV(PS2_CLK); //A 0
  1198. >     ps2Mode(PS2_DAT, HI);
  1199. >     ps2Mode(PS2_CLK, HI);
  1200. 410,414c398,402
  1201. <   if (!(PS2_PIN & (1 << PS2_CLK)))
  1202. <       return 1;
  1203. <   if (!(PS2_PIN & (1 << PS2_DAT)))
  1204. <       return 1;
  1205. <   return 0;
  1206. ---
  1207. >     if (!(PS2_PIN & (1 << PS2_CLK)))
  1208. >         return 1;
  1209. >     if (!(PS2_PIN & (1 << PS2_DAT)))
  1210. >         return 1;
  1211. >     return 0;
  1212. 418c406
  1213. <   uint16_t cont = 0;
  1214. ---
  1215. >     uint16_t cont = 0;
  1216. 420,424c408,412
  1217. <   while (cont++ < tramo) {
  1218. <       if (!(PS2_PIN & (1 << PS2_DAT)))
  1219. <           return 1;
  1220. <       _delay_us(5);
  1221. <   }
  1222. ---
  1223. >     while (cont++ < tramo) {
  1224. >         if (!(PS2_PIN & (1 << PS2_DAT)))
  1225. >             return 1;
  1226. >         _delay_us(5);
  1227. >     }
  1228. 426c414
  1229. <   return 0;
  1230. ---
  1231. >     return 0;
  1232. 431,435c419,423
  1233. <   while (0<us)
  1234. <   {
  1235. <       _delay_us(4);
  1236. <       us -= 4;
  1237. <   }
  1238. ---
  1239. >     while (0<us)
  1240. >     {
  1241. >         _delay_us(4);
  1242. >         us -= 4;
  1243. >     }
  1244. 444,445c432
  1245. <                 //envio de datos ps/2 simulando reloj con delays.
  1246. < void sendPS2(unsigned char code)
  1247. ---
  1248. > void sendPS2_aux(unsigned char code, unsigned char kbmodif)
  1249. 447,496d433
  1250. <   //Para continuar las l�neas deben estar en alto
  1251. <   //if (ps2Stat())
  1252. <   //  return;
  1253. <   while (ps2Stat());
  1254. <
  1255. <   unsigned char parity = 1;
  1256. <   uint8_t i = 0;
  1257. <
  1258. <   //iniciamos transmisi�n
  1259. <   ps2Mode(PS2_DAT, LO);
  1260. <   _delay_us_4usteps(CK1*CKm);
  1261. <
  1262. <   ps2Mode(PS2_CLK, LO); //bit de comienzo
  1263. <   _delay_us_4usteps(CK2*CKm);
  1264. <   ps2Mode(PS2_CLK, HI);
  1265. <   _delay_us_4usteps(CK1*CKm);
  1266. <   //enviamos datos
  1267. <   for (i = 0; i < 8; ++i)
  1268. <   {
  1269. <       if (code & (1 << i))
  1270. <       {
  1271. <           ps2Mode(PS2_DAT, HI);
  1272. <           parity = parity ^ 1;
  1273. <       }
  1274. <       else ps2Mode(PS2_DAT, LO);
  1275. <
  1276. <       _delay_us_4usteps(CK1*CKm);
  1277. <       ps2Mode(PS2_CLK, LO);
  1278. <       _delay_us_4usteps(CK2*CKm);
  1279. <       ps2Mode(PS2_CLK, HI);
  1280. <       _delay_us_4usteps(CK1*CKm);
  1281. <   }
  1282. <
  1283. <   // Enviamos bit de paridad
  1284. <   if (parity) ps2Mode(PS2_DAT, HI);
  1285. <   else        ps2Mode(PS2_DAT, LO);
  1286. <
  1287. <   _delay_us_4usteps(CK1*CKm);
  1288. <   ps2Mode(PS2_CLK, LO);
  1289. <   _delay_us_4usteps(CK2*CKm);
  1290. <   ps2Mode(PS2_CLK, HI);
  1291. <   _delay_us_4usteps(CK1*CKm);
  1292. <
  1293. <   //Bit de parada
  1294. <   ps2Mode(PS2_DAT, HI);
  1295. <   _delay_us_4usteps(CK1*CKm);
  1296. <   ps2Mode(PS2_CLK, LO);
  1297. <   _delay_us_4usteps(CK2*CKm);
  1298. <   ps2Mode(PS2_CLK, HI);
  1299. <   _delay_us_4usteps(CK1*CKm);
  1300. 498c435,439
  1301. <   _delay_us(50);    //fin
  1302. ---
  1303. >     //Para continuar las líneas deben estar en alto
  1304. >     while (ps2Stat());
  1305. >
  1306. >     unsigned char parity = 1;
  1307. >     uint8_t i = 0;
  1308. 499a441,523
  1309. >     //iniciamos transmisión
  1310. >     ps2Mode(PS2_DAT, LO);
  1311. >     _delay_us_4usteps(CK1*CKm);
  1312. >
  1313. >     ps2Mode(PS2_CLK, LO); //bit de comienzo
  1314. >     _delay_us_4usteps(CK2*CKm);
  1315. >     ps2Mode(PS2_CLK, HI);
  1316. >     _delay_us_4usteps(CK1*CKm);
  1317. >     //enviamos datos
  1318. >     for (i = 0; i < 8; ++i)
  1319. >     {
  1320. >         if (code & (1 << i))
  1321. >         {
  1322. >             ps2Mode(PS2_DAT, HI);
  1323. >             parity = parity ^ 1;
  1324. >         }
  1325. >         else ps2Mode(PS2_DAT, LO);
  1326. >
  1327. >         _delay_us_4usteps(CK1*CKm);
  1328. >         ps2Mode(PS2_CLK, LO);
  1329. >         _delay_us_4usteps(CK2*CKm);
  1330. >         ps2Mode(PS2_CLK, HI);
  1331. >         _delay_us_4usteps(CK1*CKm);
  1332. >     }
  1333. >
  1334. >     // Enviamos bit de paridad
  1335. >     if (parity) ps2Mode(PS2_DAT, HI);
  1336. >     else        ps2Mode(PS2_DAT, LO);
  1337. >
  1338. >     _delay_us_4usteps(CK1*CKm);
  1339. >     ps2Mode(PS2_CLK, LO);
  1340. >     _delay_us_4usteps(CK2*CKm);
  1341. >     ps2Mode(PS2_CLK, HI);
  1342. >     _delay_us_4usteps(CK1*CKm);
  1343. >
  1344. >     //Bit de parada
  1345. >     ps2Mode(PS2_DAT, HI);
  1346. >     _delay_us_4usteps(CK1*CKm);
  1347. >     ps2Mode(PS2_CLK, LO);
  1348. >     _delay_us_4usteps(CK2*CKm);
  1349. >     ps2Mode(PS2_CLK, HI);
  1350. >     _delay_us_4usteps(CK1*CKm);
  1351. >
  1352. >     _delay_us(50);    //fin
  1353. >
  1354. >     if (kbmodif)
  1355. >     {
  1356. >         if (codeset == 2)
  1357. >         {
  1358. >             if (kbcontrol && code == KEY_LCTRL) return;
  1359. >             if (kbalt && code == KEY_LALT) return;
  1360. >             if (kbshift && code == KEY_LSHIFT) return;
  1361. >             if (kbaltgr && code == KEY_RALT) return;
  1362. >             if (kblwin && code == KEY_LWIN) return;
  1363. >             if (prevf0 && (code != 0xF0))
  1364. >             {
  1365. >                 pulsa_y_suelta_teclas_modificadoras(1, 1, 1, 1, 1);
  1366. >                 prevf0 = 0;
  1367. >             }
  1368. >             else
  1369. >             {
  1370. >                 prevf0 = (code == 0xF0);
  1371. >             }
  1372. >         }
  1373. >         else
  1374. >         {
  1375. >             if (kbcontrol && code == KS1_LCTRL + KS1_RELEASE) return;
  1376. >             if (kbalt && code == KS1_LALT + KS1_RELEASE) return;
  1377. >             if (kbshift && code == KS1_LSHIFT + KS1_RELEASE) return;
  1378. >             if (kbaltgr && code == KS1_RALT + KS1_RELEASE) return;
  1379. >             if (kblwin && code == KS1_LWIN + KS1_RELEASE) return;
  1380. >             if (code != 0xE0 && code > KS1_RELEASE)
  1381. >             {
  1382. >                 pulsa_y_suelta_teclas_modificadoras(1, 1, 1, 1, 1);
  1383. >             }
  1384. >         }
  1385. >     }
  1386. > }
  1387. >
  1388. > //envio de datos ps/2 simulando reloj con delays.
  1389. > void sendPS2(unsigned char code)
  1390. > {
  1391. >     sendPS2_aux(code, 1);
  1392. 504,548c528,572
  1393. <   unsigned char data = 0x00;
  1394. <   unsigned char p = 0x01;
  1395. <   uint8_t i = 0;
  1396. <
  1397. <   // discard the start bit
  1398. <   while ((PS2_PIN & (1 << PS2_DAT)));
  1399. <   while (!(PS2_PIN & (1 << PS2_CLK)));
  1400. <
  1401. <   // Bit de comienzo
  1402. <   _delay_us_4usteps(CK1*CKm);
  1403. <   ps2Mode(PS2_CLK, LO);
  1404. <   _delay_us_4usteps(CK2*CKm);
  1405. <   ps2Mode(PS2_CLK, HI);
  1406. <   _delay_us_4usteps(CK1*CKm);
  1407. <
  1408. <   // read each data bit
  1409. <   for (i = 0; i<8; i++) {
  1410. <       if ((PS2_PIN & (1 << PS2_DAT))) {
  1411. <           data = data | (1 << i);
  1412. <           p = p ^ 1;
  1413. <       }
  1414. <       _delay_us_4usteps(CK1*CKm);
  1415. <       ps2Mode(PS2_CLK, LO);
  1416. <       _delay_us_4usteps(CK2*CKm);
  1417. <       ps2Mode(PS2_CLK, HI);
  1418. <       _delay_us_4usteps(CK1*CKm);
  1419. <   }
  1420. <
  1421. <   // read the parity bit
  1422. <   if (((PS2_PIN & (1 << PS2_DAT)) != 0) != p) {
  1423. <       return -1;
  1424. <   }
  1425. <   _delay_us_4usteps(CK1*CKm);
  1426. <   ps2Mode(PS2_CLK, LO);
  1427. <   _delay_us_4usteps(CK2*CKm);
  1428. <   ps2Mode(PS2_CLK, HI);
  1429. <   _delay_us_4usteps(CK1*CKm);
  1430. <
  1431. <   // send 'ack' bit
  1432. <   ps2Mode(PS2_DAT, LO);
  1433. <   _delay_us_4usteps(CK1*CKm);
  1434. <   ps2Mode(PS2_CLK, LO);
  1435. <   _delay_us_4usteps(CK2*CKm);
  1436. <   ps2Mode(PS2_CLK, HI);
  1437. <   ps2Mode(PS2_DAT, HI);
  1438. ---
  1439. >     unsigned char data = 0x00;
  1440. >     unsigned char p = 0x01;
  1441. >     uint8_t i = 0;
  1442. >
  1443. >     // discard the start bit
  1444. >     while ((PS2_PIN & (1 << PS2_DAT)));
  1445. >     while (!(PS2_PIN & (1 << PS2_CLK)));
  1446. >
  1447. >     // Bit de comienzo
  1448. >     _delay_us_4usteps(CK1*CKm);
  1449. >     ps2Mode(PS2_CLK, LO);
  1450. >     _delay_us_4usteps(CK2*CKm);
  1451. >     ps2Mode(PS2_CLK, HI);
  1452. >     _delay_us_4usteps(CK1*CKm);
  1453. >
  1454. >     // read each data bit
  1455. >     for (i = 0; i<8; i++) {
  1456. >         if ((PS2_PIN & (1 << PS2_DAT))) {
  1457. >             data = data | (1 << i);
  1458. >             p = p ^ 1;
  1459. >         }
  1460. >         _delay_us_4usteps(CK1*CKm);
  1461. >         ps2Mode(PS2_CLK, LO);
  1462. >         _delay_us_4usteps(CK2*CKm);
  1463. >         ps2Mode(PS2_CLK, HI);
  1464. >         _delay_us_4usteps(CK1*CKm);
  1465. >     }
  1466. >
  1467. >     // read the parity bit
  1468. >     if (((PS2_PIN & (1 << PS2_DAT)) != 0) != p) {
  1469. >         return -1;
  1470. >     }
  1471. >     _delay_us_4usteps(CK1*CKm);
  1472. >     ps2Mode(PS2_CLK, LO);
  1473. >     _delay_us_4usteps(CK2*CKm);
  1474. >     ps2Mode(PS2_CLK, HI);
  1475. >     _delay_us_4usteps(CK1*CKm);
  1476. >
  1477. >     // send 'ack' bit
  1478. >     ps2Mode(PS2_DAT, LO);
  1479. >     _delay_us_4usteps(CK1*CKm);
  1480. >     ps2Mode(PS2_CLK, LO);
  1481. >     _delay_us_4usteps(CK2*CKm);
  1482. >     ps2Mode(PS2_CLK, HI);
  1483. >     ps2Mode(PS2_DAT, HI);
  1484. 550c574
  1485. <   _delay_us(100);
  1486. ---
  1487. >     _delay_us(100);
  1488. 552,553c576,577
  1489. <   *ret = data;
  1490. <   return 0;
  1491. ---
  1492. >     *ret = data;
  1493. >     return 0;
  1494. 559c583
  1495. <   uint8_t extn = 0;
  1496. ---
  1497. >     uint8_t extn = 0;
  1498. 561,588c585,612
  1499. <   //checkeamos si es una tecla con scancode extendido (E0)
  1500. <   switch (key) {
  1501. <   case JOY_UP:
  1502. <   case JOY_DOWN:
  1503. <   case JOY_LEFT:
  1504. <   case JOY_RIGHT:
  1505. <   case JOY_INS:
  1506. <   case JOY_HOME:
  1507. <   case JOY_PUP:
  1508. <   case JOY_DEL:
  1509. <   case JOY_END:
  1510. <   case JOY_PDN:
  1511. <   case JOYPAD_BAR:
  1512. <   case JOYPAD_ENT:
  1513. <
  1514. <       extn = 1;
  1515. <       break;
  1516. <   default:
  1517. <       extn = 0;
  1518. <       break;
  1519. <   }
  1520. <   //secuencia
  1521. <
  1522. <   if (extn)
  1523. <       sendPS2(0xE0);
  1524. <
  1525. <   if (key && release && scancodeset == 1) // Set 1 release
  1526. <       sendPS2(ScanCodes1[key] + 0x80);
  1527. ---
  1528. >     //checkeamos si es una tecla con scancode extendido (E0)
  1529. >     switch (key) {
  1530. >     case JOY_UP:
  1531. >     case JOY_DOWN:
  1532. >     case JOY_LEFT:
  1533. >     case JOY_RIGHT:
  1534. >     case JOY_INS:
  1535. >     case JOY_HOME:
  1536. >     case JOY_PUP:
  1537. >     case JOY_DEL:
  1538. >     case JOY_END:
  1539. >     case JOY_PDN:
  1540. >     case JOYPAD_BAR:
  1541. >     case JOYPAD_ENT:
  1542. >
  1543. >         extn = 1;
  1544. >         break;
  1545. >     default:
  1546. >         extn = 0;
  1547. >         break;
  1548. >     }
  1549. >     //secuencia
  1550. >
  1551. >     if (extn)
  1552. >         sendPS2(0xE0);
  1553. >
  1554. >     if (key && release && scancodeset == 1) // Set 1 release
  1555. >         sendPS2(ScanCodes1[key] + 0x80);
  1556. 590,591c614,615
  1557. <   if (key && !release && scancodeset == 1) // Set 1 make
  1558. <       sendPS2(ScanCodes1[key]);
  1559. ---
  1560. >     if (key && !release && scancodeset == 1) // Set 1 make
  1561. >         sendPS2(ScanCodes1[key]);
  1562. 593,594c617,618
  1563. <   if (key && release && scancodeset == 2) // Set 2 release
  1564. <       sendPS2(0xF0);
  1565. ---
  1566. >     if (key && release && scancodeset == 2) // Set 2 release
  1567. >         sendPS2(0xF0);
  1568. 596,597c620,621
  1569. <   if (key && scancodeset == 2) // Set 2 make or release
  1570. <       sendPS2(ScanCodes2[key]);
  1571. ---
  1572. >     if (key && scancodeset == 2) // Set 2 make or release
  1573. >         sendPS2(ScanCodes2[key]);
  1574. 603c627
  1575. <   sendCodeMR(key, 0, scancodeset); //Make
  1576. ---
  1577. >     sendCodeMR(key, 0, scancodeset); //Make
  1578. 605c629
  1579. <   sendCodeMR(key, 1, scancodeset); //Release
  1580. ---
  1581. >     sendCodeMR(key, 1, scancodeset); //Release
  1582. 608d631
  1583. <
  1584. 611,632c634,655
  1585. <   int n;
  1586. <   char pausa = 50;
  1587. <   if (!modo)
  1588. <   {
  1589. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1590. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1591. <   }
  1592. <
  1593. <   sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1594. <
  1595. <   for (n = 0; n<8; n++)
  1596. <   {
  1597. <       if (n == 2 || n == 4) { _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO); }
  1598. <       _delay_ms(pausa);
  1599. <       sendPS2(versionKeyCodes[version[n]]);
  1600. <       _delay_ms(pausa);
  1601. <       sendPS2(0xF0);
  1602. <       sendPS2(versionKeyCodes[version[n]]);
  1603. <       _delay_ms(pausa);
  1604. <   }
  1605. <   fnpulsada = 1;
  1606. <   fnpulsando = 1;
  1607. ---
  1608. >     int n;
  1609. >     char pausa = 75;
  1610. >     if (!modo)
  1611. >     {
  1612. >         sendPS2_aux(0xF0, 0); sendPS2_aux(CAPS_SHIFT, 0); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1613. >         sendPS2_aux(0xF0, 0); sendPS2_aux(SYMBOL_SHIFT, 0); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1614. >     }
  1615. >
  1616. >     sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1617. >
  1618. >     for (n = 0; n<8; n++)
  1619. >     {
  1620. >         if (n == 2 || n == 4) { _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO); }
  1621. >         _delay_ms(pausa);
  1622. >         sendPS2(versionKeyCodes[version[n]]);
  1623. >         _delay_ms(pausa);
  1624. >         sendPS2(0xF0);
  1625. >         sendPS2(versionKeyCodes[version[n]]);
  1626. >         _delay_ms(pausa);
  1627. >     }
  1628. >     fnpulsada = 1;
  1629. >     fnpulsando = 1;
  1630. 637,660c660,684
  1631. <   int n;
  1632. <   char pausa = 50;
  1633. <   if (!modo)
  1634. <   {
  1635. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1636. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1637. <   }
  1638. <   eeprom_write_byte((uint8_t*)5, (uint8_t)modo);
  1639. <   if (codeset == 2)
  1640. <   {
  1641. <       _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1642. <       _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1643. <       for (n = 0; n < 10; n++)
  1644. <       {
  1645. <           _delay_ms(pausa);
  1646. <           sendPS2(eepromsavename[n]);
  1647. <           _delay_ms(pausa);
  1648. <           sendPS2(0xF0);
  1649. <           sendPS2(eepromsavename[n]);
  1650. <           _delay_ms(pausa);
  1651. <       }
  1652. <   }
  1653. <   fnpulsada = 1;
  1654. <   fnpulsando = 1;
  1655. ---
  1656. >     int n;
  1657. >     char pausa = 50;
  1658. >     if (!modo)
  1659. >     {
  1660. >         sendPS2_aux(0xF0, 0); sendPS2_aux(CAPS_SHIFT, 0); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1661. >         sendPS2_aux(0xF0, 0); sendPS2_aux(SYMBOL_SHIFT, 0); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1662. >     }
  1663. >     eeprom_write_byte((uint8_t*)5, (uint8_t)modo); // Guardamos el modo de teclado
  1664. >     eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode); // Guardamos funcion de teclas modificadoras de ZX
  1665. >     if (codeset == 2)
  1666. >     {
  1667. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1668. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1669. >         for (n = 0; n < 10; n++)
  1670. >         {
  1671. >             _delay_ms(pausa);
  1672. >             sendPS2(eepromsavename[n]);
  1673. >             _delay_ms(pausa);
  1674. >             sendPS2(0xF0);
  1675. >             sendPS2(eepromsavename[n]);
  1676. >             _delay_ms(pausa);
  1677. >         }
  1678. >     }
  1679. >     fnpulsada = 1;
  1680. >     fnpulsando = 1;
  1681. 665,666c689,690
  1682. <   int n;
  1683. <   char pausa = 100;
  1684. ---
  1685. >     int n;
  1686. >     char pausa = 100;
  1687. 668,685c692,709
  1688. <   if (!modo)
  1689. <   {
  1690. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1691. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1692. <   }
  1693. <
  1694. <   _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1695. <   _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1696. <   for (n = 1; n<nomcore[0] + 1; n++)
  1697. <   {
  1698. <       _delay_ms(pausa);
  1699. <       sendPS2(nomcore[n]);
  1700. <       _delay_ms(pausa);
  1701. <       sendPS2(0xF0);
  1702. <       sendPS2(nomcore[n]);
  1703. <       _delay_ms(pausa);
  1704. <   }
  1705. <   CKm = nomcore[nomcore[0] + 1]; //Valor de CKm en la configuracion de nomcore[]
  1706. ---
  1707. >     if (!modo)
  1708. >     {
  1709. >         sendPS2_aux(0xF0, 0); sendPS2_aux(CAPS_SHIFT, 0); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1710. >         sendPS2_aux(0xF0, 0); sendPS2_aux(SYMBOL_SHIFT, 0); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1711. >     }
  1712. >
  1713. >     _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1714. >     _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1715. >     for (n = 1; n<nomcore[0] + 1; n++)
  1716. >     {
  1717. >         _delay_ms(pausa);
  1718. >         sendPS2(nomcore[n]);
  1719. >         _delay_ms(pausa);
  1720. >         sendPS2(0xF0);
  1721. >         sendPS2(nomcore[n]);
  1722. >         _delay_ms(pausa);
  1723. >     }
  1724. >     CKm = nomcore[nomcore[0] + 1]; //Valor de CKm en la configuracion de nomcore[]
  1725. 689,748c713,720
  1726. < void cambia_tzxduino()
  1727. < {
  1728. <   int n;
  1729. <   char pausa = 50;
  1730. <   opqa_cursors = 0;
  1731. <
  1732. <   tzxduino_value = tzxduino_value ? 0 : 1;
  1733. <
  1734. <   if (tzxduino_value) tzxduino_stop = 0;
  1735. <
  1736. <   if (!modo)
  1737. <   {
  1738. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1739. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1740. <   }
  1741. <
  1742. <   if (codeset == 2)
  1743. <   {
  1744. <       _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1745. <       _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1746. <
  1747. <       if (tzxduino_value)
  1748. <       {
  1749. <           for (n = 0; n < 3; n++)
  1750. <           {
  1751. <               _delay_ms(pausa);
  1752. <               sendPS2(enable[n]);
  1753. <               _delay_ms(pausa);
  1754. <               sendPS2(0xF0);
  1755. <               sendPS2(enable[n]);
  1756. <               _delay_ms(pausa);
  1757. <           }
  1758. <       }
  1759. <       else
  1760. <       {
  1761. <           for (n = 0; n < 4; n++)
  1762. <           {
  1763. <               _delay_ms(pausa);
  1764. <               sendPS2(disable[n]);
  1765. <               _delay_ms(pausa);
  1766. <               sendPS2(0xF0);
  1767. <               sendPS2(disable[n]);
  1768. <               _delay_ms(pausa);
  1769. <           }
  1770. <       }
  1771. <
  1772. <       for (n = 0; n < 8; n++)
  1773. <       {
  1774. <           _delay_ms(pausa);
  1775. <           sendPS2(tzxduino[n]);
  1776. <           _delay_ms(pausa);
  1777. <           sendPS2(0xF0);
  1778. <           sendPS2(tzxduino[n]);
  1779. <           _delay_ms(pausa);
  1780. <       }
  1781. <
  1782. <   }
  1783. <   fnpulsada = 1;
  1784. <   fnpulsando = 1;
  1785. < }
  1786. ---
  1787. > void cambia_tzxduino();
  1788. > void cambia_joy2ps2();
  1789. > void cambia_del_break();
  1790. > void cambia_cursors_kbpc();
  1791. > void cambiafkbmode();
  1792. > void Joy2PS2Init();
  1793. > void TZXDUINO_pushbutton(uint8_t pin, uint8_t bcd);
  1794. > void TZXDUINOInit();
  1795. 750c722,723
  1796. < void cambia_del_break()
  1797. ---
  1798. > //Inicializar Matriz
  1799. > void matrixInit()
  1800. 752,755c725
  1801. <   int n;
  1802. <   char pausa = 50;
  1803. <
  1804. <   del_break_value = del_break_value ? 0 : 1;
  1805. ---
  1806. >     uint8_t c, r;
  1807. 757,807c727,736
  1808. <   if (!modo)
  1809. <   {
  1810. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1811. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1812. <   }
  1813. <
  1814. <   if (codeset == 2)
  1815. <   {
  1816. <       _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1817. <       _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1818. <
  1819. <       if (del_break_value)
  1820. <       {
  1821. <           for (n = 0; n < 3; n++)
  1822. <           {
  1823. <               _delay_ms(pausa);
  1824. <               sendPS2(enable[n]);
  1825. <               _delay_ms(pausa);
  1826. <               sendPS2(0xF0);
  1827. <               sendPS2(enable[n]);
  1828. <               _delay_ms(pausa);
  1829. <           }
  1830. <       }
  1831. <       else
  1832. <       {
  1833. <           for (n = 0; n < 4; n++)
  1834. <           {
  1835. <               _delay_ms(pausa);
  1836. <               sendPS2(disable[n]);
  1837. <               _delay_ms(pausa);
  1838. <               sendPS2(0xF0);
  1839. <               sendPS2(disable[n]);
  1840. <               _delay_ms(pausa);
  1841. <           }
  1842. <       }
  1843. <
  1844. <       for (n = 0; n < 9; n++)
  1845. <       {
  1846. <           _delay_ms(pausa);
  1847. <           sendPS2(del_break[n]);
  1848. <           _delay_ms(pausa);
  1849. <           sendPS2(0xF0);
  1850. <           sendPS2(del_break[n]);
  1851. <           _delay_ms(pausa);
  1852. <       }
  1853. <       eeprom_write_byte((uint8_t*)7, (uint8_t)del_break_value);
  1854. <
  1855. <
  1856. <   }
  1857. <   fnpulsada = 1;
  1858. <   fnpulsando = 1;
  1859. ---
  1860. >     for (c = 0; c<COLS; c++)
  1861. >     {
  1862. >         pinSet(pinsC[c], bcdC[c], _IN);
  1863. >         pinPut(pinsC[c], bcdC[c], HI);
  1864. >     }
  1865. >
  1866. >     for (r = 0; r < ROWS; r++)
  1867. >     {
  1868. >         pinSet(pinsR[r], bcdR[r], _IN);
  1869. >     }
  1870. 810c739
  1871. < void cambia_cursors_kbpc()
  1872. ---
  1873. > KBMODE cambiarmodo2(KBMODE modokb)
  1874. 812,867c741,913
  1875. <   int n;
  1876. <   char pausa = 50;
  1877. <
  1878. <   cursors_kbpc_value = cursors_kbpc_value ? 0 : 1;
  1879. <
  1880. <   if (!modo)
  1881. <   {
  1882. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  1883. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  1884. <   }
  1885. <
  1886. <   if (codeset == 2)
  1887. <   {
  1888. <       _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  1889. <       _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  1890. <
  1891. <       if (cursors_kbpc_value)
  1892. <       {
  1893. <           for (n = 0; n < 3; n++)
  1894. <           {
  1895. <               _delay_ms(pausa);
  1896. <               sendPS2(enable[n]);
  1897. <               _delay_ms(pausa);
  1898. <               sendPS2(0xF0);
  1899. <               sendPS2(enable[n]);
  1900. <               _delay_ms(pausa);
  1901. <           }
  1902. <       }
  1903. <       else
  1904. <       {
  1905. <           for (n = 0; n < 4; n++)
  1906. <           {
  1907. <               _delay_ms(pausa);
  1908. <               sendPS2(disable[n]);
  1909. <               _delay_ms(pausa);
  1910. <               sendPS2(0xF0);
  1911. <               sendPS2(disable[n]);
  1912. <               _delay_ms(pausa);
  1913. <           }
  1914. <       }
  1915. <
  1916. <       for (n = 0; n < 12; n++)
  1917. <       {
  1918. <           _delay_ms(pausa);
  1919. <           sendPS2(cursors_kbpc[n]);
  1920. <           _delay_ms(pausa);
  1921. <           sendPS2(0xF0);
  1922. <           sendPS2(cursors_kbpc[n]);
  1923. <           _delay_ms(pausa);
  1924. <       }
  1925. <       eeprom_write_byte((uint8_t*)8, (uint8_t)cursors_kbpc_value);
  1926. <
  1927. <
  1928. <   }
  1929. <   fnpulsada = 1;
  1930. <   fnpulsando = 1;
  1931. ---
  1932. >     kbescucha = 0;
  1933. >     KBEXT_BIDIR_OFF;
  1934. >     opqa_cursors = 0;
  1935. >     opqa_numbers = 0;
  1936. >     if (modokb == zx)  CKm = nomZX[nomZX[0] + 1];
  1937. >     if (modokb == cpc) CKm = nomCPC[nomCPC[0] + 1];
  1938. >     if (modokb == msx) CKm = nomMSX[nomMSX[0] + 1];
  1939. >     if (modokb == c64) CKm = nomC64[nomC64[0] + 1];
  1940. >     if (modokb == at8) CKm = nomAT8[nomAT8[0] + 1];
  1941. >     if (modokb == bbc) CKm = nomBBC[nomBBC[0] + 1];
  1942. >     if (modokb == aco) CKm = nomACO[nomACO[0] + 1];
  1943. >     if (modokb == ap2) CKm = nomAP2[nomAP2[0] + 1];
  1944. >     if (modokb == vic) CKm = nomVIC[nomVIC[0] + 1];
  1945. >     if (modokb == ori) CKm = nomORI[nomORI[0] + 1];
  1946. >     if (modokb == sam) CKm = nomSAM[nomSAM[0] + 1];
  1947. >     if (modokb == jup) CKm = nomJUP[nomJUP[0] + 1];
  1948. >     if (modokb == sms) CKm = nomSMS[nomSMS[0] + 1];
  1949. >     if (modokb == c16) CKm = nomC16[nomC16[0] + 1];
  1950. >     if (modokb == ht8) CKm = nomHT8[nomHT8[0] + 1];
  1951. >     if (modokb == galak) CKm = nomGALAK[nomGALAK[0] + 1];
  1952. >     if (modokb == multi) CKm = nomMULTI[nomMULTI[0] + 1];
  1953. >     if (modokb == pc) { CKm = nomPC[nomPC[0] + 1]; kbescucha = 1; timeout_escucha = 0; codeset = 2; } // Iniciamos la escucha para que se pueda cambiar al core de PC/XT.
  1954. >     if (modokb == kbext) { CKm = nomKBEXT[nomKBEXT[0] + 1]; kbescucha = 1; timeout_escucha = 0; codeset = 2; KBEXT_BIDIR_ON; } // Iniciamos la escucha y mantenemos activa bidireccionalidad, para que pueda ser usado como teclado externo.
  1955. >     if (modokb == pcxt) { CKm = nomPCXT[nomPCXT[0] + 1]; kbescucha = 0; codeset = 1; imprimecore(nomPCXT); } // Sin escucha activa para ser usado de forma simultanea junto a un teclado externo.
  1956. >
  1957. >     return modokb;
  1958. > }
  1959. >
  1960. > void ejecutarfuncion(unsigned char code)
  1961. > {
  1962. >     funcion = 0; //para salir del bucle de la funcion
  1963. >     switch (code)
  1964. >     {
  1965. >         case KEY_T:
  1966. >             cambia_tzxduino(); // TZXDUINO ON / OFF
  1967. >             break;
  1968. >
  1969. >         case KEY_Q:
  1970. >             cambia_cursors_kbpc(); // XCHG CURSORS KBPC ON / OFF
  1971. >             break;
  1972. >
  1973. >         case KEY_W:
  1974. >             cambia_del_break(); // XCHG DEL BREAK ON / OFF
  1975. >             break;
  1976. >
  1977. >         case KEY_J:
  1978. >             cambia_joy2ps2(); // Famicom <-> Atari/Megadrive
  1979. >             break;
  1980. >
  1981. >         case KEY_U:
  1982. >             cambiomodo = 1;
  1983. >             _delay_ms(250);
  1984. >             break;
  1985. >         case KEY_C:
  1986. >             if (modo == at8 || modo == jup || modo == c64)
  1987. >             {
  1988. >                 opqa_cursors = 0;
  1989. >                 opqa_numbers = !opqa_numbers; // OPQA -> Bloq Num (Activacion / Desactivacion)
  1990. >
  1991. >                 fnpulsada = 1;
  1992. >                 fnpulsando = 1;
  1993. >             }
  1994. >             else
  1995. >             {
  1996. >                 opqa_numbers = 0;
  1997. >                 opqa_cursors = !opqa_cursors; // OPQA -> Cursores (Activacion / Desactivacion)
  1998. >
  1999. >                 fnpulsada = 1;
  2000. >                 fnpulsando = 1;
  2001. >             }
  2002. >             break;
  2003. >
  2004. >         case KEY_D:
  2005. >             if (!modo) // Funcion valida solo para el modo ZX
  2006. >             {
  2007. >                 fkbmode = !fkbmode; // Teclas modificadoras (Activacion / Desactivacion)
  2008. >                 sendPS2_aux(0xF0, 0); sendPS2_aux(CAPS_SHIFT, 0); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  2009. >                 sendPS2_aux(0xF0, 0); sendPS2_aux(SYMBOL_SHIFT, 0); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  2010. >
  2011. >                 fnpulsada = 1;
  2012. >                 fnpulsando = 1;
  2013. >             }
  2014. >             break;
  2015. >
  2016. >         case KEY_H:
  2017. >             if (modo == at8)
  2018. >             {
  2019. >                 // F8 + F10 para Atari
  2020. >                 sendPS2(KEY_F8);
  2021. >                 _delay_ms(50);
  2022. >                 sendPS2(KEY_F10);
  2023. >
  2024. >                 _delay_ms(50);
  2025. >
  2026. >                 sendPS2(0xF0);
  2027. >                 sendPS2(KEY_F10);
  2028. >                 _delay_ms(1000);
  2029. >                 sendPS2(0xF0);
  2030. >                 sendPS2(KEY_F8);
  2031. >                 _delay_ms(50);
  2032. >
  2033. >                 fnpulsada = 1;
  2034. >                 fnpulsando = 1;
  2035. >             }
  2036. >             break;
  2037. >         case KEY_O:
  2038. >             if (modo == bbc)
  2039. >             {
  2040. >                 // F12 y seguido shift pulsado con delay de 1 segundo antes de soltar para BBC
  2041. >                 pulsafn(Y_P_ROW, O_COL, KEY_F12, 0, 0, 0, 0, 0, 0);
  2042. >                 sendPS2(KEY_LSHIFT);
  2043. >                 _delay_ms(1000);
  2044. >                 sendPS2(0xF0); sendPS2(KEY_LSHIFT);
  2045. >
  2046. >                 fnpulsada = 1;
  2047. >                 fnpulsando = 1;
  2048. >             }
  2049. >             if (modo == msx) // Hard Reset
  2050. >             {
  2051. >                 // Control+Alt+F12
  2052. >                 pulsafn(Y_P_ROW, Y_COL, codeset == 1 ? KS1_F12 : KEY_F12, 0, 0, 1, 1, 0, 0);
  2053. >             }
  2054. >
  2055. >             break;
  2056. >
  2057. >         case KEY_V:
  2058. >             if (codeset == 2)
  2059. >                 imprimeversion();
  2060. >             break;
  2061. >
  2062. >         case KEY_X:
  2063. >             // Guarda en la EEPROM el modo actual de teclado
  2064. >             eepromsave();
  2065. >             break;
  2066. >
  2067. >         case KEY_B:
  2068. >             // ZXUNO Hard Reset (Control+Alt+Backsp)
  2069. >             pulsafn(B_M_ROW, B_COL, codeset == 1 ? KS1_BACKSP : KEY_BACKSP, 0, 0, 1, 1, 0, 0);
  2070. >             break;
  2071. >
  2072. >         case KEY_N:
  2073. >             // ZXUNO Soft Reset (Control+Alt+Supr)
  2074. >             pulsafn(B_M_ROW, N_COL, codeset == 1 ? KS1_DELETE : KEY_DELETE, 1, 0, 1, 1, 0, 0);
  2075. >             if (modo == pc)
  2076. >             {
  2077. >                 kbescucha = 1; timeout_escucha = 0; codeset = 2; // Iniciamos la escucha para que se pueda cambiar al core de PC/XT.
  2078. >             }
  2079. >             break;
  2080. >
  2081. >         case KEY_Y: // NMI
  2082. >             if (modo == zx || modo == cpc || modo == jup || modo == sam)
  2083. >             {
  2084. >                 // Control+Alt+F5
  2085. >                 pulsafn(Y_P_ROW, Y_COL, codeset == 1 ? KS1_F5 : KEY_F5, 0, 0, 1, 1, 0, 0);
  2086. >             }
  2087. >             break;
  2088. >
  2089. >         case KEY_G: // VGA-RGB
  2090. >             if (modo == zx || modo == at8 || modo == bbc || modo == vic || modo == ori || modo == sms || modo == ht8)
  2091. >             {
  2092. >                 pulsafn(A_G_ROW, G_COL, codeset == 1 ? KS1_SCRLCK : KEY_SCRLCK, 0, 0, 1, 1, 0, 0);
  2093. >             }
  2094. >             if (modo == msx)
  2095. >             {
  2096. >                 pulsaimprpant(A_G_ROW, G_COL);
  2097. >             }
  2098. >             break;
  2099. >
  2100. >         default:
  2101. >             fnpulsada = 1;
  2102. >             fnpulsando = 1;
  2103. >             break;
  2104. >     }
  2105. 870c916
  2106. < void cambiafkbmode()
  2107. ---
  2108. > KBMODE cambiarmodo(KBMODE modokb)
  2109. 872,929c918,1075
  2110. <   int n;
  2111. <   char pausa = 50;
  2112. <   if (!modo)
  2113. <   {
  2114. <       sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  2115. <       sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  2116. <   }
  2117. <   if (codeset == 2)
  2118. <   {
  2119. <       _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  2120. <       _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  2121. <
  2122. <       switch (fkbmode)
  2123. <       {
  2124. <       case 0:
  2125. <           for (n = 0; n < 15; n++)
  2126. <           {
  2127. <               _delay_ms(pausa);
  2128. <               sendPS2(fkbmode0[n]);
  2129. <               _delay_ms(pausa);
  2130. <               sendPS2(0xF0);
  2131. <               sendPS2(fkbmode0[n]);
  2132. <               _delay_ms(pausa);
  2133. <               eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  2134. <           }
  2135. <           break;
  2136. <       case 1:
  2137. <           for (n = 0; n < 12; n++)
  2138. <           {
  2139. <               _delay_ms(pausa);
  2140. <               sendPS2(fkbmode1[n]);
  2141. <               _delay_ms(pausa);
  2142. <               sendPS2(0xF0);
  2143. <               sendPS2(fkbmode1[n]);
  2144. <               _delay_ms(pausa);
  2145. <               eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  2146. <           }
  2147. <           break;
  2148. <       case 2:
  2149. <           for (n = 0; n < 6; n++)
  2150. <           {
  2151. <               _delay_ms(pausa);
  2152. <               sendPS2(fkbmode2[n]);
  2153. <               _delay_ms(pausa);
  2154. <               sendPS2(0xF0);
  2155. <               sendPS2(fkbmode2[n]);
  2156. <               _delay_ms(pausa);
  2157. <               eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  2158. <           }
  2159. <           break;
  2160. <       default:
  2161. <           break;
  2162. <       }
  2163. <
  2164. <   }
  2165. <   fnpulsada = 1;
  2166. <   fnpulsando = 1;
  2167. < }
  2168. ---
  2169. >     KBMODE auxmodo = modo;
  2170. >     kbescucha = 0;
  2171. >     KBEXT_BIDIR_OFF;
  2172. >     opqa_cursors = 0;
  2173. >     opqa_numbers = 0;
  2174. >     muestramodo:
  2175. >     if (modokb == zx)  imprimecore(nomZX);
  2176. >     if (modokb == cpc) imprimecore(nomCPC);
  2177. >     if (modokb == msx) imprimecore(nomMSX);
  2178. >     if (modokb == c64) imprimecore(nomC64);
  2179. >     if (modokb == at8) imprimecore(nomAT8);
  2180. >     if (modokb == bbc) imprimecore(nomBBC);
  2181. >     if (modokb == aco) imprimecore(nomACO);
  2182. >     if (modokb == ap2) imprimecore(nomAP2);
  2183. >     if (modokb == vic) imprimecore(nomVIC);
  2184. >     if (modokb == ori) imprimecore(nomORI);
  2185. >     if (modokb == sam) imprimecore(nomSAM);
  2186. >     if (modokb == jup) imprimecore(nomJUP);
  2187. >     if (modokb == sms) imprimecore(nomSMS);
  2188. >     if (modokb == c16) imprimecore(nomC16);
  2189. >     if (modokb == ht8) imprimecore(nomHT8);
  2190. >     if (modokb == galak) imprimecore(nomGALAK);
  2191. >     if (modokb == multi) imprimecore(nomMULTI);
  2192. >     if (modokb == pc) { kbescucha = 1; timeout_escucha = 0; codeset = 2; imprimecore(nomPC); } // Iniciamos la escucha para que se pueda cambiar al core de PC/XT.
  2193. >     if (modokb == pcxt) { kbescucha = 0; codeset = 1; imprimecore(nomPCXT); } // Sin escucha activa para ser usado de forma simultanea junto a un teclado externo.
  2194. >     if (modokb == kbext) { kbescucha = 1; timeout_escucha = 0; codeset = 2; imprimecore(nomKBEXT); KBEXT_BIDIR_ON; } // Iniciamos la escucha y mantenemos activa bidireccionalidad, para que pueda ser usado como teclado externo.
  2195. >
  2196. >     if (modokb > kbext)
  2197. >     {
  2198. >         modokb = auxmodo; // Si no se trata de un modo conocido, mantenemos el anterior y lo imprimimos por pantalla.
  2199. >         goto muestramodo;
  2200. >     }
  2201. >     //Uso normal: CK1 = 20, CK2 = 40 // Para codigo sin optimizar (x12) CK1 = 240, CK2 = 480.  //JOyPs2 CK1=15 CK2=30 //Mio CK1=4 CK2=8
  2202. >     //if(modokb>0) CKm=4; else CKm=1; //Se coge del Nombrecore[]
  2203. >
  2204. >     fnpulsada = 1;
  2205. >     fnpulsando = 1;
  2206. >     cambiomodo = 0; //para salir del bucle del cambiomodo
  2207. >     return modokb;
  2208. >
  2209. > }
  2210. >
  2211. > void is_fn(unsigned char row, unsigned char col)
  2212. > {
  2213. >     pulsa_y_suelta_teclas_modificadoras(1, 1, 1, 1, 1);
  2214. >     matriz[row][col] = 0;
  2215. > }
  2216. >
  2217. > void pulsapausa(unsigned char row, unsigned char col)
  2218. > {
  2219. >     sendPS2_aux(0xE1, 0); sendPS2_aux(0x14, 0); sendPS2_aux(0x77, 0); sendPS2_aux(0xE1, 0);
  2220. >     sendPS2_aux(0xF0, 0); sendPS2_aux(0x14, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(0x77, 0);
  2221. >     _delay_ms(100);
  2222. > }
  2223. >
  2224. > void pulsaimprpant(unsigned char row, unsigned char col)
  2225. > {
  2226. >     sendPS2_aux(0xE0, 0); sendPS2_aux(0x12, 0); sendPS2_aux(0xE0, 0); sendPS2_aux(0x7C, 0);
  2227. >     _delay_ms(100);
  2228. >     sendPS2_aux(0xE0, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(0x12, 0); sendPS2_aux(0xE0, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(0x7C, 0);
  2229. > }
  2230. >
  2231. > void pulsa_alt_code_set1(unsigned char d1, unsigned char d2, unsigned char d3)
  2232. > {
  2233. >
  2234. >     if (d1 + d2 + d3 == 0) return;
  2235. >
  2236. >     sendPS2_aux(KS1_LALT, 0);
  2237. >
  2238. >     if (d1 != 0) { sendPS2_aux(d1, 0); sendPS2_aux(d1 + KS1_RELEASE, 0); }
  2239. >     if (d2 != 0) { sendPS2_aux(d2, 0); sendPS2_aux(d2 + KS1_RELEASE, 0); }
  2240. >     if (d3 != 0) { sendPS2_aux(d3, 0); sendPS2_aux(d3 + KS1_RELEASE, 0); }
  2241. >
  2242. >     sendPS2_aux(KS1_LALT + KS1_RELEASE, 0);
  2243. > }
  2244. >
  2245. > void pulsa_alt_code_set2(unsigned char d1, unsigned char d2, unsigned char d3)
  2246. > {
  2247. >
  2248. >     if (d1 + d2 + d3 == 0) return;
  2249. >
  2250. >     sendPS2_aux(KEY_LALT, 0);
  2251. >
  2252. >     if (d1 != 0) { sendPS2_aux(d1, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(d1, 0); }
  2253. >     if (d2 != 0) { sendPS2_aux(d2, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(d2, 0); }
  2254. >     if (d3 != 0) { sendPS2_aux(d3, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(d3, 0); }
  2255. >
  2256. >     sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_LALT, 0);
  2257. > }
  2258. >
  2259. > void pulsafn(unsigned char row, unsigned char col, unsigned char key, unsigned char key_E0, unsigned char shift, unsigned char ctrl, unsigned char alt, unsigned char altgr, unsigned char lwin)
  2260. > {
  2261. >     if (espera) { _delay_us(5); espera = 0; }
  2262. >     if (shift) { if (codeset == 2) { sendPS2(KEY_LSHIFT); espera++; } else { sendPS2(KS1_LSHIFT); espera++; } }//El Shift no necesita E0
  2263. >     if (ctrl) { if (codeset == 2) { sendPS2(KEY_LCTRL);  espera++; } else { sendPS2(KS1_LCTRL); espera++; } }// Pulsamos siempre el CTRL Izquierdo para mayor compatibilidad con todos los cores.
  2264. >     if (alt) { if (codeset == 2) { sendPS2(KEY_LALT);   espera++; } else { sendPS2(KS1_LALT); espera++; } }// Alt izdo
  2265. >     if (altgr) { if (codeset == 2) { sendPS2(0xE0); sendPS2(KEY_RALT); espera++; } else { sendPS2(0xE0); sendPS2(KS1_RALT); espera++; } }// AltGr
  2266. >     if (lwin) { if (codeset == 2) { sendPS2(0xE0); sendPS2(KEY_LWIN); espera++; } else { sendPS2(0xE0); sendPS2(KS1_LWIN); espera++; } }// LWin
  2267. >     if (espera) { _delay_us(5); espera = 0; }
  2268. >     if (key_E0) { sendPS2(0xE0); } //La tecla requiere modo E0 del PS2
  2269. >     sendPS2(key);
  2270. >     _delay_ms(100);
  2271. >     if (key_E0) { sendPS2(0xE0); }
  2272. >     if (codeset == 2) sendPS2(0xF0);
  2273. >     if (codeset == 2) sendPS2(key); else sendPS2(key + KS1_RELEASE);
  2274. >     matriz[row][col] = 0;
  2275. >     if (shift) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LSHIFT); } else { sendPS2(KS1_LSHIFT + KS1_RELEASE); } }
  2276. >     if (ctrl) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_RCTRL); } else { sendPS2(KS1_RCTRL + KS1_RELEASE); } }
  2277. >     if (alt) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LALT); } else { sendPS2(KS1_RALT + KS1_RELEASE); } }
  2278. >     if (altgr) { if (codeset == 2) { sendPS2(0xE0); sendPS2(0xF0); sendPS2(KEY_LALT); } else { sendPS2(0xE0); sendPS2(KS1_RALT + KS1_RELEASE); } }
  2279. >     if (lwin) { if (codeset == 2) { sendPS2(0xE0); sendPS2(0xF0); sendPS2(KEY_LALT); } else { sendPS2(0xE0); sendPS2(KS1_RALT + KS1_RELEASE); } }
  2280. >     _delay_us(5);
  2281. >     pulsa_y_suelta_teclas_modificadoras(1, 1, 1, 1, 1);
  2282. >     matriz[row][col] = 0;
  2283. > }
  2284. >
  2285. > void traducekey(uint8_t &key, uint8_t &keymodif, KBMODE modokb) // con esta funcion ahorramos muchas matrices de mapas y por tanto memoria dinamica del AVR
  2286. > {
  2287. >     // 0x1 -> LShift
  2288. >     // 0x2 -> LCTrl
  2289. >     // 0x4 -> LAlt
  2290. >     // 0x8 -> RAlt (AltGr)
  2291. >     // 0x10 -> RCTrl
  2292. >     // 0x20 -> Requiere 0xE0
  2293. >
  2294. >     if (modokb == pc && codeset == 1) return; // pcxt tiene su propio mapa con scancodes distintos
  2295. >
  2296. >     // traduccion de key segun el core
  2297. >     if (key != 0)
  2298. >     {
  2299. >         switch (modokb)
  2300. >         {
  2301. > #ifdef symbols_cpc
  2302. >             case cpc:
  2303. >                 keymodif =
  2304. >                 key == KEY_A ? 2 :
  2305. >                 key == KEY_2 ? 0 :
  2306. >                 key == KEY_D ? 0 :
  2307. >                 key == KEY_Y ? 0 :
  2308. >                 key == KEY_U ? 0 :
  2309. >                 key == KEY_O ? 0 :
  2310. >                 key == KEY_V ? 0 :
  2311. >                 key == KEY_Z ? 0 :
  2312. >                 key == KEY_H ? 0 :
  2313. >                 key == KEY_J ? 0 :
  2314. >                 key == KEY_N ? 0 :
  2315. >                 key == KEY_M ? 0 :
  2316. >                 1;
  2317. >                 key =
  2318. >                 key == KEY_2 ? KEY_ACORCHE : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_BKSLASH :
  2319. >                 key == KEY_F ? KEY_CCORCHE : key == KEY_D ? KEY_LESS : key == KEY_S ? KEY_ACORCHE : key == KEY_A ? KEY_2 :
  2320. >                 key == KEY_Y ? KEY_CCORCHE : key == KEY_U ? KEY_BKSLASH : key == KEY_O ? KEY_COMILLA : key == KEY_P ? KEY_2 :
  2321. >                 key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_IGUAL : key == KEY_Z ? KEY_PTOCOMA :
  2322. >                 key == KEY_H ? KEY_IGUAL : key == KEY_J ? KEY_MENOS : key == KEY_K ? KEY_COMILLA : key == KEY_L ? KEY_MENOS :
  2323. >                 key == KEY_B ? KEY_PTOCOMA : key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO :
  2324. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2325. >                 break;
  2326. > #endif
  2327. 931,940c1077,1121
  2328. < //Inicializar Joy2PS2
  2329. < void Joy2PS2Init()
  2330. < {
  2331. <   uint8_t p;
  2332. <
  2333. <   for (p = 0; p < 7; p++)
  2334. <   {
  2335. <       pinSet(pinsJOY2PS2[p], bcdJOY2PS2[p], _IN);
  2336. <       pinPut(pinsJOY2PS2[p], bcdJOY2PS2[p], HI);
  2337. <   }
  2338. ---
  2339. > #ifdef symbols_msx
  2340. >             case msx:
  2341. >                 keymodif =
  2342. >                 key == KEY_W ? 1 :
  2343. >                 key == KEY_E ? 9 :
  2344. >                 key == KEY_I ? 1 :
  2345. >                 key == KEY_1 ? 1 :
  2346. >                 key == KEY_2 ? 8 :
  2347. >                 key == KEY_3 ? 8 :
  2348. >                 key == KEY_4 ? 1 :
  2349. >                 key == KEY_5 ? 1 :
  2350. >                 key == KEY_6 ? 1 :
  2351. >                 key == KEY_8 ? 1 :
  2352. >                 key == KEY_9 ? 1 :
  2353. >                 key == KEY_0 ? 1 :
  2354. >                 key == KEY_T ? 1 :
  2355. >                 key == KEY_Y ? 8 :
  2356. >                 key == KEY_U ? 8 :
  2357. >                 key == KEY_O ? 1 :
  2358. >                 key == KEY_P ? 1 :
  2359. >                 key == KEY_A ? 8 :
  2360. >                 key == KEY_S ? 5 :
  2361. >                 key == KEY_D ? 8 :
  2362. >                 key == KEY_F ? 8 :
  2363. >                 key == KEY_G ? 8 :
  2364. >                 key == KEY_H ? 1 :
  2365. >                 key == KEY_L ? 1 :
  2366. >                 key == KEY_Z ? 1 :
  2367. >                 key == KEY_X ? 9 :
  2368. >                 key == KEY_C ? 1 :
  2369. >                 key == KEY_V ? 1 :
  2370. >                 key == KEY_B ? 1 :
  2371. >                 0;
  2372. >                 key =
  2373. >                 key == KEY_Q ? KEY_TLD : key == KEY_W ? KEY_TLD : key == KEY_E ? KEY_1 : key == KEY_I ? KEY_IGUAL :
  2374. >                 key == KEY_1 ? KEY_1 : key == KEY_2 ? KEY_2 : key == KEY_3 ? KEY_3 : key == KEY_4 ? KEY_4 :
  2375. >                 key == KEY_5 ? KEY_5 : key == KEY_6 ? KEY_6 : key == KEY_7 ? KEY_MENOS : key == KEY_8 ? KEY_8 :
  2376. >                 key == KEY_9 ? KEY_9 : key == KEY_0 ? KEY_SLASH : key == KEY_R ? KEY_LESS : key == KEY_T ? KEY_LESS :
  2377. >                 key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE : key == KEY_O ? KEY_COMA : key == KEY_P ? KEY_2 :
  2378. >                 key == KEY_A ? KEY_4 : key == KEY_S ? KEY_1 : key == KEY_D ? KEY_TLD : key == KEY_F ? KEY_COMILLA :
  2379. >                 key == KEY_G ? KEY_BKSLASH : key == KEY_H ? KEY_ACORCHE : key == KEY_J ? KEY_SLASH : key == KEY_K ? KEY_CCORCHE :
  2380. >                 key == KEY_L ? KEY_0 : key == KEY_Z ? KEY_PUNTO : key == KEY_X ? KEY_4 : key == KEY_C ? KEY_MENOS : key == KEY_3 ? key :
  2381. >                 key == KEY_V ? KEY_7 : key == KEY_B ? KEY_CCORCHE : key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO : 0;
  2382. >                 break;
  2383. > #endif
  2384. 942,944c1123,1149
  2385. <   pinSet(pinsJOY2PS2[5], bcdJOY2PS2[5], _OUT); // Select como salida y en alto.
  2386. <
  2387. < }
  2388. ---
  2389. > #ifdef symbols_c16_c64
  2390. >             case c16:
  2391. >             case c64:
  2392. >                 keymodif =
  2393. >                 key == KEY_0 ? 4 :
  2394. >                 key == KEY_2 ? 0 :
  2395. >                 key == KEY_O ? 0 :
  2396. >                 key == KEY_V ? 0 :
  2397. >                 key == KEY_Z ? 0 :
  2398. >                 key == KEY_H ? 0 :
  2399. >                 key == KEY_J ? 0 :
  2400. >                 key == KEY_K ? 0 :
  2401. >                 key == KEY_L ? 0 :
  2402. >                 key == KEY_B ? 0 :
  2403. >                 key == KEY_N ? 0 :
  2404. >                 key == KEY_M ? 0 :
  2405. >                 1;
  2406. >                 key =
  2407. >                 key == KEY_0 ? KEY_ACORCHE :
  2408. >                 key == KEY_2 ? KEY_ACORCHE : key == KEY_R ? KEY_COMA : key == KEY_T ? KEY_PUNTO : key == KEY_S ? KEY_MENOS :
  2409. >                 key == KEY_Y ? KEY_PTOCOMA : key == KEY_U ? KEY_COMILLA : key == KEY_O ? KEY_COMILLA : key == KEY_P ? KEY_2 :
  2410. >                 key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_BKSLASH :
  2411. >                 key == KEY_J ? KEY_MENOS : key == KEY_K ? KEY_F10 : key == KEY_L ? KEY_IGUAL : key == KEY_B ? KEY_CCORCHE :
  2412. >                 key == KEY_M ? KEY_PUNTO : key == KEY_N ? KEY_COMA :
  2413. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9) ? key : 0;
  2414. >                 break;
  2415. > #endif
  2416. 946,957c1151,1177
  2417. < void TZXDUINO_pushbutton(uint8_t pin, uint8_t bcd)
  2418. < {
  2419. <   // Pulsa
  2420. <   pinPut(pin, bcd, LO);
  2421. <   pinSet(pin, bcd, _OUT);
  2422. <
  2423. <   // Delay de 250 ms
  2424. <   _delay_ms(250);
  2425. <
  2426. <   // Suelta
  2427. <   pinSet(pin, bcd, _IN);
  2428. <   pinPut(pin, bcd, HI);
  2429. ---
  2430. > #ifdef symbols_at8
  2431. >             case at8:
  2432. >                 keymodif =
  2433. >                 key == KEY_T ? 0 :
  2434. >                 key == KEY_R ? 0 :
  2435. >                 key == KEY_W ? 0 :
  2436. >                 key == KEY_Q ? 0 :
  2437. >                 key == KEY_O ? 0 :
  2438. >                 key == KEY_V ? 0 :
  2439. >                 key == KEY_J ? 0 :
  2440. >                 key == KEY_K ? 0 :
  2441. >                 key == KEY_L ? 0 :
  2442. >                 key == KEY_B ? 0 :
  2443. >                 key == KEY_N ? 0 :
  2444. >                 key == KEY_M ? 0 :
  2445. >                 1;
  2446. >                 key =
  2447. >                 key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 : key == KEY_0 ? KEY_ACORCHE :
  2448. >                 key == KEY_2 ? KEY_8 : key == KEY_T ? KEY_IGUAL : key == KEY_R ? KEY_MENOS : key == KEY_W ? KEY_F12 :
  2449. >                 key == KEY_Q ? KEY_F11 : key == KEY_D ? KEY_COMILLA : key == KEY_S ? KEY_CCORCHE : key == KEY_Y ? KEY_COMA :
  2450. >                 key == KEY_U ? KEY_PUNTO : key == KEY_O ? KEY_PTOCOMA : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_SLASH :
  2451. >                 key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_BKSLASH : key == KEY_J ? KEY_ACORCHE :
  2452. >                 key == KEY_K ? KEY_COMILLA : key == KEY_L ? KEY_CCORCHE : key == KEY_B ? KEY_BKSLASH : key == KEY_N ? KEY_COMA :
  2453. >                 key == KEY_M ? KEY_PUNTO :
  2454. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7) ? key : 0;
  2455. >                 break;
  2456. > #endif
  2457. 959c1179,1196
  2458. < }
  2459. ---
  2460. > #ifdef symbols_galak
  2461. >             case galak:
  2462. >                 keymodif =
  2463. >                 key == KEY_O ? 0 :
  2464. >                 key == KEY_L ? 0 :
  2465. >                 key == KEY_Z ? 0 :
  2466. >                 key == KEY_V ? 0 :
  2467. >                 key == KEY_N ? 0 :
  2468. >                 key == KEY_M ? 0 :
  2469. >                 1;
  2470. >                 key =
  2471. >                 key == KEY_O ? KEY_PTOCOMA : key == KEY_L ? KEY_IGUAL : key == KEY_Z ? KEY_ACORCHE : key == KEY_V ? KEY_SLASH :
  2472. >                 key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA :
  2473. >                 key == KEY_P ? KEY_2 : key == KEY_J ? KEY_IGUAL : key == KEY_K ? KEY_PTOCOMA : key == KEY_C ? KEY_SLASH :
  2474. >                 key == KEY_B ? KEY_ACORCHE :
  2475. >                 (key == KEY_3 || key == KEY_6 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2476. >                 break;
  2477. > #endif
  2478. 961,965c1198,1222
  2479. < //Inicializar TZXDUINO
  2480. < void TZXDUINOInit()
  2481. < {
  2482. <   pinSet(TZX_ROOT_PIN, TZX_ROOT_BCD, _IN);
  2483. <   pinPut(TZX_ROOT_PIN, TZX_ROOT_BCD, HI);
  2484. ---
  2485. > #ifdef symbols_multi
  2486. >             case multi:
  2487. >                 keymodif =
  2488. >                 key == KEY_7 ? 0 :
  2489. >                 key == KEY_Y ? 0 :
  2490. >                 key == KEY_U ? 0 :
  2491. >                 key == KEY_O ? 0 :
  2492. >                 key == KEY_J ? 0 :
  2493. >                 key == KEY_L ? 0 :
  2494. >                 key == KEY_V ? 0 :
  2495. >                 key == KEY_N ? 0 :
  2496. >                 key == KEY_M ? 0 :
  2497. >                 1;
  2498. >                 key =
  2499. >                 key == KEY_6 ? KEY_7 : key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 :
  2500. >                 key == KEY_7 ? KEY_COMILLA : key == KEY_0 ? KEY_MENOS : key == KEY_R ? KEY_COMA :
  2501. >                 key == KEY_T ? KEY_PUNTO : key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE :
  2502. >                 key == KEY_O ? KEY_PTOCOMA : key == KEY_P ? KEY_COMILLA : key == KEY_F ? KEY_ACORCHE :
  2503. >                 key == KEY_G ? KEY_CCORCHE : key == KEY_H ? KEY_6 : key == KEY_J ? KEY_MENOS :
  2504. >                 key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL : key == KEY_Z ? KEY_PTOCOMA :
  2505. >                 key == KEY_C ? KEY_SLASH : key == KEY_V ? KEY_SLASH : key == KEY_B ? KEY_8 :
  2506. >                 key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO :
  2507. >                 (key == KEY_2 || key == KEY_3) ? key : 0;
  2508. >                 break;
  2509. > #endif
  2510. 967,968c1224,1249
  2511. <   pinSet(TZX_UP_PIN, TZX_UP_BCD, _IN);
  2512. <   pinPut(TZX_UP_PIN, TZX_UP_BCD, HI);
  2513. ---
  2514. > #ifdef symbols_ht8
  2515. >             case ht8:
  2516. >                 keymodif =
  2517. >                 key == KEY_D ? 0 :
  2518. >                 key == KEY_H ? 0 :
  2519. >                 key == KEY_Y ? 0 :
  2520. >                 key == KEY_U ? 0 :
  2521. >                 key == KEY_2 ? 0 :
  2522. >                 key == KEY_0 ? 0 :
  2523. >                 key == KEY_O ? 0 :
  2524. >                 key == KEY_J ? 0 :
  2525. >                 key == KEY_Z ? 0 :
  2526. >                 key == KEY_V ? 0 :
  2527. >                 key == KEY_N ? 0 :
  2528. >                 key == KEY_M ? 0 :
  2529. >                 1;
  2530. >                 key =
  2531. >                 key == KEY_D ? KEY_F2 : key == KEY_H ? KEY_F4 :
  2532. >                 key == KEY_2 ? KEY_BKSLASH : key == KEY_0 ? KEY_F1 : key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE :
  2533. >                 key == KEY_O ? KEY_PTOCOMA : key == KEY_L ? KEY_IGUAL : key == KEY_Z ? KEY_MENOS : key == KEY_V ? KEY_SLASH :
  2534. >                 key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA :
  2535. >                 key == KEY_P ? KEY_2 : key == KEY_J ? KEY_IGUAL : key == KEY_K ? KEY_PTOCOMA : key == KEY_C ? KEY_SLASH :
  2536. >                 key == KEY_B ? KEY_MENOS :
  2537. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9) ? key : 0;
  2538. >                 break;
  2539. > #endif
  2540. 970,971c1251,1273
  2541. <   pinSet(TZX_DOWN_PIN, TZX_DOWN_BCD, _IN);
  2542. <   pinPut(TZX_DOWN_PIN, TZX_DOWN_BCD, HI);
  2543. ---
  2544. > #ifdef symbols_bbc
  2545. >             case bbc:
  2546. >                 keymodif =
  2547. >                 key == KEY_2 ? 0 :
  2548. >                 key == KEY_W ? 0 :
  2549. >                 key == KEY_A ? 0 :
  2550. >                 key == KEY_O ? 0 :
  2551. >                 key == KEY_V ? 0 :
  2552. >                 key == KEY_Z ? 0 :
  2553. >                 key == KEY_H ? 0 :
  2554. >                 key == KEY_J ? 0 :
  2555. >                 key == KEY_N ? 0 :
  2556. >                 key == KEY_M ? 0 :
  2557. >                 1;
  2558. >                 key =
  2559. >                 key == KEY_2 ? KEY_TLD : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_W ? KEY_F12 :
  2560. >                 key == KEY_Q ? KEY_F12 : key == KEY_S ? KEY_LESS : key == KEY_A ? KEY_MENOS : key == KEY_O ? KEY_PTOCOMA :
  2561. >                 key == KEY_P ? KEY_2 : key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_BKSLASH :
  2562. >                 key == KEY_Z ? KEY_COMILLA : key == KEY_H ? KEY_IGUAL : key == KEY_J ? KEY_BKSLASH : key == KEY_K ? KEY_PTOCOMA :
  2563. >                 key == KEY_L ? KEY_MENOS : key == KEY_B ? KEY_COMILLA : key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO :
  2564. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2565. >                 break;
  2566. > #endif
  2567. 973,974c1275,1295
  2568. <   pinSet(TZX_PLAY_PIN, TZX_PLAY_BCD, _IN);
  2569. <   pinPut(TZX_PLAY_PIN, TZX_PLAY_BCD, HI);
  2570. ---
  2571. > #ifdef symbols_aco
  2572. >             case aco:
  2573. >                 keymodif =
  2574. >                 key == KEY_D ? 0 :
  2575. >                 key == KEY_U ? 0:
  2576. >                 key == KEY_O ? 0 :
  2577. >                 key == KEY_V ? 0 :
  2578. >                 key == KEY_Z ? 0 :
  2579. >                 key == KEY_J ? 0 :
  2580. >                 key == KEY_N ? 0 :
  2581. >                 key == KEY_M ? 0 :
  2582. >                 1;
  2583. >                 key =
  2584. >                 key == KEY_2 ? KEY_0 : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_D ? KEY_BKSLASH :
  2585. >                 key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE : key == KEY_O ? KEY_PTOCOMA : key == KEY_P ? KEY_2 :
  2586. >                 key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_ACORCHE : key == KEY_Z ? KEY_COMILLA :
  2587. >                 key == KEY_J ? KEY_MENOS : key == KEY_K ? KEY_PTOCOMA : key == KEY_L ? KEY_MENOS : key == KEY_B ? KEY_COMILLA :
  2588. >                 key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO :
  2589. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2590. >                 break;
  2591. > #endif
  2592. 976,978c1297,1318
  2593. <   pinSet(TZX_STOP_PIN, TZX_STOP_BCD, _IN);
  2594. <   pinPut(TZX_STOP_PIN, TZX_STOP_BCD, HI);
  2595. < }
  2596. ---
  2597. > #ifdef symbols_ap2
  2598. >             case ap2:
  2599. >                 keymodif =
  2600. >                 key == KEY_7 ? 0 :
  2601. >                 key == KEY_Y ? 0 :
  2602. >                 key == KEY_U ? 0 :
  2603. >                 key == KEY_O ? 0 :
  2604. >                 key == KEY_V ? 0 :
  2605. >                 key == KEY_J ? 0 :
  2606. >                 key == KEY_L ? 0 :
  2607. >                 key == KEY_N ? 0 :
  2608. >                 key == KEY_M ? 0 :
  2609. >                 1;
  2610. >                 key =
  2611. >                 key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_6 ? KEY_7 : key == KEY_7 ? KEY_COMILLA :
  2612. >                 key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 : key == KEY_0 ? KEY_MENOS : key == KEY_Y ? KEY_ACORCHE :
  2613. >                 key == KEY_U ? KEY_CCORCHE : key == KEY_O ? KEY_PTOCOMA : key == KEY_P ? KEY_COMILLA : key == KEY_V ? KEY_SLASH :
  2614. >                 key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_6 : key == KEY_J ? KEY_MENOS :
  2615. >                 key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL : key == KEY_B ? KEY_8 : key == KEY_N ? KEY_COMA :
  2616. >                 key == KEY_M ? KEY_PUNTO : (key == KEY_3 || key == KEY_2) ? key : 0;
  2617. >                 break;
  2618. > #endif
  2619. 980,983c1320,1346
  2620. < //Inicializar Matriz
  2621. < void matrixInit()
  2622. < {
  2623. <   uint8_t c, r;
  2624. ---
  2625. > #ifdef symbols_vic
  2626. >             case vic:
  2627. >                 keymodif =
  2628. >                 key == KEY_H ? 0x20 :
  2629. >                 key == KEY_X ? 0x20 :
  2630. >                 key == KEY_0 ? 2 :
  2631. >                 key == KEY_2 ? 0 :
  2632. >                 key == KEY_O ? 0 :
  2633. >                 key == KEY_V ? 0 :
  2634. >                 key == KEY_Z ? 0 :
  2635. >                 key == KEY_J ? 0 :
  2636. >                 key == KEY_K ? 0 :
  2637. >                 key == KEY_L ? 0 :
  2638. >                 key == KEY_B ? 0 :
  2639. >                 key == KEY_N ? 0 :
  2640. >                 key == KEY_M ? 0 :
  2641. >                 1;
  2642. >                 key =
  2643. >                 key == KEY_H ? KEY_DELETE : key == KEY_X ? KEY_INS : key == KEY_D ? KEY_M : key == KEY_0 ? KEY_ACORCHE :
  2644. >                 key == KEY_2 ? KEY_ACORCHE : key == KEY_R ? KEY_COMA : key == KEY_T ? KEY_PUNTO : key == KEY_S ? KEY_IGUAL :
  2645. >                 key == KEY_Y ? KEY_PTOCOMA : key == KEY_U ? KEY_COMILLA : key == KEY_O ? KEY_COMILLA : key == KEY_P ? KEY_2 :
  2646. >                 key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_J ? KEY_IGUAL :
  2647. >                 key == KEY_K ? KEY_MENOS : key == KEY_L ? KEY_BKSLASH : key == KEY_B ? KEY_CCORCHE : key == KEY_M ? KEY_PUNTO :
  2648. >                 key == KEY_N ? KEY_COMA : key == KEY_0 ? KEY_ACORCHE :
  2649. >                 (key == KEY_3 || key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9) ? key : 0;
  2650. >                 break;
  2651. > #endif
  2652. 985,995c1348,1371
  2653. <   for (c = 0; c<COLS; c++)
  2654. <   {
  2655. <       pinSet(pinsC[c], bcdC[c], _IN);
  2656. <       pinPut(pinsC[c], bcdC[c], HI);
  2657. <   }
  2658. <
  2659. <   for (r = 0; r < ROWS; r++)
  2660. <   {
  2661. <       pinSet(pinsR[r], bcdR[r], _IN);
  2662. <   }
  2663. < }
  2664. ---
  2665. > #ifdef symbols_ori
  2666. >             case ori:
  2667. >                 keymodif =
  2668. >                 key == KEY_D ? 0 :
  2669. >                 key == KEY_7 ? 0 :
  2670. >                 key == KEY_Y ? 0 :
  2671. >                 key == KEY_U ? 0 :
  2672. >                 key == KEY_O ? 0 :
  2673. >                 key == KEY_V ? 0 :
  2674. >                 key == KEY_J ? 0 :
  2675. >                 key == KEY_L ? 0 :
  2676. >                 key == KEY_N ? 0 :
  2677. >                 key == KEY_M ? 0 :
  2678. >                 1;
  2679. >                 key =
  2680. >                 key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_CCORCHE : key == KEY_F ? KEY_ACORCHE :
  2681. >                 key == KEY_D ? KEY_BKSLASH : key == KEY_S ? KEY_BKSLASH : key == KEY_6 ? KEY_7 : key == KEY_7 ? KEY_COMILLA :
  2682. >                 key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 : key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE :
  2683. >                 key == KEY_O ? KEY_PTOCOMA : key == KEY_P ? KEY_COMILLA : key == KEY_V ? KEY_SLASH : key == KEY_C ? KEY_SLASH :
  2684. >                 key == KEY_X ? KEY_MENOS : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_6 : key == KEY_J ? KEY_MENOS :
  2685. >                 key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL : key == KEY_B ? KEY_8 : key == KEY_N ? KEY_COMA :
  2686. >                 key == KEY_M ? KEY_PUNTO : (key == KEY_3 || key == KEY_2) ? key : 0;
  2687. >                 break;
  2688. > #endif
  2689. 997,1016c1373,1396
  2690. < KBMODE cambiarmodo2(KBMODE modokb)
  2691. < {
  2692. <   kbescucha = 0;
  2693. <   KBEXT_BIDIR_OFF;
  2694. <   opqa_cursors = 0;
  2695. <   if (modokb == zx)  CKm = nomZX[nomZX[0] + 1];
  2696. <   if (modokb == cpc) CKm = nomCPC[nomCPC[0] + 1];
  2697. <   if (modokb == msx) CKm = nomMSX[nomMSX[0] + 1];
  2698. <   if (modokb == c64) CKm = nomC64[nomC64[0] + 1];
  2699. <   if (modokb == at8) CKm = nomAT8[nomAT8[0] + 1];
  2700. <   if (modokb == bbc) CKm = nomBBC[nomBBC[0] + 1];
  2701. <   if (modokb == aco) CKm = nomACO[nomACO[0] + 1];
  2702. <   if (modokb == ap2) CKm = nomAP2[nomAP2[0] + 1];
  2703. <   if (modokb == vic) CKm = nomVIC[nomVIC[0] + 1];
  2704. <   if (modokb == ori) CKm = nomORI[nomORI[0] + 1];
  2705. <   if (modokb == sam) CKm = nomSAM[nomSAM[0] + 1];
  2706. <   if (modokb == jup) CKm = nomJUP[nomJUP[0] + 1];
  2707. <   if (modokb == pc) { CKm = nomPC[nomPC[0] + 1]; kbescucha = 1; timeout_escucha = 0; codeset = 2; } // Iniciamos la escucha para que se pueda cambiar al core de PC/XT.
  2708. <   if (modokb == kbext) { CKm = nomKBEXT[nomKBEXT[0] + 1]; kbescucha = 1; timeout_escucha = 0; codeset = 2; KBEXT_BIDIR_ON; } // Iniciamos la escucha y mantenemos activa bidireccionalidad, para que pueda ser usado como teclado externo.
  2709. <   if (modokb == pcxt) { CKm = nomPCXT[nomPCXT[0] + 1]; kbescucha = 0; codeset = 1; imprimecore(nomPCXT); } // Sin escucha activa para ser usado de forma simultanea junto a un teclado externo.
  2710. ---
  2711. > #ifdef symbols_sam
  2712. >             case sam:
  2713. >                 keymodif =
  2714. >                 key == KEY_R ? 0 :
  2715. >                 key == KEY_G ? 0 :
  2716. >                 key == KEY_F ? 0 :
  2717. >                 key == KEY_A ? 0 :
  2718. >                 key == KEY_7 ? 0 :
  2719. >                 key == KEY_X ? 0 :
  2720. >                 key == KEY_J ? 0 :
  2721. >                 key == KEY_K ? 0 :
  2722. >                 key == KEY_N ? 0 :
  2723. >                 key == KEY_M ? 0 :
  2724. >                 1;
  2725. >                 key =
  2726. >                 key == KEY_2 ? KEY_BKSLASH : key == KEY_T ? KEY_LESS : key == KEY_R ? KEY_LESS : key == KEY_G ? KEY_BKSLASH :
  2727. >                 key == KEY_F ? KEY_COMILLA : key == KEY_A ? KEY_PTOCOMA : key == KEY_7 ? KEY_MENOS : key == KEY_0 ? KEY_SLASH :
  2728. >                 key == KEY_O ? KEY_COMA : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_7 : key == KEY_C ? KEY_MENOS :
  2729. >                 key == KEY_X ? KEY_ACORCHE : key == KEY_Z ? KEY_PUNTO : key == KEY_H ? KEY_ACORCHE : key == KEY_J ? KEY_SLASH :
  2730. >                 key == KEY_K ? KEY_CCORCHE : key == KEY_L ? KEY_0 : key == KEY_B ? KEY_CCORCHE : key == KEY_N ? KEY_COMA :
  2731. >                 key == KEY_M ? KEY_PUNTO :
  2732. >                 (key == KEY_3 || key == KEY_6 || key == KEY_8 || key == KEY_9) ? key : 0;
  2733. >                 break;
  2734. > #endif
  2735. 1018,1019c1398,1427
  2736. <   return modokb;
  2737. < }
  2738. ---
  2739. > #ifdef symbols_jup
  2740. >             case jup:
  2741. >                 keymodif =
  2742. >                 key == KEY_U ? 4 :
  2743. >                 key == KEY_S ? 4 :
  2744. >                 key == KEY_A ? 0x10 :
  2745. >                 key == KEY_G ? 0x10 :
  2746. >                 key == KEY_Q ? 0 :
  2747. >                 key == KEY_2 ? 0x10 :
  2748. >                 key == KEY_R ? 0 :
  2749. >                 key == KEY_D ? 0 :
  2750. >                 key == KEY_7 ? 0 :
  2751. >                 key == KEY_X ? 0 :
  2752. >                 key == KEY_H ? 0 :
  2753. >                 key == KEY_J ? 0 :
  2754. >                 key == KEY_K ? 0 :
  2755. >                 key == KEY_N ? 0 :
  2756. >                 key == KEY_M ? 0 :
  2757. >                 1;
  2758. >                 key =
  2759. >                 key == KEY_U ? KEY_CCORCHE : key == KEY_S ? KEY_1 : key == KEY_Q ? KEY_BKSLASH :
  2760. >                 key == KEY_T ? KEY_LESS : key == KEY_R ? KEY_LESS : key == KEY_F ? KEY_COMILLA :
  2761. >                 key == KEY_D ? KEY_TLD : key == KEY_7 ? KEY_MENOS : key == KEY_0 ? KEY_SLASH : key == KEY_Y ? KEY_ACORCHE :
  2762. >                 key == KEY_O ? KEY_COMA : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_7 : key == KEY_C ? KEY_MENOS : key == KEY_X ? KEY_COMILLA :
  2763. >                 key == KEY_Z ? KEY_PUNTO : key == KEY_H ? KEY_ACORCHE : key == KEY_J ? KEY_SLASH : key == KEY_K ? KEY_CCORCHE :
  2764. >                 key == KEY_L ? KEY_0 : key == KEY_B ? KEY_CCORCHE : key == KEY_N ? KEY_COMA : key == KEY_M ? KEY_PUNTO :
  2765. >                 (key == KEY_3 || key == KEY_2 || key == KEY_6 || key == KEY_8 || key == KEY_9 || key == KEY_G || key == KEY_A) ? key : 0;
  2766. >                 break;
  2767. > #endif
  2768. > #ifdef symbols_pc
  2769. 1021,1237c1429,1466
  2770. < KBMODE cambiarmodo(KBMODE modokb)
  2771. < {
  2772. <   KBMODE auxmodo = modo;
  2773. <   kbescucha = 0;
  2774. <   KBEXT_BIDIR_OFF;
  2775. <   opqa_cursors = 0;
  2776. <   if (modokb == zx)  imprimecore(nomZX);
  2777. <   if (modokb == cpc) imprimecore(nomCPC);
  2778. <   if (modokb == msx) imprimecore(nomMSX);
  2779. <   if (modokb == c64) imprimecore(nomC64);
  2780. <   if (modokb == at8) imprimecore(nomAT8);
  2781. <   if (modokb == bbc) imprimecore(nomBBC);
  2782. <   if (modokb == aco) imprimecore(nomACO);
  2783. <   if (modokb == ap2) imprimecore(nomAP2);
  2784. <   if (modokb == vic) imprimecore(nomVIC);
  2785. <   if (modokb == ori) imprimecore(nomORI);
  2786. <   if (modokb == sam) imprimecore(nomSAM);
  2787. <   if (modokb == jup) imprimecore(nomJUP);
  2788. <   if (modokb == pc) { kbescucha = 1; timeout_escucha = 0; codeset = 2; imprimecore(nomPC); } // Iniciamos la escucha para que se pueda cambiar al core de PC/XT.
  2789. <   if (modokb == pcxt) { kbescucha = 0; codeset = 1; imprimecore(nomPCXT); } // Sin escucha activa para ser usado de forma simultanea junto a un teclado externo.
  2790. <   if (modokb == kbext) { kbescucha = 1; timeout_escucha = 0; codeset = 2; imprimecore(nomKBEXT); KBEXT_BIDIR_ON; } // Iniciamos la escucha y mantenemos activa bidireccionalidad, para que pueda ser usado como teclado externo.
  2791. <
  2792. <   if (modokb > kbext) modokb = auxmodo; // Si no se trata de un modo conocido, mantenemos el anterior.
  2793. <
  2794. <   //Uso normal: CK1 = 20, CK2 = 40 // Para codigo sin optimizar (x12) CK1 = 240, CK2 = 480.  //JOyPs2 CK1=15 CK2=30 //Mio CK1=4 CK2=8
  2795. <   //if(modokb>0) CKm=4; else CKm=1; //Se coge del Nombrecore[]
  2796. <
  2797. <   fnpulsada = 1;
  2798. <   fnpulsando = 1;
  2799. <   cambiomodo = 0; //para salir del bucle del cambiomodo
  2800. <
  2801. <   return modokb;
  2802. <
  2803. < }
  2804. <
  2805. < void pulsafn(unsigned char row, unsigned char col, unsigned char key, unsigned char key_E0, unsigned char shift, unsigned char ctrl, unsigned char alt, unsigned char useg)
  2806. < {
  2807. <   if (espera) { _delay_us(5); espera = 0; }
  2808. <   if (shift) { if (codeset == 2) { sendPS2(KEY_LSHIFT); espera++; } else { sendPS2(KS1_LSHIFT); espera++; } }//El Shift no necesita E0
  2809. <   if (ctrl) { if (codeset == 2) { sendPS2(0xE0); sendPS2(KEY_RCTRL);  espera++; } else { sendPS2(0xE0); sendPS2(KS1_RCTRL);  espera++; } }//Se manda E0 para el control derecho (que vale para ambos casos)
  2810. <   if (alt) { if (codeset == 2) { sendPS2(KEY_LALT);   espera++; } else { sendPS2(KS1_LALT);   espera++; } }//Usamos el Alt izdo siempre
  2811. <   if (espera) { _delay_us(5); espera = 0; }
  2812. <   if (key_E0) { sendPS2(0xE0); } //La tecla requiere modo E0 del PS2
  2813. <   sendPS2(key);
  2814. <   _delay_ms(50);
  2815. <   if (key_E0) { sendPS2(0xE0); }
  2816. <   if (codeset == 2) sendPS2(0xF0);
  2817. <   if (codeset == 2) sendPS2(key);  else sendPS2(key + KS1_RELEASE);
  2818. <   matriz[row][col] = 0;
  2819. <   if (shift) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LSHIFT); } else { sendPS2(KS1_LSHIFT + KS1_RELEASE); } }
  2820. <   if (ctrl) { if (codeset == 2) { sendPS2(0xE0); sendPS2(0xF0); sendPS2(KEY_RCTRL); } else { sendPS2(0xE0); sendPS2(KS1_RCTRL + KS1_RELEASE); } }
  2821. <   if (alt) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LALT); } else { sendPS2(KS1_RALT + KS1_RELEASE); } }
  2822. <   _delay_us(5);
  2823. <   fnpulsada = 1;
  2824. <   fnpulsando = 1;
  2825. <   kbalt = 0;
  2826. <   soltarteclas = 1; // Forzamos a que despues todas las teclas esten soltadas para evitar que se quede pulsada la letra asociada al combo.
  2827. < }
  2828. <
  2829. < unsigned char traducekey(unsigned char key, KBMODE modokb) // con esta funcion ahorramos muchas matrices de mapas y por tanto memoria dinamica del AVR
  2830. < {
  2831. <   // Se hace OR 0x80 al key que no requiera shift (KEY_F7 es el unico scancode incompatible, ya se resolveria en caso de necesidad)
  2832. <   // combinaciones no usables, comun a todos los cores
  2833. <   key =
  2834. <       key == KEY_E ? 0 : key == KEY_W ? 0 : key == KEY_Q ? 0 :
  2835. <       key == KEY_I ? 0 : key == KEY_SPACE ? 0 : key == KEY_ENTER ? 0 : key;
  2836. <
  2837. <   if ((modokb == pc || modokb == pcxt || modokb == kbext) && codeset == 1) return key; // pcxt tiene su propio mapa con scancodes distintos
  2838. <
  2839. <                                                 // combinaciones numericas comunes a todos los cores
  2840. <   if (key == KEY_1 || key == KEY_3 || key == KEY_4 || key == KEY_5) return key;
  2841. <
  2842. <   // traduccion de key segun el core
  2843. <   if (key != 0)
  2844. <   {
  2845. <       switch (modokb)
  2846. <       {
  2847. <       case cpc:
  2848. <           key =
  2849. <               key == KEY_2 ? KEY_ACORCHE | 0x80 : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_BKSLASH :
  2850. <               key == KEY_F ? KEY_CCORCHE : key == KEY_D ? KEY_LESS | 0x80 : key == KEY_S ? KEY_ACORCHE : key == KEY_A ? KEY_LESS :
  2851. <               key == KEY_Y ? KEY_CCORCHE | 0x80 : key == KEY_U ? KEY_BKSLASH | 0x80 : key == KEY_O ? KEY_COMILLA | 0x80 : key == KEY_P ? KEY_2 :
  2852. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_IGUAL : key == KEY_Z ? KEY_PTOCOMA | 0x80 :
  2853. <               key == KEY_H ? KEY_IGUAL | 0x80 : key == KEY_J ? KEY_MENOS | 0x80 : key == KEY_K ? KEY_COMILLA : key == KEY_L ? KEY_MENOS :
  2854. <               key == KEY_B ? KEY_PTOCOMA : key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 :
  2855. <
  2856. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2857. <           break;
  2858. <
  2859. <       case msx:
  2860. <           key =
  2861. <               key == KEY_2 ? KEY_COMILLA : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_ACORCHE :
  2862. <               key == KEY_F ? KEY_TLD | 0x80 : key == KEY_D ? KEY_BKSLASH | 0x80 : key == KEY_S ? KEY_BKSLASH : key == KEY_A ? KEY_CCORCHE :
  2863. <               key == KEY_6 ? KEY_COMILLA | 0x80 : key == KEY_7 ? KEY_PTOCOMA : key == KEY_8 ? KEY_0 : key == KEY_0 ? KEY_IGUAL | 0x80 :
  2864. <               key == KEY_Y ? KEY_2 : key == KEY_U ? KEY_ACORCHE | 0x80 : key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_8 :
  2865. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_IGUAL : key == KEY_H ? KEY_7 :
  2866. <               key == KEY_J ? KEY_MENOS | 0x80 : key == KEY_K ? KEY_TLD : key == KEY_L ? KEY_6 : key == KEY_B ? KEY_9 :
  2867. <               key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 : 0;
  2868. <           break;
  2869. <
  2870. <       case c64:
  2871. <           key =
  2872. <               key == KEY_2 ? KEY_ACORCHE | 0x80 : key == KEY_T ? KEY_COMA : key == KEY_R ? KEY_LESS : key == KEY_S ? KEY_MENOS :
  2873. <               key == KEY_Y ? KEY_PTOCOMA : key == KEY_U ? KEY_COMILLA : key == KEY_O ? KEY_COMILLA | 0x80 : key == KEY_P ? KEY_2 :
  2874. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA | 0x80 : key == KEY_H ? KEY_BKSLASH | 0x80 :
  2875. <               key == KEY_J ? KEY_MENOS | 0x80 : key == KEY_K ? KEY_F10 | 0x80 : key == KEY_L ? KEY_IGUAL | 0x80 : key == KEY_B ? KEY_CCORCHE | 0x80 :
  2876. <               key == KEY_N ? KEY_LESS | 0x80 : key == KEY_M ? KEY_COMA | 0x80 :
  2877. <
  2878. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2879. <           break;
  2880. <
  2881. <       case at8:
  2882. <           key =
  2883. <               key == KEY_2 ? KEY_8 : key == KEY_T ? KEY_IGUAL | 0x80 : key == KEY_R ? KEY_MENOS | 0x80 : key == KEY_W ? KEY_F12 | 0x80 :
  2884. <               key == KEY_Q ? KEY_F11 | 0x80 : key == KEY_D ? KEY_COMILLA : key == KEY_S ? KEY_CCORCHE : key == KEY_Y ? KEY_COMA :
  2885. <               key == KEY_U ? KEY_PUNTO : key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_SLASH | 0x80 :
  2886. <               key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_BKSLASH : key == KEY_J ? KEY_ACORCHE | 0x80 :
  2887. <               key == KEY_K ? KEY_COMILLA | 0x80 : key == KEY_L ? KEY_CCORCHE | 0x80 : key == KEY_B ? KEY_BKSLASH | 0x80 : key == KEY_N ? KEY_COMA | 0x80 :
  2888. <               key == KEY_M ? KEY_PUNTO | 0x80 :
  2889. <
  2890. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2891. <           break;
  2892. <
  2893. <       case bbc:
  2894. <           key =
  2895. <               key == KEY_2 ? KEY_TLD | 0x80 : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_W ? KEY_F12 | 0x80 :
  2896. <               key == KEY_Q ? KEY_F12 : key == KEY_S ? KEY_LESS : key == KEY_A ? KEY_MENOS | 0x80 : key == KEY_O ? KEY_PTOCOMA | 0x80 :
  2897. <               key == KEY_P ? KEY_2 : key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_BKSLASH :
  2898. <               key == KEY_Z ? KEY_COMILLA | 0x80 : key == KEY_H ? KEY_IGUAL | 0x80 : key == KEY_J ? KEY_BKSLASH | 0x80 : key == KEY_K ? KEY_PTOCOMA :
  2899. <               key == KEY_L ? KEY_MENOS : key == KEY_B ? KEY_COMILLA : key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 :
  2900. <
  2901. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2902. <           break;
  2903. <
  2904. <       case aco:
  2905. <           key =
  2906. <               key == KEY_2 ? KEY_0 : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_D ? KEY_BKSLASH | 0x80 :
  2907. <               key == KEY_Y ? KEY_ACORCHE : key == KEY_U ? KEY_CCORCHE | 0x80 : key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_2 :
  2908. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_X ? KEY_ACORCHE : key == KEY_Z ? KEY_COMILLA | 0x80 :
  2909. <               key == KEY_J ? KEY_MENOS | 0x80 : key == KEY_K ? KEY_PTOCOMA : key == KEY_L ? KEY_MENOS : key == KEY_B ? KEY_COMILLA :
  2910. <               key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 :
  2911. <
  2912. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2913. <           break;
  2914. <
  2915. <       case ap2:
  2916. <           key =
  2917. <               key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_6 ? KEY_7 : key == KEY_7 ? KEY_COMILLA | 0x80 :
  2918. <               key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 : key == KEY_0 ? KEY_MENOS : key == KEY_Y ? KEY_ACORCHE | 0x80 :
  2919. <               key == KEY_U ? KEY_CCORCHE | 0x80 : key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_COMILLA : key == KEY_V ? KEY_SLASH | 0x80 :
  2920. <               key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_6 : key == KEY_J ? KEY_MENOS | 0x80 :
  2921. <               key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL | 0x80 : key == KEY_B ? KEY_8 : key == KEY_N ? KEY_COMA | 0x80 :
  2922. <               key == KEY_M ? KEY_PUNTO | 0x80 : key == KEY_2 ? key : 0;
  2923. <           break;
  2924. <
  2925. <       case vic:
  2926. <           key =
  2927. <               key == KEY_2 ? KEY_ACORCHE | 0x80 : key == KEY_T ? KEY_COMA : key == KEY_R ? KEY_LESS : key == KEY_S ? KEY_IGUAL :
  2928. <               key == KEY_Y ? KEY_PTOCOMA : key == KEY_U ? KEY_COMILLA : key == KEY_O ? KEY_COMILLA | 0x80 : key == KEY_P ? KEY_2 :
  2929. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA | 0x80 : key == KEY_J ? KEY_IGUAL | 0x80 :
  2930. <               key == KEY_K ? KEY_MENOS | 0x80 : key == KEY_L ? KEY_BKSLASH | 0x80 : key == KEY_B ? KEY_CCORCHE | 0x80 : key == KEY_N ? KEY_LESS | 0x80 :
  2931. <               key == KEY_M ? KEY_COMA | 0x80 :
  2932. <
  2933. <               (key == KEY_6 || key == KEY_7 || key == KEY_8 || key == KEY_9 || key == KEY_0) ? key : 0;
  2934. <           break;
  2935. <
  2936. <       case ori:
  2937. <           key =
  2938. <               key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_CCORCHE : key == KEY_F ? KEY_ACORCHE :
  2939. <               key == KEY_D ? KEY_BKSLASH | 0x80 : key == KEY_S ? KEY_BKSLASH : key == KEY_6 ? KEY_7 : key == KEY_7 ? KEY_COMILLA | 0x80 :
  2940. <               key == KEY_8 ? KEY_9 : key == KEY_9 ? KEY_0 : key == KEY_Y ? KEY_ACORCHE | 0x80 : key == KEY_U ? KEY_CCORCHE | 0x80 :
  2941. <               key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_COMILLA : key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH :
  2942. <               key == KEY_X ? KEY_MENOS : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_6 : key == KEY_J ? KEY_MENOS | 0x80 :
  2943. <               key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL | 0x80 : key == KEY_B ? KEY_8 : key == KEY_N ? KEY_COMA | 0x80 :
  2944. <               key == KEY_M ? KEY_PUNTO | 0x80 : key == KEY_0 ? key : 0;
  2945. <           break;
  2946. <
  2947. <       case sam:
  2948. <           key =
  2949. <               key == KEY_2 ? KEY_BKSLASH : key == KEY_T ? KEY_LESS : key == KEY_R ? KEY_LESS | 0x80 : key == KEY_G ? KEY_BKSLASH | 0x80 :
  2950. <               key == KEY_F ? KEY_COMILLA | 0x80 : key == KEY_A ? KEY_PTOCOMA | 0x80 : key == KEY_7 ? KEY_MENOS | 0x80 : key == KEY_0 ? KEY_SLASH :
  2951. <               key == KEY_O ? KEY_COMA : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_7 : key == KEY_C ? KEY_MENOS :
  2952. <               key == KEY_X ? KEY_ACORCHE | 0x80 : key == KEY_Z ? KEY_PUNTO : key == KEY_H ? KEY_ACORCHE : key == KEY_J ? KEY_SLASH | 0x80 :
  2953. <               key == KEY_K ? KEY_CCORCHE | 0x80 : key == KEY_L ? KEY_0 : key == KEY_B ? KEY_CCORCHE : key == KEY_N ? KEY_COMA | 0x80 :
  2954. <               key == KEY_M ? KEY_PUNTO | 0x80 :
  2955. <
  2956. <               (key == KEY_6 || key == KEY_8 || key == KEY_9) ? key : 0;
  2957. <           break;
  2958. <
  2959. <       case jup:
  2960. <           key =
  2961. <               key == KEY_2 ? KEY_BKSLASH | 0x80 : key == KEY_T ? KEY_LESS : key == KEY_R ? KEY_LESS | 0x80 : key == KEY_F ? KEY_COMILLA :
  2962. <               key == KEY_D ? KEY_TLD | 0x80 : key == KEY_7 ? KEY_MENOS | 0x80 : key == KEY_0 ? KEY_SLASH : key == KEY_Y ? KEY_ACORCHE :
  2963. <               key == KEY_O ? KEY_COMA : key == KEY_P ? KEY_2 : key == KEY_V ? KEY_7 : key == KEY_C ? KEY_MENOS : key == KEY_X ? KEY_COMILLA | 0x80 :
  2964. <               key == KEY_Z ? KEY_PUNTO : key == KEY_H ? KEY_ACORCHE | 0x80 : key == KEY_J ? KEY_SLASH | 0x80 : key == KEY_K ? KEY_CCORCHE | 0x80 :
  2965. <               key == KEY_L ? KEY_0 : key == KEY_B ? KEY_CCORCHE : key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 :
  2966. <
  2967. <               (key == KEY_6 || key == KEY_8 || key == KEY_9) ? key : 0;
  2968. <           break;
  2969. <       case pc:
  2970. <       case pcxt:
  2971. <       case kbext:
  2972. <           key =
  2973. <               key == KEY_0 ? KEY_MENOS : key == KEY_9 ? KEY_0 : key == KEY_8 ? KEY_9 : key == KEY_7 ? KEY_COMILLA | 0x80 :
  2974. <               key == KEY_6 ? KEY_7 : key == KEY_T ? KEY_PUNTO : key == KEY_R ? KEY_COMA : key == KEY_G ? KEY_CCORCHE :
  2975. <               key == KEY_F ? KEY_ACORCHE : key == KEY_D ? KEY_LESS | 0x80 : key == KEY_S ? KEY_BKSLASH : key == KEY_A ? KEY_TLD :
  2976. <               key == KEY_Y ? KEY_ACORCHE | 0x80 : key == KEY_U ? KEY_CCORCHE | 0x80 : key == KEY_O ? KEY_PTOCOMA | 0x80 : key == KEY_P ? KEY_COMILLA :
  2977. <               key == KEY_V ? KEY_SLASH | 0x80 : key == KEY_C ? KEY_SLASH : key == KEY_Z ? KEY_PTOCOMA : key == KEY_H ? KEY_6 :
  2978. <               key == KEY_J ? KEY_MENOS | 0x80 : key == KEY_K ? KEY_IGUAL : key == KEY_L ? KEY_IGUAL | 0x80 : key == KEY_B ? KEY_8 :
  2979. <               key == KEY_N ? KEY_COMA | 0x80 : key == KEY_M ? KEY_PUNTO | 0x80 : key == KEY_2 ? key : 0;
  2980. <           break;
  2981. <
  2982. <       default:
  2983. <           key = 0;
  2984. <           break;
  2985. <       }
  2986. <   }
  2987. ---
  2988. >             case pc: // scancodes set 2
  2989. >                 keymodif =
  2990. >                 key == KEY_A ? 0x40 :
  2991. >                 key == KEY_X ? 0x40 :
  2992. >                 key == KEY_2 ? 8 :
  2993. >                 key == KEY_3 ? 8 :
  2994. >                 key == KEY_Q ? 0 :
  2995. >                 key == KEY_E ? 0 :
  2996. >                 key == KEY_R ? 0 :
  2997. >                 key == KEY_S ? 8 :
  2998. >                 key == KEY_D ? 8 :
  2999. >                 key == KEY_F ? 8 :
  3000. >                 key == KEY_G ? 8 :
  3001. >                 key == KEY_7 ? 0 :
  3002. >                 key == KEY_U ? 8 :
  3003. >                 key == KEY_Y ? 8 :
  3004. >                 key == KEY_K ? 0 :
  3005. >                 key == KEY_J ? 0 :
  3006. >                 key == KEY_M ? 0 :
  3007. >                 key == KEY_N ? 0 :
  3008. >                 1;
  3009. >                 key =
  3010. >                 key == KEY_A ? 126 : key == KEY_X ? 156 :
  3011. >                 key == KEY_Q ? KEY_TLD : key == KEY_W ? KEY_TLD : key == KEY_E ? KEY_IGUAL : key == KEY_R ? KEY_LESS : key == KEY_T ? KEY_LESS :
  3012. >                 key == KEY_S ? KEY_1 : key == KEY_D ? KEY_TLD : key == KEY_F ? KEY_COMILLA : key == KEY_G ? KEY_BKSLASH : key == KEY_0 ? KEY_SLASH :
  3013. >                 key == KEY_7 ? KEY_MENOS : key == KEY_P ? KEY_2 : key == KEY_O ? KEY_COMA : key == KEY_I ? KEY_IGUAL : key == KEY_U ? KEY_CCORCHE :
  3014. >                 key == KEY_Y ? KEY_ACORCHE : key == KEY_Z ? KEY_PUNTO : key == KEY_C ? KEY_MENOS : key == KEY_V ? KEY_7 : key == KEY_L ? KEY_0 :
  3015. >                 key == KEY_K ? KEY_CCORCHE : key == KEY_J ? KEY_SLASH : key == KEY_H ? KEY_ACORCHE : key == KEY_M ? KEY_PUNTO :
  3016. >                 key == KEY_N ? KEY_COMA : key == KEY_B ? KEY_CCORCHE :
  3017. >                 (key == KEY_2 || key == KEY_3 || key == KEY_6 || key == KEY_8 || key == KEY_9) ? key : 0;
  3018. >                 break;
  3019. > #endif
  3020. >
  3021. >             default:
  3022. >                 key = 0;
  3023. >                 break;
  3024. >         }
  3025. >     }
  3026. 1239c1468
  3027. <   return key;
  3028. ---
  3029. >     return;
  3030. 1244,1256c1473,1525
  3031. <   unsigned char key = 0, shift = 0;
  3032. <   typematicfirst = 0;
  3033. <   typematic_codeaux = 0;
  3034. <   key = traducekey(mapZX[row][col], modokb);
  3035. <   if (key != 0)
  3036. <   {
  3037. <       if ((modokb == pc || modokb == pcxt || modokb == kbext) && codeset == 1) { key = mapXT1[row][col]; shift = modXT1[row][col]; }
  3038. <       else { shift = !(key & 0x80); if (!shift) key ^= 0x80; }
  3039. <
  3040. <       if (shift) { if (codeset == 2) { sendPS2(KEY_LSHIFT); typematic_codeaux = KEY_LSHIFT; } else { sendPS2(KS1_LSHIFT); typematic_codeaux = KS1_LSHIFT; } }
  3041. <       sendPS2(key);
  3042. <       typematic_code = key;
  3043. <   }
  3044. ---
  3045. >     // 0x1 -> LShift
  3046. >     // 0x2 -> LCTrl
  3047. >     // 0x4 -> LAlt
  3048. >     // 0x8 -> RAlt (AltGr)
  3049. >     // 0x10 -> RCTrl
  3050. >     // 0x20 -> Requiere 0xE0
  3051. >
  3052. >     uint8_t key = 0, keymodif = 0;
  3053. >     unsigned char shift = 0, ctrl = 0, rctrl = 0, alt = 0, altgr = 0, specialkey = 0, altcode = 0;
  3054. >     typematicfirst = 0;
  3055. >     typematic_codeaux = 0;
  3056. >     key = codeset == 1 ? mapSET1[row][col] : mapZX[row][col];
  3057. >
  3058. >     if (modo)
  3059. >     {
  3060. >         traducekey(key, keymodif, modokb);
  3061. >         if (key)
  3062. >         {
  3063. >             if (modokb == pc && codeset == 1) { key = mapXT1[row][col]; shift = modXT1[row][col] & 1; altgr = modXT1[row][col] & 8; altcode = modXT1[row][col] & 0x40; }
  3064. >                 else
  3065. >                 {
  3066. >                     shift = (keymodif & 0x1) == 0x1;
  3067. >                     ctrl = (keymodif & 0x2) == 0x2;
  3068. >                     alt = (keymodif & 0x4) == 0x4;
  3069. >                     altgr = (keymodif & 0x8) == 0x8;
  3070. >                     rctrl = (keymodif & 0x10) == 0x10;
  3071. >                     specialkey = (keymodif & 0x20) == 0x20;
  3072. >                     altcode = (keymodif & 0x40) == 0x40;
  3073. >                 }
  3074. >
  3075. >             if (key && !altcode)
  3076. >             {
  3077. >                 if (shift) { if (codeset == 2) { sendPS2(KEY_LSHIFT); typematic_codeaux = KEY_LSHIFT; } else { sendPS2(KS1_LSHIFT); typematic_codeaux = KS1_LSHIFT; } }
  3078. >                 if (ctrl) { if (codeset == 2) { sendPS2(KEY_LCTRL); typematic_codeaux = KEY_LCTRL; } }
  3079. >                 if (alt) { if (codeset == 2) { sendPS2(KEY_LALT); typematic_codeaux = KEY_LALT; } }
  3080. >                 if (altgr) { sendPS2_aux(0xE0, 0); if (codeset == 2) sendPS2(KEY_RALT); else sendPS2(KS1_RALT); } // typematic_codeaux = KEY_RALT; } }
  3081. >                 if (rctrl) { if (codeset == 2) { sendPS2_aux(0xE0, 0); sendPS2(KEY_RCTRL); } } // typematic_codeaux = KEY_RCTRL; } }
  3082. >                 if (specialkey) sendPS2_aux(0xE0, 0);
  3083. >                 if (!altcode)
  3084. >                 {
  3085. >                   sendPS2((uint8_t)key);
  3086. >                  typematic_code = (uint8_t)key;
  3087. >                }
  3088. >             }
  3089. >         }
  3090. >     }
  3091. >     else
  3092. >     {
  3093. >         key = mapZX[row][col];
  3094. >         sendPS2(KEY_LCTRL); typematic_codeaux = KEY_LCTRL;
  3095. >         sendPS2((uint8_t)key);
  3096. >         typematic_code = (uint8_t)key;
  3097. >     }
  3098. 1260,1273c1529,1596
  3099. <   unsigned char key = 0, shift = 0;
  3100. <   typematic_code = 0;
  3101. <   key = traducekey(mapZX[row][col], modokb);
  3102. <   if (key != 0)
  3103. <   {
  3104. <       if ((modokb == pc || modokb == pcxt || modokb == kbext) && codeset == 1) { key = mapXT1[row][col]; shift = modXT1[row][col]; }
  3105. <       else { shift = !(key & 0x80); if (!shift) key ^= 0x80; }
  3106. <
  3107. <       if (codeset == 2) { sendPS2(0xF0); sendPS2(key); }
  3108. <       else sendPS2(key + KS1_RELEASE);
  3109. <
  3110. <       if (shift) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LSHIFT); } else sendPS2(KS1_LSHIFT + KS1_RELEASE); }
  3111. <
  3112. <   }
  3113. ---
  3114. >     // 0x1 -> LShift
  3115. >     // 0x2 -> LCTrl
  3116. >     // 0x4 -> LAlt
  3117. >     // 0x8 -> RAlt (AltGr)
  3118. >     // 0x10 -> RCTrl
  3119. >     // 0x20 -> Requiere 0xE0
  3120. >
  3121. >     uint8_t key = 0, keymodif = 0;
  3122. >     unsigned char shift = 0, ctrl = 0, rctrl = 0, alt = 0, altgr = 0, specialkey = 0, altcode = 0;
  3123. >     unsigned char d1 = 0, d2 = 0, d3 = 0;
  3124. >     typematic_code = 0;
  3125. >     key = mapZX[row][col];
  3126. >     if (modo)
  3127. >     {
  3128. >         traducekey(key, keymodif, modokb);
  3129. >         if (key)
  3130. >         {
  3131. >             if (modokb == pc && codeset == 1) { key = mapXT1[row][col]; shift = modXT1[row][col] & 1; altgr = modXT1[row][col] & 8; altcode = modXT1[row][col] & 0x40; }
  3132. >             else
  3133. >             {
  3134. >                 shift = (keymodif & 0x1) == 0x1;
  3135. >                 ctrl = (keymodif & 0x2) == 0x2;
  3136. >                 alt = (keymodif & 0x4) == 0x4;
  3137. >                 altgr = (keymodif & 0x8) == 0x8;
  3138. >                 rctrl = (keymodif & 0x10) == 0x10;
  3139. >                 specialkey = (keymodif & 0x20) == 0x20;
  3140. >                 altcode = (keymodif & 0x40) == 0x40;
  3141. >             }
  3142. >
  3143. >             if (key)
  3144. >             {
  3145. >                 if (!altcode)
  3146. >                 {
  3147. >                     if (codeset == 2)
  3148. >                     {
  3149. >                         if (specialkey) sendPS2_aux(0xE0, 0);
  3150. >                         sendPS2(0xF0);
  3151. >                         sendPS2((uint8_t)key);
  3152. >                     }
  3153. >                     else sendPS2((uint8_t)key + KS1_RELEASE);
  3154. >
  3155. >                     if (shift) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LSHIFT); } else sendPS2(KS1_LSHIFT + KS1_RELEASE); }
  3156. >                     if (ctrl) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LCTRL); } }
  3157. >                     if (alt) { if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_LALT); } }
  3158. >                     if (altgr) { sendPS2(0xE0); if (codeset == 2) { sendPS2(0xF0); sendPS2(KEY_RALT); } else sendPS2(KS1_RALT + KS1_RELEASE); }
  3159. >                     if (rctrl) { if (codeset == 2) { sendPS2(0xE0); sendPS2(0xF0); sendPS2(KEY_RCTRL); } }
  3160. >
  3161. >                 }
  3162. >                 else
  3163. >                 {
  3164. >                     if (key == 126) { d1 = codeset == 2 ? KEYPAD_1 : KS1PAD_1; d2 = codeset == 2 ? KEYPAD_2 : KS1PAD_2; d3 = codeset == 2 ? KEYPAD_6 : KS1PAD_6; }
  3165. >                     if (key == 156) { d1 = codeset == 2 ? KEYPAD_1 : KS1PAD_1; d2 = codeset == 2 ? KEYPAD_5 : KS1PAD_5; d3 = codeset == 2 ? KEYPAD_6 : KS1PAD_6; }
  3166. >
  3167. >                     if (codeset == 1) pulsa_alt_code_set1(d1, d2, d3);
  3168. >                     if (codeset == 2) pulsa_alt_code_set2(d1, d2, d3);
  3169. >
  3170. >                 }
  3171. >
  3172. >             }
  3173. >
  3174. >         }
  3175. >     }
  3176. >     else
  3177. >     {
  3178. >         key = mapZX[row][col];
  3179. >         sendPS2(0xF0); sendPS2((uint8_t)key);
  3180. >         sendPS2(0xF0); sendPS2(KEY_LCTRL);
  3181. >     }
  3182. 1277,1290c1600,1613
  3183. <   typematicfirst = 0;
  3184. <   typematic_codeaux = 0;
  3185. <   if (!key) //si no esta mapeada saca la mayuscula
  3186. <   {
  3187. <       if (codeset == 2) { sendPS2(KEY_LSHIFT); typematic_codeaux = KEY_LSHIFT; } else { sendPS2(KS1_LSHIFT); typematic_codeaux = KS1_LSHIFT; }
  3188. <       if (codeset == 2) { sendPS2(mapZX[row][col]); typematic_code = mapZX[row][col]; } else { sendPS2(mapSET1[row][col]); typematic_code = mapSET1[row][col]; }
  3189. <   }
  3190. <   else
  3191. <   {
  3192. <       if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) { sendPS2(0xE0); typematic_codeaux = 0xE0; } //Es una tecla del codeset2 que necesita E0
  3193. <       if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) { sendPS2(0xE0); typematic_codeaux = 0xE0; }//Es una tecla del codeset1 que necesita E0
  3194. <       sendPS2(key);
  3195. <       typematic_code = key;
  3196. <   }
  3197. ---
  3198. >     typematicfirst = 0;
  3199. >     typematic_codeaux = 0;
  3200. >     if (!key) //si no esta mapeada saca la mayuscula
  3201. >     {
  3202. >         if (codeset == 2) { sendPS2(KEY_LSHIFT); typematic_codeaux = KEY_LSHIFT; } else { sendPS2(KS1_LSHIFT); typematic_codeaux = KS1_LSHIFT; }
  3203. >         if (codeset == 2) { sendPS2(mapZX[row][col]); typematic_code = mapZX[row][col]; } else { sendPS2(mapSET1[row][col]); typematic_code = mapSET1[row][col]; }
  3204. >     }
  3205. >     else
  3206. >     {
  3207. >         if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) { sendPS2(0xE0); typematic_codeaux = 0xE0; } //Es una tecla del codeset2 que necesita E0
  3208. >         if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) { sendPS2(0xE0); typematic_codeaux = 0xE0; }//Es una tecla del codeset1 que necesita E0
  3209. >         sendPS2(key);
  3210. >         typematic_code = key;
  3211. >     }
  3212. 1295,1307c1618,1630
  3213. <   typematic_code = 0;
  3214. <   if (!key) //si no esta mapeada saca la mayuscula
  3215. <   {
  3216. <       if (codeset == 2) { sendPS2(0xF0); sendPS2(mapZX[row][col]); sendPS2(0xF0); sendPS2(KEY_LSHIFT); }
  3217. <       else { sendPS2(mapSET1[row][col] + KS1_RELEASE); sendPS2(KS1_LSHIFT + KS1_RELEASE); }
  3218. <   }
  3219. <   else
  3220. <   {
  3221. <       if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
  3222. <       if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) sendPS2(0xE0); //Es una tecla del codeset1 que necesita E0
  3223. <       if (codeset == 2) { sendPS2(0xF0); sendPS2(key); }
  3224. <       else sendPS2(key + KS1_RELEASE);
  3225. <   }
  3226. ---
  3227. >     typematic_code = 0;
  3228. >     if (!key) //si no esta mapeada saca la mayuscula
  3229. >     {
  3230. >         if (codeset == 2) { sendPS2(0xF0); sendPS2(mapZX[row][col]); sendPS2(0xF0); sendPS2(KEY_LSHIFT); }
  3231. >         else { sendPS2(mapSET1[row][col] + KS1_RELEASE); sendPS2(KS1_LSHIFT + KS1_RELEASE); }
  3232. >     }
  3233. >     else
  3234. >     {
  3235. >         if (codeset == 2 && (key == KEY_LEFT || key == KEY_RIGHT || key == KEY_UP || key == KEY_DOWN)) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
  3236. >         if (codeset == 1 && (key == KS1_LEFT || key == KS1_RIGHT || key == KS1_UP || key == KS1_DOWN)) sendPS2(0xE0); //Es una tecla del codeset1 que necesita E0
  3237. >         if (codeset == 2) { sendPS2(0xF0); sendPS2(key); }
  3238. >         else sendPS2(key + KS1_RELEASE);
  3239. >     }
  3240. 1312,1555c1635,1878
  3241. <   uint8_t isextra2a = 1;
  3242. <   uint8_t re = 0, ce = 0, rt = 0, ct = 0;
  3243. <   uint8_t csss_status = 0;
  3244. <
  3245. <   switch (mapZX[r][c])
  3246. <   {
  3247. <
  3248. <   case KEY_COMILLA:
  3249. <       re = SYMBOL_SHIFT_ROW;
  3250. <       ce = SYMBOL_SHIFT_COL;
  3251. <       rt = Y_P_ROW;
  3252. <       ct = P_COL;
  3253. <       ss_counter += p;
  3254. <       break;
  3255. <   case KEY_PTOCOMA:
  3256. <       re = SYMBOL_SHIFT_ROW;
  3257. <       ce = SYMBOL_SHIFT_COL;
  3258. <       rt = Y_P_ROW;
  3259. <       ct = O_COL;
  3260. <       ss_counter += p;
  3261. <       break;
  3262. <   case KEY_F1:
  3263. <       re = CAPS_SHIFT_ROW;
  3264. <       ce = CAPS_SHIFT_COL;
  3265. <       rt = N1_N5_ROW;
  3266. <       ct = N1_COL;
  3267. <       cs_counter += p;
  3268. <       break;
  3269. <   case KEY_F3:
  3270. <       re = CAPS_SHIFT_ROW;
  3271. <       ce = CAPS_SHIFT_COL;
  3272. <       rt = N1_N5_ROW;
  3273. <       ct = N3_COL;
  3274. <       cs_counter += p;
  3275. <       break;
  3276. <   case KEY_F4:
  3277. <       re = CAPS_SHIFT_ROW;
  3278. <       ce = CAPS_SHIFT_COL;
  3279. <       rt = N1_N5_ROW;
  3280. <       ct = N4_COL;
  3281. <       cs_counter += p;
  3282. <       break;
  3283. <   case KEY_F9:
  3284. <       re = CAPS_SHIFT_ROW;
  3285. <       ce = CAPS_SHIFT_COL;
  3286. <       rt = N6_N0_ROW;
  3287. <       ct = N9_COL;
  3288. <       cs_counter += p;
  3289. <       break;
  3290. <   case KEY_CAPS:
  3291. <       re = CAPS_SHIFT_ROW;
  3292. <       ce = CAPS_SHIFT_COL;
  3293. <       rt = N1_N5_ROW;
  3294. <       ct = N2_COL;
  3295. <       cs_counter += p;
  3296. <       break;
  3297. <   case KEY_DOWN:
  3298. <       re = CAPS_SHIFT_ROW;
  3299. <       ce = CAPS_SHIFT_COL;
  3300. <       rt = N6_N0_ROW;
  3301. <       ct = N6_COL;
  3302. <       cs_counter += p;
  3303. <       break;
  3304. <   case KEY_TAB:
  3305. <       re = CAPS_SHIFT_ROW;
  3306. <       ce = CAPS_SHIFT_COL;
  3307. <       rt = SYMBOL_SHIFT_ROW;
  3308. <       ct = SYMBOL_SHIFT_COL;
  3309. <       cs_counter += p;
  3310. <       break;
  3311. <
  3312. <   default:
  3313. <       isextra2a = 0;
  3314. <       break;
  3315. <   }
  3316. <
  3317. <   if (del_break_value)
  3318. <   {
  3319. <       switch (mapZX[r][c])
  3320. <       {
  3321. <
  3322. <       case KEY_ESCAPE:
  3323. <           re = CAPS_SHIFT_ROW;
  3324. <           ce = CAPS_SHIFT_COL;
  3325. <           rt = N6_N0_ROW;
  3326. <           ct = N0_COL;
  3327. <           cs_counter += p;
  3328. <           isextra2a = 1;
  3329. <           break;
  3330. <
  3331. <       case KEY_BACKSP:
  3332. <           re = CAPS_SHIFT_ROW;
  3333. <           ce = CAPS_SHIFT_COL;
  3334. <           rt = SPACE_ROW;
  3335. <           ct = SPACE_COL;
  3336. <           cs_counter += p;
  3337. <           isextra2a = 1;
  3338. <           break;
  3339. <
  3340. <       default:
  3341. <           break;
  3342. <       }
  3343. <
  3344. <   }
  3345. <   else
  3346. <   {
  3347. <       switch (mapZX[r][c])
  3348. <       {
  3349. <
  3350. <       case KEY_BACKSP:
  3351. <           re = CAPS_SHIFT_ROW;
  3352. <           ce = CAPS_SHIFT_COL;
  3353. <           rt = N6_N0_ROW;
  3354. <           ct = N0_COL;
  3355. <           cs_counter += p;
  3356. <           isextra2a = 1;
  3357. <           break;
  3358. <
  3359. <       case KEY_ESCAPE:
  3360. <           re = CAPS_SHIFT_ROW;
  3361. <           ce = CAPS_SHIFT_COL;
  3362. <           rt = SPACE_ROW;
  3363. <           ct = SPACE_COL;
  3364. <           cs_counter += p;
  3365. <           isextra2a = 1;
  3366. <           break;
  3367. <
  3368. <       default:
  3369. <           break;
  3370. <       }
  3371. <   }
  3372. <
  3373. <   if (cursors_kbpc_value)
  3374. <   {
  3375. <
  3376. <       switch (mapZX[r][c])
  3377. <       {
  3378. <
  3379. <       case KEY_LEFT:
  3380. <           re = SYMBOL_SHIFT_ROW;
  3381. <           ce = SYMBOL_SHIFT_COL;
  3382. <           rt = B_M_ROW;
  3383. <           ct = M_COL;
  3384. <           ss_counter += p;
  3385. <           isextra2a = 1;
  3386. <           break;
  3387. <       case KEY_RIGHT:
  3388. <           re = SYMBOL_SHIFT_ROW;
  3389. <           ce = SYMBOL_SHIFT_COL;
  3390. <           rt = B_M_ROW;
  3391. <           ct = N_COL;
  3392. <           ss_counter += p;
  3393. <           isextra2a = 1;
  3394. <           break;
  3395. <       case KEY_UP:
  3396. <           re = CAPS_SHIFT_ROW;
  3397. <           ce = CAPS_SHIFT_COL;
  3398. <           rt = N1_N5_ROW;
  3399. <           ct = N5_COL;
  3400. <           cs_counter += p;
  3401. <           isextra2a = 1;
  3402. <           break;
  3403. <       case KEY_PUNTO:
  3404. <           re = CAPS_SHIFT_ROW;
  3405. <           ce = CAPS_SHIFT_COL;
  3406. <           rt = N6_N0_ROW;
  3407. <           ct = N7_COL;
  3408. <           cs_counter += p;
  3409. <           isextra2a = 1;
  3410. <           break;
  3411. <       case KEY_COMA:
  3412. <           re = CAPS_SHIFT_ROW;
  3413. <           ce = CAPS_SHIFT_COL;
  3414. <           rt = N6_N0_ROW;
  3415. <           ct = N8_COL;
  3416. <           cs_counter += p;
  3417. <           isextra2a = 1;
  3418. <           break;
  3419. <
  3420. <       default:
  3421. <           break;
  3422. <       }
  3423. <
  3424. <   }
  3425. <   else
  3426. <   {
  3427. <       switch (mapZX[r][c])
  3428. <       {
  3429. <
  3430. <       case KEY_PUNTO:
  3431. <           re = SYMBOL_SHIFT_ROW;
  3432. <           ce = SYMBOL_SHIFT_COL;
  3433. <           rt = B_M_ROW;
  3434. <           ct = M_COL;
  3435. <           ss_counter += p;
  3436. <           isextra2a = 1;
  3437. <           break;
  3438. <       case KEY_COMA:
  3439. <           re = SYMBOL_SHIFT_ROW;
  3440. <           ce = SYMBOL_SHIFT_COL;
  3441. <           rt = B_M_ROW;
  3442. <           ct = N_COL;
  3443. <           ss_counter += p;
  3444. <           isextra2a = 1;
  3445. <           break;
  3446. <       case KEY_LEFT:
  3447. <           re = CAPS_SHIFT_ROW;
  3448. <           ce = CAPS_SHIFT_COL;
  3449. <           rt = N1_N5_ROW;
  3450. <           ct = N5_COL;
  3451. <           cs_counter += p;
  3452. <           isextra2a = 1;
  3453. <           break;
  3454. <       case KEY_UP:
  3455. <           re = CAPS_SHIFT_ROW;
  3456. <           ce = CAPS_SHIFT_COL;
  3457. <           rt = N6_N0_ROW;
  3458. <           ct = N7_COL;
  3459. <           cs_counter += p;
  3460. <           isextra2a = 1;
  3461. <           break;
  3462. <       case KEY_RIGHT:
  3463. <           re = CAPS_SHIFT_ROW;
  3464. <           ce = CAPS_SHIFT_COL;
  3465. <           rt = N6_N0_ROW;
  3466. <           ct = N8_COL;
  3467. <           cs_counter += p;
  3468. <           isextra2a = 1;
  3469. <           break;
  3470. <
  3471. <       default:
  3472. <           break;
  3473. <       }
  3474. <   }
  3475. <
  3476. <   if (isextra2a)
  3477. <   {
  3478. <       csss_status = matriz[rt][ct] & 0x18;
  3479. <       if (p == -1)
  3480. <       {
  3481. <           if (cs_counter == 0 && ss_counter == 0) matriz[re][ce] = matriz[r][c];
  3482. <       }
  3483. <       else matriz[re][ce] = matriz[r][c];
  3484. <       matriz[rt][ct] = matriz[r][c] | csss_status;
  3485. ---
  3486. >     uint8_t isextra2a = 1;
  3487. >     uint8_t re = 0, ce = 0, rt = 0, ct = 0;
  3488. >     uint8_t csss_status = 0;
  3489. >
  3490. >     switch (mapZX[r][c])
  3491. >     {
  3492. >
  3493. >     case KEY_COMILLA:
  3494. >         re = SYMBOL_SHIFT_ROW;
  3495. >         ce = SYMBOL_SHIFT_COL;
  3496. >         rt = Y_P_ROW;
  3497. >         ct = P_COL;
  3498. >         ss_counter += p;
  3499. >         break;
  3500. >     case KEY_PTOCOMA:
  3501. >         re = SYMBOL_SHIFT_ROW;
  3502. >         ce = SYMBOL_SHIFT_COL;
  3503. >         rt = Y_P_ROW;
  3504. >         ct = O_COL;
  3505. >         ss_counter += p;
  3506. >         break;
  3507. >     case KEY_F1:
  3508. >         re = CAPS_SHIFT_ROW;
  3509. >         ce = CAPS_SHIFT_COL;
  3510. >         rt = N1_N5_ROW;
  3511. >         ct = N1_COL;
  3512. >         cs_counter += p;
  3513. >         break;
  3514. >     case KEY_F3:
  3515. >         re = CAPS_SHIFT_ROW;
  3516. >         ce = CAPS_SHIFT_COL;
  3517. >         rt = N1_N5_ROW;
  3518. >         ct = N3_COL;
  3519. >         cs_counter += p;
  3520. >         break;
  3521. >     case KEY_F4:
  3522. >         re = CAPS_SHIFT_ROW;
  3523. >         ce = CAPS_SHIFT_COL;
  3524. >         rt = N1_N5_ROW;
  3525. >         ct = N4_COL;
  3526. >         cs_counter += p;
  3527. >         break;
  3528. >     case KEY_F9:
  3529. >         re = CAPS_SHIFT_ROW;
  3530. >         ce = CAPS_SHIFT_COL;
  3531. >         rt = N6_N0_ROW;
  3532. >         ct = N9_COL;
  3533. >         cs_counter += p;
  3534. >         break;
  3535. >     case KEY_CAPS:
  3536. >         re = CAPS_SHIFT_ROW;
  3537. >         ce = CAPS_SHIFT_COL;
  3538. >         rt = N1_N5_ROW;
  3539. >         ct = N2_COL;
  3540. >         cs_counter += p;
  3541. >         break;
  3542. >     case KEY_DOWN:
  3543. >         re = CAPS_SHIFT_ROW;
  3544. >         ce = CAPS_SHIFT_COL;
  3545. >         rt = N6_N0_ROW;
  3546. >         ct = N6_COL;
  3547. >         cs_counter += p;
  3548. >         break;
  3549. >     case KEY_TAB:
  3550. >         re = CAPS_SHIFT_ROW;
  3551. >         ce = CAPS_SHIFT_COL;
  3552. >         rt = SYMBOL_SHIFT_ROW;
  3553. >         ct = SYMBOL_SHIFT_COL;
  3554. >         cs_counter += p;
  3555. >         break;
  3556. >
  3557. >     default:
  3558. >         isextra2a = 0;
  3559. >         break;
  3560. >     }
  3561. >
  3562. >     if (del_break_value)
  3563. >     {
  3564. >         switch (mapZX[r][c])
  3565. >         {
  3566. >
  3567. >         case KEY_ESCAPE:
  3568. >             re = CAPS_SHIFT_ROW;
  3569. >             ce = CAPS_SHIFT_COL;
  3570. >             rt = N6_N0_ROW;
  3571. >             ct = N0_COL;
  3572. >             cs_counter += p;
  3573. >             isextra2a = 1;
  3574. >             break;
  3575. >
  3576. >         case KEY_BACKSP:
  3577. >             re = CAPS_SHIFT_ROW;
  3578. >             ce = CAPS_SHIFT_COL;
  3579. >             rt = SPACE_ROW;
  3580. >             ct = SPACE_COL;
  3581. >             cs_counter += p;
  3582. >             isextra2a = 1;
  3583. >             break;
  3584. >
  3585. >         default:
  3586. >             break;
  3587. >         }
  3588. >
  3589. >     }
  3590. >     else
  3591. >     {
  3592. >         switch (mapZX[r][c])
  3593. >         {
  3594. >
  3595. >         case KEY_BACKSP:
  3596. >             re = CAPS_SHIFT_ROW;
  3597. >             ce = CAPS_SHIFT_COL;
  3598. >             rt = N6_N0_ROW;
  3599. >             ct = N0_COL;
  3600. >             cs_counter += p;
  3601. >             isextra2a = 1;
  3602. >             break;
  3603. >
  3604. >         case KEY_ESCAPE:
  3605. >             re = CAPS_SHIFT_ROW;
  3606. >             ce = CAPS_SHIFT_COL;
  3607. >             rt = SPACE_ROW;
  3608. >             ct = SPACE_COL;
  3609. >             cs_counter += p;
  3610. >             isextra2a = 1;
  3611. >             break;
  3612. >
  3613. >         default:
  3614. >             break;
  3615. >         }
  3616. >     }
  3617. >
  3618. >     if (cursors_kbpc_value)
  3619. >     {
  3620. >
  3621. >         switch (mapZX[r][c])
  3622. >         {
  3623. >
  3624. >         case KEY_LEFT:
  3625. >             re = SYMBOL_SHIFT_ROW;
  3626. >             ce = SYMBOL_SHIFT_COL;
  3627. >             rt = B_M_ROW;
  3628. >             ct = M_COL;
  3629. >             ss_counter += p;
  3630. >             isextra2a = 1;
  3631. >             break;
  3632. >         case KEY_RIGHT:
  3633. >             re = SYMBOL_SHIFT_ROW;
  3634. >             ce = SYMBOL_SHIFT_COL;
  3635. >             rt = B_M_ROW;
  3636. >             ct = N_COL;
  3637. >             ss_counter += p;
  3638. >             isextra2a = 1;
  3639. >             break;
  3640. >         case KEY_UP:
  3641. >             re = CAPS_SHIFT_ROW;
  3642. >             ce = CAPS_SHIFT_COL;
  3643. >             rt = N1_N5_ROW;
  3644. >             ct = N5_COL;
  3645. >             cs_counter += p;
  3646. >             isextra2a = 1;
  3647. >             break;
  3648. >         case KEY_PUNTO:
  3649. >             re = CAPS_SHIFT_ROW;
  3650. >             ce = CAPS_SHIFT_COL;
  3651. >             rt = N6_N0_ROW;
  3652. >             ct = N7_COL;
  3653. >             cs_counter += p;
  3654. >             isextra2a = 1;
  3655. >             break;
  3656. >         case KEY_COMA:
  3657. >             re = CAPS_SHIFT_ROW;
  3658. >             ce = CAPS_SHIFT_COL;
  3659. >             rt = N6_N0_ROW;
  3660. >             ct = N8_COL;
  3661. >             cs_counter += p;
  3662. >             isextra2a = 1;
  3663. >             break;
  3664. >
  3665. >         default:
  3666. >             break;
  3667. >         }
  3668. >
  3669. >     }
  3670. >     else
  3671. >     {
  3672. >         switch (mapZX[r][c])
  3673. >         {
  3674. >
  3675. >         case KEY_PUNTO:
  3676. >             re = SYMBOL_SHIFT_ROW;
  3677. >             ce = SYMBOL_SHIFT_COL;
  3678. >             rt = B_M_ROW;
  3679. >             ct = M_COL;
  3680. >             ss_counter += p;
  3681. >             isextra2a = 1;
  3682. >             break;
  3683. >         case KEY_COMA:
  3684. >             re = SYMBOL_SHIFT_ROW;
  3685. >             ce = SYMBOL_SHIFT_COL;
  3686. >             rt = B_M_ROW;
  3687. >             ct = N_COL;
  3688. >             ss_counter += p;
  3689. >             isextra2a = 1;
  3690. >             break;
  3691. >         case KEY_LEFT:
  3692. >             re = CAPS_SHIFT_ROW;
  3693. >             ce = CAPS_SHIFT_COL;
  3694. >             rt = N1_N5_ROW;
  3695. >             ct = N5_COL;
  3696. >             cs_counter += p;
  3697. >             isextra2a = 1;
  3698. >             break;
  3699. >         case KEY_UP:
  3700. >             re = CAPS_SHIFT_ROW;
  3701. >             ce = CAPS_SHIFT_COL;
  3702. >             rt = N6_N0_ROW;
  3703. >             ct = N7_COL;
  3704. >             cs_counter += p;
  3705. >             isextra2a = 1;
  3706. >             break;
  3707. >         case KEY_RIGHT:
  3708. >             re = CAPS_SHIFT_ROW;
  3709. >             ce = CAPS_SHIFT_COL;
  3710. >             rt = N6_N0_ROW;
  3711. >             ct = N8_COL;
  3712. >             cs_counter += p;
  3713. >             isextra2a = 1;
  3714. >             break;
  3715. >
  3716. >         default:
  3717. >             break;
  3718. >         }
  3719. >     }
  3720. >
  3721. >     if (isextra2a)
  3722. >     {
  3723. >         csss_status = matriz[rt][ct] & 0x18;
  3724. >         if (p == -1)
  3725. >         {
  3726. >             if (cs_counter == 0 && ss_counter == 0) matriz[re][ce] = matriz[r][c];
  3727. >         }
  3728. >         else matriz[re][ce] = matriz[r][c];
  3729. >         matriz[rt][ct] = matriz[r][c] | csss_status;
  3730. 1557c1880
  3731. <   }
  3732. ---
  3733. >     }
  3734. 1561a1885,1997
  3735. > void pulsa_y_suelta_teclas_modificadoras(uint8_t control, uint8_t alt, uint8_t shift, uint8_t altgr, uint8_t lwin)
  3736. > {
  3737. >
  3738. >     if (control)
  3739. >     {
  3740. >         switch (kbcontrol)
  3741. >         {
  3742. >         case 1:
  3743. >             if (codeset == 2) sendPS2_aux(KEY_LCTRL, 0); else sendPS2_aux(KS1_LCTRL, 0);
  3744. >             kbcontrol = 2;
  3745. >             break;
  3746. >         case 2:
  3747. >             _delay_ms(delay_specialkeys); // Antes de liberarla añadimos un pequeño delay
  3748. >             if (codeset == 2) { sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_LCTRL, 0); }
  3749. >             else sendPS2_aux(KS1_LCTRL + KS1_RELEASE, 0);
  3750. >             kbcontrol = 0;
  3751. >             break;
  3752. >         default:
  3753. >             break;
  3754. >         }
  3755. >     }
  3756. >
  3757. >     if (alt)
  3758. >     {
  3759. >         switch (kbalt)
  3760. >         {
  3761. >         case 1:
  3762. >             if (codeset == 2) sendPS2_aux(KEY_LALT, 0); else sendPS2_aux(KS1_LALT, 0);
  3763. >             kbalt = 2;
  3764. >             break;
  3765. >         case 2:
  3766. >             _delay_ms(delay_specialkeys); // Antes de liberarla añadimos un pequeño delay
  3767. >             if (codeset == 2) { sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_LALT, 0); }
  3768. >             else sendPS2_aux(KS1_LALT + KS1_RELEASE, 0);
  3769. >             kbalt = 0;
  3770. >             break;
  3771. >         default:
  3772. >             break;
  3773. >         }
  3774. >     }
  3775. >
  3776. >     if (shift)
  3777. >     {
  3778. >         switch (kbshift)
  3779. >         {
  3780. >         case 1:
  3781. >             if (codeset == 2) sendPS2_aux(KEY_LSHIFT, 0); else sendPS2_aux(KS1_LSHIFT, 0);
  3782. >             kbshift = 2;
  3783. >             break;
  3784. >         case 2:
  3785. >       _delay_ms(delay_specialkeys); // Antes de liberarla añadimos un pequeño delay
  3786. >             if (codeset == 2) { sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_LSHIFT, 0); }
  3787. >             else sendPS2_aux(KS1_LSHIFT + KS1_RELEASE, 0);
  3788. >             kbshift = 0;
  3789. >             break;
  3790. >         default:
  3791. >             break;
  3792. >         }
  3793. >     }
  3794. >
  3795. >     if (altgr)
  3796. >     {
  3797. >         switch (kbaltgr)
  3798. >         {
  3799. >         case 1:
  3800. >             if (codeset == 2) { sendPS2_aux(0xE0, 0); sendPS2_aux(KEY_RALT, 0); }
  3801. >             else { sendPS2_aux(0xE0, 0); sendPS2_aux(KS1_RALT, 0); }
  3802. >             kbaltgr = 2;
  3803. >             break;
  3804. >         case 2:
  3805. >             _delay_ms(delay_specialkeys); // Antes de liberarla añadimos un pequeño delay
  3806. >             if (codeset == 2) { sendPS2_aux(0xE0, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_RALT, 0); }
  3807. >             else { sendPS2_aux(0xE0, 0); sendPS2_aux(KS1_RALT + KS1_RELEASE, 0); }
  3808. >             kbaltgr = 0;
  3809. >             break;
  3810. >         default:
  3811. >             break;
  3812. >         }
  3813. >     }
  3814. >
  3815. >     if (lwin)
  3816. >     {
  3817. >         switch (kblwin)
  3818. >         {
  3819. >         case 1:
  3820. >             if (codeset == 2) { sendPS2_aux(0xE0, 0); sendPS2_aux(KEY_LWIN, 0); }
  3821. >             else { sendPS2_aux(0xE0, 0); sendPS2_aux(KS1_LWIN, 0); }
  3822. >             kblwin = 2;
  3823. >             break;
  3824. >         case 2:
  3825. >             _delay_ms(delay_specialkeys); // Antes de liberarla añadimos un pequeño delay
  3826. >             if (codeset == 2) { sendPS2_aux(0xE0, 0); sendPS2_aux(0xF0, 0); sendPS2_aux(KEY_LWIN, 0); }
  3827. >             else { sendPS2_aux(0xE0, 0); sendPS2_aux(KS1_LWIN + KS1_RELEASE, 0); }
  3828. >             kblwin = 0;
  3829. >             break;
  3830. >         default:
  3831. >             break;
  3832. >         }
  3833. >     }
  3834. >
  3835. > }
  3836. >
  3837. > void espera_a_soltar_tecla(uint8_t r, uint8_t c)
  3838. > {
  3839. >      //activar row/fila
  3840. >      pinSet(pinsR[r], bcdR[r], _OUT);
  3841. >      pinPut(pinsR[r], bcdR[r], LO);
  3842. >      _delay_us(5);
  3843. >      while (pinStat(pinsC[c], bcdC[c])) true;
  3844. >      //desact. row/fila
  3845. >      pinSet(pinsR[r], bcdR[r], _IN);
  3846. > }
  3847. >
  3848. 1564,1595c2000,2035
  3849. <   p1prev.up = p1.up;
  3850. <   p1prev.down = p1.down;
  3851. <   p1prev.left = p1.left;
  3852. <   p1prev.right = p1.right;
  3853. <   p1prev.select = p1.select; p1.select = 0;
  3854. <   p1prev.start = p1.start; p1.start = 0;
  3855. <   p1prev.button1 = p1.button1;
  3856. <   p1prev.button2 = p1.button2;
  3857. <   p1prev.button3 = p1.button3; p1.button3 = 0;
  3858. <   p1prev.button4 = p1.button4; p1.button4 = 0;
  3859. <   p1prev.button5 = p1.button5; p1.button5 = 0;
  3860. <   p1prev.button6 = p1.button6; p1.button6 = 0;
  3861. <
  3862. <   _delay_ms(10); // Para evitar efecto rebote en la lectura de pulsaciones de los gamepads
  3863. <
  3864. <   ReadDB9();
  3865. <   CheckP1SelectStartNesClon();
  3866. <
  3867. <   if (p1.up != p1prev.up) sendCodeMR(P1KeyMap[0], !p1.up, codeset);
  3868. <   if (p1.down != p1prev.down) sendCodeMR(P1KeyMap[1], !p1.down, codeset);
  3869. <   if (p1.left != p1prev.left) sendCodeMR(P1KeyMap[2], !p1.left, codeset);
  3870. <   if (p1.right != p1prev.right) sendCodeMR(P1KeyMap[3], !p1.right, codeset);
  3871. <
  3872. <   if (p1.select != p1prev.select) sendCodeMR(P1KeyMap[4], !p1.select, codeset);
  3873. <   if (p1.start != p1prev.start) sendCodeMR(P1KeyMap[5], !p1.start, codeset);
  3874. <
  3875. <   if (p1.button1 != p1prev.button1) sendCodeMR(P1KeyMap[6], !p1.button1, codeset);
  3876. <   if (p1.button2 != p1prev.button2) sendCodeMR(P1KeyMap[7], !p1.button2, codeset);
  3877. <   if (p1.button3 != p1prev.button3) sendCodeMR(P1KeyMap[8], !p1.button3, codeset);
  3878. <   if (p1.button4 != p1prev.button4) sendCodeMR(P1KeyMap[9], !p1.button4, codeset);
  3879. <   if (p1.button5 != p1prev.button5) sendCodeMR(P1KeyMap[10], !p1.button5, codeset);
  3880. <   if (p1.button6 != p1prev.button6) sendCodeMR(P1KeyMap[11], !p1.button6, codeset);
  3881. ---
  3882. >     p1prev.up = p1.up;
  3883. >     p1prev.down = p1.down;
  3884. >     p1prev.left = p1.left;
  3885. >     p1prev.right = p1.right;
  3886. >     p1prev.select = p1.select; p1.select = 0;
  3887. >     p1prev.start = p1.start; p1.start = 0;
  3888. >     p1prev.button1 = p1.button1;
  3889. >     p1prev.button2 = p1.button2;
  3890. >     p1prev.button3 = p1.button3; p1.button3 = 0;
  3891. >     p1prev.button4 = p1.button4; p1.button4 = 0;
  3892. >     p1prev.button5 = p1.button5; p1.button5 = 0;
  3893. >     p1prev.button6 = p1.button6; p1.button6 = 0;
  3894. >
  3895. >     _delay_ms(10); // Para evitar efecto rebote en la lectura de pulsaciones de los gamepads
  3896. >
  3897. >     if (famicom) ReadFamicom();
  3898. >     else
  3899. >     {
  3900. >         ReadDB9();
  3901. >         CheckP1SelectStartNesClon();
  3902. >     }
  3903. >
  3904. >     if (p1.up != p1prev.up) sendCodeMR(P1KeyMap[0], !p1.up, codeset);
  3905. >     if (p1.down != p1prev.down) sendCodeMR(P1KeyMap[1], !p1.down, codeset);
  3906. >     if (p1.left != p1prev.left) sendCodeMR(P1KeyMap[2], !p1.left, codeset);
  3907. >     if (p1.right != p1prev.right) sendCodeMR(P1KeyMap[3], !p1.right, codeset);
  3908. >
  3909. >     if (p1.select != p1prev.select) sendCodeMR(P1KeyMap[4], !p1.select, codeset);
  3910. >     if (p1.start != p1prev.start) sendCodeMR(P1KeyMap[5], !p1.start, codeset);
  3911. >
  3912. >     if (p1.button1 != p1prev.button1) sendCodeMR(P1KeyMap[6], !p1.button1, codeset);
  3913. >     if (p1.button2 != p1prev.button2) sendCodeMR(P1KeyMap[7], !p1.button2, codeset);
  3914. >     if (p1.button3 != p1prev.button3) sendCodeMR(P1KeyMap[8], !p1.button3, codeset);
  3915. >     if (p1.button4 != p1prev.button4) sendCodeMR(P1KeyMap[9], !p1.button4, codeset);
  3916. >     if (p1.button5 != p1prev.button5) sendCodeMR(P1KeyMap[10], !p1.button5, codeset);
  3917. >     if (p1.button6 != p1prev.button6) sendCodeMR(P1KeyMap[11], !p1.button6, codeset);
  3918. 1599,1600c2039,2040
  3919. <   uint8_t r, c;
  3920. <   uint8_t keyaux = 0;
  3921. ---
  3922. >     uint8_t r, c;
  3923. >     uint8_t keyaux = 0;
  3924. 1602,1661c2042,2101
  3925. <   fnpulsada = 0; //Se pone a 0 la pulsacion de una tecla de funcion
  3926. <
  3927. <   if (pinStat(SYSTEM_PIN, SYSTEM_BCD)) // Gestion del switch SYSTEM (RESET)
  3928. <   {
  3929. <       _delay_us(10); //debounce
  3930. <       if (pinStat(SYSTEM_PIN, SYSTEM_BCD))
  3931. <       {
  3932. <           if (zxuno_encendido == 1) // Apagar ZX-Uno
  3933. <           {
  3934. <               tiemout_poweroff--;
  3935. <               _delay_ms(10);
  3936. <               if (tiemout_poweroff < 100)
  3937. <               {
  3938. <                   tiemout_poweroff = 300;
  3939. <                   zxuno_encendido = 0;
  3940. <                   POWER_OFF;
  3941. <                   while (pinStat(SYSTEM_PIN, SYSTEM_BCD)) _delay_ms(250);
  3942. <               }
  3943. <           }
  3944. <           else // Encender ZX-Uno
  3945. <           {
  3946. <               tiemout_poweroff = 300;
  3947. <               zxuno_encendido = 1;
  3948. <               POWER_ON;
  3949. <               _delay_ms(250);
  3950. <           }
  3951. <       }
  3952. <   }
  3953. <   else
  3954. <   {
  3955. <       if (tiemout_poweroff < 300)
  3956. <       {
  3957. <           RESET_ON;
  3958. <           _delay_ms(100);
  3959. <           RESET_OFF;
  3960. <           _delay_ms(250);
  3961. <       }
  3962. <       tiemout_poweroff = 300;
  3963. <   }
  3964. <
  3965. <   rescan:
  3966. <
  3967. <   //Escaneo de la matriz del teclado
  3968. <   if (!fnpulsada) for (r = 0; r < ROWS; r++)
  3969. <   {
  3970. <       //activar row/fila
  3971. <       pinSet(pinsR[r], bcdR[r], _OUT);
  3972. <       pinPut(pinsR[r], bcdR[r], LO);
  3973. <       _delay_us(5);
  3974. <       for (c = 0; c < COLS; c++)
  3975. <       {
  3976. <
  3977. <           if (pinStat(pinsC[c], bcdC[c]))
  3978. <           {
  3979. <               _delay_us(10); //debounce
  3980. <               if (pinStat(pinsC[c], bcdC[c]))
  3981. <               {
  3982. <                   if (matriz[r][c] & 0x01)
  3983. <                   {
  3984. <                       matriz[r][c] |= 0x02; //Marcado como mantenido "0x02"
  3985. ---
  3986. >     fnpulsada = 0; //Se pone a 0 la pulsacion de una tecla de funcion
  3987. >
  3988. >     if (pinStat(SYSTEM_PIN, SYSTEM_BCD)) // Gestion del switch SYSTEM (RESET)
  3989. >     {
  3990. >         _delay_us(10); //debounce
  3991. >         if (pinStat(SYSTEM_PIN, SYSTEM_BCD))
  3992. >         {
  3993. >             if (zxuno_encendido == 1) // Apagar ZX-Uno
  3994. >             {
  3995. >                 tiemout_poweroff--;
  3996. >                 _delay_ms(10);
  3997. >                 if (tiemout_poweroff < 100)
  3998. >                 {
  3999. >                     tiemout_poweroff = 300;
  4000. >                     zxuno_encendido = 0;
  4001. >                     POWER_OFF;
  4002. >                     while (pinStat(SYSTEM_PIN, SYSTEM_BCD)) _delay_ms(250);
  4003. >                 }
  4004. >             }
  4005. >             else // Encender ZX-Uno
  4006. >             {
  4007. >                 tiemout_poweroff = 300;
  4008. >                 zxuno_encendido = 1;
  4009. >                 POWER_ON;
  4010. >                 _delay_ms(250);
  4011. >             }
  4012. >         }
  4013. >     }
  4014. >     else
  4015. >     {
  4016. >         if (tiemout_poweroff < 300)
  4017. >         {
  4018. >             RESET_ON;
  4019. >             _delay_ms(100);
  4020. >             RESET_OFF;
  4021. >             _delay_ms(250);
  4022. >         }
  4023. >         tiemout_poweroff = 300;
  4024. >     }
  4025. >
  4026. >     rescan:
  4027. >
  4028. >     //Escaneo de la matriz del teclado
  4029. >     if (!fnpulsada) for (r = 0; r < ROWS; r++)
  4030. >     {
  4031. >         //activar row/fila
  4032. >         pinSet(pinsR[r], bcdR[r], _OUT);
  4033. >         pinPut(pinsR[r], bcdR[r], LO);
  4034. >         _delay_us(5);
  4035. >         for (c = 0; c < COLS; c++)
  4036. >         {
  4037. >
  4038. >             if (pinStat(pinsC[c], bcdC[c]))
  4039. >             {
  4040. >                 _delay_us(10); //debounce
  4041. >                 if (pinStat(pinsC[c], bcdC[c]))
  4042. >                 {
  4043. >                     if (matriz[r][c] & 0x01)
  4044. >                     {
  4045. >                         matriz[r][c] |= 0x02; //Marcado como mantenido "0x02"
  4046. 1663,1671c2103,2111
  4047. <                       if (r > 7 && c > 4) // pulsa extra +2A/+3
  4048. <                       {
  4049. <                           traduceextra2a(r, c, 0);
  4050. <                       }
  4051. < #endif
  4052. <                   }
  4053. <                   else
  4054. <                   {
  4055. <                       matriz[r][c] |= 0x01; // Marcado como pulsado "0x01"
  4056. ---
  4057. >                         if (r > 7 && c > 4) // pulsa extra +2A/+3
  4058. >                         {
  4059. >                             traduceextra2a(r, c, 0);
  4060. >                         }
  4061. > #endif
  4062. >                     }
  4063. >                     else
  4064. >                     {
  4065. >                         matriz[r][c] |= 0x01; // Marcado como pulsado "0x01"
  4066. 1673,1686c2113,2124
  4067. <                       if (r > 7 && c > 4) // pulsa extra +2A/+3
  4068. <                       {
  4069. <                           traduceextra2a(r, c, 1);
  4070. <                       }
  4071. < #endif
  4072. <                   }
  4073. <
  4074. <               }
  4075. <
  4076. <               else if (matriz[r][c] & 0x01)
  4077. <               {
  4078. <                   matriz[r][c] &= ~0x02; // Ya no esta mantenida "~0x02"
  4079. <                   matriz[r][c] &= ~0x01; // Ya no esta pulsada "~0x01"
  4080. <                   matriz[r][c] |= 0x04; // Marcado para soltar la tecla "0x04" (si entra por debounce)
  4081. ---
  4082. >                         if (r > 7 && c > 4) // pulsa extra +2A/+3
  4083. >                         {
  4084. >                             traduceextra2a(r, c, 1);
  4085. >                         }
  4086. > #endif
  4087. >                     }
  4088. >                 }
  4089. >                 else if (matriz[r][c] & 0x01)
  4090. >                 {
  4091. >                     matriz[r][c] &= ~0x02; // Ya no esta mantenida "~0x02"
  4092. >                     matriz[r][c] &= ~0x01; // Ya no esta pulsada "~0x01"
  4093. >                     matriz[r][c] |= 0x04; // Marcado para soltar la tecla "0x04" (si entra por debounce)
  4094. 1688,1692c2126,2130
  4095. <                   if (r > 7 && c > 4) // suelta extra +2A/+3
  4096. <                   {
  4097. <                       traduceextra2a(r, c, -1);
  4098. <                       matriz[r][c] = 0;
  4099. <                   }
  4100. ---
  4101. >                     if (r > 7 && c > 4) // suelta extra +2A/+3
  4102. >                     {
  4103. >                         traduceextra2a(r, c, -1);
  4104. >                         matriz[r][c] = 0;
  4105. >                     }
  4106. 1695,1701c2133,2139
  4107. <               }
  4108. <           }
  4109. <           else if (matriz[r][c] & 0x01)
  4110. <           {
  4111. <               matriz[r][c] &= ~0x02; // Ya no esta mantenida "~0x02"
  4112. <               matriz[r][c] &= ~0x01; // Ya no esta pulsada "~0x01"
  4113. <               matriz[r][c] |= 0x04; // Marcado para soltar la tecla "0x04"
  4114. ---
  4115. >                 }
  4116. >             }
  4117. >             else if (matriz[r][c] & 0x01)
  4118. >             {
  4119. >                 matriz[r][c] &= ~0x02; // Ya no esta mantenida "~0x02"
  4120. >                 matriz[r][c] &= ~0x01; // Ya no esta pulsada "~0x01"
  4121. >                 matriz[r][c] |= 0x04; // Marcado para soltar la tecla "0x04"
  4122. 1703,2060c2141,2147
  4123. <               if (r > 7 && c > 4) // suelta extra +2A/+3
  4124. <               {
  4125. <                   traduceextra2a(r, c, -1);
  4126. <                   matriz[r][c] = 0;
  4127. <               }
  4128. < #endif
  4129. <           }
  4130. <
  4131. <       }//Fin de Escaneo de las Columnas para el Row/Fila indicado
  4132. <        //desact. row/fila
  4133. <       pinSet(pinsR[r], bcdR[r], _IN);
  4134. <   } //fin escaneo de Rows/Filas de la matriz del teclado
  4135. <
  4136. <   if (soltarteclas)
  4137. <   {
  4138. <       soltarteclas = 0;
  4139. <       for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++) if (matriz[r][c] & 0x01) soltarteclas = 1;
  4140. <       goto rescan;
  4141. <   }
  4142. <
  4143. <   if (cambiomodo)
  4144. <   {
  4145. <       if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x04) { matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0; if (!modo) { sendPS2(0xF0); sendPS2(CAPS_SHIFT); } }
  4146. <       if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x04) { matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0; if (!modo) { sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); } }
  4147. <
  4148. <       if (matriz[Q_T_ROW][T_COL] & 0x01) cambia_tzxduino(); // TZXDUINO ON / OFF
  4149. <       if (matriz[Y_P_ROW][P_COL] & 0x01) cambia_cursors_kbpc(); // XCHG CURSORS KBPC ON / OFF
  4150. <       if (matriz[Y_P_ROW][O_COL] & 0x01) cambia_del_break(); // XCHG DEL BREAK ON / OFF
  4151. <
  4152. <       for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++) if (matriz[r][c] & 0x01) modo = cambiarmodo( ((KBMODE)(mapMODO[r][c])) );
  4153. <
  4154. <       fnpulsada = 1; //Si no se pulsa ninguna tecla sigue en bucle hasta que se pulse
  4155. <   }
  4156. <   //Comprobacion de Teclas especiales al tener pulsado Caps Shift y Symbol Shift
  4157. <   if (!fnpulsada && (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01))
  4158. <   {
  4159. <       if (!fnpulsando)
  4160. <       {//row, col, key, key_E0, shift, ctrl, alt, museg
  4161. <
  4162. <           if (modo == pc || modo == pcxt || modo == kbext)
  4163. <           {
  4164. <               if (matriz[Z_V_ROW][C_COL] & 0x01) opqa_cursors = !opqa_cursors; // OPQA -> Cursores (Activacion / Desactivacion)
  4165. <               if (matriz[H_L_ROW][L_COL] & 0x01) kbalt = 1; // Modo Alt activado para F1 - F12
  4166. <               _delay_ms(200);
  4167. <           }
  4168. <           if ((matriz[Y_P_ROW][U_COL] & 0x01) && (fkbmode == 1 || modo))
  4169. <           {
  4170. <               kbescucha = 0;
  4171. <               cambiomodo = 1; fnpulsada = 1; soltarteclas = 1;
  4172. <               KBEXT_BIDIR_ON;
  4173. <
  4174. <           }
  4175. <           if (codeset == 2)
  4176. <           {
  4177. <               if ((matriz[H_L_ROW][J_COL] & 0x01) && !modo)
  4178. <               {
  4179. <                   fkbmode++;
  4180. <                   fkbmode = fkbmode > 2 ? 0 : fkbmode;
  4181. <                   cambiafkbmode();
  4182. <               }
  4183. <               //Activa el cambio de modo lo que dejara en bucle hasta que se pulse una tecla. El led se enciende.
  4184. <               if ((matriz[N1_N5_ROW][N1_COL] & 0x01) && fkbmode != 2) pulsafn(N1_N5_ROW, N1_COL, KEY_F1, 0, 0, 0, 0, 5);  //F1
  4185. <               if ((matriz[N1_N5_ROW][N2_COL] & 0x01) && fkbmode != 2) pulsafn(N1_N5_ROW, N2_COL, KEY_F2, 0, 0, 0, 0, 5);  //F2
  4186. <               if ((matriz[N1_N5_ROW][N3_COL] & 0x01) && fkbmode != 2) pulsafn(N1_N5_ROW, N3_COL, KEY_F3, 0, 0, 0, 0, 5);  //F3
  4187. <               if ((matriz[N1_N5_ROW][N4_COL] & 0x01) && fkbmode != 2) pulsafn(N1_N5_ROW, N4_COL, KEY_F4, 0, 0, 0, 0, 5);  //F4
  4188. <               if ((matriz[N1_N5_ROW][N5_COL] & 0x01) && fkbmode != 2) pulsafn(N1_N5_ROW, N5_COL, KEY_F5, 0, 0, 0, 0, 5);  //F5
  4189. <               if ((matriz[N6_N0_ROW][N6_COL] & 0x01) && fkbmode != 2) pulsafn(N6_N0_ROW, N6_COL, KEY_F6, 0, 0, 0, 0, 5);  //F6
  4190. <               if ((matriz[N6_N0_ROW][N7_COL] & 0x01) && fkbmode != 2) pulsafn(N6_N0_ROW, N7_COL, KEY_F7, 0, 0, 0, 0, 5);  //F7
  4191. <               if ((matriz[N6_N0_ROW][N8_COL] & 0x01) && fkbmode != 2) pulsafn(N6_N0_ROW, N8_COL, KEY_F8, 0, 0, 0, 0, 5);  //F8
  4192. <               if ((matriz[N6_N0_ROW][N9_COL] & 0x01) && fkbmode != 2) pulsafn(N6_N0_ROW, N9_COL, KEY_F9, 0, 0, 0, 0, 5);  //F9
  4193. <               if ((matriz[N6_N0_ROW][N0_COL] & 0x01) && fkbmode != 2) pulsafn(N6_N0_ROW, N0_COL, KEY_F10, 0, 0, 0, 0, 5); //F10
  4194. <
  4195. <               if ((matriz[Q_T_ROW][Q_COL] & 0x01) && fkbmode != 2) pulsafn(Q_T_ROW, Q_COL, KEY_F11, 0, 0, 0, 0, 50); //F11
  4196. <               if ((matriz[Q_T_ROW][W_COL] & 0x01) && fkbmode != 2) pulsafn(Q_T_ROW, W_COL, KEY_F12, 0, 0, 0, 0, 50); //F12
  4197. <
  4198. <               if ((matriz[A_G_ROW][S_COL] & 0x01) && modo)
  4199. <               {
  4200. <                   if (modo == at8) //F8 + F10 para Atari
  4201. <                   {
  4202. <                       sendPS2(KEY_F8);
  4203. <                       _delay_ms(50);
  4204. <                       sendPS2(KEY_F10);
  4205. <
  4206. <                       _delay_ms(50);
  4207. <
  4208. <                       sendPS2(0xF0);
  4209. <                       sendPS2(KEY_F10);
  4210. <                       _delay_ms(1000);
  4211. <                       sendPS2(0xF0);
  4212. <                       sendPS2(KEY_F8);
  4213. <                       _delay_ms(50);
  4214. <
  4215. <                       fnpulsada = 1;
  4216. <                       fnpulsando = 1;
  4217. <                   }
  4218. <                   if (modo == c64) //Ctrl + F12 para C64
  4219. <                   {
  4220. <                       pulsafn(A_G_ROW, S_COL, KEY_F12, 0, 0, 1, 0, 5);
  4221. <                   }
  4222. <               }
  4223. <               if ((matriz[A_G_ROW][A_COL] & 0x01) && (fkbmode == 1 || modo)) pulsafn(A_G_ROW, A_COL, KEY_F10, 0, 0, 0, 0, 5);       //F10 para el NEXT (�Mejor cambiar a otra?)
  4224. <
  4225. <               if ((matriz[Y_P_ROW][Y_COL] & 0x01) && (fkbmode != 2 || modo)) pulsafn(Y_P_ROW, Y_COL, KEY_F5, 0, 0, 1, 1, 5);        //ZXUNO NMI (Control+Alt+F5)
  4226. <               if ((matriz[B_M_ROW][B_COL] & 0x01) && (fkbmode != 2 || modo)) pulsafn(B_M_ROW, B_COL, KEY_BACKSP, 0, 0, 1, 1, 5);    //ZXUNO Hard Reset (Control+Alt+Backsp)
  4227. <               if ((matriz[B_M_ROW][N_COL] & 0x01) && (fkbmode != 2 || modo)) pulsafn(B_M_ROW, N_COL, KEY_DELETE, 0, 0, 1, 1, 5);    //ZXUNO Soft Reset (Control+Alt+Supr)
  4228. <               if ((matriz[A_G_ROW][G_COL] & 0x01) && (fkbmode != 2 || modo)) pulsafn(A_G_ROW, G_COL, KEY_SCRLCK, 0, 0, 0, 0, 5);    //ZXUNO RGB/VGA Swich (Bloq Despl)
  4229. <
  4230. <               if ((matriz[Z_V_ROW][V_COL] & 0x01) && (fkbmode == 1 || modo)) imprimeversion();
  4231. <               if ((matriz[Z_V_ROW][X_COL] & 0x01) && (fkbmode == 1 || modo)) eepromsave();                                          //Guarda en la EEPROM el modo actual de teclado
  4232. <
  4233. <               /*
  4234. <               if ((matriz[Y_P_ROW][O_COL] & 0x01) && (fkbmode == 1 || modo)) cambia_del_break();
  4235. <               if ((matriz[Y_P_ROW][P_COL] & 0x01) && (fkbmode == 1 || modo)) cambia_cursors_kbpc();
  4236. <               if ((matriz[Q_T_ROW][T_COL] & 0x01) && (fkbmode == 1 || modo)) cambia_tzxduino();
  4237. <               */
  4238. <
  4239. <               if ((matriz[Q_T_ROW][E_COL] & 0x01) && modo) pulsafn(Q_T_ROW, E_COL, KEY_PGUP, 1, 0, 0, 0, 5); //Re Pag / Pg Up   (Acorn: VGA) (C64 Disco Anterior)
  4240. <               if ((matriz[Q_T_ROW][R_COL] & 0x01) && modo) pulsafn(Q_T_ROW, R_COL, KEY_PGDW, 1, 0, 0, 0, 5); //Av Pag / Pg Down (Acorn: RGB) (C64 Disco Siguiente)
  4241. <               if ((matriz[A_G_ROW][D_COL] & 0x01) && modo) pulsafn(A_G_ROW, D_COL, KEY_PGUP, 1, 1, 0, 0, 5); //Re Pag / Pg Up   + Shift (C64 10 Discos Anteriores)
  4242. <               if ((matriz[A_G_ROW][F_COL] & 0x01) && modo) pulsafn(A_G_ROW, F_COL, KEY_PGDW, 1, 1, 0, 0, 5); //Av Pag / Pg Down + Shift (C64 10 Discos Siguientes)
  4243. <
  4244. <
  4245. <
  4246. <           }
  4247. <           else if (codeset == 1)
  4248. <           {
  4249. <               if (matriz[N1_N5_ROW][N1_COL] & 0x01) pulsafn(N1_N5_ROW, N1_COL, KS1_F1, 0, 0, 0, kbalt, 5);  //F1
  4250. <               if (matriz[N1_N5_ROW][N2_COL] & 0x01) pulsafn(N1_N5_ROW, N2_COL, KS1_F2, 0, 0, 0, kbalt, 5);  //F2
  4251. <               if (matriz[N1_N5_ROW][N3_COL] & 0x01) pulsafn(N1_N5_ROW, N3_COL, KS1_F3, 0, 0, 0, kbalt, 5);  //F3
  4252. <               if (matriz[N1_N5_ROW][N4_COL] & 0x01) pulsafn(N1_N5_ROW, N4_COL, KS1_F4, 0, 0, 0, kbalt, 5);  //F4
  4253. <               if (matriz[N1_N5_ROW][N5_COL] & 0x01) pulsafn(N1_N5_ROW, N5_COL, KS1_F5, 0, 0, 0, kbalt, 5);  //F5
  4254. <               if (matriz[N6_N0_ROW][N6_COL] & 0x01) pulsafn(N6_N0_ROW, N6_COL, KS1_F6, 0, 0, 0, kbalt, 5);  //F6
  4255. <               if (matriz[N6_N0_ROW][N7_COL] & 0x01) pulsafn(N6_N0_ROW, N7_COL, KS1_F7, 0, 0, 0, kbalt, 5);  //F7
  4256. <               if (matriz[N6_N0_ROW][N8_COL] & 0x01) pulsafn(N6_N0_ROW, N8_COL, KS1_F8, 0, 0, 0, kbalt, 5);  //F8
  4257. <               if (matriz[N6_N0_ROW][N9_COL] & 0x01) pulsafn(N6_N0_ROW, N9_COL, KS1_F9, 0, 0, 0, kbalt, 5);  //F9
  4258. <               if (matriz[N6_N0_ROW][N0_COL] & 0x01) pulsafn(N6_N0_ROW, N0_COL, KS1_F10, 0, 0, 0, kbalt, 5); //F10
  4259. <               if (matriz[Q_T_ROW][Q_COL] & 0x01) pulsafn(Q_T_ROW, Q_COL, KS1_F11, 0, 0, 0, kbalt, 5);       //F11
  4260. <               if (matriz[Q_T_ROW][W_COL] & 0x01) pulsafn(Q_T_ROW, W_COL, KS1_F12, 0, 0, 0, kbalt, 5);       //F12
  4261. <               if (matriz[B_M_ROW][B_COL] & 0x01) pulsafn(B_M_ROW, B_COL, KS1_BACKSP, 0, 0, 1, 1, 5);    //ZXUNO Hard Reset (Control+Alt+Backsp)
  4262. <               if (matriz[B_M_ROW][N_COL] & 0x01) pulsafn(B_M_ROW, N_COL, KS1_DELETE, 0, 0, 1, 1, 5);    //ZXUNO Soft Reset (Control+Alt+Supr)
  4263. <           }
  4264. <
  4265. <       }
  4266. <       else fnpulsando = 0; //Fin de escaneo de combos
  4267. <   }
  4268. <
  4269. <   //Control de teclado
  4270. <   if (!fnpulsada) //Si no se ha pulsado ningun tecla de funcion
  4271. <   {
  4272. <       if (tzxduino_value)
  4273. <       {
  4274. <
  4275. <           if (!tzxduino_snooze)
  4276. <           {
  4277. <
  4278. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N7_COL] & 0x01)) // UP
  4279. <               {
  4280. <                   TZXDUINO_pushbutton(TZX_UP_PIN, TZX_UP_BCD);
  4281. <                   matriz[N6_N0_ROW][N7_COL] = 0;
  4282. <                   tzxduino_stop = 0;
  4283. <               }
  4284. <
  4285. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N6_COL] & 0x01)) // DOWN
  4286. <               {
  4287. <                   TZXDUINO_pushbutton(TZX_DOWN_PIN, TZX_DOWN_BCD);
  4288. <                   matriz[N6_N0_ROW][N6_COL] = 0;
  4289. <                   tzxduino_stop = 0;
  4290. <               }
  4291. <
  4292. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N5_COL] & 0x01)) // ROOT (LEFT)
  4293. <               {
  4294. <                   TZXDUINO_pushbutton(TZX_ROOT_PIN, TZX_ROOT_BCD);
  4295. <                   matriz[N1_N5_ROW][N5_COL] = 0;
  4296. <                   tzxduino_stop = 0;
  4297. <               }
  4298. <
  4299. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N8_COL] & 0x01)) // STOP - OFF (RIGHT)
  4300. <               {
  4301. <                   if (tzxduino_stop)
  4302. <                   {
  4303. <                       tzxduino_stop = 0;
  4304. <                       tzxduino_value = 0;
  4305. <                       tzxduino_snooze = 0;
  4306. <                   }
  4307. <                   else
  4308. <                   {
  4309. <                       TZXDUINO_pushbutton(TZX_STOP_PIN, TZX_STOP_BCD);
  4310. <                       tzxduino_stop = 1;
  4311. <                   }
  4312. <                   matriz[N6_N0_ROW][N8_COL] = 0;
  4313. <               }
  4314. <
  4315. <
  4316. <               if (matriz[ENTER_ROW][ENTER_COL] & 0x01) // PLAY/PAUSE (ENTER)
  4317. <               {
  4318. <                   TZXDUINO_pushbutton(TZX_PLAY_PIN, TZX_PLAY_BCD);
  4319. <                   matriz[ENTER_ROW][ENTER_COL] = 0;
  4320. <                   tzxduino_stop = 0;
  4321. <               }
  4322. <
  4323. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N1_COL] & 0x01)) // EDIT (CONTROL CURSORES/ENTER TECLADO)
  4324. <               {
  4325. <                   matriz[N1_N5_ROW][N1_COL] = 0;
  4326. <                   tzxduino_snooze = 1;
  4327. <               }
  4328. <
  4329. <           }
  4330. <           else
  4331. <           {
  4332. <               if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N1_COL] & 0x01)) // EDIT (CONTROL CURSORES/ENTER TZXDUINO)
  4333. <               {
  4334. <                   matriz[N1_N5_ROW][N1_COL] = 0;
  4335. <                   tzxduino_snooze = 0;
  4336. <               }
  4337. <           }
  4338. <
  4339. <
  4340. <       }
  4341. <
  4342. <       if (!modo) // Si el modo es 0 (ZX-Spectrum)
  4343. <       {
  4344. <           //Enviar la pulsacion de Caps Shift y/o Symbol Shift si estamos en modo ZX)
  4345. <           if ((matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x02)) { sendPS2(CAPS_SHIFT);    matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] |= 0x02;     espera++; } // Probar a suprimir matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] |= 0x02; (Ya se deja mantenido durante el scan)
  4346. <           if ((matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x02)) { sendPS2(SYMBOL_SHIFT);  matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] |= 0x02; espera++; } // Probar a suprimir matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] |= 0x02; (Ya se deja mantenido durante el scan)
  4347. <           if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x04) { sendPS2(0xF0); sendPS2(CAPS_SHIFT);    matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;     espera++; }
  4348. <           if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x04) { sendPS2(0xF0); sendPS2(SYMBOL_SHIFT);  matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0; espera++; }
  4349. <           if (espera) { _delay_us(5); espera = 0; }
  4350. <           //Enviar el resto de Teclas Pulsadas, nunca entrara por shift o symbol de matrix[r][c] ya que se cambia el valor en el bloque anterior a 3 o 0
  4351. <           for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++)
  4352. <           {
  4353. <               if ((matriz[r][c] & 0x01) && !(matriz[r][c] & 0x02)) sendPS2(mapZX[r][c]);
  4354. <               if (matriz[r][c] & 0x04) { sendPS2(0xF0); sendPS2(mapZX[r][c]); matriz[r][c] = 0; }
  4355. <           }
  4356. <       }
  4357. <       else // Manejo de los otros modos de Keymap
  4358. <       {
  4359. <           if (!antighosting && cs_counter == 0 && ss_counter == 0)
  4360. <           {
  4361. <               if (((matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x02)) ||
  4362. <                   ((matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x02)))
  4363. <               {
  4364. <                   for (r = 0; r < ROWS8; r++) for (c = 0; c < COLS5; c++)
  4365. <                   {
  4366. <                       // Ignoramos teclas capssymbol y symbolshift en el recorrido
  4367. <                       if (r == CAPS_SHIFT_ROW && c == CAPS_SHIFT_COL) continue;
  4368. <                       if (r == SYMBOL_SHIFT_ROW && c == SYMBOL_SHIFT_COL) continue;
  4369. <                       if (matriz[r][c] & 0x01) { antighosting = 1; break; }
  4370. <                   }
  4371. <
  4372. <               }
  4373. <           }
  4374. <           else
  4375. <           {
  4376. <               if (!(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01))
  4377. <                   antighosting = 0;
  4378. <           }
  4379. <
  4380. <           for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++)
  4381. <           {
  4382. <               // Ignoramos teclas capssymbol y symbolshift en el recorrido
  4383. <               if (r == CAPS_SHIFT_ROW && c == CAPS_SHIFT_COL) continue;
  4384. <               if (r == SYMBOL_SHIFT_ROW && c == SYMBOL_SHIFT_COL) continue;
  4385. <
  4386. <               if ((matriz[r][c] & 0x01) && !(matriz[r][c] & 0x02)) // Gestion de pulsado
  4387. <               {
  4388. <                   if (!antighosting)
  4389. <                   {
  4390. <                       if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) matriz[r][c] |= 0x08; // Se marca capsshift
  4391. <                       if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) matriz[r][c] |= 0x10; // Se marca symbolshift
  4392. <                   }
  4393. <
  4394. <                   if ((matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10)) pulsateclaconshift(r, c, codeset == 2 ? mapEXT[r][c] : mapEXT1[r][c]); // Pulsar con capsshift
  4395. <                   if ((matriz[r][c] & 0x10) && !(matriz[r][c] & 0x08)) pulsateclaconsymbol(r, c, modo); // Pulsar con symbolshift
  4396. <                   if (!(matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10))
  4397. <                   {
  4398. <
  4399. <                       if (opqa_cursors)
  4400. <                       {
  4401. <                           typematicfirst = 0;
  4402. <                           typematic_codeaux = 0;
  4403. <
  4404. <                           if (codeset == 2)
  4405. <                           {
  4406. <                               keyaux = mapZX[r][c];
  4407. <                               keyaux = keyaux == KEY_O ? KEY_LEFT : keyaux;
  4408. <                               keyaux = keyaux == KEY_P ? KEY_RIGHT : keyaux;
  4409. <                               keyaux = keyaux == KEY_Q ? KEY_UP : keyaux;
  4410. <                               keyaux = keyaux == KEY_A ? KEY_DOWN : keyaux;
  4411. <                               if (keyaux == KEY_LEFT || keyaux == KEY_RIGHT || keyaux == KEY_UP || keyaux == KEY_DOWN) typematic_codeaux = 0xE0; //Es una tecla del codeset2 que necesita E0
  4412. <                           }
  4413. <                           if (codeset == 1)
  4414. <                           {
  4415. <                               keyaux = mapSET1[r][c];
  4416. <                               keyaux = keyaux == KS1_O ? KS1_LEFT : keyaux;
  4417. <                               keyaux = keyaux == KS1_P ? KS1_RIGHT : keyaux;
  4418. <                               keyaux = keyaux == KS1_Q ? KS1_UP : keyaux;
  4419. <                               keyaux = keyaux == KS1_A ? KS1_DOWN : keyaux;
  4420. <                               if (keyaux == KS1_LEFT || keyaux == KS1_RIGHT || keyaux == KS1_UP || keyaux == KS1_DOWN) typematic_codeaux = 0xE0; //Es una tecla del codeset1 que necesita E0
  4421. <                           }
  4422. <
  4423. <                           typematic_code = keyaux;
  4424. <                           if (typematic_codeaux > 0) sendPS2(0xE0);
  4425. <                           sendPS2(typematic_code);
  4426. <                       }
  4427. <                       else
  4428. <                       {
  4429. <                           typematicfirst = 0;
  4430. <                           if (codeset == 2) typematic_code = mapZX[r][c];
  4431. <                           else typematic_code = mapSET1[r][c]; // Pulsar sin modificadores
  4432. <
  4433. <                           typematic_codeaux = 0;
  4434. <                           sendPS2(typematic_code);
  4435. <                       }
  4436. <                   }
  4437. <                   // Si estan pulsados capsshift y symbolshift, no hacemos nada
  4438. <
  4439. <                   matriz[r][c] |= 0x02; // Se marca mantenida
  4440. <               }
  4441. <
  4442. <               if ((matriz[r][c] & 0x04)) // Gestion de liberado
  4443. <               {
  4444. <                   if ((matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10)) sueltateclaconshift(r, c, codeset == 2 ? mapEXT[r][c] : mapEXT1[r][c]); // Liberar con capsshift
  4445. <                   if ((matriz[r][c] & 0x10) && !(matriz[r][c] & 0x08)) sueltateclaconsymbol(r, c, modo); // Liberar con symbolshift
  4446. <                   if (!(matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10))
  4447. <                   {
  4448. <                       if (opqa_cursors)
  4449. <                       {
  4450. <                           typematic_code = 0;
  4451. <
  4452. <                           if (codeset == 2)
  4453. <                           {
  4454. <                               keyaux = mapZX[r][c];
  4455. <                               keyaux = keyaux == KEY_O ? KEY_LEFT : keyaux;
  4456. <                               keyaux = keyaux == KEY_P ? KEY_RIGHT : keyaux;
  4457. <                               keyaux = keyaux == KEY_Q ? KEY_UP : keyaux;
  4458. <                               keyaux = keyaux == KEY_A ? KEY_DOWN : keyaux;
  4459. <
  4460. <                               if (keyaux == KEY_LEFT || keyaux == KEY_RIGHT || keyaux == KEY_UP || keyaux == KEY_DOWN) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
  4461. <                               sendPS2(0xF0); sendPS2(keyaux);
  4462. <                           }
  4463. <                           if (codeset == 1)
  4464. <                           {
  4465. <                               keyaux = mapSET1[r][c];
  4466. <                               keyaux = keyaux == KS1_O ? KS1_LEFT : keyaux;
  4467. <                               keyaux = keyaux == KS1_P ? KS1_RIGHT : keyaux;
  4468. <                               keyaux = keyaux == KS1_Q ? KS1_UP : keyaux;
  4469. <                               keyaux = keyaux == KS1_A ? KS1_DOWN : keyaux;
  4470. <                               if (keyaux == KS1_LEFT || keyaux == KS1_RIGHT || keyaux == KS1_UP || keyaux == KS1_DOWN) sendPS2(0xE0); //Es una tecla del codeset1 que necesita E0
  4471. <                               sendPS2(keyaux + KS1_RELEASE);
  4472. <                           }
  4473. <                       }
  4474. <                       else
  4475. <                       {
  4476. <                           if (codeset == 2) { sendPS2(0xF0); sendPS2(mapZX[r][c]); typematic_code = typematic_code == mapZX[r][c] ? 0 : typematic_code; }
  4477. <                           else { sendPS2(mapSET1[r][c] + KS1_RELEASE); typematic_code = typematic_code == mapSET1[r][c] ? 0 : typematic_code; } // Liberar sin modificadores
  4478. <                       }
  4479. <                   }
  4480. <                   matriz[r][c] = 0; // Fin de gestion de la tecla
  4481. ---
  4482. >                 if (r > 7 && c > 4) // suelta extra +2A/+3
  4483. >                 {
  4484. >                     traduceextra2a(r, c, -1);
  4485. >                     matriz[r][c] = 0;
  4486. >                 }
  4487. > #endif
  4488. >             }
  4489. 2062,2063c2149,2496
  4490. <               }
  4491. <           }
  4492. ---
  4493. >         }//Fin de Escaneo de las Columnas para el Row/Fila indicado
  4494. >         //desact. row/fila
  4495. >         pinSet(pinsR[r], bcdR[r], _IN);
  4496. >     } //fin escaneo de Rows/Filas de la matriz del teclado
  4497. >
  4498. >     if (soltarteclas)
  4499. >     {
  4500. >         soltarteclas = 0;
  4501. >         for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++) if (matriz[r][c] & 0x01) soltarteclas = 1;
  4502. >         goto rescan;
  4503. >     }
  4504. >
  4505. >     if (funcion || cambiomodo)
  4506. >     {
  4507. >
  4508. >         if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x04) { matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0; if (!modo) { sendPS2_aux(0xF0, 0); sendPS2_aux(CAPS_SHIFT, 0); } }
  4509. >         if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x04) { matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0; if (!modo) { sendPS2_aux(0xF0, 0); sendPS2_aux(SYMBOL_SHIFT, 0); } }
  4510. >
  4511. >         for (r = 0; r < ROWS8; r++) for (c = 0; c < COLS5; c++)
  4512. >         {
  4513. >             if (funcion)
  4514. >             {
  4515. >                 if (matriz[r][c] & 0x01)
  4516. >                 {
  4517. >                     ejecutarfuncion(mapZX[r][c]);
  4518. >                     break;
  4519. >                 }
  4520. >             }
  4521. >             if (cambiomodo)
  4522. >             {
  4523. >                 if (matriz[r][c] & 0x01) modo = cambiarmodo(((KBMODE)(mapMODO[r][c])));
  4524. >             }
  4525. >         }
  4526. >
  4527. >         fnpulsada = 1; //Si no se pulsa ninguna tecla sigue en bucle hasta que se pulse
  4528. >     }
  4529. >
  4530. >     //Comprobacion de Teclas especiales al tener pulsado Caps Shift y Symbol Shift
  4531. >     if (!fnpulsada && (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01))
  4532. >     {
  4533. >         if (!fnpulsando)
  4534. >         {//row, col, key, key_E0, shift, ctrl, alt, museg
  4535. >
  4536. >             if (matriz[A_G_ROW][F_COL] & 0x01)
  4537. >             {
  4538. >                 funcion = 1; fnpulsada = 1; soltarteclas = 1;
  4539. >                 _delay_ms(250);
  4540. >             }
  4541. >
  4542. >             if ((matriz[Z_V_ROW][Z_COL] & 0x01) && (modo || fkbmode))
  4543. >             {
  4544. >                 kbcontrol = !kbcontrol ? 1 : kbcontrol;
  4545. >                 pulsa_y_suelta_teclas_modificadoras(1, 0, 0, 0, 0);
  4546. >                 espera_a_soltar_tecla(Z_V_ROW, Z_COL);
  4547. >
  4548. >             }
  4549. >
  4550. >             if ((matriz[Z_V_ROW][C_COL] & 0x01) && (modo || fkbmode))
  4551. >             {
  4552. >                 kbalt = !kbalt ? 1 : kbalt;
  4553. >                 pulsa_y_suelta_teclas_modificadoras(0, 1, 0, 0, 0);
  4554. >                 espera_a_soltar_tecla(Z_V_ROW, C_COL);
  4555. >
  4556. >             }
  4557. >             if ((matriz[A_G_ROW][A_COL] & 0x01) && (modo || fkbmode))
  4558. >             {
  4559. >                 kbshift = !kbshift ? 1 : kbshift;
  4560. >                 pulsa_y_suelta_teclas_modificadoras(0, 0, 1, 0, 0);
  4561. >                 espera_a_soltar_tecla(A_G_ROW, A_COL);
  4562. >
  4563. >             }
  4564. >
  4565. >             if ((matriz[Z_V_ROW][X_COL] & 0x01) && (modo || fkbmode))
  4566. >             {
  4567. >                 kblwin = !kblwin ? 1 : kblwin;
  4568. >                 pulsa_y_suelta_teclas_modificadoras(0, 0, 0, 0, 1);
  4569. >                 espera_a_soltar_tecla(Z_V_ROW, X_COL);
  4570. >
  4571. >             }
  4572. >
  4573. >             if ((matriz[B_M_ROW][M_COL] & 0x01) && (modo || fkbmode))
  4574. >             {
  4575. >                 kbaltgr = !kbaltgr ? 1 : kbaltgr;
  4576. >                 pulsa_y_suelta_teclas_modificadoras(0, 0, 0, 1, 0);
  4577. >                 espera_a_soltar_tecla(B_M_ROW, M_COL);
  4578. >             }
  4579. >
  4580. >             // F1 a F12
  4581. >             if ((matriz[N1_N5_ROW][N1_COL] & 0x01) && (modo || fkbmode)) pulsafn(N1_N5_ROW, N1_COL, codeset == 1 ? KS1_F1 : KEY_F1, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F1
  4582. >             if ((matriz[N1_N5_ROW][N2_COL] & 0x01) && (modo || fkbmode)) pulsafn(N1_N5_ROW, N2_COL, codeset == 1 ? KS1_F2 : KEY_F2, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F2
  4583. >             if ((matriz[N1_N5_ROW][N3_COL] & 0x01) && (modo || fkbmode)) pulsafn(N1_N5_ROW, N3_COL, codeset == 1 ? KS1_F3 : KEY_F3, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F3
  4584. >             if ((matriz[N1_N5_ROW][N4_COL] & 0x01) && (modo || fkbmode)) pulsafn(N1_N5_ROW, N4_COL, codeset == 1 ? KS1_F4 : KEY_F4, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F4
  4585. >             if ((matriz[N1_N5_ROW][N5_COL] & 0x01) && (modo || fkbmode)) pulsafn(N1_N5_ROW, N5_COL, codeset == 1 ? KS1_F5 : KEY_F5, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F5
  4586. >             if ((matriz[N6_N0_ROW][N6_COL] & 0x01) && (modo || fkbmode)) pulsafn(N6_N0_ROW, N6_COL, codeset == 1 ? KS1_F6 : KEY_F6, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F6
  4587. >             if ((matriz[N6_N0_ROW][N7_COL] & 0x01) && (modo || fkbmode)) pulsafn(N6_N0_ROW, N7_COL, codeset == 1 ? KS1_F7 : KEY_F7, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F7
  4588. >             if ((matriz[N6_N0_ROW][N8_COL] & 0x01) && (modo || fkbmode)) pulsafn(N6_N0_ROW, N8_COL, codeset == 1 ? KS1_F8 : KEY_F8, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F8
  4589. >             if ((matriz[N6_N0_ROW][N9_COL] & 0x01) && (modo || fkbmode)) pulsafn(N6_N0_ROW, N9_COL, codeset == 1 ? KS1_F9 : KEY_F9, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);     //F9
  4590. >             if ((matriz[N6_N0_ROW][N0_COL] & 0x01) && (modo || fkbmode)) pulsafn(N6_N0_ROW, N0_COL, codeset == 1 ? KS1_F10 : KEY_F10, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);   //F10
  4591. >             if ((matriz[Q_T_ROW][Q_COL] & 0x01) && (modo || fkbmode)) pulsafn(Q_T_ROW, Q_COL, codeset == 1 ? KS1_F11 : KEY_F11, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);         //F11
  4592. >             if ((matriz[Q_T_ROW][W_COL] & 0x01) && (modo || fkbmode)) pulsafn(Q_T_ROW, W_COL, codeset == 1 ? KS1_F12 : KEY_F12, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);         //F12
  4593. >             //
  4594. >
  4595. >             // Teclas especiales
  4596. >             if ((matriz[A_G_ROW][S_COL] & 0x01) && (modo || fkbmode)) pulsafn(A_G_ROW, S_COL, codeset == 1 ? KS1_LESS : KEY_LESS, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);       // (Z) KEY_LESS
  4597. >             if ((matriz[Y_P_ROW][I_COL] & 0x01) && (modo || fkbmode)) pulsafn(Y_P_ROW, I_COL, codeset == 1 ? KS1_BLOQNUM : KEY_BLOQNUM, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (I) Bloq Num
  4598. >             if ((matriz[Y_P_ROW][O_COL] & 0x01) && (modo || fkbmode)) pulsafn(Y_P_ROW, O_COL, codeset == 1 ? KS1_ACORCHE : KEY_ACORCHE, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (O) KEY_ACORCHE
  4599. >             if ((matriz[Y_P_ROW][P_COL] & 0x01) && (modo || fkbmode)) pulsafn(Y_P_ROW, P_COL, codeset == 1 ? KS1_CCORCHE : KEY_CCORCHE, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (P) KEY_CCORCHE
  4600. >             if ((matriz[Q_T_ROW][E_COL] & 0x01) && (modo || fkbmode)) pulsafn(Q_T_ROW, E_COL, codeset == 1 ? KS1PAD_ASTERISK : KEYPAD_ASTERISK, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);                                                                                                                                                                     // (E) Num *
  4601. >             if ((matriz[Q_T_ROW][R_COL] & 0x01) && (modo || fkbmode)) pulsafn(Q_T_ROW, R_COL, codeset == 1 ? KS1PAD_MENOS : KEYPAD_MENOS, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (R) Num -
  4602. >             if ((matriz[A_G_ROW][D_COL] & 0x01) && (modo || fkbmode)) pulsafn(A_G_ROW, D_COL, codeset == 1 ? KS1PAD_MAS : KEYPAD_MAS, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);   // (D) Num +
  4603. >             if ((matriz[Q_T_ROW][T_COL] & 0x01) && (modo || fkbmode)) { pulsaimprpant(Q_T_ROW, T_COL); is_fn(Q_T_ROW, T_COL); }                                                         // (T) Impr Pant
  4604. >             if ((matriz[Y_P_ROW][Y_COL] & 0x01) && (modo || fkbmode)) pulsafn(Y_P_ROW, Y_COL, codeset == 1 ? KS1_SCRLCK : KEY_SCRLCK, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (Y) Bloq Despl
  4605. >             if ((matriz[Y_P_ROW][U_COL] & 0x01) && (modo || fkbmode)) { pulsapausa(Y_P_ROW, U_COL); is_fn(Y_P_ROW, U_COL); }                                                            // (U) Pausa
  4606. >             if ((matriz[A_G_ROW][G_COL] & 0x01) && (modo || fkbmode)) pulsafn(A_G_ROW, G_COL, codeset == 1 ? KS1_INS : KEY_INS, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);         // (G) Insert
  4607. >             if ((matriz[H_L_ROW][H_COL] & 0x01) && (modo || fkbmode)) pulsafn(H_L_ROW, H_COL, codeset == 1 ? KS1_HOME : KEY_HOME, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);       // (H) Home
  4608. >             if ((matriz[H_L_ROW][J_COL] & 0x01) && (modo || fkbmode)) pulsafn(H_L_ROW, J_COL, codeset == 1 ? KS1_PGUP : KEY_PGUP, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);         // (J) Re Pag
  4609. >             if ((matriz[Z_V_ROW][V_COL] & 0x01) && (modo || fkbmode)) pulsafn(Z_V_ROW, V_COL, codeset == 1 ? KS1_DELETE : KEY_DELETE, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);   // (V) Supr
  4610. >             if ((matriz[B_M_ROW][B_COL] & 0x01) && (modo || fkbmode)) pulsafn(B_M_ROW, B_COL, codeset == 1 ? KS1_END : KEY_END, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);         // (B) End
  4611. >             if ((matriz[B_M_ROW][N_COL] & 0x01) && (modo || fkbmode)) pulsafn(B_M_ROW, N_COL, codeset == 1 ? KS1_PGDW : KEY_PGDW, 1, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);       // (N) Av Pag
  4612. >             if ((matriz[H_L_ROW][K_COL] & 0x01) && (modo || fkbmode)) pulsafn(H_L_ROW, K_COL, codeset == 1 ? KS1_PTOCOMA : KEY_PTOCOMA, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (K) KEY_PTOCOMA
  4613. >             if ((matriz[H_L_ROW][L_COL] & 0x01) && (modo || fkbmode)) pulsafn(H_L_ROW, L_COL, codeset == 1 ? KS1_COMILLA : KEY_COMILLA, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin); // (L) KEY_COMILLA
  4614. >             if ((matriz[ENTER_ROW][ENTER_COL] & 0x01) && (modo || fkbmode)) pulsafn(ENTER_ROW, ENTER_COL, codeset == 1 ? KS1_BKSLASH : KEY_BKSLASH, 0, kbshift, kbcontrol, kbalt, kbaltgr, kblwin);                                                                                                                                                                     // (ENTER) KEY_BKSLASH
  4615. > //
  4616. >
  4617. >         }
  4618. >     }
  4619. >     else fnpulsando = 0; //Fin de escaneo de combos
  4620. >
  4621. >     //Control de teclado
  4622. >     if (!fnpulsada) //Si no se ha pulsado ningun tecla de funcion y el modo es 0 (ZX-Spectrum)
  4623. >     {
  4624. >         if (tzxduino_value)
  4625. >         {
  4626. >
  4627. >             if (!tzxduino_snooze)
  4628. >             {
  4629. >
  4630. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N7_COL] & 0x01)) // UP
  4631. >                 {
  4632. >                     TZXDUINO_pushbutton(TZX_UP_PIN, TZX_UP_BCD);
  4633. >                     matriz[N6_N0_ROW][N7_COL] = 0;
  4634. >                     tzxduino_stop = 0;
  4635. >                 }
  4636. >
  4637. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N6_COL] & 0x01)) // DOWN
  4638. >                 {
  4639. >                     TZXDUINO_pushbutton(TZX_DOWN_PIN, TZX_DOWN_BCD);
  4640. >                     matriz[N6_N0_ROW][N6_COL] = 0;
  4641. >                     tzxduino_stop = 0;
  4642. >                 }
  4643. >
  4644. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N5_COL] & 0x01)) // ROOT (LEFT)
  4645. >                 {
  4646. >                     TZXDUINO_pushbutton(TZX_ROOT_PIN, TZX_ROOT_BCD);
  4647. >                     matriz[N1_N5_ROW][N5_COL] = 0;
  4648. >                     tzxduino_stop = 0;
  4649. >                 }
  4650. >
  4651. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N6_N0_ROW][N8_COL] & 0x01)) // STOP - OFF (RIGHT)
  4652. >                 {
  4653. >                     if (tzxduino_stop)
  4654. >                     {
  4655. >                         tzxduino_stop = 0;
  4656. >                         tzxduino_value = 0;
  4657. >                         tzxduino_snooze = 0;
  4658. >                     }
  4659. >                     else
  4660. >                     {
  4661. >                         TZXDUINO_pushbutton(TZX_STOP_PIN, TZX_STOP_BCD);
  4662. >                         tzxduino_stop = 1;
  4663. >                     }
  4664. >                     matriz[N6_N0_ROW][N8_COL] = 0;
  4665. >                 }
  4666. >
  4667. >                 if (matriz[ENTER_ROW][ENTER_COL] & 0x01) // PLAY/PAUSE (ENTER)
  4668. >                 {
  4669. >                     TZXDUINO_pushbutton(TZX_PLAY_PIN, TZX_PLAY_BCD);
  4670. >                     matriz[ENTER_ROW][ENTER_COL] = 0;
  4671. >                     tzxduino_stop = 0;
  4672. >                 }
  4673. >
  4674. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N1_COL] & 0x01)) // EDIT (CONTROL CURSORES/ENTER TECLADO)
  4675. >                 {
  4676. >                     matriz[N1_N5_ROW][N1_COL] = 0;
  4677. >                     tzxduino_snooze = 1;
  4678. >                 }
  4679. >
  4680. >             }
  4681. >             else
  4682. >             {
  4683. >                 if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] > 0 && (matriz[N1_N5_ROW][N1_COL] & 0x01)) // EDIT (CONTROL CURSORES/ENTER TZXDUINO)
  4684. >                 {
  4685. >                     matriz[N1_N5_ROW][N1_COL] = 0;
  4686. >                     tzxduino_snooze = 0;
  4687. >                 }
  4688. >             }
  4689. >
  4690. >         }
  4691. >
  4692. >         if (!modo && !fkbmode)
  4693. >         {
  4694. >             //Enviar la pulsacion de Caps Shift y/o Symbol Shift si estamos en modo ZX)
  4695. >             if ((matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x02)) { sendPS2(CAPS_SHIFT);    matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] |= 0x02;     espera++; } // Probar a suprimir matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] |= 0x02; (Ya se deja mantenido durante el scan)
  4696. >             if ((matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x02)) { sendPS2(SYMBOL_SHIFT);  matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] |= 0x02; espera++; } // Probar a suprimir matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] |= 0x02; (Ya se deja mantenido durante el scan)
  4697. >             if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x04) { sendPS2(0xF0); sendPS2(CAPS_SHIFT);    matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;     espera++; }
  4698. >             if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x04) { sendPS2(0xF0); sendPS2(SYMBOL_SHIFT);  matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0; espera++; }
  4699. >             if (espera) { _delay_us(5); espera = 0; }
  4700. >             //Enviar el resto de Teclas Pulsadas, nunca entrara por shift o symbol de matrix[r][c] ya que se cambia el valor en el bloque anterior a 3 o 0
  4701. >             for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++)
  4702. >             {
  4703. >                 if ((matriz[r][c] & 0x01) && !(matriz[r][c] & 0x02)) sendPS2(mapZX[r][c]);
  4704. >                 if (matriz[r][c] & 0x04) { sendPS2(0xF0); sendPS2(mapZX[r][c]); matriz[r][c] = 0; }
  4705. >             }
  4706. >         }
  4707. >         else // Manejo de los otros modos de Keymap
  4708. >         {
  4709. >
  4710. >
  4711. >             if (!antighosting && cs_counter == 0 && ss_counter == 0)
  4712. >             {
  4713. >                 if (((matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x02)) ||
  4714. >                     ((matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x02)))
  4715. >                 {
  4716. >                     for (r = 0; r < ROWS8; r++) for (c = 0; c < COLS5; c++)
  4717. >                     {
  4718. >                         // Ignoramos teclas capssymbol y symbolshift en el recorrido
  4719. >                         if (r == CAPS_SHIFT_ROW && c == CAPS_SHIFT_COL) continue;
  4720. >                         if (r == SYMBOL_SHIFT_ROW && c == SYMBOL_SHIFT_COL) continue;
  4721. >                         if (matriz[r][c] & 0x01) { antighosting = 1; break; }
  4722. >                     }
  4723. >
  4724. >                 }
  4725. >             }
  4726. >             else
  4727. >             {
  4728. >                 if (!(matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) && !(matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01))
  4729. >                     antighosting = 0;
  4730. >             }
  4731. >
  4732. >             for (r = 0; r<ROWS8; r++) for (c = 0; c<COLS5; c++)
  4733. >             {
  4734. >                 // Ignoramos teclas capssymbol y symbolshift en el recorrido
  4735. >                 if (r == CAPS_SHIFT_ROW && c == CAPS_SHIFT_COL) continue;
  4736. >                 if (r == SYMBOL_SHIFT_ROW && c == SYMBOL_SHIFT_COL) continue;
  4737. >
  4738. >                 if ((matriz[r][c] & 0x01) && !(matriz[r][c] & 0x02)) // Gestion de pulsado
  4739. >                 {
  4740. >                     if (!antighosting)
  4741. >                     {
  4742. >                         if (matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] & 0x01) matriz[r][c] |= 0x08; // Se marca capsshift
  4743. >                         if (matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] & 0x01) matriz[r][c] |= 0x10; // Se marca symbolshift
  4744. >                     }
  4745. >
  4746. >                     if ((matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10)) pulsateclaconshift(r, c, codeset == 2 ? mapEXT[r][c] : mapEXT1[r][c]); // Pulsar con capsshift
  4747. >                     if ((matriz[r][c] & 0x10) && !(matriz[r][c] & 0x08)) pulsateclaconsymbol(r, c, modo); // Pulsar con symbolshift
  4748. >                     if (!(matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10))
  4749. >                     {
  4750. >
  4751. >                         if (opqa_cursors || opqa_numbers)
  4752. >                         {
  4753. >                             typematicfirst = 0;
  4754. >                             typematic_codeaux = 0;
  4755. >
  4756. >                             if (codeset == 2)
  4757. >                             {
  4758. >                                 keyaux = mapZX[r][c];
  4759. >                                 keyaux = keyaux == KEY_O ? KEY_LEFT : keyaux;
  4760. >                                 keyaux = keyaux == KEY_P ? KEY_RIGHT : keyaux;
  4761. >                                 keyaux = keyaux == KEY_Q ? KEY_UP : keyaux;
  4762. >                                 keyaux = keyaux == KEY_A ? KEY_DOWN : keyaux;
  4763. >                                 if (opqa_cursors_m) keyaux = keyaux == KEY_M ? (opqa_cursors || modo == jup) ? KEY_SPACE : KEYPAD_0 : keyaux == KEY_SPACE ? opqa_cursors ? KEY_M : keyaux : keyaux;
  4764. >
  4765. >                                 if ((keyaux == KEY_LEFT || keyaux == KEY_RIGHT || keyaux == KEY_UP || keyaux == KEY_DOWN) && opqa_cursors) typematic_codeaux = 0xE0; //Es una tecla del codeset2 que necesita E0
  4766. >
  4767. >                             }
  4768. >                             if (codeset == 1)
  4769. >                             {
  4770. >                                 keyaux = mapSET1[r][c];
  4771. >                                 keyaux = keyaux == KS1_O ? KS1_LEFT : keyaux;
  4772. >                                 keyaux = keyaux == KS1_P ? KS1_RIGHT : keyaux;
  4773. >                                 keyaux = keyaux == KS1_Q ? KS1_UP : keyaux;
  4774. >                                 keyaux = keyaux == KS1_A ? KS1_DOWN : keyaux;
  4775. >                                 if (opqa_cursors_m) keyaux = keyaux == KS1_M ? KS1_SPACE : keyaux;
  4776. >
  4777. >                                 if (keyaux == KS1_LEFT || keyaux == KS1_RIGHT || keyaux == KS1_UP || keyaux == KS1_DOWN) typematic_codeaux = 0xE0; //Es una tecla del codeset1 que necesita E0
  4778. >                             }
  4779. >
  4780. >                             typematic_code = keyaux;
  4781. >                             if (typematic_codeaux > 0) sendPS2(0xE0);
  4782. >                             sendPS2(typematic_code);
  4783. >                         }
  4784. >                         else
  4785. >                         {
  4786. >                             typematicfirst = 0;
  4787. >                             if (codeset == 2) typematic_code = mapZX[r][c];
  4788. >                             else typematic_code = mapSET1[r][c]; // Pulsar sin modificadores
  4789. >
  4790. >                             typematic_codeaux = 0;
  4791. >                             sendPS2(typematic_code);
  4792. >                         }
  4793. >                     }
  4794. >                     // Si estan pulsados capsshift y symbolshift, no hacemos nada
  4795. >
  4796. >                     matriz[r][c] |= 0x02; // Se marca mantenida
  4797. >                 }
  4798. >
  4799. >                 if ((matriz[r][c] & 0x04)) // Gestion de liberado
  4800. >                 {
  4801. >                     if ((matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10)) sueltateclaconshift(r, c, codeset == 2 ? mapEXT[r][c] : mapEXT1[r][c]); // Liberar con capsshift
  4802. >                     if ((matriz[r][c] & 0x10) && !(matriz[r][c] & 0x08)) sueltateclaconsymbol(r, c, modo); // Liberar con symbolshift
  4803. >                     if (!(matriz[r][c] & 0x08) && !(matriz[r][c] & 0x10))
  4804. >                     {
  4805. >                         if (opqa_cursors || opqa_numbers)
  4806. >                         {
  4807. >                             typematic_code = 0;
  4808. >
  4809. >                             if (codeset == 2)
  4810. >                             {
  4811. >                                 keyaux = mapZX[r][c];
  4812. >                                 keyaux = keyaux == KEY_O ? KEY_LEFT : keyaux;
  4813. >                                 keyaux = keyaux == KEY_P ? KEY_RIGHT : keyaux;
  4814. >                                 keyaux = keyaux == KEY_Q ? KEY_UP : keyaux;
  4815. >                                 keyaux = keyaux == KEY_A ? KEY_DOWN : keyaux;
  4816. >                                 if (opqa_cursors_m) keyaux = keyaux == KEY_M ? (opqa_cursors || modo == jup) ? KEY_SPACE : KEYPAD_0 : keyaux == KEY_SPACE ? opqa_cursors ? KEY_M : keyaux : keyaux;
  4817. >
  4818. >                                 if ((keyaux == KEY_LEFT || keyaux == KEY_RIGHT || keyaux == KEY_UP || keyaux == KEY_DOWN) && opqa_cursors) sendPS2(0xE0); //Es una tecla del codeset2 que necesita E0
  4819. >                                 sendPS2(0xF0); sendPS2(keyaux);
  4820. >                             }
  4821. >                             if (codeset == 1)
  4822. >                             {
  4823. >                                 keyaux = mapSET1[r][c];
  4824. >                                 keyaux = keyaux == KS1_O ? KS1_LEFT : keyaux;
  4825. >                                 keyaux = keyaux == KS1_P ? KS1_RIGHT : keyaux;
  4826. >                                 keyaux = keyaux == KS1_Q ? KS1_UP : keyaux;
  4827. >                                 keyaux = keyaux == KS1_A ? KS1_DOWN : keyaux;
  4828. >                                 if (opqa_cursors_m) keyaux = keyaux == KS1_M ? KS1_SPACE : keyaux;
  4829. >
  4830. >                                 if (keyaux == KS1_LEFT || keyaux == KS1_RIGHT || keyaux == KS1_UP || keyaux == KS1_DOWN) sendPS2(0xE0); //Es una tecla del codeset 1 que necesita E0
  4831. >                                 sendPS2(keyaux + KS1_RELEASE);
  4832. >                             }
  4833. >                         }
  4834. >                         else
  4835. >                         {
  4836. >                             if (codeset == 2) { sendPS2(0xF0); sendPS2(mapZX[r][c]); typematic_code = typematic_code == mapZX[r][c] ? 0 : typematic_code; }
  4837. >                             else { sendPS2(mapSET1[r][c] + KS1_RELEASE); typematic_code = typematic_code == mapSET1[r][c] ? 0 : typematic_code; } // Liberar sin modificadores
  4838. >                         }
  4839. >                     }
  4840. >                     matriz[r][c] = 0; // Fin de gestion de la tecla
  4841. 2065,2067c2498,2499
  4842. <       }//Fin del If/else manejo de modo ZX u otros Keymaps
  4843. <   }//Fin del If del control del teclado.
  4844. < }//FIN de Matrixscan
  4845. ---
  4846. >                 }
  4847. >             }
  4848. 2068a2501,2503
  4849. >         }//Fin del If/else manejo de modo ZX u otros Keymaps
  4850. >     }//Fin del If del control del teclado.
  4851. > }//FIN de Matrixscan
  4852. 2073c2508
  4853. <   CPU_PRESCALE(CPU_16MHz);
  4854. ---
  4855. >     CPU_PRESCALE(CPU_16MHz);
  4856. 2075,2123c2510,2562
  4857. <   POWER_CONFIG;
  4858. <   POWER_OFF;
  4859. <   RESET_OFF;
  4860. <   KBEXT_BIDIR_CONFIG;
  4861. <   KBEXT_BIDIR_OFF;
  4862. <   LED_CONFIG;
  4863. <   LED_ON;
  4864. <
  4865. <   ps2Init();
  4866. <   matrixInit();
  4867. <   Joy2PS2Init();
  4868. <   TZXDUINOInit();
  4869. <
  4870. <   p1selectnesclon = 0;
  4871. <   p1startnesclon = 0;
  4872. <
  4873. <   // Configuracion del switch SYSTEM
  4874. <   pinSet(SYSTEM_PIN, SYSTEM_BCD, _IN);
  4875. <   pinPut(SYSTEM_PIN, SYSTEM_BCD, HI);
  4876. <   //
  4877. <
  4878. <   const uint8_t ZXUNO_SIGNATURE[] = { 'S','U','G','A','R' };
  4879. <   uint8_t checksignature[5];
  4880. <   uint8_t issigned = 1;
  4881. <
  4882. <   eeprom_read_block((void*)&checksignature, (const void*)0, 5);
  4883. <
  4884. <   for (int n = 0; n < 5; n++) if (checksignature[n] != ZXUNO_SIGNATURE[n]) issigned = 0;
  4885. <   if (issigned)
  4886. <   {
  4887. <       modo = cambiarmodo2(((KBMODE)eeprom_read_byte((uint8_t*)5)));
  4888. <       fkbmode = eeprom_read_byte((uint8_t*)6);
  4889. <       fkbmode = fkbmode > 2 ? 0 : fkbmode;
  4890. <
  4891. <       del_break_value = eeprom_read_byte((uint8_t*)7);
  4892. <       del_break_value = del_break_value > 1 ? 0 : del_break_value;
  4893. <
  4894. <       cursors_kbpc_value = eeprom_read_byte((uint8_t*)8);
  4895. <       cursors_kbpc_value = cursors_kbpc_value > 1 ? 0 : cursors_kbpc_value;
  4896. <
  4897. <   }
  4898. <   else
  4899. <   {
  4900. <       eeprom_write_block((const void*)&ZXUNO_SIGNATURE, (void*)0, 5); // Guardamos la firma
  4901. <       eeprom_write_byte((uint8_t*)5, (uint8_t)0); // Guardamos modo ZX por defecto
  4902. <       eeprom_write_byte((uint8_t*)6, (uint8_t)1); // Guardamos ZXFULLCOMBOS por defecto
  4903. <       eeprom_write_byte((uint8_t*)7, (uint8_t)0); // Guardamos del_break por defecto
  4904. <       eeprom_write_byte((uint8_t*)8, (uint8_t)0); // Guardamos cursors_kbpc por defecto
  4905. <   }
  4906. ---
  4907. >     POWER_CONFIG;
  4908. >     POWER_OFF;
  4909. >     RESET_OFF;
  4910. >     KBEXT_BIDIR_CONFIG;
  4911. >     KBEXT_BIDIR_OFF;
  4912. >     LED_CONFIG;
  4913. >     LED_ON;
  4914. >
  4915. >     ps2Init();
  4916. >     matrixInit();
  4917. >     Joy2PS2Init();
  4918. >     TZXDUINOInit();
  4919. >
  4920. >     p1selectnesclon = 0;
  4921. >     p1startnesclon = 0;
  4922. >
  4923. >     // Configuracion del switch SYSTEM
  4924. >     pinSet(SYSTEM_PIN, SYSTEM_BCD, _IN);
  4925. >     pinPut(SYSTEM_PIN, SYSTEM_BCD, HI);
  4926. >     //
  4927. >
  4928. >     const uint8_t ZXUNO_SIGNATURE[] = { 'S','U','G','A','R' };
  4929. >     uint8_t checksignature[5];
  4930. >     uint8_t issigned = 1;
  4931. >
  4932. >     eeprom_read_block((void*)&checksignature, (const void*)0, 5);
  4933. >
  4934. >     for (int n = 0; n < 5; n++) if (checksignature[n] != ZXUNO_SIGNATURE[n]) issigned = 0;
  4935. >     if (issigned)
  4936. >     {
  4937. >         modo = cambiarmodo2(((KBMODE)eeprom_read_byte((uint8_t*)5)));
  4938. >         fkbmode = eeprom_read_byte((uint8_t*)6);
  4939. >         fkbmode = fkbmode > 1 ? 0 : fkbmode;
  4940. >
  4941. >         del_break_value = eeprom_read_byte((uint8_t*)7);
  4942. >         del_break_value = del_break_value > 1 ? 0 : del_break_value;
  4943. >
  4944. >         cursors_kbpc_value = eeprom_read_byte((uint8_t*)8);
  4945. >         cursors_kbpc_value = cursors_kbpc_value > 1 ? 0 : cursors_kbpc_value;
  4946. >
  4947. >         famicom = eeprom_read_byte((uint8_t*)9);
  4948. >         famicom = famicom > 1 ? 0 : famicom;
  4949. >
  4950. >     }
  4951. >     else
  4952. >     {
  4953. >         eeprom_write_block((const void*)&ZXUNO_SIGNATURE, (void*)0, 5); // Guardamos la firma
  4954. >         eeprom_write_byte((uint8_t*)5, (uint8_t)0); // Guardamos modo ZX por defecto
  4955. >         eeprom_write_byte((uint8_t*)6, (uint8_t)1); // Guardamos ZXFULLCOMBOS por defecto
  4956. >         eeprom_write_byte((uint8_t*)7, (uint8_t)0); // Guardamos del_break por defecto
  4957. >         eeprom_write_byte((uint8_t*)8, (uint8_t)0); // Guardamos cursors_kbpc por defecto
  4958. >         eeprom_write_byte((uint8_t*)9, (uint8_t)0); // Guardamos famicom por defecto
  4959. >     }
  4960. 2127,2204c2566,2978
  4961. < {
  4962. <       if (ps2Stat() && (modo == pc || modo == pcxt || modo == kbext) && (kbescucha || timeout_escucha > 0)) // Lineas CLK y/o DATA a 0 y escucha activa
  4963. <       {                      // Solo hay escucha activa en modo PC, hasta su inicializacion.
  4964. <                              // Una vez completada la inicializacion de teclado, no es necesario mantener activa la escucha de comandos excepto si se hace eco
  4965. <
  4966. <
  4967. <           while (checkState(1000)) // tramos de 5 us (5000 us)
  4968. <           {
  4969. <               hostdataAnt = hostdata;
  4970. <               if (getPS2(&hostdata) == 0)
  4971. <               {
  4972. <                   timeout_escucha = 100000;   // Dejamos tiempo para que se complete la inicializacion
  4973. <                   if (hostdata == 0xEE)
  4974. <                   {
  4975. <                       sendPS2(0xEE); // Echo
  4976. <                       kbescucha = 1; // Si se hace eco, mantenemos la escucha de comandos (necesario en determinados adaptadores PS/2 -> USB)
  4977. <                   }
  4978. <                   else
  4979. <                   {
  4980. <                       sendPS2(0xFA); // Ack
  4981. <                   }
  4982. <                   switch (hostdata)
  4983. <                   {
  4984. <                   case 0x00: // second bit of 0xED or 0xF3 (or get scancode set)
  4985. <                       if (hostdataAnt == 0xF0)
  4986. <                       {
  4987. <                           sendPS2(codeset);
  4988. <                       }
  4989. <                       break;
  4990. <                   case 0x01: // set scancode 1
  4991. <                       if (hostdataAnt == 0xF0)
  4992. <                       {
  4993. <                           codeset = 1;
  4994. <                       }
  4995. <                       break;
  4996. <                   case 0x02: // set scancode 2
  4997. <                       if (hostdataAnt == 0xF0)
  4998. <                       {
  4999. <                           codeset = 2;
  5000. <                       }
  5001. <                       break;
  5002. <                   case 0xED: // set/reset LEDs
  5003. <                       break;
  5004. <                   case 0xF2: // ID
  5005. <                       sendPS2(0xAB);
  5006. <                       sendPS2(0x83);
  5007. <                       break;
  5008. <                   case 0xF0: // get/set scancode set
  5009. <                       break;
  5010. <                   case 0xF3: // set/reset typematic delay
  5011. <                       break;
  5012. <                   case 0xF4: // keyboard is enabled, break loop
  5013. <                       break;
  5014. <                   case 0xF5: // keyboard is disabled, break loop
  5015. <                       break;
  5016. <                   case 0xFF:
  5017. <                       // tell host we are ready to connect
  5018. <                       sendPS2(0xAA);
  5019. <                       kbescucha = 0; // En el inicio iniciamos la cuenta atras de timeout
  5020. <                       break;
  5021. <                   default:
  5022. <                       break;
  5023. <                   } //Fin del Swich
  5024. <               } //Fin del IF de si detecta dato
  5025. <           } //Fin del while que chequea el estado
  5026. <       }
  5027. <       else
  5028. <       {
  5029. <           if (timeout_escucha > 0) timeout_escucha--;
  5030. <           if ((modo == pc || modo == pcxt || modo == kbext) && typematic_code != 0 && (typematicfirst++ > 1000 || codeset == 2) && typematic++ > 150) // Funcion tipematica simulada para PC
  5031. <           {
  5032. <               if (typematic_codeaux != 0) sendPS2(typematic_codeaux);
  5033. <               sendPS2(typematic_code); typematic = 0;
  5034. <           }
  5035. <           //No llegan datos del Host, enviamos teclado.
  5036. <           matrixScan();
  5037. <           joy2ps2Scan();
  5038. <           //
  5039. ---
  5040. > {
  5041. >         if (ps2Stat() && (modo == pc || modo == pcxt || modo == kbext) && (kbescucha || timeout_escucha > 0)) // Lineas CLK y/o DATA a 0 y escucha activa
  5042. >         {                      // Solo hay escucha activa en modo PC, hasta su inicializacion.
  5043. >                                // Una vez completada la inicializacion de teclado, no es necesario mantener activa la escucha de comandos excepto si se hace eco
  5044. >
  5045. >             while (checkState(1000)) // tramos de 5 us (5000 us)
  5046. >             {
  5047. >                 hostdataAnt = hostdata;
  5048. >                 if (getPS2(&hostdata) == 0)
  5049. >                 {
  5050. >                     timeout_escucha = 100000;   // Dejamos tiempo para que se complete la inicializacion
  5051. >                     if (hostdata == 0xEE)
  5052. >                     {
  5053. >                         sendPS2(0xEE); // Echo
  5054. >                         kbescucha = 1; // Si se hace eco, mantenemos la escucha de comandos (necesario en determinados adaptadores PS/2 -> USB)
  5055. >                     }
  5056. >                     else
  5057. >                     {
  5058. >                         sendPS2(0xFA); // Ack
  5059. >                     }
  5060. >                     switch (hostdata)
  5061. >                     {
  5062. >                     case 0x00: // second bit of 0xED or 0xF3 (or get scancode set)
  5063. >                         if (hostdataAnt == 0xF0)
  5064. >                         {
  5065. >                             sendPS2(codeset);
  5066. >                         }
  5067. >                         break;
  5068. >                     case 0x01: // set scancode 1
  5069. >                         if (hostdataAnt == 0xF0)
  5070. >                         {
  5071. >                             codeset = 1;
  5072. >                         }
  5073. >                         break;
  5074. >                     case 0x02: // set scancode 2
  5075. >                         if (hostdataAnt == 0xF0)
  5076. >                         {
  5077. >                             codeset = 2;
  5078. >                         }
  5079. >                         break;
  5080. >                     case 0xED: // set/reset LEDs
  5081. >                         break;
  5082. >                     case 0xF2: // ID
  5083. >                         sendPS2(0xAB);
  5084. >                         sendPS2(0x83);
  5085. >                         break;
  5086. >                     case 0xF0: // get/set scancode set
  5087. >                         break;
  5088. >                     case 0xF3: // set/reset typematic delay
  5089. >                         break;
  5090. >                     case 0xF4: // keyboard is enabled, break loop
  5091. >                         break;
  5092. >                     case 0xF5: // keyboard is disabled, break loop
  5093. >                         break;
  5094. >                     case 0xFF:
  5095. >                         // tell host we are ready to connect
  5096. >                         sendPS2(0xAA);
  5097. >                         kbescucha = 0; // En el inicio iniciamos la cuenta atras de timeout
  5098. >                         break;
  5099. >                     default:
  5100. >                         break;
  5101. >                     } //Fin del Swich
  5102. >                 } //Fin del IF de si detecta dato
  5103. >             } //Fin del while que chequea el estado
  5104. >         }
  5105. >         else
  5106. >         {
  5107. >             if (timeout_escucha > 0) timeout_escucha--;
  5108. >             if ((modo == pc || modo == pcxt || modo == kbext) && typematic_code != 0 && (typematicfirst++ > 1000 || codeset == 2) && typematic++ > 150) // Funcion tipematica simulada para PC
  5109. >             {
  5110. >                 if (typematic_codeaux != 0) sendPS2(typematic_codeaux);
  5111. >                 sendPS2(typematic_code); typematic = 0;
  5112. >             }
  5113. >             //No llegan datos del Host, enviamos teclado.
  5114. >             matrixScan();
  5115. >             joy2ps2Scan();
  5116. >             //
  5117. >
  5118. >         }
  5119. > }
  5120. >
  5121. > void cambia_tzxduino()
  5122. > {
  5123. >     int n;
  5124. >     char pausa = 50;
  5125. >     opqa_cursors = 0;
  5126. >
  5127. >     tzxduino_value = tzxduino_value ? 0 : 1;
  5128. >
  5129. >     if (tzxduino_value) tzxduino_stop = 0;
  5130. >
  5131. >     if (!modo)
  5132. >     {
  5133. >         sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  5134. >         sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  5135. >     }
  5136. >
  5137. >     if (codeset == 2)
  5138. >     {
  5139. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  5140. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  5141. >
  5142. >         if (tzxduino_value)
  5143. >         {
  5144. >             for (n = 0; n < 3; n++)
  5145. >             {
  5146. >                 _delay_ms(pausa);
  5147. >                 sendPS2(enable[n]);
  5148. >                 _delay_ms(pausa);
  5149. >                 sendPS2(0xF0);
  5150. >                 sendPS2(enable[n]);
  5151. >                 _delay_ms(pausa);
  5152. >             }
  5153. >         }
  5154. >         else
  5155. >         {
  5156. >             for (n = 0; n < 4; n++)
  5157. >             {
  5158. >                 _delay_ms(pausa);
  5159. >                 sendPS2(disable[n]);
  5160. >                 _delay_ms(pausa);
  5161. >                 sendPS2(0xF0);
  5162. >                 sendPS2(disable[n]);
  5163. >                 _delay_ms(pausa);
  5164. >             }
  5165. >         }
  5166. >
  5167. >         for (n = 0; n < 8; n++)
  5168. >         {
  5169. >             _delay_ms(pausa);
  5170. >             sendPS2(tzxduino[n]);
  5171. >             _delay_ms(pausa);
  5172. >             sendPS2(0xF0);
  5173. >             sendPS2(tzxduino[n]);
  5174. >             _delay_ms(pausa);
  5175. >         }
  5176. >
  5177. >     }
  5178. >     fnpulsada = 1;
  5179. >     fnpulsando = 1;
  5180. > }
  5181. >
  5182. > void cambia_joy2ps2()
  5183. > {
  5184. >     int n;
  5185. >     char pausa = 50;
  5186. >     famicom = !famicom;
  5187. >
  5188. >     if (!modo)
  5189. >     {
  5190. >         sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  5191. >         sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  5192. >     }
  5193. >
  5194. >     if (codeset == 2)
  5195. >     {
  5196. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  5197. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  5198. >
  5199. >         if (famicom)
  5200. >         {
  5201. >             for (n = 0; n < 11; n++)
  5202. >             {
  5203. >                 _delay_ms(pausa);
  5204. >                 sendPS2(joy_famicom[n]);
  5205. >                 _delay_ms(pausa);
  5206. >                 sendPS2(0xF0);
  5207. >                 sendPS2(joy_famicom[n]);
  5208. >                 _delay_ms(pausa);
  5209. >             }
  5210. >         }
  5211. >         else
  5212. >         {
  5213. >             for (n = 0; n < 12; n++)
  5214. >             {
  5215. >                 _delay_ms(pausa);
  5216. >                 sendPS2(joy_atarismd[n]);
  5217. >                 _delay_ms(pausa);
  5218. >                 sendPS2(0xF0);
  5219. >                 sendPS2(joy_atarismd[n]);
  5220. >                 _delay_ms(pausa);
  5221. >             }
  5222. >         }
  5223. >         eeprom_write_byte((uint8_t*)9, (uint8_t)famicom);
  5224. >     }
  5225. >
  5226. >     fnpulsada = 1;
  5227. >     fnpulsando = 1;
  5228. > }
  5229. >
  5230. > void cambia_del_break()
  5231. > {
  5232. >     int n;
  5233. >     char pausa = 50;
  5234. >
  5235. >     del_break_value = del_break_value ? 0 : 1;
  5236. >
  5237. >     if (!modo)
  5238. >     {
  5239. >         sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  5240. >         sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  5241. >     }
  5242. >
  5243. >     if (codeset == 2)
  5244. >     {
  5245. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  5246. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  5247. >
  5248. >         if (del_break_value)
  5249. >         {
  5250. >             for (n = 0; n < 3; n++)
  5251. >             {
  5252. >                 _delay_ms(pausa);
  5253. >                 sendPS2(enable[n]);
  5254. >                 _delay_ms(pausa);
  5255. >                 sendPS2(0xF0);
  5256. >                     sendPS2(enable[n]);
  5257. >             _delay_ms(pausa);
  5258. >             }
  5259. >         }
  5260. >         else
  5261. >         {
  5262. >             for (n = 0; n < 4; n++)
  5263. >             {
  5264. >                 _delay_ms(pausa);
  5265. >                 sendPS2(disable[n]);
  5266. >                 _delay_ms(pausa);
  5267. >                 sendPS2(0xF0);
  5268. >                 sendPS2(disable[n]);
  5269. >                 _delay_ms(pausa);
  5270. >             }
  5271. >         }
  5272. >
  5273. >         for (n = 0; n < 9; n++)
  5274. >         {
  5275. >             _delay_ms(pausa);
  5276. >             sendPS2(del_break[n]);
  5277. >             _delay_ms(pausa);
  5278. >             sendPS2(0xF0);
  5279. >             sendPS2(del_break[n]);
  5280. >             _delay_ms(pausa);
  5281. >         }
  5282. >         eeprom_write_byte((uint8_t*)7, (uint8_t)del_break_value);
  5283. >
  5284. >     }
  5285. >     fnpulsada = 1;
  5286. >     fnpulsando = 1;
  5287. > }
  5288. >
  5289. > void cambia_cursors_kbpc()
  5290. > {
  5291. >     int n;
  5292. >     char pausa = 50;
  5293. >
  5294. >     cursors_kbpc_value = cursors_kbpc_value ? 0 : 1;
  5295. >
  5296. >     if (!modo)
  5297. >     {
  5298. >         sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  5299. >         sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  5300. >     }
  5301. >
  5302. >     if (codeset == 2)
  5303. >     {
  5304. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  5305. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  5306. >
  5307. >         if (cursors_kbpc_value)
  5308. >         {
  5309. >             for (n = 0; n < 3; n++)
  5310. >             {
  5311. >                 _delay_ms(pausa);
  5312. >                 sendPS2(enable[n]);
  5313. >                 _delay_ms(pausa);
  5314. >                 sendPS2(0xF0);
  5315. >                 sendPS2(enable[n]);
  5316. >                 _delay_ms(pausa);
  5317. >             }
  5318. >         }
  5319. >         else
  5320. >         {
  5321. >             for (n = 0; n < 4; n++)
  5322. >             {
  5323. >                 _delay_ms(pausa);
  5324. >                 sendPS2(disable[n]);
  5325. >                 _delay_ms(pausa);
  5326. >                 sendPS2(0xF0);
  5327. >                 sendPS2(disable[n]);
  5328. >                 _delay_ms(pausa);
  5329. >             }
  5330. >         }
  5331. >
  5332. >         for (n = 0; n < 12; n++)
  5333. >         {
  5334. >             _delay_ms(pausa);
  5335. >             sendPS2(cursors_kbpc[n]);
  5336. >             _delay_ms(pausa);
  5337. >             sendPS2(0xF0);
  5338. >             sendPS2(cursors_kbpc[n]);
  5339. >             _delay_ms(pausa);
  5340. >         }
  5341. >         eeprom_write_byte((uint8_t*)8, (uint8_t)cursors_kbpc_value);
  5342. >
  5343. >     }
  5344. >     fnpulsada = 1;
  5345. >     fnpulsando = 1;
  5346. > }
  5347. >
  5348. > void cambiafkbmode()
  5349. > {
  5350. >     int n;
  5351. >     char pausa = 50;
  5352. >     if (!modo)
  5353. >     {
  5354. >         sendPS2(0xF0); sendPS2(CAPS_SHIFT); matriz[CAPS_SHIFT_ROW][CAPS_SHIFT_COL] = 0;
  5355. >         sendPS2(0xF0); sendPS2(SYMBOL_SHIFT); matriz[SYMBOL_SHIFT_ROW][SYMBOL_SHIFT_COL] = 0;
  5356. >     }
  5357. >     if (codeset == 2)
  5358. >     {
  5359. >         _delay_ms(pausa); sendPS2(KEY_SPACE); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_SPACE);
  5360. >         _delay_ms(pausa); sendPS2(KEY_PUNTO); _delay_ms(pausa); sendPS2(0xF0); sendPS2(KEY_PUNTO);
  5361. >
  5362. >         switch (fkbmode)
  5363. >         {
  5364. >             case 0:
  5365. >                 for (n = 0; n < 15; n++)
  5366. >                 {
  5367. >                     _delay_ms(pausa);
  5368. >                     sendPS2(fkbmode0[n]);
  5369. >                     _delay_ms(pausa);
  5370. >                     sendPS2(0xF0);
  5371. >                     sendPS2(fkbmode0[n]);
  5372. >                     _delay_ms(pausa);
  5373. >                     eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  5374. >                 }
  5375. >                 break;
  5376. >             case 1:
  5377. >                 for (n = 0; n < 12; n++)
  5378. >                 {
  5379. >                     _delay_ms(pausa);
  5380. >                     sendPS2(fkbmode1[n]);
  5381. >                     _delay_ms(pausa);
  5382. >                     sendPS2(0xF0);
  5383. >                     sendPS2(fkbmode1[n]);
  5384. >                     _delay_ms(pausa);
  5385. >                     eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  5386. >                 }
  5387. >                 break;
  5388. >             case 2:
  5389. >                 for (n = 0; n < 6; n++)
  5390. >                 {
  5391. >                     _delay_ms(pausa);
  5392. >                     sendPS2(fkbmode2[n]);
  5393. >                     _delay_ms(pausa);
  5394. >                     sendPS2(0xF0);
  5395. >                     sendPS2(fkbmode2[n]);
  5396. >                     _delay_ms(pausa);
  5397. >                     eeprom_write_byte((uint8_t*)6, (uint8_t)fkbmode);
  5398. >                 }
  5399. >                 break;
  5400. >             default:
  5401. >                 break;
  5402. >         }
  5403. >
  5404. >     }
  5405. >     fnpulsada = 1;
  5406. >     fnpulsando = 1;
  5407. > }
  5408. >
  5409. > //Inicializar Joy2PS2
  5410. > void Joy2PS2Init()
  5411. > {
  5412. >     uint8_t p;
  5413. >
  5414. >     for (p = 0; p < 7; p++)
  5415. >     {
  5416. >         pinSet(pinsJOY2PS2[p], bcdJOY2PS2[p], _IN);
  5417. >         pinPut(pinsJOY2PS2[p], bcdJOY2PS2[p], HI);
  5418. >     }
  5419. >
  5420. >     pinSet(pinsJOY2PS2[5], bcdJOY2PS2[5], _OUT); // Select como salida y en alto.
  5421. >
  5422. > }
  5423. >
  5424. > void TZXDUINO_pushbutton(uint8_t pin, uint8_t bcd)
  5425. > {
  5426. >     // Pulsa
  5427. >     pinPut(pin, bcd, LO);
  5428. >     pinSet(pin, bcd, _OUT);
  5429. >
  5430. >     // Delay de 250 ms
  5431. >     _delay_ms(250);
  5432. >
  5433. >     // Suelta
  5434. >     pinSet(pin, bcd, _IN);
  5435. >     pinPut(pin, bcd, HI);
  5436. >
  5437. > }
  5438. >
  5439. > //Inicializar TZXDUINO
  5440. > void TZXDUINOInit()
  5441. > {
  5442. >     pinSet(TZX_ROOT_PIN, TZX_ROOT_BCD, _IN);
  5443. >     pinPut(TZX_ROOT_PIN, TZX_ROOT_BCD, HI);
  5444. >
  5445. >     pinSet(TZX_UP_PIN, TZX_UP_BCD, _IN);
  5446. >     pinPut(TZX_UP_PIN, TZX_UP_BCD, HI);
  5447. >
  5448. >     pinSet(TZX_DOWN_PIN, TZX_DOWN_BCD, _IN);
  5449. >     pinPut(TZX_DOWN_PIN, TZX_DOWN_BCD, HI);
  5450. >
  5451. >     pinSet(TZX_PLAY_PIN, TZX_PLAY_BCD, _IN);
  5452. >     pinPut(TZX_PLAY_PIN, TZX_PLAY_BCD, HI);
  5453. 2206,2207c2980,2982
  5454. <       }
  5455. < }
  5456. ---
  5457. >     pinSet(TZX_STOP_PIN, TZX_STOP_BCD, _IN);
  5458. >     pinPut(TZX_STOP_PIN, TZX_STOP_BCD, HI);
  5459. > }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement