Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Text CodePage = cp1251
  2.  
  3. ; Ïðåäâàðèòåëüíî íåîáõîäèìî óñòàíîâèòü ðåæèì ââîäà ñêàíêîäîâ
  4. ;set_ckancode_mode:
  5. ;         xor      ecx, ecx
  6. ;         inc ecx
  7. ;         mcall 66,1                    ; óñòàíîâêà ðåæèìà ââîäà ñêàíêîäîâ
  8. ;         ret
  9.  
  10.  
  11.  
  12.  
  13.  
  14. ;-----------------------------------------------------
  15. load_port_FE:           ;    äåøèôðîâêà ïîðà FE - êëàâèàòóðà Spectruma
  16.  
  17.                                   ;    âõîä ax - íîìåð ïîðòà  al = 0xFE   ah = [ñòàðøèé áàéò àäðåñà ïîðòà]
  18.                                   ;    âûõîä   - al - ñîäåðæèìîå ïîðòà êëàâèàòóðû îñòàëüíûå áàéòû ïðîèçâîëüíû
  19.                                   ;    ïðîèçâîäèòñÿ ïîëíàÿ äåøèôðàöèÿ ïîðòà c ïðîèçâîëüíûìè çíà÷åíèÿìè
  20.                                   ;    ñòàðøåãî áàéòà (êàê â íàñòîÿùåì ñïåêêå)
  21.             cmp   al, 0xFE
  22.             jne     .ret
  23.    push   esi
  24.    push   ebx
  25.             mov  esi, zx_keys    ; áóäåì âû÷èòûâàòü èç áóôåðà êëàâû
  26.             mov  bl, 0xFF
  27.             cld
  28. rept  8
  29. {
  30.             lodsb
  31.             shr   ah, 1
  32.             jc  @f
  33.             and  bl, al
  34. @@:
  35. }
  36.            mov  al, bl
  37.  
  38.    pop    ebx
  39.    pop    esi
  40.  
  41. .ret:
  42.            ret
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. ;------------------------------------------------------
  51. ;  ×òåíèå êëàâèàòóðû PC è ïåðåâîä åå ñîñòîÿíèÿ â áóôåð ïîðòà FE ñïåêòðóìà
  52.  
  53. load_keys:                    ; ðåãèñòðû íå ñîõðàíÿåò
  54.  
  55.          mov     edi, scancodes_tbl             ; Àäðåñ òàáëèöû îáðàáîòêè ñêàíêîäîâ
  56.          mov     ebx, 0xFFFFFFE0                ; âñïîìîãàòåëüíàÿ ìàñêà
  57.  
  58.          mov     edx,  dword [zx_keys]         ; áóôåð êëàâèàòóðû ñïåêòðóìà
  59.          mov     esi,   dword [zx_keys+4]    ;
  60.  
  61.  
  62.  
  63. .loop:                ; öèêë âûáîðà êëàâèø èç áóôåðà
  64.          mov     ecx, ebx                       ; ñîõðàíèòü ebx
  65.          mcall   66,3                             ; ïðîâåðèòü óïðàâëÿþùèå êëàâèøè
  66.          mov     ebx, ecx                       ; âîññòàíîâèòü ebx
  67.          and      al, 0x80                       ; ïðîâåðèòü NumLock
  68.          mov     byte [num_lock_flag], al
  69. .loop_1:
  70.          mcall   2                                  ; çàáðàòü êîä íàæàòîé êëàâèøè
  71.          cmp     eax, 1
  72.          jne        .load                              ; åñëè áóôåð íå ïóñò
  73.  
  74. .exit:
  75.         mov   dword [zx_keys], edx
  76.         mov   dword [zx_keys+4], esi
  77. .ret:
  78.         ret
  79.  
  80.  
  81.  
  82. .ext_key:
  83.               mov byte [ext_flag], 1
  84.               jmp  .loop
  85.  
  86. .load:
  87.         cmp  ah, 250
  88.         jne   @f
  89.         or  edx, 0x02000001       ; ñòèðàåì CAPS LOCK  {, NumLock, ScrollLock  - ?}
  90. ;        or  esi,  0x00000000
  91.         mov  byte [ ext_flag], 0
  92.         jmp  .loop_1
  93. @@:
  94.         cmp  ah,   224
  95.         je       .ext_key                         ; åñëè ðàñøèðåííàÿ êëàâèøà
  96.  
  97.         mov   cl, ah
  98.         and    cl, 0x7F
  99.         cmp   cl, 71                             ; åñëè êëàâèøè èç NumPad
  100.         jc       .l1
  101.         cmp   cl, 84
  102.         jnc     .l1
  103.  
  104.         cmp  byte [ ext_flag], 1           ;    åñëè êëàâèøà íàæàòà ïîñëå EXT
  105.         je      .l1
  106.        ; åñëè êëàâèøà áåç ext -
  107.         cmp  byte [num_lock_flag], 0     ;   åñëè óñòàíîâëåí ðåæèì êóðñîðà
  108.         jne      .lnorm
  109.        ; äîïîëíèòåëüíîå èçâðàùåíèå äëÿ ââîäà öèôð íà NumPade
  110.         sub   cl, 71
  111.         and   eax, 0x00008000
  112.         mov  al, cl
  113.         jz      .l1_2
  114.         xor    ah, ah
  115.         jz      ._1_2
  116. .l1:
  117.        mov   byte [ext_flag], 0
  118. .lnorm:
  119.         mov     al, ah                            ; scancode â al
  120.         and     eax, 0x000000FF          ;îòðåçàíèå ñòàðøåé ÷àñòè îò al
  121.         or        al, al
  122.         js  ._1
  123.   ;  Åñëè âûäàí ñêàíêîä íàæàòèÿ êëàâèøè
  124. .l1_1:    add  al, 13
  125. .l1_2:
  126.        shl       eax, 1                        ; *2
  127.        mov     ax, word [ edi+eax]     ;   al - 1 êëàâ , ah - 2 êëàâ
  128.        mov     ecx, eax
  129.      call     .L_proc_set                    ; 1 - êëàâèøà
  130.      shr    ecx, 8
  131.      mov   eax, ecx
  132.      call     .L_proc_set                    ; 2 - êëàâèøà
  133.        jmp   .loop_1                               ; ïðîäîëæèòü âûáîð èç áóôåðà
  134.  
  135. ._1:              ;Åñëè âûäàí ñêàíêîä îòïóñêàíèÿ êëàâèøè
  136.        and      al, 0x7f
  137.        add      al, 13
  138. ._1_2:
  139.        shl       eax, 1                        ; *2
  140.        mov     ax, word [ edi+eax]     ;   al - 1 êëàâ , ah - 2 êëàâ
  141.        mov     ecx, eax
  142.      call     .L_proc_res                    ; 1 - êëàâèøà
  143.      shr    ecx, 8
  144.      mov   eax, ecx
  145.      call     .L_proc_res                    ; 2 - êëàâèøà
  146.        jmp   .loop_1
  147.  
  148.  
  149.  
  150.  
  151. .L_proc_set:
  152.        or        cl, cl
  153.        jz       .ret
  154.        or        eax, ebx
  155.        and     cl, bl                              ; ìàñêà ïîðòà *32
  156.        or        cl, cl
  157.        js   @f
  158.                                                          ;  ïîðò ðàñïîëîæåí â edx
  159.        ror    cl, 2                                 ; öèêëè÷åñêîå ñìåùåíèå
  160.        rol    eax, cl
  161.        and  edx, eax                           ; ñîõðàíåíèå êëàâèøè
  162.        ret
  163. @@:                                         ; ïîðò ðàñïîëîæåí â esi
  164.       and   cl, 0x60                 ; íîðìèðîâêà ìàñêè
  165.       ror    cl, 2
  166.       rol    eax, cl
  167.       and  esi, eax
  168.       ret
  169.  
  170. .L_proc_res:
  171.        or        cl, cl
  172.        jz        .ret
  173.        or        eax, ebx
  174.        xor      eax, -1
  175.        and     cl, bl                              ; ìàñêà ïîðòà *32
  176.        or        cl, cl
  177.        js   @f
  178.                                                          ;  ïîðò ðàñïîëîæåí â edx
  179.        ror    cl, 2                                 ; öèêëè÷åñêîå ñìåùåíèå
  180.        rol    eax, cl
  181.        or     edx, eax                           ; óäàëåíèå êëàâèøè
  182.        ret
  183. @@:                                         ; ïîðò ðàñïîëîæåí â esi
  184.       and   cl, 0x60                 ; íîðìèðîâêà ìàñêè
  185.       ror    cl, 2
  186.       rol    eax, cl
  187.       or     esi, eax
  188.       ret
  189. ;--------------------------------------------------------
  190.  
  191.  
  192.  
  193. ;   Êëàâèàòóðà äëÿ Ñïåêòðóìà
  194. ;-----------------------------------------------------
  195. ;  SHIFT             -   CAPS SHIFT        (CS)
  196. ;  CTRL              -    SIMBOL SHIFT   (SS)
  197. ;  ALT                -    EXTEND MODE   (CS/SS) ; Îáû÷íûì ñïîñîáîì CS/SS íå íàáèðàåòñÿ
  198. ;
  199. ;  BACKSPACE  -   DELETE                (CS/0)
  200. ;  ESC                -   BREAK                  (CS/Space)
  201. ;  TAB                -   EDIT                     (CS/1)
  202. ;  '~'                  -   GRAPH                 (CS/9)
  203. ;  PAGE UP        -  TRUE VIDEO        (CS/3)
  204. ;  PAGE DOWN  -  INV. VIDEO          (CS/4)
  205. ;  UP                  -   UP                        (CS/7)
  206. ;  DOWN            -  DOWN                  (CS/6)
  207. ;  LEFT              -  LEFT                    (CS/5)
  208. ;  RIGHT            -  RIGHT                 (CS/8)
  209. ;  CAPS LOCK    - /CAPS LOCK/ - íå ðàáîòàåò íàáèðàòü òîëüêî êàê  (CS/2)
  210.  
  211.  
  212.  
  213.  
  214. not_used_code     equ     0x1F1F           ; êîä äëÿ íåèñïîëüçóåìîãî ñêàíêîäà
  215.  
  216. ; êîä ñêàíêîäà - 0x[áàéò ïðåôèêñà][áàéò êëàâèøè]
  217. ; [áàéò êëàâèøè / ïðåôèêñà] - áèòû=PPPKKKKK
  218. ; ãäå   PPP -  êîä ïîðòà
  219. ;          KKKKK - êîä êëàâèøè
  220.  
  221.  
  222.  
  223.  
  224.  
  225.                ; òàáëèöà ñîîòâåòñòâèÿ ñêàíêîäîâ êîäàì îáðàáîòêè êëàâèø - 256 - áàéò
  226.  
  227. scancodes_tbl     dw 0x0097                          ; 71 - Num7
  228.    dw 0x009B                          ; 72 - Num8
  229.    dw 0x009D                          ; 73 - Num9
  230.    dw 0xFDD7                         ; 74 - Num-
  231.    dw 0x0077                          ; 75 - Num4
  232.    dw 0x006F                          ; 76 - Num5
  233.    dw 0x008F                          ; 77 - Num6
  234.    dw 0xFDDB                         ; 78 - Num+
  235.    dw 0x007E                           ; 79 - Num1
  236.  
  237.    dw 0x007D                          ; 80 - Num2
  238.    dw 0x007B                          ; 81 - Num3
  239.    dw 0x009E                          ; 82 - Num0
  240.    dw 0xFDFB                         ; 83 - Num.
  241.    dw not_used_code             ;  0              ; -------------------------------------------
  242.    dw 0x1EFE                          ; 1 - ESC  -  Break (CS/Space)
  243.    dw 0x007E                           ; 2 - 1
  244.    dw 0x007D                           ; 3 - 2
  245.    dw 0x007B                           ; 4 - 3
  246.    dw 0x0077                           ; 5 - 4
  247.    dw 0x006F                          ; 6 - 5
  248.    dw 0x008F                          ; 7 - 6
  249.    dw 0x0097                          ; 8 - 7
  250.    dw 0x009B                          ; 9 - 8
  251.  
  252.    dw 0x009D                         ; 10 - 9
  253.    dw 0x009E                          ; 11 - 0
  254.    dw 0xFDD7                         ; 12 - -
  255.    dw 0xFDDD                        ; 13 - =
  256.    dw 0x1E9E                          ; 14 - BackSpace   -  Delete(backspace) (CS/0)
  257.    dw 0x1E7E                          ; 15 - TAB       -     EDIT (CS/1)
  258.    dw 0x005E                          ; 16 - q
  259.    dw 0x005D                         ; 17 - w
  260.    dw 0x005B                         ; 18 - e
  261.    dw 0x0057                         ; 19 - r
  262.  
  263.    dw 0x004F                          ; 20 - t
  264.    dw 0x00AF                           ; 21 - y
  265.    dw 0x00B7                          ; 22 - u
  266.    dw 0x00BB                         ; 23 - i
  267.    dw 0x00BD                         ; 24 - o
  268.    dw 0x00BE                         ; 25 - p
  269.    dw 0xFDAF                        ; 26 - [            -     SS/Y
  270.    dw 0xFDB7                        ; 27 - ]            -     SS/U
  271.    dw 0x00DE                         ; 28 - Enter
  272.    dw 0x00FD                         ; 29 - L_Control   -  Simbol Shift (SS)
  273.  
  274.    dw 0x003E                          ; 30 - a
  275.    dw 0x003D                          ; 31 - s
  276.    dw 0x003B                          ; 32 - d
  277.    dw 0x0037                          ; 33 - f
  278.    dw 0x002F                         ; 34 - g
  279.    dw 0x00CF                         ; 35 - h
  280.    dw 0x00D7                         ; 36 - j
  281.    dw 0x00DB                         ; 37 - k
  282.    dw 0x00DD                         ; 38 - l
  283.    dw 0xFDBD                        ; 39 - ;         -   ;  (SS/O)
  284.  
  285.    dw 0xFD97                         ; 40 - '       -    '  (SS/7)
  286.    dw 0x1E9D                         ; 41 - ~     -   GRAPH (CS/9)
  287.    dw 0x001E                          ; 42 - L_Shift (ýì caps )
  288.    dw 0xFD3B                         ; 43 - \      -   SS/D
  289.    dw 0x001D                          ; 44 - z
  290.    dw 0x001B                          ; 45 - x
  291.    dw 0x0017                          ; 46 - c
  292.    dw 0x000F                          ; 47 - v
  293.    dw 0x00EF                          ; 48 - b
  294.    dw 0x00F7                          ; 49 - n
  295.  
  296.    dw 0x00FB                          ; 50 - m
  297.    dw 0xFDF7                         ; 51 - ,
  298.    dw 0xFDFB                         ; 52 - .
  299.    dw 0xFD0F                         ; 53 - /
  300.    dw 0x001E                          ; 54 - R_Shift  -    CAPS   (CS)
  301.    dw 0xFDEF                         ; 55 - Num *    -  *  (SS/B)
  302.    dw 0xFD1E                         ; 56 - ALT     -    Extend Mode     (CS/SS)
  303.    dw 0x00FE                          ; 57 - Space
  304.    dw 0x1E7D                         ; 58 - Caps Lock   -  Caps Lock  (CS/2)
  305.    dw not_used_code             ; 59 - F1
  306.  
  307.    dw not_used_code             ; 60 - F2
  308.    dw not_used_code             ; 61 - F3
  309.    dw not_used_code             ; 62 - F4
  310.    dw not_used_code             ; 63 - F5
  311.    dw not_used_code             ; 64 - F6
  312.    dw not_used_code             ; 65 - F7
  313.    dw not_used_code             ; 66 - F8
  314.    dw not_used_code             ; 67 - F9
  315.    dw not_used_code             ; 68 - F10
  316.    dw not_used_code             ; 69 - NumLock (îòïóñê M 250)
  317.                                                        ; BREAK ñîâìåñòíî (225,29,69) (225 - EXT2) (29 -L_Control)
  318.  
  319.    dw not_used_code             ; 70 - Scroll Lock ( îòïóñê Ì 250)
  320.    dw not_used_code             ; 71 - Home  (ïîñëå EXT)      (åì
  321.    dw 0x1E97                          ; 72 - Up (ïîñëå EXT)     -    UP (CS/7)
  322.    dw 0x1E7B                         ; 73 - Page Up (ïîñëå EXT - 224)   -  True video (CS/3)
  323.    dw 0xFDD7                         ; 74 - Num-     -        -     (SS/J)
  324.    dw 0x1E6F                          ; 75 - Left (ïîñëå EXT)     -    <-- (CS/5)
  325.    dw not_used_code             ; 76 - Num5
  326.    dw 0x1E9B                          ; 77 - Right (ïîñëå EXT)  -    --> (CS/8)
  327.    dw 0xFDDB                         ; 78 - Num+
  328.    dw not_used_code             ; 79 - END (ïîñëå EXT)
  329.  
  330.    dw 0x1E8F                          ; 80 - Down (ïîñëå EXT)   -    DOWN (CS/6)
  331.    dw 0x1E77                          ; 81 - Page Down (ïîñëå EXT)  - Inv. Video (CS/4)
  332.    dw not_used_code             ; 82 - Insert (ïîñëå EXT)
  333.    dw not_used_code             ; 83 - Delete (ïîñëå EXT)
  334.    dw not_used_code             ; 84
  335.    dw not_used_code             ; 85
  336.    dw not_used_code             ; 86
  337.    dw not_used_code             ; 87 - F11
  338.    dw not_used_code             ; 88 - F12
  339.    dw not_used_code             ; 89
  340.  
  341.    dw not_used_code             ; 90
  342.    dw not_used_code             ; 91
  343.    dw not_used_code             ; 92
  344.    dw not_used_code             ; 93 - Ìåíþ 3 (ïîñëå ext)
  345.    dw not_used_code             ; 94
  346.    dw not_used_code             ; 95
  347.    dw not_used_code             ; 96 - (224) - ext - äîï. ôóíêöèÿ ñêàíêîäîâ
  348.    dw not_used_code             ; 97 - (225) - ext2
  349.    dw not_used_code             ; 98
  350.    dw not_used_code             ; 99
  351.  
  352.    dw not_used_code             ; 100
  353.    dw not_used_code             ; 101
  354.    dw not_used_code             ; 102
  355.    dw not_used_code             ; 103
  356.    dw not_used_code             ; 104
  357.    dw not_used_code             ; 105
  358.    dw not_used_code             ; 106
  359.    dw not_used_code             ; 107
  360.    dw not_used_code             ; 108
  361.    dw not_used_code             ; 109
  362.  
  363.    dw not_used_code             ; 110
  364.    dw not_used_code             ; 111
  365.    dw not_used_code             ; 112
  366.    dw not_used_code             ; 113
  367.    dw not_used_code             ; 114
  368.    dw not_used_code             ; 115
  369.    dw not_used_code             ; 116
  370.    dw not_used_code             ; 117
  371.    dw not_used_code             ; 118
  372.    dw not_used_code             ; 119
  373.  
  374.    dw not_used_code             ; 120
  375.    dw not_used_code             ; 121
  376.    dw not_used_code             ; 122 - (250) M Îòïóñê (Capslock, Numlock è ò.ï.)
  377.    dw not_used_code             ; 123
  378.    dw not_used_code             ; 124
  379.    dw not_used_code             ; 125
  380.    dw not_used_code             ; 126
  381.    dw not_used_code             ; 127
  382.    dw 0
  383.  
  384.  
  385.  
  386.  
  387. ; Ôëàãè êëàâèàòóðû
  388. ext_flag                 db 0                 ; ôëàã ðàñøèðåííîãî ñêàíêîäà
  389. num_lock_flag      db 0                 ;  ôëàã num êëàâû
  390.  
  391.  
  392. ;Áóôåð ZX-Spectrum êëàâèàòóðû.
  393.  
  394. zx_keys     dd   0xFFFFFFFF, 0xFFFFFFFF
  395. ;ïîçèöèÿ áàéòà/ñòàðøèé áàéò ïîðòà:
  396.  
  397. ;   +0 - FE
  398. ;   +1 - FD
  399. ;   +2 - FB
  400. ;   +3 - F7
  401. ;   +4 - EF
  402. ;   +5 - DF
  403. ;   +6 - BF
  404. ;   +7 - 7F
  405.  
  406.  
  407.  
  408.