Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ha 1
;**************************************************
2
;*      ПОИСК МЫШИ ПО ПОСЛЕДОВАТЕЛЬНЫМ ПОРТАМ     *
3
;* Процедура подготавливает глобальные переменные *
4
;* COMPortNum и COMPortBaseAddr для подпрограммы  *
5
;* установки обработчика прерывания               *
6
;**************************************************
7
; Автор исходного текста Кулаков Владимир Геннадьевич.
8
; Адаптация и доработка Mario79
9
 
10
MSMouseSearch:
11
        pusha
12
; Запретить прерывание COM1 и COM2
13
        cli
14
        in      AL,21h  ;прочитать маску прерываний
15
        or      AL,18h  ;запретить IRQ3 и IRQ4
16
        out     21h,AL  ;заменить маску
17
        sti
18
; ПОИСК МЫШИ ЧЕРЕЗ COM-ПОРТЫ
19
MouseSearch:
20
        ; Устанавливаем скорость
21
        ; приема/передачи 1200 бод
22
        mov     DX,[COMPortBaseAddr]
23
        add     DX,3
24
        in      AL,DX
25
        or      AL,80h  ;установить бит DLAB
26
        out     DX,AL
27
        mov     DX,[COMPortBaseAddr]
28
        mov     AL,60h  ;1200 бод
29
        out     DX,AL
30
        inc     DX
31
        mov     AL,0
32
        out     DX,AL
33
        ; Установить длину слова 7 бит, 1 стоповый бит,
34
        ; четность не контролировать
35
        mov     DX,[COMPortBaseAddr]
36
        add     DX,3
37
        mov     AL,00000010b
38
        out     DX,AL
39
        ; Запретить все прерывания
40
        mov     DX,[COMPortBaseAddr]
41
        inc     DX
42
        mov     AL,0
43
        out     DX,AL
44
; Проверить, что устройство подключено и является
45
; мышью типа MSMouse
46
        ; Отключить питание мыши и прерывания
47
        mov     DX,[COMPortBaseAddr]
48
        add     DX,4    ;регистр управления модемом
49
        mov     AL,0    ;сбросить DTR, RTS и OUT2
50
        out     DX,AL
51
        ; Ожидать 5 "тиков" (0,2 с)
52
        mov  ecx,0xffff
53
dT_1:
54
        dec  ecx
55
        cmp ecx,0
56
        jne dT_1
57
       mov  ecx,0xffff
58
        ; Включить питание мыши
59
        mov     AL,11b  ;установить DTR и RTS
60
        out     DX,AL
61
        ; Очистить регистр данных
62
        mov     DX,[COMPortBaseAddr]
63
        in      AL,DX
64
; Цикл опроса порта
65
WaitData:
66
        ; Ожидать еще 10 "тиков"
67
         dec  ecx
68
         cmp  ecx,0
69
         je     NoMouse
70
        ; Проверить наличие идентификационного байта
71
        mov     DX,[COMPortBaseAddr]
72
        add     DX,5
73
        in      AL,DX
74
        test    AL,1   ;Данные готовы?
75
        jz      WaitData
76
        ; Ввести данные
77
        mov     DX,[COMPortBaseAddr]
78
        in      AL,DX
79
        ; Устройство является мышью?
80
        cmp     AL,'M'
81
        je EndDetect
82
NoMouse:
83
        inc     [COMPortNum]
84
        cmp     [COMPortNum],1
85
        ja      EndDetect
86
        sub     [COMPortBaseAddr],100h
87
        jmp     MouseSearch
88
 
89
iglobal
90
COMPortBaseAddr dw 3F8h
91
COMPortNum dw 0
92
endg
93
 
94
iglobal
95
boot_setmouse_type  db   'No COM mouse, set PS2',0
96
                    db   'Detected - COM1 mouse',0
97
                    db   'Detected - COM2 mouse',0
98
 
99
endg
100
 
101
EndDetect:
102
        cmp     [COMPortNum],0  ;номер порта меньше 0?
103
        jl      ComMouseNotFound ;мышь не найдена
104
        cmp     [COMPortNum],1  ;номер порта больше 1?
105
        ja      ComMouseNotFound ;мышь не найдена
106
        mov     ax,[COMPortNum]
107
        add     al,2
108
        jmp     set_detecting_mouse
109
 ComMouseNotFound:
110
        mov al,1
111
 set_detecting_mouse:
112
        mov   [0xF604],al
113
        dec   al
114
        movzx eax,al
115
        imul  eax,22
116
        mov   esi,boot_setmouse_type
117
        add   esi,eax
118
        call  boot_log
119
        popa
120