Subversion Repositories NedoOS

Rev

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