Subversion Repositories Kolibri OS

Rev

Rev 802 | Blame | Compare with Previous | 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. ;; 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.  
  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.