?login_element?

Subversion Repositories NedoOS

Rev

Rev 1217 | 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.                 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.                  bit .bKEY_MODE_CTRL,l
  117.                  jr nz,.ctrl_mod
  118.                 cp 27
  119.                 ld a,.KEY_MODE_SHIFT
  120.                 jr nc,.base_noneed_caps
  121.                 bit .bKEY_MODE_ALT,l
  122.                 jr z,.no_alt_mod
  123.                 ld a,b
  124.                 ;jr .retsymb
  125.         add a,0xff&.alt_decode
  126.         ld e,a
  127.         adc a,0xff&(.alt_decode>>8)
  128.         jr .ctrl_mod_ok
  129. ;.no_alt_mod
  130.                 ;bit .bKEY_MODE_CTRL,l
  131.                 ;jr z,.no_ctrl_mod
  132. .ctrl_mod
  133.                 ld a,b
  134.                 add a,0xff&.ctrl_decode
  135.                 ld e,a
  136.                 adc a,0xff&(.ctrl_decode>>8)
  137. .ctrl_mod_ok                
  138.                 sub e
  139.                 ld d,a
  140.                 ld a,(de)
  141.                 ld c,a
  142.                 jr .retsymb
  143. .no_alt_mod
  144. .no_ctrl_mod
  145.                 ld a,.KEY_MODE_SHIFT|.KEY_MODE_CAPS
  146. .base_noneed_caps
  147.                 and l
  148.                 ld a,0
  149.                 jp pe,.base_not_sh
  150.                 ld a,.mod_sh-.mod_base
  151. .base_not_sh
  152.                 add a,b
  153.                 add 0xff&.char_decode
  154.                 ld e,a
  155.                 ld a,0
  156.                 adc 0xff&(.char_decode>>8)
  157.                 ld d,a
  158.                 ld a,(de)
  159.                 ld c,a
  160.                 bit .bKEY_MODE_E0,l
  161.                 jr nz,.retsymb
  162.                 bit .bKEY_MODE_RUS,l
  163.                 jr nz,.rus_decode
  164. .retsymb
  165.                 ld b,a
  166.                 ld (KEY_PUTREDRAW.rep_key),bc
  167.                 ex af,af' ;'
  168.                 ld a,35
  169.                 ld (KEYSCAN.rep_wait),a
  170.                 ex af,af' ;'
  171. .retsymb1
  172.                 ld b,0
  173.                 ld h,b
  174.                 res .bKEY_MODE_E0,l
  175.                 ld (.mode),hl
  176.                 ret
  177. .rus_decode
  178.                 ld a,b
  179.                 cp 33
  180.                 ld a,.KEY_MODE_SHIFT
  181.                 jr nc,.rus_noneed_caps
  182.                 ld a,.KEY_MODE_SHIFT|.KEY_MODE_CAPS
  183. .rus_noneed_caps
  184.                 and l
  185.                 ld a,0
  186.                 jp pe,.rus_not_sh
  187.                 ld a,.mod_sh-.mod_base
  188. .rus_not_sh
  189.                 add a,b
  190.                 add a,0xff&.char_decode_ru
  191.                 ld e,a
  192.                 ld a,0
  193.                 adc a,0xff&(.char_decode_ru>>8)
  194.                 ld d,a
  195.                 ld a,(de)
  196.                 jr .retsymb
  197. .not_simbol
  198.                 ld b,a
  199.                 cp 128
  200.                 jr c,.is_mode_key
  201.                 cp 139
  202.                 jr nc,.unmod_no_lock
  203.                 bit .bKEY_MODE_E0,l
  204.                 jr nz,.unmod_no_lock
  205.                 bit .bKEY_MODE_NUML,l
  206.                 jr nz,.unmod_no_lock
  207.                 add .unmod_sh-.unmod
  208. .unmod_no_lock
  209.                 add a,0xff&.unmod_decode
  210.                 ld e,a
  211.                 ld a,0
  212.                 adc a,0xff&(.unmod_decode>>8)
  213.                 ld d,a
  214.                 ld a,(de)
  215.                 ld c,a
  216.                cp key_enter
  217.                jr z,.modify_enter
  218.                  bit .bKEY_MODE_SHIFT,l
  219.                  jp nz,.zero_ret ;Shift+F1 - это не F1
  220.                 jr .retsymb
  221. .modify_enter
  222.                  bit .bKEY_MODE_SHIFT,l
  223.                  jr z,.retsymb
  224.         ld a,0x7f
  225.         in a,(0xfe)
  226.         rra
  227.         ld c,a ;c0=ss
  228.         ld a,0xbf
  229.         in a,(0xfe)
  230.         or c
  231.         rra ;NC: ssEnter pressed
  232.         jp nc,.zero_ret
  233.                  ld a,key_csenter
  234.                  ld c,a
  235.                  jr .retsymb
  236.  
  237. .is_mode_key
  238.                 cp 64
  239.                 jr nz,.not_shift_key
  240.                 ld a,l
  241.                 or .KEY_MODE_SHIFT
  242.                 and ~.KEY_MODE_E0
  243.                 bit .bKEY_MODE_ALT,a
  244.                 jp z,.savemode
  245. .chruslat
  246.                 xor .KEY_MODE_RUS
  247.                 jp .savemode
  248. .not_shift_key
  249.                 cp 66
  250.                 jr nz,.not_alt_key
  251.                 ld a,l
  252.                 or .KEY_MODE_ALT
  253.                 and ~.KEY_MODE_E0
  254.                 bit .bKEY_MODE_SHIFT,a
  255.                 jp z,.savemode
  256.                 jr .chruslat
  257. .not_alt_key
  258.                 cp 68
  259.                 jr nz,.not_ctrl_key
  260.                 ld a,l
  261.                 or .KEY_MODE_CTRL
  262.                 and ~.KEY_MODE_E0
  263.                 jp .savemode
  264. .not_ctrl_key          
  265.                 ld a,l
  266.                 and ~.KEY_MODE_E0
  267.                 jp .savemode
  268.  
  269. .keypressmode
  270.                 cp 0xe0
  271.                 jp z,.noredraw
  272.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_SHIFT)
  273.                 cp 0x12
  274.                 jr z,.keypressend
  275.                 cp 0x59
  276.                 jr z,.keypressend
  277.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_ALT)
  278.                 cp 0x11
  279.                 jr z,.keypressend
  280.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_CTRL)
  281.                 cp 0x14
  282.                 jr z,.keypressend
  283.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0)
  284.                 ld e,.KEY_MODE_CAPS
  285.                 cp 0x58
  286.                 jr z,.keypressm_xor
  287.                 ld e,.KEY_MODE_NUML
  288.                 cp 0x77
  289.                 jr nz,.keypressend
  290. .keypressm_xor
  291.                 ld a,l
  292.                 and h
  293.                 xor e
  294.                 jr .keypressend1
  295. .keypressend
  296.                 ld a,h
  297.                 and l
  298. .keypressend1
  299.                 ld (.mode),a
  300.         jp .noredraw
  301.  
  302. .scodes
  303.                 ;0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
  304.                 ;0, F9,  0, F5, F3, F1, F2,F12,  0,F10, F8, F6, F4,TAB,'`',  0
  305.         defb    0,151,  0,147,145,143,144,  0,  0,152,150,148,146,140, 33,  0   ;0x00
  306.                 ;0,LAl,LSh,  0,LCt,'q','1',  0,  0,  0,'z','s','a','w','2',  0
  307.         defb    0, 66, 64,  0, 68, 17, 34,  0,  0,  0, 26, 19,  1, 23, 35,  0   ;0x10
  308.                 ;0,'c','x','d','e','4','3',  0,  0,' ','v','f','t','r','5',  0
  309.         defb    0,  3, 24,  4,  5, 37, 36,  0,  0,142, 22,  6, 20, 18, 38,  0   ;0x20
  310.                 ;0,'n','b','h','g','y','6',  0,  0,  0,'m','j','u','7','8',  0
  311.         defb    0, 14,  2,  8,  7, 25, 39,  0,  0,  0, 13, 10, 21, 40, 41,  0   ;0x30
  312.                 ;0,',','k','i','o','0','9',  0,  0,'.','/','l',';','p','-',  0
  313.         defb    0, 31, 11,  9, 15, 43, 42,  0,  0, 32, 47, 12, 29, 16, 44,  0   ;0x40
  314.                 ;0,  0,  ',  0,'[','=',  0,  0,  0,RSh,ENT,']',  0,  \,  0,  0
  315.         defb    0,  0, 30,  0, 27, 45,  0,  0,  0, 64,156, 28,  0, 46,  0,  0   ;0x50
  316.                 ;0,  0,  0,  0,  0,  0, BS,  0,  0,'1',  0,'4','7',  0,  0,  0
  317.         defb    0,  0,  0,  0,  0,  0,139,  0,  0,137,  0,128,136,  0,  0,  0   ;0x60
  318.                 ;'0','.','2','5','6','8',ESC,  0,F11,'+','3','-','*','9',  0,  0
  319.         defb  134,135,131,138,129,130,141,  0,  0,155,133,154,153,132,  0,  0   ;0x70
  320.                 ;0,  0,  0, F7                                                                 
  321.         defb    0,  0,  0,149
  322.        
  323. .mod_base
  324.                  ;                 11111111112222222   2223 333   333333444444 44
  325.                  ;12345678901234567890123456   7890 123   456789012345 67
  326. .char_decode=$-1
  327.         defb "abcdefghijklmnopqrstuvwxyz","[];\',.`","1234567890-=\\/"
  328. .mod_sh
  329.         defb "ABCDEFGHIJKLMNOPQRSTUVWXYZ","{}:\"<>~","!@#$%^&*()_+|?"
  330. .mod_ru
  331. .char_decode_ru=$-1
  332.         defb "фисвуапршолдьтщзйкыегмцчня","хъжэбюё","1234567890-=\\."
  333. .mod_ru_sh
  334.         defb "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ","ХЪЖЭБЮЁ","!\"№;%:?*()_+/,"
  335. .unmod
  336. .unmod_decode=$-128
  337.         defb key_left,key_right,key_up,key_down ;128
  338.         defb key_pgup,key_pgdown,key_ins,key_del ;132
  339.         defb key_home,key_end,0,key_backspace   ;136
  340.         defb key_tab,key_esc,' ',key_F1 ;140
  341.         defb key_F2,key_F3,key_F4,key_F5        ;144
  342.         defb key_F6,key_F7,key_F8,key_F9        ;148
  343.         defb key_F10,'*','-','+',key_enter      ;152
  344. .unmod_sh
  345.         defb "4682930.715"
  346.        
  347. .ctrl_decode=$-1
  348.         defb ssA,ssB,ssC,ssD,ssE,ssF,ssG,ssH,ssI,ssJ,ssK,ssL,ssM
  349.         defb ssN,ssO,ssP,ssQ,ssR,ssS,ssT,ssU,ssV,ssW,ssX,ssY,ssZ
  350.         db "{}:\"<>~",ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,ss9,ss0,"_+|?"
  351. .alt_decode=$-1
  352.         defb extA,extB,extC,extD,extE,extF,extG,extH,extI,extJ,extK,extL,extM
  353.         defb extN,extO,extP,extQ,extR,extS,extT,extU,extV,extW,extX,extY,extZ
  354.        db "{}:\"<>~",ext1,ext2,ext3,ext4,ext5,ext6,ext7,ext8,ext9,ext0,"_+|?"
  355.