Subversion Repositories NedoOS

Rev

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

  1.  
  2. KEYSCAN
  3.                 ret
  4.                
  5.                
  6. ;--------------------------------------------------
  7. keyqueueput_codenolang
  8.        
  9. GETKEY
  10. .KEY_MODE_NONE          = 0x00
  11. .KEY_MODE_SHIFT         = 0x01
  12. .KEY_MODE_ALT           = 0x02
  13. .KEY_MODE_CTRL          = 0x04
  14. .KEY_MODE_RUS           = 0x08
  15. .KEY_MODE_UP            = 0x10
  16. .KEY_MODE_E0            = 0x20
  17.  
  18. .bKEY_MODE_SHIFT        = 0x00
  19. .bKEY_MODE_ALT          = 0x01
  20. .bKEY_MODE_CTRL         = 0x02
  21. .bKEY_MODE_RUS          = 0x03
  22. .bKEY_MODE_UP           = 0x04
  23. .bKEY_MODE_E0           = 0x05
  24. ;out: ha=key (NOKEY=none), bc=keynolang keeps de,l
  25. ;H0=1 for control codes, H0=0 for symbols
  26. ;TODO где-то в H добавить биты регистра клавиатуры
  27.                 ld hl,(.redrawkey)
  28.                 ld a,l
  29.                 or a
  30.                 jr z,.noredraw
  31.                 ld bc,0x0000
  32.                 ld (.redrawkey),bc
  33.                 ld c,a
  34.                 ld b,h
  35.                 ret
  36. .noredraw
  37.                 ld bc,0xdef7    ;todo перенести в init
  38.                 out (c),c                       ;
  39.                 ld b,0xbe                       ;
  40.                 ld a,2                          ;
  41.                 out (c),a                       ;
  42.                 ;ld bc,0xdef7   ;раскоментить
  43.                 ;out (c),c
  44.                 ld b,0xbe
  45.                 in a,(c)
  46. .noredraw1
  47.                 ld h,a
  48.                 ld b,h
  49.                 ld c,a
  50.                 ret z ;a=nokey, h=0, bc=0
  51.                 cp 0xff
  52.                 jr nz,.decode
  53.                 ld bc,0xdef7    ;переполнено
  54.                 ld a,0x0c               ;сбросить буфер
  55.                 out (c),a
  56.                 ld b,0xbe
  57.                 ld a,1
  58.                 out (c),a
  59.                 xor a
  60.                 jr .noredraw1
  61.                
  62. .decode
  63. .mode=$+1
  64.                 ld l,0x00
  65.                 bit .bKEY_MODE_UP,l
  66.                 jp nz,.keypressmode
  67.                 cp 0xf0
  68.                 jr nz,.noF0
  69.                 ld a,.KEY_MODE_UP
  70. .savemode_or
  71.                 or l
  72. .savemode
  73.                 ld (.mode),a
  74.                 jr .noredraw
  75. .noF0  
  76.                 cp 0xe0
  77.                 jr nz,.noE0
  78.                 ld a,.KEY_MODE_E0
  79.                 jr .savemode_or
  80.                
  81. .noE0
  82.                 add 0xff&.scodes
  83.                 ld e,a
  84.                 ld a,0
  85.                 adc 0xff&(.scodes>>8)
  86.                 ld d,a
  87.                 ld a,(de)
  88.                 or a
  89.                 jr z,.noredraw  ;кнопка не поддерживается
  90.                
  91.                 cp 0x12
  92.                 jr nz,.no12
  93. .yes59
  94.                 ld a,l
  95.                 or .KEY_MODE_SHIFT
  96.                 and ~.KEY_MODE_E0
  97.                 bit .bKEY_MODE_ALT,a
  98.                 jr z,.savemode
  99. .chruslat
  100.                 xor .KEY_MODE_RUS
  101.                 jr .savemode
  102. .no12
  103.                 cp 0x59
  104.                 jr z,.yes59
  105.                 cp 0x11
  106.                 jr nz,.no11
  107.                 ld a,l
  108.                 or .KEY_MODE_ALT
  109.                 and ~.KEY_MODE_E0
  110.                 bit .bKEY_MODE_SHIFT,a
  111.                 jr z,.savemode
  112.                 jr .chruslat
  113. .no11
  114.                 bit .bKEY_MODE_E0,l
  115.                 jr z,.noE0mod
  116.                 ld a,l
  117.                 and ~.KEY_MODE_E0
  118.                 jr .savemode
  119. .noE0mod
  120.                 add 0xff&.scodes
  121.                 ld e,a
  122.                 ld a,0
  123.                 adc 0xff&(.scodes>>8)
  124.                 ld d,a
  125.                 ld a,(de)
  126.                 or a
  127.                 jr z,.noredraw1
  128.                 cp 68+1
  129.                 jr c,.noUniv
  130. .retsymb
  131.                 ld c,a
  132.                 ld b,1
  133.                 ld h,b
  134.                 ret
  135. .noUniv
  136.                 cp 47+1
  137.                 jr c,.noUnmod
  138.                 add 0xff&.unmod
  139.                 ld e,a
  140.                 ld a,0
  141.                 adc 0xff&(.unmod>>8)
  142.                 ld d,a
  143.                 ld a,(de)
  144.                 jr .retsymb
  145. .noUnmod
  146.                 ex af,af'
  147.                 ld a,l
  148.                 and .KEY_MODE_RUS|.KEY_MODE_SHIFT
  149.                 jr nz,.notModenone
  150.                         ex af,af'
  151.                         cp 27
  152.                         jr nc,.modenone1
  153.                         add 'a'-1
  154.                         jr .retsymb
  155. .modenone1
  156.                         cp 38
  157.                         jr c,.modenone2
  158.                         add '0'-38
  159.                         jr .retsymb
  160. .modenone2
  161.                         add 0xff&.stand
  162.                         ld e,a
  163.                         ld a,0
  164.                         adc 0xff&(.stand>>8)
  165.                         ld d,a
  166.                         ld a,(de)
  167.                         jr .retsymb                    
  168. .notModenone
  169.                 cp .KEY_MODE_SHIFT
  170.                 jr nz,.notModeShift
  171.                         ex af,af'
  172.                         cp 27
  173.                         jr nc,.modeshift1
  174.                         add 'A'-1
  175.                         jr .retsymb
  176. .modeshift1
  177.                         add 0xff&.stand_sh
  178.                         ld e,a
  179.                         ld a,0
  180.                         adc 0xff&(.stand_sh>>8)
  181.                         ld d,a
  182.                         ld a,(de)
  183.                         jr .retsymb    
  184. .notModeShift
  185.                 cp .KEY_MODE_RUS
  186.                 jr nz,.isModeRusShift
  187.                         ex af,af'
  188.                         cp 38
  189.                         jr nc,.moderus1
  190.                         add 0xff&.rust
  191.                         ld e,a
  192.                         ld a,0
  193.                         adc 0xff&(.rust>>8)
  194.                         ld d,a
  195.                         ld a,(de)
  196.                         jr .retsymb    
  197. .moderus1
  198.                         add '0'-38
  199.                         jr .retsymb
  200. .isModeRusShift
  201.                 ex af,af'
  202.                         add 0xff&.rust_sh
  203.                         ld e,a
  204.                         ld a,0
  205.                         adc 0xff&(.rust_sh>>8)
  206.                         ld d,a
  207.                         ld a,(de)
  208.                         jr .retsymb                    
  209. .keypressmode
  210.                 cp 0xe0
  211.                 jp z,.noredraw
  212.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_SHIFT)
  213.                 cp 0x12
  214.                 jr z,.keypressend
  215.                 cp 0x59
  216.                 jr z,.keypressend
  217.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_ALT)
  218.                 cp 0x11
  219.                 jr z,.keypressend
  220.                 ld h,~(.KEY_MODE_UP|.KEY_MODE_E0)
  221. .keypressend
  222.                 ld a,h
  223.                 and l
  224.                 ld (.mode),a
  225.                 xor a
  226.        jp .noredraw1
  227. ;.mode  defb 0
  228. .redrawkey
  229.                 DEFW 0
  230. .scodes
  231. ;                 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
  232. ;                       0, F9,  0, F5, F3, F1, F2,F12,  0,F10, F8, F6, F4,TAB,'`',  0
  233.         defb    0, 76,  0, 72, 70, 68, 69, 79,  0, 77, 75, 73, 71, 67, 33,  0   ;0x00
  234. ;                       0,  0,  0,  0,  0,'q','1',  0,  0,  0,'z','s','a','w','2',  0
  235.         defb    0,  0,  0,  0,  0, 17, 39,  0,  0,  0, 26, 19,  1, 23, 40,  0   ;0x10
  236. ;                       0,'c','x','d','e','4','3',  0,  0,' ','v','f','t','r','5',  0
  237.         defb    0,  3, 24,  4,  5, 42, 41,  0,  0, 48, 22,  6, 20, 18, 43,  0   ;0x20
  238. ;                       0,'n','b','h','g','y','6',  0,  0,  0,'m','j','u','7','8',  0
  239.         defb    0, 14,  2,  8,  7, 25, 44,  0,  0,  0, 13, 10, 21, 45, 46,  0   ;0x30
  240. ;                       0,',','k','i','o','0','9',  0,  0,'.','/','l',';','p','-',  0
  241.         defb    0, 31, 11,  9, 15, 38, 47,  0,  0, 32, 35, 12, 29, 16, 36,  0   ;0x40
  242. ;                       0,  0,  ',  0,'[','=',  0,  0,  0,  0,ENT,']',  0,  \,  0,  0
  243.         defb    0,  0, 30,  0, 27, 37,  0,  0,  0,  0, 49, 28,  0, 34,  0,  0   ;0x50
  244. ;                       0,  0,  0,  0,  0,  0, BS,  0,  0,'1',  0,'4','7',  0,  0,  0
  245.         defb    0,  0,  0,  0,  0,  0,key_backspace,  0,  0, 51,  0,248, 57,  0,  0,  0         ;0x60
  246. ;                 '0','.','2','5','6','8',ESC,  0,F11,'+','3','-','*','9',  0,  0
  247.         defb   50, 65,249, 55,251,250, 66,  0, 78, 64, 53, 63, 62, 59,  0,  0   ;0x70
  248. ;                       0,  0,  0, F7                                                                          
  249.         defb    0,  0,  0, 74
  250.        
  251. .unmod=$-48
  252.         defb " \r0123456789 /*-+.",0x1b,"\t",0x08
  253. .stand=$-27
  254.         defb "[];\',.`\\/-="
  255. .stand_sh=$-27
  256.         defb "{}:\"<>~|?_+)!@#$%^&*("
  257. .rust=$-1
  258.         defb "фисвуапршолдьтщзйкыегмцчняхъжэбюё\\.-="
  259. .rust_sh=$-1
  260.         defb "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯХЪЖЭБЮЁ/,_+)!\"№;%:?*("
  261.        
  262.        
  263. KEY_PUTREDRAW
  264. ;чистим очередь клавиатуры
  265.                 call GETKEY
  266.                 or c
  267.                 jr nz,KEY_PUTREDRAW
  268.                 ld bc,key_redraw
  269.                 ld (GETKEY.redrawkey),bc
  270.                 ret
  271.          ;jp KEYQUEUEPUT ;если переключились на неактивную задачу, то некому прочитать код!!
  272.