Subversion Repositories Kolibri OS

Rev

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