?login_element?

Subversion Repositories NedoOS

Rev

Blame | 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.                  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.                    ;   ,Esc,'1','2','3','4','5','6','7','8','9','0',   ,   , BS,Tab
  305.         defb      0,141, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,  0,  0,139,140 ;0x00
  306.        
  307.                    ;'q','w','e','r','t','y','u','i','o','p','[',']',Ent,LCt,'a','s'
  308.         defb     17, 23,  5, 18, 20, 25, 21,  9, 15, 16, 27, 28,156, 68,  1, 19 ;0x10
  309.        
  310.                    ;'d','f','g','h','j','k','L',';',"'",'~',LSh,   ,'z','x','c','v'
  311.         defb      4,  6,  7,  8, 10, 11, 12, 29, 30, 33, 64,  0, 26, 24,  3, 22 ;0x20
  312.        
  313.                    ;'b','n','m',',','.',   ,RSh,'*',LAl,' ',   , F1, F2, F3, F4, F5
  314.         defb      2, 14, 13, 31, 32,  0, 64,153, 66,142,  0,143,144,145,146,147 ;0x30
  315.        
  316.                    ; F6, F7, F8, F9,F10,   ,   ,'7','8','9','-','4','5','6','+','1'
  317.         defb    148,149,150,151,152,  0,  0,136,130,132,154,128,138,129,155,137 ;0x40
  318.        
  319.                    ;'2','3','0','.',   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,  
  320.         defb    131,133,134,135,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;0x50
  321.        
  322.                    ;   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,  
  323.         defb      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;0x60
  324.        
  325.                    ;   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,   ,  
  326.         defb      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 ;0x70
  327.        
  328.        
  329. .mod_base
  330.                  ;                 11111111112222222   2223 333   333333444444 44
  331.                  ;12345678901234567890123456   7890 123   456789012345 67
  332. .char_decode=$-1
  333.         defb "abcdefghijklmnopqrstuvwxyz","[];\',.`","1234567890-=\\/"
  334. .mod_sh
  335.         defb "ABCDEFGHIJKLMNOPQRSTUVWXYZ","{}:\"<>~","!@#$%^&*()_+|?"
  336. .mod_ru
  337. .char_decode_ru=$-1
  338.         defb "фисвуапршолдьтщзйкыегмцчня","хъжэбюё","1234567890-=\\."
  339. .mod_ru_sh
  340.         defb "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ","ХЪЖЭБЮЁ","!\"№;%:?*()_+/,"
  341. .unmod
  342. .unmod_decode=$-128
  343.         defb key_left,key_right,key_up,key_down ;128
  344.         defb key_pgup,key_pgdown,key_ins,key_del ;132
  345.         defb key_home,key_end,0,key_backspace   ;136
  346.         defb key_tab,key_esc,' ',key_F1 ;140
  347.         defb key_F2,key_F3,key_F4,key_F5        ;144
  348.         defb key_F6,key_F7,key_F8,key_F9        ;148
  349.         defb key_F10,'*','-','+',key_enter      ;152
  350. .unmod_sh
  351.         defb "4682930.715"
  352.        
  353. .ctrl_decode=$-1
  354.         defb ssA,ssB,ssC,ssD,ssE,ssF,ssG,ssH,ssI,ssJ,ssK,ssL,ssM
  355.         defb ssN,ssO,ssP,ssQ,ssR,ssS,ssT,ssU,ssV,ssW,ssX,ssY,ssZ
  356.         db "{}:\"<>~",ss1,ss2,ss3,ss4,ss5,ss6,ss7,ss8,ss9,ss0,"_+|?"
  357. .alt_decode=$-1
  358.         defb extA,extB,extC,extD,extE,extF,extG,extH,extI,extJ,extK,extL,extM
  359.         defb extN,extO,extP,extQ,extR,extS,extT,extU,extV,extW,extX,extY,extZ
  360.        db "{}:\"<>~",ext1,ext2,ext3,ext4,ext5,ext6,ext7,ext8,ext9,ext0,"_+|?"
  361.