Subversion Repositories Kolibri OS

Rev

Rev 2434 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;; Includes source code by Kulakov Vladimir Gennadievich.       ;;
  7. ;; Modified by Mario79 and Rus.                                 ;;
  8. ;; 02.12.2009 <Lrz>                                             ;;
  9. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  10.  
  11. ;driver sceletone
  12.  
  13. format MS COFF
  14.  
  15. DEBUG        equ 0
  16.  
  17. include 'proc32.inc'
  18. include 'imports.inc'
  19.  
  20. API_VERSION     equ 5  ;debug
  21.  
  22. struc IOCTL
  23. {  .handle      dd ?
  24.    .io_code     dd ?
  25.    .input       dd ?
  26.    .inp_size    dd ?
  27.    .output      dd ?
  28.    .out_size    dd ?
  29. }
  30.  
  31. virtual at 0
  32.   IOCTL IOCTL
  33. end virtual
  34.  
  35. public START
  36. public version
  37.  
  38.  
  39. DRV_ENTRY    equ 1
  40. DRV_EXIT     equ -1
  41. STRIDE       equ 4      ;size of row in devices table
  42.  
  43. SRV_GETVERSION  equ 0
  44.  
  45. section '.flat' code readable align 16
  46.  
  47. proc START stdcall, state:dword
  48.  
  49.         cmp     [state], 1
  50.         jne     .exit
  51. .entry:
  52.         ;Detect_COM_Mouse:
  53. if DEBUG
  54.         mov     esi, msgInit
  55.         call    Boot_Log
  56. end if
  57.         mov     bx, 0x3f8
  58.         call    MSMouseSearch
  59.         cmp     AL, 'M'
  60.         jne     @f
  61.         ;mov    [com1_mouse_detected],1
  62.         ;mov     [irq_owner+4*4], 1      ; IRQ4 owner is System
  63.  
  64.         mov     dx, bx
  65.         inc     dx                       ; 0x3f8 + 1
  66.         mov     al, 1
  67.         out     dx, al
  68.  
  69.         stdcall AttachIntHandler, 4, irq4_handler, dword 0
  70. if DEBUG
  71.         test    eax, eax
  72.         jne     .label1
  73.  
  74.         mov     esi, msg_error_attach_int_handler
  75.         call    Boot_Log
  76. end if
  77.      .label1:
  78. ;       mov     eax, 0
  79. ;       mov     ebx, 0x3F8
  80. ;       mov     ecx, 0x3FF
  81.         xor     ebx, ebx
  82.         mov     ecx, 0x3F8
  83.         mov     edx, 0x3FF
  84.         call    ReservePortArea
  85.  
  86. if DEBUG
  87.         cmp     eax, 1
  88.         jne     .go
  89.  
  90.         mov     esi, msg_error_reserve_ports
  91.         call    Boot_Log
  92.  
  93.      .go:
  94.         mov     esi, boot_setmouse_type
  95.         call    Boot_Log
  96. end if
  97.      @@:
  98.         mov     bx, 0x2f8
  99.         call    MSMouseSearch
  100.         cmp     AL, 'M'
  101.         jne     .resume
  102.         ;mov     [com2_mouse_detected],1
  103.         ;mov     [irq_owner+3*4], 1      ; IRQ3 owner is System
  104.  
  105.         stdcall AttachIntHandler, 3, irq3_handler, dword 0
  106.  
  107. ;       mov     eax, 0
  108. ;       mov     ebx, 0x2F8
  109. ;       mov     ecx, 0x3F8
  110.         xor     ebx, ebx
  111.         mov     ecx, 0x2F8
  112.         mov     edx, 0x3F8
  113.  
  114.         call    ReservePortArea
  115. if DEBUG
  116.         cmp     eax, 1
  117.         jne     @f
  118.  
  119.         mov     esi, msg_error_reserve_ports
  120.         call    Boot_Log
  121.       @@:
  122.  
  123.         mov     esi, boot_setmouse_type + 22
  124.         call    Boot_Log
  125. end if
  126.       .resume:
  127.  
  128.         stdcall RegService, my_service, service_proc
  129. if DEBUG
  130.         test    eax, eax
  131.         jne     @f
  132.  
  133.         mov     esi, msg_exit
  134.         call    Boot_Log
  135. end if
  136.          @@:
  137.         ret
  138. .fail:
  139. .exit:
  140. if DEBUG
  141.         mov     esi, msg_exit
  142.         call    Boot_Log
  143. end if
  144.         xor     eax, eax
  145.         ret
  146. endp
  147.  
  148. handle     equ  IOCTL.handle
  149. io_code    equ  IOCTL.io_code
  150. input      equ  IOCTL.input
  151. inp_size   equ  IOCTL.inp_size
  152. output     equ  IOCTL.output
  153. out_size   equ  IOCTL.out_size
  154.  
  155. align 4
  156. proc service_proc stdcall, ioctl:dword
  157.  
  158.         mov     ebx, [ioctl]
  159.         mov     eax, [ebx+io_code]
  160.         cmp     eax, SRV_GETVERSION
  161.         jne     @F
  162.  
  163.         mov     eax, [ebx+output]
  164.         cmp     [ebx+out_size], 4
  165.         jne     .fail
  166.         mov     [eax], dword API_VERSION
  167.         xor     eax, eax
  168.         ret
  169. @@:
  170. .fail:
  171.         or      eax, -1
  172.         ret
  173. endp
  174.  
  175. align 4
  176. MSMouseSearch:
  177.         ; ÏÎÈÑÊ ÌÛØÈ ×ÅÐÅÇ COM-ÏÎÐÒÛ
  178. MouseSearch:
  179.         ; Óñòàíàâëèâàåì ñêîðîñòü
  180.         ; ïðèåìà/ïåðåäà÷è 1200 áîä
  181.         ; in bx COM Port Base Address
  182.         mov     DX, bx
  183.         add     DX, 3
  184.         in      AL, DX
  185.         or      AL, 80h ;óñòàíîâèòü áèò DLAB
  186.         out     DX, AL
  187.         mov     DX, bx
  188.         mov     AL, 60h ;1200 áîä
  189.         out     DX, AL
  190.         inc     DX
  191.         mov     AL, 0
  192.         out     DX, AL
  193.         ; Óñòàíîâèòü äëèíó ñëîâà 7 áèò, 1 ñòîïîâûé áèò,
  194.         ; ÷åòíîñòü íå êîíòðîëèðîâàòü
  195.         mov     DX, bx
  196.         add     DX, 3
  197.         mov     AL, 00000010b
  198.         out     DX, AL
  199.         ; Çàïðåòèòü âñå ïðåðûâàíè
  200.         mov     dx, bx
  201.         inc     dx
  202.         mov     AL, 0
  203.         out     DX, AL
  204. ; Ïðîâåðèòü, ÷òî óñòðîéñòâî ïîäêëþ÷åíî è ÿâëÿåòñ
  205. ; ìûøüþ òèïà MSMouse
  206.         ; Îòêëþ÷èòü ïèòàíèå ìûøè è ïðåðûâàíè
  207.         mov     DX, bx
  208.         add     EDX, 4  ;ðåãèñòð óïðàâëåíèÿ ìîäåìîì
  209.         mov     AL, 0   ;ñáðîñèòü DTR, RTS è OUT2
  210.         out     DX, AL
  211.         ; Îæèäàòü 5 "òèêîâ" (0,2 ñ)
  212.         mov     ecx, 0xFFFF
  213.         loop    $
  214.         ; Âêëþ÷èòü ïèòàíèå ìûøè
  215.         mov     al, 1
  216.         out     dx, al
  217.         mov     ecx, 0xFFFF
  218.         loop    $
  219.         ; Î÷èñòèòü ðåãèñòð äàííûõ
  220.         mov     dx, bx
  221.         in      AL, DX
  222.         add     edx, 4
  223.         mov     AL, 1011b  ;óñòàíîâèòü DTR è RTS è OUT2
  224.         out     DX, AL
  225.         mov     ecx, 0x1FFFF
  226. ; Öèêë îïðîñà ïîðòà
  227. WaitData:
  228.         ; Îæèäàòü åùå 10 "òèêîâ"
  229.         dec     ecx
  230. ;        cmp  ecx,0
  231.         jz      NoMouse
  232.         ; Ïðîâåðèòü íàëè÷èå èäåíòèôèêàöèîííîãî áàéòà
  233.         mov     DX, bx
  234.         add     DX, 5
  235.         in      AL, DX
  236.         test    AL, 1  ;Äàííûå ãîòîâû?
  237.         jz      WaitData
  238.         ; Ââåñòè äàííûå
  239.         mov     DX, bx
  240.         in      AL, DX
  241. NoMouse:
  242.         ret
  243.  
  244. align 4
  245. irq3_handler:
  246.         mov     dx, 0x2f8
  247.         mov     esi, com2_mouse
  248.         jmp     irq_handler
  249.  
  250. align 4
  251. irq4_handler:
  252.         mov     dx, 0x3f8
  253.         mov     esi, com1_mouse
  254.  
  255. irq_handler:
  256.  
  257. ; in: esi -> COM_MOUSE_DATA struc, dx = base port (xF8h)
  258.         add     edx, 5          ; xFDh
  259.         in      al, dx
  260.         test    al, 1           ; Äàííûå ãîòîâû?
  261.         jz      .Error
  262. ; Ââåñòè äàííûå
  263.         sub     edx, 5
  264.         in      al, dx
  265. ; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò
  266.         and     al, 01111111b
  267.  
  268. ; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà
  269.         cmp     [esi+COM_MOUSE_DATA.MouseByteNumber], 2
  270.         ja      .Error
  271.         jz      .ThirdByte
  272.         jp      .SecondByte
  273. ; Ñîõðàíèòü ïåðâûé áàéò äàííûõ
  274. .FirstByte:
  275.         test    al, 1000000b    ; Ïåðâûé áàéò ïîñûëêè?
  276.         jz      .Error
  277.         mov     [esi+COM_MOUSE_DATA.FirstByte], al
  278.         inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
  279.         jmp     .EndMouseInterrupt
  280. ; Ñîõðàíèòü âòîðîé áàéò äàííûõ
  281. .SecondByte:
  282.         test    al, 1000000b
  283.         jnz     .Error
  284.         mov     [esi+COM_MOUSE_DATA.SecondByte], al
  285.         inc     [esi+COM_MOUSE_DATA.MouseByteNumber]
  286.         jmp     .EndMouseInterrupt
  287. ; Ñîõðàíèòü òðåòèé áàéò äàííûõ
  288. .ThirdByte:
  289.         test    al, 1000000b
  290.         jnz     .Error
  291.         mov     [esi+COM_MOUSE_DATA.ThirdByte], al
  292.         mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
  293. ; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ).
  294. ; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè
  295.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  296.         mov     ah, al
  297.         shr     al, 3
  298.         and     al, 2
  299.         shr     ah, 5
  300.         and     ah, 1
  301.         add     al, ah
  302.         movzx   eax, al
  303.         mov     [BTN_DOWN], eax
  304.  
  305. ; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X
  306.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  307.         shl     al, 6
  308.         or      al, [esi+COM_MOUSE_DATA.SecondByte]
  309.  
  310.         cbw
  311.         movzx   eax, ax
  312.         mov     [MOUSE_X], eax
  313.  
  314. ; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y
  315.         mov     al, [esi+COM_MOUSE_DATA.FirstByte]
  316.         and     al, 00001100b
  317.         shl     al, 4
  318.         or      al, [esi+COM_MOUSE_DATA.ThirdByte]
  319.  
  320.         cbw
  321.         movzx   eax, ax
  322.         neg     eax
  323.         mov     [MOUSE_Y], eax
  324.  
  325.         stdcall SetMouseData, [BTN_DOWN], [MOUSE_X], [MOUSE_Y], 0, 0
  326.  
  327.         jmp     .EndMouseInterrupt
  328.  
  329. .Error:
  330. ; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò
  331. ; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ
  332.  
  333.         mov     [esi+COM_MOUSE_DATA.MouseByteNumber], 0
  334. .EndMouseInterrupt:
  335.         mov     al, 1
  336.         ret
  337.  
  338. ;all initialized data place here
  339.  
  340. align 4
  341.  
  342. struc COM_MOUSE_DATA {
  343. ; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà
  344.         .MouseByteNumber        db      ?
  345. ; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ
  346.         .FirstByte              db      ?
  347.         .SecondByte             db      ?
  348.         .ThirdByte              db      ?
  349.         ;.timer_ticks_com        dd      ?
  350. }
  351. virtual at 0
  352.  COM_MOUSE_DATA COM_MOUSE_DATA
  353. end virtual
  354.  
  355. com1_mouse COM_MOUSE_DATA
  356. com2_mouse COM_MOUSE_DATA
  357.  
  358. MOUSE_X      dd 0
  359. MOUSE_Y      dd 0
  360. BTN_DOWN     dd 0
  361.  
  362. COMPortBaseAddr dw 3F8h
  363.  
  364.  
  365.  
  366. version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
  367.  
  368. my_service   db 'COM_Mouse',0  ;max 16 chars include zero
  369.  
  370. if DEBUG
  371. msgInit                      db   'Preved bugoga!',13,10,0
  372. boot_setmouse_type           db   'Detected - COM1 mouse',13,10,0
  373.                              db   'Detected - COM2 mouse',13,10,0
  374. msg_error_reserve_ports      db   'Error reserving ports!',13,10,0
  375. msg_error_attach_int_handler db   'Error attach interrupt handler!',13,10,0
  376. msg_exit                     db   'Exit!',13,10,0
  377. end if
  378.  
  379. section '.data' data readable writable align 16
  380.  
  381. ;all uninitialized data place here
  382.  
  383.