Subversion Repositories Kolibri OS

Rev

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