- #include <avr/pgmspace.h> 
- #include <avr/eeprom.h> 
-   
- #include "pins.h" 
- #include "mytypes.h" 
-   
- #include "getfaraddress.h" 
- #include "main.h" 
- #include "zx.h" 
- #include "kbmap.h" 
- #include "rs232.h" 
-   
- const UBYTE default_kbmap[] PROGMEM = 
- { 
- NO_KEY,NO_KEY, // 00 
- NO_KEY,NO_KEY, // 01 F9 
- NO_KEY,NO_KEY, // 02 
- NO_KEY,NO_KEY, // 03 F5 
- NO_KEY,NO_KEY, // 04 F3 
- NO_KEY,NO_KEY, // 05 F1 
- NO_KEY,NO_KEY, // 06 F2 
- NO_KEY,NO_KEY, // 07 F12 
- NO_KEY,NO_KEY, // 08 
- NO_KEY,NO_KEY, // 09 F10 
- NO_KEY,NO_KEY, // 0A F8 
- NO_KEY,NO_KEY, // 0B F6 
- NO_KEY,NO_KEY, // 0C F4 
- KEY_CS,KEY_SP, // 0D TAB 
- KEY_CS,KEY_1 , // 0E ~ 
- NO_KEY,NO_KEY, // 0F 
-   
- NO_KEY,NO_KEY, // 10 
- NO_KEY,NO_KEY, // 11 ALT 
- KEY_CS,NO_KEY, // 12 LSHIFT 
- NO_KEY,NO_KEY, // 13 
- NO_KEY,NO_KEY, // 14 LCTRL 
- KEY_Q ,NO_KEY, // 15 Q 
- KEY_1 ,NO_KEY, // 16 1 
- NO_KEY,NO_KEY, // 17 
- NO_KEY,NO_KEY, // 18 
- NO_KEY,NO_KEY, // 19 
- KEY_Z ,NO_KEY, // 1A Z 
- KEY_S ,NO_KEY, // 1B S 
- KEY_A ,NO_KEY, // 1C A 
- KEY_W ,NO_KEY, // 1D W 
- KEY_2 ,NO_KEY, // 1E 2 
- NO_KEY,NO_KEY, // 1F 
-   
- NO_KEY,NO_KEY, // 20 
- KEY_C ,NO_KEY, // 21 C 
- KEY_X ,NO_KEY, // 22 X 
- KEY_D ,NO_KEY, // 23 D 
- KEY_E ,NO_KEY, // 24 E 
- KEY_4 ,NO_KEY, // 25 4 
- KEY_3 ,NO_KEY, // 26 3 
- NO_KEY,NO_KEY, // 27 
- NO_KEY,NO_KEY, // 28 
- KEY_SP,NO_KEY, // 29 SPACE 
- KEY_V ,NO_KEY, // 2A V 
- KEY_F ,NO_KEY, // 2B F 
- KEY_T ,NO_KEY, // 2C T 
- KEY_R ,NO_KEY, // 2D R 
- KEY_5 ,NO_KEY, // 2E 5 
- NO_KEY,NO_KEY, // 2F 
-   
- NO_KEY,NO_KEY, // 30 
- KEY_N ,NO_KEY, // 31 N 
- KEY_B ,NO_KEY, // 32 B 
- KEY_H ,NO_KEY, // 33 H 
- KEY_G ,NO_KEY, // 34 G 
- KEY_Y ,NO_KEY, // 35 Y 
- KEY_6 ,NO_KEY, // 36 6 
- NO_KEY,NO_KEY, // 37 
- NO_KEY,NO_KEY, // 38 
- NO_KEY,NO_KEY, // 39 
- KEY_M ,NO_KEY, // 3A M 
- KEY_J ,NO_KEY, // 3B J 
- KEY_U ,NO_KEY, // 3C U 
- KEY_7 ,NO_KEY, // 3D 7 
- KEY_8 ,NO_KEY, // 3E 8 
- NO_KEY,NO_KEY, // 3F 
-   
- NO_KEY,NO_KEY, // 40 
- KEY_SS,KEY_N , // 41 , 
- KEY_K ,NO_KEY, // 42 K 
- KEY_I ,NO_KEY, // 43 I 
- KEY_O ,NO_KEY, // 44 O 
- KEY_0 ,NO_KEY, // 45 0 
- KEY_9 ,NO_KEY, // 46 9 
- NO_KEY,NO_KEY, // 47 
- NO_KEY,NO_KEY, // 48 
- KEY_SS,KEY_M , // 49 . 
- KEY_SS,KEY_C , // 4A / 
- KEY_L ,NO_KEY, // 4B L 
- KEY_SS,KEY_Z , // 4C : 
- KEY_P ,NO_KEY, // 4D P 
- KEY_SS,KEY_J , // 4E - 
- NO_KEY,NO_KEY, // 4F 
-   
- NO_KEY,NO_KEY, // 50 
- NO_KEY,NO_KEY, // 51 
- KEY_SS,KEY_P , // 52 " 
- NO_KEY,NO_KEY, // 53 
- KEY_SS,KEY_8 , // 54 [ 
- KEY_SS,KEY_K , // 55 + 
- NO_KEY,NO_KEY, // 56 
- NO_KEY,NO_KEY, // 57 
- KEY_CS,KEY_2 , // 58 CAPSLOCK 
- KEY_SS,NO_KEY, // 59 RSHIFT 
- KEY_EN,NO_KEY, // 5A ENTER 
- KEY_SS,KEY_9 , // 5B ] 
- NO_KEY,NO_KEY, // 5C 
- KEY_SS,KEY_CS, // 5D backslash 
- NO_KEY,NO_KEY, // 5E 
- NO_KEY,NO_KEY, // 5F 
-   
- NO_KEY,NO_KEY, // 60 
- KEY_SS,KEY_CS, // 61 backslash 
- NO_KEY,NO_KEY, // 62 
- NO_KEY,NO_KEY, // 63 
- NO_KEY,NO_KEY, // 64 
- NO_KEY,NO_KEY, // 65 
- KEY_CS,KEY_0 , // 66 BACKSPACE 
- NO_KEY,NO_KEY, // 67 
- NO_KEY,NO_KEY, // 68 
- KEY_1 ,NO_KEY, // 69 keypad 1 
- NO_KEY,NO_KEY, // 6A 
- KEY_4 ,NO_KEY, // 6B keypad 4 
- KEY_7 ,NO_KEY, // 6C keypad 7 
- NO_KEY,NO_KEY, // 6D 
- NO_KEY,NO_KEY, // 6E 
- NO_KEY,NO_KEY, // 6F 
-   
- KEY_0 ,NO_KEY, // 70 keypad 0 
- KEY_SS,KEY_M , // 71 keypad . 
- KEY_2 ,NO_KEY, // 72 keypad 2 
- KEY_5 ,NO_KEY, // 73 keypad 5 
- KEY_6 ,NO_KEY, // 74 keypad 6 
- KEY_8 ,NO_KEY, // 75 keypad 8 
- CLRKYS,NO_KEY, // 76 ESC 
- NO_KEY,NO_KEY, // 77 Num Lock 
- NO_KEY,NO_KEY, // 78 F11 
- KEY_SS,KEY_K , // 79 keypad + 
- KEY_3 ,NO_KEY, // 7A keypad 3 
- KEY_SS,KEY_J , // 7B keypad - 
- KEY_SS,KEY_B , // 7C keypad * 
- KEY_9 ,NO_KEY, // 7D keypad 9 
- NO_KEY,NO_KEY, // 7E Scroll Lock 
- NO_KEY,NO_KEY  // 7F F7 !!!Warning real code is 0x83 is (converted to 0x7F) 
- }; 
-   
- const UBYTE default_kbmap_E0[] PROGMEM = 
- { 
- NO_KEY,NO_KEY, // 00 
- NO_KEY,NO_KEY, // 01 
- NO_KEY,NO_KEY, // 02 
- NO_KEY,NO_KEY, // 03 
- NO_KEY,NO_KEY, // 04 
- NO_KEY,NO_KEY, // 05 
- NO_KEY,NO_KEY, // 06 
- NO_KEY,NO_KEY, // 07 
- NO_KEY,NO_KEY, // 08 
- NO_KEY,NO_KEY, // 09 
- NO_KEY,NO_KEY, // 0A 
- NO_KEY,NO_KEY, // 0B 
- NO_KEY,NO_KEY, // 0C 
- NO_KEY,NO_KEY, // 0D 
- NO_KEY,NO_KEY, // 0E 
- NO_KEY,NO_KEY, // 0F 
-   
- NO_KEY,NO_KEY, // 10 
- NO_KEY,NO_KEY, // 11 ALT GR 
- NO_KEY,NO_KEY, // 12 
- NO_KEY,NO_KEY, // 13 
- NO_KEY,NO_KEY, // 14 RCTRL 
- NO_KEY,NO_KEY, // 15 
- NO_KEY,NO_KEY, // 16 
- NO_KEY,NO_KEY, // 17 
- NO_KEY,NO_KEY, // 18 
- NO_KEY,NO_KEY, // 19 
- NO_KEY,NO_KEY, // 1A 
- NO_KEY,NO_KEY, // 1B 
- NO_KEY,NO_KEY, // 1C 
- NO_KEY,NO_KEY, // 1D 
- NO_KEY,NO_KEY, // 1E 
- NO_KEY,NO_KEY, // 1F LEFT WINDOWS 
-   
- NO_KEY,NO_KEY, // 20 
- NO_KEY,NO_KEY, // 21 multimedia Volume - 
- NO_KEY,NO_KEY, // 22 
- NO_KEY,NO_KEY, // 23 
- NO_KEY,NO_KEY, // 24 
- NO_KEY,NO_KEY, // 25 
- NO_KEY,NO_KEY, // 26 
- NO_KEY,NO_KEY, // 27 RIGHT WINDOWS 
- NO_KEY,NO_KEY, // 28 
- NO_KEY,NO_KEY, // 29 
- NO_KEY,NO_KEY, // 2A 
- NO_KEY,NO_KEY, // 2B 
- NO_KEY,NO_KEY, // 2C 
- NO_KEY,NO_KEY, // 2D 
- NO_KEY,NO_KEY, // 2E 
- NO_KEY,NO_KEY, // 2F APPLICATION 
-   
- NO_KEY,NO_KEY, // 30 
- NO_KEY,NO_KEY, // 31 
- NO_KEY,NO_KEY, // 32 multimedia Volume + 
- NO_KEY,NO_KEY, // 33 
- NO_KEY,NO_KEY, // 34 multimedia Play/Pause 
- NO_KEY,NO_KEY, // 35 
- NO_KEY,NO_KEY, // 36 
- NO_KEY,NO_KEY, // 37 POWER 
- NO_KEY,NO_KEY, // 38 
- NO_KEY,NO_KEY, // 39 
- NO_KEY,NO_KEY, // 3A 
- NO_KEY,NO_KEY, // 3B multimedia Stop 
- NO_KEY,NO_KEY, // 3C 
- NO_KEY,NO_KEY, // 3D 
- NO_KEY,NO_KEY, // 3E 
- NO_KEY,NO_KEY, // 3F SLEEP 
-   
- NO_KEY,NO_KEY, // 40 
- NO_KEY,NO_KEY, // 41 
- NO_KEY,NO_KEY, // 42 
- NO_KEY,NO_KEY, // 43 
- NO_KEY,NO_KEY, // 44 
- NO_KEY,NO_KEY, // 45 
- NO_KEY,NO_KEY, // 46 
- NO_KEY,NO_KEY, // 47 
- NO_KEY,NO_KEY, // 48 
- NO_KEY,NO_KEY, // 49 
- KEY_SS,KEY_V , // 4A keypad / 
- NO_KEY,NO_KEY, // 4B 
- NO_KEY,NO_KEY, // 4C 
- NO_KEY,NO_KEY, // 4D 
- NO_KEY,NO_KEY, // 4E 
- NO_KEY,NO_KEY, // 4F 
-   
- NO_KEY,NO_KEY, // 50 multimedia Active 
- NO_KEY,NO_KEY, // 51 
- NO_KEY,NO_KEY, // 52 
- NO_KEY,NO_KEY, // 53 
- NO_KEY,NO_KEY, // 54 
- NO_KEY,NO_KEY, // 55 
- NO_KEY,NO_KEY, // 56 
- NO_KEY,NO_KEY, // 57 
- NO_KEY,NO_KEY, // 58 
- NO_KEY,NO_KEY, // 59 
- KEY_EN,NO_KEY, // 5A keypad ENTER 
- NO_KEY,NO_KEY, // 5B 
- NO_KEY,NO_KEY, // 5C 
- NO_KEY,NO_KEY, // 5D 
- NO_KEY,NO_KEY, // 5E WAKE 
- NO_KEY,NO_KEY, // 5F 
-   
- NO_KEY,NO_KEY, // 60 
- NO_KEY,NO_KEY, // 61 
- NO_KEY,NO_KEY, // 62 
- NO_KEY,NO_KEY, // 63 
- NO_KEY,NO_KEY, // 64 
- NO_KEY,NO_KEY, // 65 
- NO_KEY,NO_KEY, // 66 
- NO_KEY,NO_KEY, // 67 
- NO_KEY,NO_KEY, // 68 
- KEY_SS,KEY_E , // 69 END 
- NO_KEY,NO_KEY, // 6A 
- KEY_CS,KEY_5 , // 6B LEFT 
- KEY_SS,KEY_Q , // 6C HOME 
- NO_KEY,NO_KEY, // 6D 
- NO_KEY,NO_KEY, // 6E 
- NO_KEY,NO_KEY, // 6F 
-   
- KEY_SS,KEY_W , // 70 INS 
- KEY_CS,KEY_9 , // 71 DEL 
- KEY_CS,KEY_6 , // 72 DOWN 
- NO_KEY,NO_KEY, // 73 
- KEY_CS,KEY_8 , // 74 RIGHT 
- KEY_CS,KEY_7 , // 75 UP 
- CLRKYS,NO_KEY, // 76 ESC 
- NO_KEY,NO_KEY, // 77 
- NO_KEY,NO_KEY, // 78 
- NO_KEY,NO_KEY, // 79 
- KEY_CS,KEY_4 , // 7A PGDN 
- NO_KEY,NO_KEY, // 7B 
- NO_KEY,NO_KEY, // 7C Print Screen 
- KEY_CS,KEY_3 , // 7D PGUP 
- NO_KEY,NO_KEY, // 7E 
- NO_KEY,NO_KEY  // 7F 
- }; 
-   
- /** User map offset in EEPROM */ 
- #define user_kbmap 0 
- /** User map (extent E0) offset in EEPROM */ 
- #define user_kbmap_E0 512 
-   
- //for loading user map (pointer to start eeprom) 
- //const void* saved_kbmap = (void*)0; 
-   
- //pointers to map 
- //UBYTE* kbmap; 
- //UBYTE* kbmap_E0; 
-   
- //if want Log than comment next string 
- #undef LOGENABLE 
-   
- void kbmap_init(void) 
- { 
-         //set pointers 
- //      kbmap = dbuf; 
- //      kbmap_E0 = dbuf + sizeof(default_kbmap); 
-   
- #ifdef LOGENABLE 
-         to_log("kbmap_init start\r\n"); 
- #endif 
-         //wait for eeprom 
-         eeprom_busy_wait(); 
-   
- #ifdef LOGENABLE 
-         to_log("eeprom OK\r\n"); 
- #endif 
-   
-         //read signature from eeprom 
- //      eeprom_read_block(dbuf, saved_kbmap, 2); 
-   
-         //check signature 
-         if ( (eeprom_read_byte((UBYTE*)user_kbmap)=='K') && 
-              (eeprom_read_byte((UBYTE*)user_kbmap+1)=='B') ) 
-         { 
-                 //read from eeprom 
- //              eeprom_read_block(kbmap, saved_kbmap, sizeof(default_kbmap)+sizeof(default_kbmap_E0)); 
- //              kbmap[0] = NO_KEY ; 
- //              kbmap[1] = NO_KEY ; 
-                 flags_ex_register |= FLAG_EX_PS2KEYBOARD_MAP; 
- #ifdef LOGENABLE 
-                 to_log("KBMAP:EEPROM\r\n"); 
- #endif 
-         } 
-         else 
-         { 
-                 //set default 
- //              memcpy_P(kbmap, default_kbmap, sizeof(default_kbmap)); 
- //              memcpy_P(kbmap_E0, default_kbmap_E0, sizeof(default_kbmap_E0)); 
- #ifdef LOGENABLE 
-                 to_log("KBMAP:DEFAULT\r\n"); 
- #endif 
-         } 
- } 
-   
- KBMAP_VALUE kbmap_get(UBYTE scancode, UBYTE was_E0) 
- { 
-         KBMAP_VALUE ret = {{NO_KEY,NO_KEY}}; 
-   
-         if( scancode < 0x7F ) 
-         { 
-                 if( flags_ex_register&FLAG_EX_PS2KEYBOARD_MAP ) 
-                 { 
-                         //user map 
-                         if ( scancode ) 
-                         { 
-                                 UWORD tblptr = scancode*2 + (was_E0)?user_kbmap_E0:user_kbmap; 
-                                 ret.tb.b1 = eeprom_read_byte((UBYTE*)tblptr++ ); 
-                                 ret.tb.b2 = eeprom_read_byte((UBYTE*)tblptr ); 
-                         } 
-                 } 
-                 else 
-                 { 
-                         //default map 
-                         ULONG tblptr = scancode*2; 
-                         if( was_E0 ) 
-                         { 
-                                 tblptr += GET_FAR_ADDRESS(default_kbmap_E0); 
-                         } 
-                         else 
-                         { 
-                                 tblptr += GET_FAR_ADDRESS(default_kbmap); 
-                         } 
-                         ret.tb.b1 = pgm_read_byte_far( tblptr++ ); 
-                         ret.tb.b2 = pgm_read_byte_far( tblptr ); 
-                 } 
-         } 
- #ifdef LOGENABLE 
- { 
-         char log_map[] = "MP..:..,..\r\n"; 
-         UBYTE b = scancode; 
-         log_map[2] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; 
-         log_map[3] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; 
-         b = ret.tb.b1; 
-         log_map[5] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; 
-         log_map[6] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; 
-         b = ret.tb.b2; 
-         log_map[8] = ((b >> 4) <= 9 )?'0'+(b >> 4):'A'+(b >> 4)-10; 
-         log_map[9] = ((b & 0x0F) <= 9 )?'0'+(b & 0x0F):'A'+(b & 0x0F)-10; 
-         to_log(log_map); 
- } 
- #endif 
-         return ret; 
- } 
-