Subversion Repositories NedoOS

Rev

Rev 648 | Rev 756 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.  
  2. ;KEYSCAN
  3. ;.rep_wait=$+1
  4. ;       ld a,0
  5. ;       dec a
  6. ;       ret m
  7. ;       ld (.rep_wait),a
  8. ;       ret
  9.  
  10.  
  11. ;--------------------------------------------------
  12. keyqueueput_codenolang
  13.  
  14. GETKEY
  15. .KEY_MODE_NONE          = 0x00
  16. .KEY_MODE_SHIFT         = 0x01
  17. .KEY_MODE_ALT           = 0x02
  18. .KEY_MODE_CTRL          = 0x04
  19. .KEY_MODE_RUS           = 0x08
  20. .KEY_MODE_UP            = 0x10
  21. .KEY_MODE_E0            = 0x20
  22. .KEY_MODE_CAPS          = 0x40
  23. .KEY_MODE_NUML          = 0x80
  24.  
  25. .bKEY_MODE_SHIFT        = 0x00
  26. .bKEY_MODE_ALT          = 0x01
  27. .bKEY_MODE_CTRL         = 0x02
  28. .bKEY_MODE_RUS          = 0x03
  29. .bKEY_MODE_UP           = 0x04
  30. .bKEY_MODE_E0           = 0x05
  31. .bKEY_MODE_CAPS         = 0x06
  32. .bKEY_MODE_NUML         = 0x07
  33. ;out: ha=key (NOKEY=none), bc=keynolang keeps de,l
  34. ;H0=1 for control codes, H0=0 for symbols
  35. ;TODO где-то в H добавить биты регистра клавиатуры
  36.                 ld hl,(KEY_PUTREDRAW.redrawkey)
  37.                 ld a,l
  38.                 or a
  39.                 jr z,.noredraw
  40.                 ld bc,0x0000
  41.                 ld (KEY_PUTREDRAW.redrawkey),bc
  42.                 ld c,a
  43.                 ld b,h
  44.                 ret
  45. .noredraw
  46. .mode=$+1
  47.                 ld hl,0x0000
  48.                 ld bc,0xdef7
  49.                 out (c),c
  50.                 ld b,0xbe
  51.                 in a,(c)
  52.                 jr nz,.not_zero
  53.                 ld a,(KEYSCAN.rep_wait)
  54.                 or a
  55.                 jr nz,.zero_ret
  56.  
  57.                 ld bc,(KEY_PUTREDRAW.rep_key)
  58.                 ld a,c
  59.                 or a
  60.                 jr z,.zero_ret
  61.                 ld a,1;3
  62.                 ld (KEYSCAN.rep_wait),a
  63.                 ld a,b
  64.                 jp nz,.retsymb1
  65. .zero_ret
  66.                 xor a
  67.                 ld h,a
  68.                 ld b,h
  69.                 ld c,a
  70.                 ret
  71.  
  72. .not_zero
  73.                 ld de,0
  74.                 ld (KEY_PUTREDRAW.rep_key),de
  75.                 cp 0xff
  76.                 jr nz,.decode
  77.                 ld b,0xde               ;переполнено
  78.                 ld a,0x0c               ;сбросить буфер
  79.                 out (c),a
  80.                 ld b,0xbe
  81.                 ld a,1
  82.                 out (c),a
  83.                 xor a
  84.                 ld (.mode),a
  85.                 jr .zero_ret
  86. .decode
  87.                 bit .bKEY_MODE_UP,l
  88.                 jp nz,.keypressmode
  89.                
  90.                 cp 0xe0
  91.                 jr c,.iskeycode
  92.                 jr z,.isE0
  93.                 ld a,.KEY_MODE_UP
  94. .savemode_or
  95.                 or l
  96. .savemode
  97.                 ld (.mode),a
  98.                 jr .noredraw
  99. .isE0          
  100.                 ld a,.KEY_MODE_E0
  101.                 jr .savemode_or
  102. .iskeycode
  103.                 add 0xff&.scodes
  104.                 ld e,a
  105.                 ld a,0
  106.                 adc 0xff&(.scodes>>8)
  107.                 ld d,a
  108.                 ld a,(de)
  109.                 or a
  110.                 jr z,.zero_ret  ;кнопка не поддерживается
  111.                  ;bit .bKEY_MODE_CTRL,l
  112.                  ;jr nz,.zero_ret ;Ctrl+F1 - это не F1
  113.                 cp 64
  114.                 jr nc,.not_simbol
  115.                 ld b,a
  116.                 cp 27
  117.                 ld a,.KEY_MODE_SHIFT
  118.                 jr nc,.base_noneed_caps
  119.                 bit .bKEY_MODE_ALT,l
  120.                 jr z,.no_alt_mod
  121.                 ld a,b
  122.                 jr .retsymb
  123. .no_alt_mod
  124.                 ld a,.KEY_MODE_SHIFT|.KEY_MODE_CAPS
  125. .base_noneed_caps
  126.                 and l
  127.                 ld a,0
  128.                 jp pe,.base_not_sh
  129.                 ld a,.mod_sh-.mod_base
  130. .base_not_sh
  131.                 add a,b
  132.                 add 0xff&.char_decode
  133.                 ld e,a
  134.                 ld a,0
  135.                 adc 0xff&(.char_decode>>8)
  136.                 ld d,a
  137.                 ld a,(de)
  138.                 ld c,a
  139.                 bit .bKEY_MODE_E0,l
  140.                 jr nz,.retsymb
  141.                 bit .bKEY_MODE_RUS,l
  142.                 jr nz,.rus_decode
  143. .retsymb
  144.                 ld b,a
  145.                 ld (KEY_PUTREDRAW.rep_key),bc
  146.                 ex af,af'
  147.                 ld a,35
  148.                 ld (KEYSCAN.rep_wait),a
  149.                 ex af,af'
  150. .retsymb1
  151.                 ld b,0
  152.                 ld h,b
  153.                 res .bKEY_MODE_E0,l
  154.                 ld (.mode),hl
  155.                 ret
  156. .rus_decode
  157.                 ld a,b
  158.                 cp 33
  159.                 ld a,.KEY_MODE_SHIFT
  160.                 jr nc,.rus_noneed_caps
  161.                 ld a,.KEY_MODE_SHIFT|.KEY_MODE_CAPS
  162. .rus_noneed_caps
  163.                 and l
  164.                 ld a,0
  165.                 jp pe,.rus_not_sh
  166.                 ld a,.mod_sh-.mod_base
  167. .rus_not_sh
  168.                 add a,b
  169.                 add a,0xff&.char_decode_ru
  170.                 ld e,a
  171.                 ld a,0
  172.                 adc a,0xff&(.char_decode_ru>>8)
  173.                 ld d,a
  174.                 ld a,(de)
  175.                 jr .retsymb
  176. .not_simbol
  177.                 ld b,a
  178.                 cp 128
  179.                 jr c,.is_mode_key
  180.                 cp 139
  181.                 jr nc,.unmod_no_lock
  182.                 bit .bKEY_MODE_E0,l
  183.                 jr nz,.unmod_no_lock
  184.                 bit .bKEY_MODE_NUML,l
  185.                 jr nz,.unmod_no_lock
  186.                 add .unmod_sh-.unmod
  187. .unmod_no_lock
  188.                 add a,0xff&.unmod_decode
  189.                 ld e,a
  190.                 ld a,0
  191.                 adc a,0xff&(.unmod_decode>>8)
  192.                 ld d,a
  193.                 ld a,(de)
  194.                 ld c,a
  195.                  bit .bKEY_MODE_SHIFT,l
  196.                  jp nz,.zero_ret ;Shift+F1 - это не F1
  197.                 jr .retsymb
  198. .is_mode_key
  199.                 cp 64
  200.                 jr nz,.not_shift_key
  201.                 ld a,l
  202.                 or .KEY_MODE_SHIFT
  203.                 and ~.KEY_MODE_E0
  204.                 bit .bKEY_MODE_ALT,a
  205.                 jp z,.savemode
  206. .chruslat
  207.                 xor .KEY_MODE_RUS
  208.                 jp .savemode
  209. .not_shift_key
  210.                 cp 66
  211.                 jr nz,.not_alt_key
  212.                 ld a,l
  213.                 or .KEY_MODE_ALT
  214.                 and ~.KEY_MODE_E0
  215.                 bit .bKEY_MODE_SHIFT,a
  216.                 jp z,.savemode
  217.                 jr .chruslat
  218. .not_alt_key
  219.                 ld a,l
  220.                 and ~.KEY_MODE_E0
  221.                 jp .savemode
  222.  
  223. .keypressmode
  224.                 cp 0xe0
  225.                 jp z,.noredraw
  226.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_SHIFT)
  227.                 cp 0x12
  228.                 jr z,.keypressend
  229.                 cp 0x59
  230.                 jr z,.keypressend
  231.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_ALT)
  232.                 cp 0x11
  233.                 jr z,.keypressend
  234.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0)
  235.                 ld e,.KEY_MODE_CAPS
  236.                 cp 0x58
  237.                 jr z,.keypressm_xor
  238.                 ld e,.KEY_MODE_NUML
  239.                 cp 0x77
  240.                 jr nz,.keypressend
  241. .keypressm_xor
  242.                 ld a,l
  243.                 and h
  244.                 xor e
  245.                 jr .keypressend1
  246. .keypressend
  247.                 ld a,h
  248.                 and l
  249. .keypressend1
  250.                 ld (.mode),a
  251.         jp .noredraw
  252.  
  253. .scodes
  254. ;                 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
  255. ;                       0, F9,  0, F5, F3, F1, F2,F12,  0,F10, F8, F6, F4,TAB,'`',  0
  256.         defb    0,151,  0,147,145,143,144,  0,  0,152,150,148,146,140, 33,  0   ;0x00
  257. ;                       0,LAl,LSh,  0,LCt,'q','1',  0,  0,  0,'z','s','a','w','2',  0
  258.         defb    0, 66, 64,  0, 68, 17, 34,  0,  0,  0, 26, 19,  1, 23, 35,  0   ;0x10
  259. ;                       0,'c','x','d','e','4','3',  0,  0,' ','v','f','t','r','5',  0
  260.         defb    0,  3, 24,  4,  5, 37, 36,  0,  0,142, 22,  6, 20, 18, 38,  0   ;0x20
  261. ;                       0,'n','b','h','g','y','6',  0,  0,  0,'m','j','u','7','8',  0
  262.         defb    0, 14,  2,  8,  7, 25, 39,  0,  0,  0, 13, 10, 21, 40, 41,  0   ;0x30
  263. ;                       0,',','k','i','o','0','9',  0,  0,'.','/','l',';','p','-',  0
  264.         defb    0, 31, 11,  9, 15, 43, 42,  0,  0, 32, 47, 12, 29, 16, 44,  0   ;0x40
  265. ;                       0,  0,  ',  0,'[','=',  0,  0,  0,RSh,ENT,']',  0,  \,  0,  0
  266.         defb    0,  0, 30,  0, 27, 45,  0,  0,  0, 64,156, 28,  0, 46,  0,  0   ;0x50
  267. ;                       0,  0,  0,  0,  0,  0, BS,  0,  0,'1',  0,'4','7',  0,  0,  0
  268.         defb    0,  0,  0,  0,  0,  0,139,  0,  0,137,  0,128,136,  0,  0,  0   ;0x60
  269. ;                 '0','.','2','5','6','8',ESC,  0,F11,'+','3','-','*','9',  0,  0
  270.         defb  134,135,131,138,129,130,141,  0,  0,155,133,154,153,132,  0,  0   ;0x70
  271. ;                       0,  0,  0, F7                                                                  
  272.         defb    0,  0,  0,149
  273.        
  274. .mod_base
  275.                  ;                 11111111112222222   2223 333   333333444444 44
  276.                  ;12345678901234567890123456   7890 123   456789012345 67
  277. .char_decode=$-1
  278.         defb "abcdefghijklmnopqrstuvwxyz","[];\',.`","1234567890-=\\/"
  279. .mod_sh
  280.         defb "ABCDEFGHIJKLMNOPQRSTUVWXYZ","{}:\"<>~","!@#$%^&*()_+|?"
  281. .mod_ru
  282. .char_decode_ru=$-1
  283.         defb "фисвуапршолдьтщзйкыегмцчня","хъжэбюё","1234567890-=\\."
  284. .mod_ru_sh
  285.         defb "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ","ХЪЖЭБЮЁ","!\"№;%:?*()_+/,"
  286. .unmod
  287. .unmod_decode=$-128
  288.         defb key_left,key_right,key_up,key_down ;128
  289.         defb key_pgup,key_pgdown,key_ins,key_del ;132
  290.         defb key_home,key_end,0,key_backspace   ;136
  291.         defb key_tab,key_esc,' ',key_F1 ;140
  292.         defb key_F2,key_F3,key_F4,key_F5        ;144
  293.         defb key_F6,key_F7,key_F8,key_F9        ;148
  294.         defb key_F10,'*','-','+',key_enter      ;152
  295. .unmod_sh
  296.         defb "4682930.715"
  297.        
  298.