Subversion Repositories Kolibri OS

Rev

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

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