?login_element?

Subversion Repositories NedoOS

Rev

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

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