adding a bunch of code (vesa, keyb, mouse, etc) to the menu
[cdmenu] / menu / src / dos / mouse.asm
1 ; vi:set filetype=nasm:
2 ; foo_ are watcom functions, _foo are djgpp functions
3
4 QUERY equ 0
5 SHOW equ 1
6 HIDE equ 2
7 READ equ 3
8 WRITE equ 4
9 PIXRATE equ 15
10 XLIM equ 7
11 YLIM equ 8
12 READREL equ 0xb
13
14 PUSHA_EAX_OFFS equ 28
15 PUSHA_ECX_OFFS equ 24
16 PUSHA_EDX_OFFS equ 20
17
18         section .text
19         bits 32
20
21 ; int have_mouse(void)
22         global have_mouse_
23         global _have_mouse
24 have_mouse_:
25 _have_mouse:
26         pusha
27         mov ax, QUERY
28         int 0x33
29         and eax, 0xffff
30         mov [esp + PUSHA_EAX_OFFS], eax
31         popa
32         ret
33
34 ; void show_mouse(int show)
35         global show_mouse_
36 show_mouse_:
37         pusha
38         test ax, ax
39         mov ax, HIDE
40         jz .skip
41         mov ax, SHOW
42 .skip:  int 0x33
43         popa
44         ret
45
46         global _show_mouse
47 _show_mouse:
48         push ebp
49         mov ebp, esp
50         push ebx
51         push esi
52         push edi
53         mov ax, [ebp + 8]
54         test ax, ax
55         mov ax, HIDE
56         jz .skip
57         mov ax, SHOW
58 .skip:  int 0x33
59         pop edi
60         pop esi
61         pop ebx
62         pop ebp
63         ret
64
65 ; int read_mouse_bn(void)
66         global read_mouse_bn_
67         global _read_mouse_bn
68 read_mouse_bn_:
69 _read_mouse_bn:
70         pusha
71         mov ax, READ
72         int 0x33
73         xor eax, eax
74         mov ax, bx
75         mov [esp + PUSHA_EAX_OFFS], eax
76         popa
77         ret
78
79 ; int read_mouse(int *xp, int *yp)
80         global read_mouse_
81 read_mouse_:
82         pusha
83         mov esi, eax    ; xp
84         mov edi, edx    ; yp
85         mov ax, READ
86         int 0x33
87         xor eax, eax
88         and ecx, 0xffff
89         and edx, 0xffff
90         mov ax, bx
91         mov [esp + PUSHA_EAX_OFFS], eax
92         mov [esi], ecx
93         mov [edi], edx
94         popa
95         ret
96
97         global _read_mouse
98 _read_mouse:
99         push ebp
100         mov ebp, esp
101         push ebx
102         push esi
103         push edi
104         mov ax, READ
105         int 0x33
106         xor eax, eax
107         mov ax, bx
108         and ecx, 0xffff
109         mov ebx, [ebp + 8]
110         mov [ebx], ecx
111         and edx, 0xffff
112         mov ebx, [ebp + 12]
113         mov [ebx], edx
114         pop edi
115         pop esi
116         pop ebx
117         pop ebp
118         ret
119
120 ; void read_mouse_rel(int *xp, int *yp)
121         global read_mouse_rel_
122 read_mouse_rel_:
123         pusha
124         mov esi, eax    ; xp
125         mov edi, edx    ; yp
126         mov ax, READREL
127         int 0x33
128         movsx eax, cx
129         mov [esi], eax
130         movsx eax, dx
131         mov [edi], eax
132         popa
133         ret
134
135         global _read_mouse_rel
136 _read_mouse_rel:
137         push ebp
138         mov ebp, esp
139         push ebx
140         push esi
141         push edi
142         mov ax, READREL
143         int 0x33
144         mov ebx, [ebp + 8]
145         movsx eax, cx
146         mov [ebx], eax
147         mov ebx, [ebp + 12]
148         movsx eax, dx
149         mov [ebx], eax
150         pop edi
151         pop esi
152         pop ebx
153         pop ebp
154         ret
155
156 ; void set_mouse(int x, int y)
157         global set_mouse_
158 set_mouse_:
159         pusha
160         mov cx, ax
161         mov ax, WRITE
162         int 0x33
163         popa
164         ret
165         
166         global _set_mouse
167 _set_mouse:
168         push ebp
169         mov ebp, esp
170         push ebx
171         push esi
172         push edi
173         mov ax, WRITE
174         mov cx, [ebp + 8]
175         mov dx, [ebp + 12]
176         int 0x33
177         pop edi
178         pop esi
179         pop ebx
180         pop ebp
181         ret
182
183 ; void set_mouse_limits(int xmin[eax], int ymin[edx], int xmax[ebx], int ymax[ecx])
184         global set_mouse_limits_
185 set_mouse_limits_:
186         pusha
187         mov cx, ax
188         mov dx, bx
189         mov ax, XLIM
190         int 0x33
191         mov ax, YLIM
192         mov cx, [esp + PUSHA_EDX_OFFS]
193         mov dx, [esp + PUSHA_ECX_OFFS]
194         int 0x33
195         popa
196         ret
197
198         global _set_mouse_limits
199 _set_mouse_limits:
200         push ebp
201         mov ebp, esp
202         push ebx
203         push esi
204         push edi
205         mov ax, XLIM
206         mov cx, [ebp + 8]
207         mov dx, [ebp + 16]
208         int 0x33
209         mov ax, YLIM
210         mov cx, [ebp + 12]
211         mov dx, [ebp + 20]
212         int 0x33
213         pop edi
214         pop esi
215         pop ebx
216         pop ebp
217         ret
218
219 ; void set_mouse_rate(int xrate, int yrate)
220         global set_mouse_rate_
221 set_mouse_rate_:
222         pusha
223         mov cx, ax
224         mov ax, PIXRATE
225         int 0x33
226         popa
227         ret
228
229         global _set_mouse_rate
230 _set_mouse_rate:
231         push ebp
232         mov ebp, esp
233         push ebx
234         push esi
235         push edi
236         mov ax, PIXRATE
237         mov cx, [esp + 4]
238         mov dx, [esp + 8]
239         int 0x33
240         pop edi
241         pop esi
242         pop ebx
243         pop ebp
244         ret