add relative mouse handling in mouse.asm
[retroray] / 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         popa
76         ret
77
78 ; int read_mouse(int *xp, int *yp)
79         global read_mouse_
80 read_mouse_:
81         pusha
82         mov esi, eax    ; xp
83         mov edi, edx    ; yp
84         mov ax, READ
85         int 0x33
86         xor eax, eax
87         and ecx, 0xffff
88         and edx, 0xffff
89         mov ax, bx
90         mov [esp + PUSHA_EAX_OFFS], eax
91         mov [esi], ecx
92         mov [edi], edx
93         popa
94         ret
95
96         global _read_mouse
97 _read_mouse:
98         push ebp
99         mov ebp, esp
100         push ebx
101         push esi
102         push edi
103         mov ax, READ
104         int 0x33
105         xor eax, eax
106         mov ax, bx
107         and ecx, 0xffff
108         mov ebx, [ebp + 8]
109         mov [ebx], ecx
110         and edx, 0xffff
111         mov ebx, [ebp + 12]
112         mov [ebx], edx
113         pop edi
114         pop esi
115         pop ebx
116         pop ebp
117         ret
118
119 ; void read_mouse_rel(int *xp, int *yp)
120         global read_mouse_rel_
121 read_mouse_rel_:
122         pusha
123         mov esi, eax    ; xp
124         mov edi, edx    ; yp
125         mov ax, READREL
126         int 0x33
127         movsx eax, cx
128         mov [esi], eax
129         movsx eax, dx
130         mov [edi], eax
131         popa
132         ret
133
134         global _read_mouse_rel
135 _read_mouse_rel:
136         push ebp
137         mov ebp, esp
138         push ebx
139         push esi
140         push edi
141         mov ax, READREL
142         int 0x33
143         mov ebx, [ebp + 8]
144         movsx eax, cx
145         mov [ebx], eax
146         mov ebx, [ebp + 12]
147         movsx eax, dx
148         mov [ebx], eax
149         pop edi
150         pop esi
151         pop ebx
152         pop ebp
153         ret
154
155 ; void set_mouse(int x, int y)
156         global set_mouse_
157 set_mouse_:
158         pusha
159         mov cx, ax
160         mov ax, WRITE
161         int 0x33
162         popa
163         ret
164         
165         global _set_mouse
166 _set_mouse:
167         push ebp
168         mov ebp, esp
169         push ebx
170         push esi
171         push edi
172         mov ax, WRITE
173         mov cx, [ebp + 8]
174         mov dx, [ebp + 12]
175         int 0x33
176         pop edi
177         pop esi
178         pop ebx
179         pop ebp
180         ret
181
182 ; void set_mouse_limits(int xmin[eax], int ymin[edx], int xmax[ebx], int ymax[ecx])
183         global set_mouse_limits_
184 set_mouse_limits_:
185         pusha
186         mov cx, ax
187         mov dx, bx
188         mov ax, XLIM
189         int 0x33
190         mov ax, YLIM
191         mov cx, [esp + PUSHA_EDX_OFFS]
192         mov dx, [esp + PUSHA_ECX_OFFS]
193         int 0x33
194         popa
195         ret
196
197         global _set_mouse_limits
198 _set_mouse_limits:
199         push ebp
200         mov ebp, esp
201         push ebx
202         push esi
203         push edi
204         mov ax, XLIM
205         mov cx, [ebp + 8]
206         mov dx, [ebp + 16]
207         int 0x33
208         mov ax, YLIM
209         mov cx, [ebp + 12]
210         mov dx, [ebp + 20]
211         int 0x33
212         pop edi
213         pop esi
214         pop ebx
215         pop ebp
216         ret
217
218 ; void set_mouse_rate(int xrate, int yrate)
219         global set_mouse_rate_
220 set_mouse_rate_:
221         pusha
222         mov cx, ax
223         mov ax, PIXRATE
224         int 0x33
225         popa
226         ret
227
228         global _set_mouse_rate
229 _set_mouse_rate:
230         push ebp
231         mov ebp, esp
232         push ebx
233         push esi
234         push edi
235         mov ax, PIXRATE
236         mov cx, [esp + 4]
237         mov dx, [esp + 8]
238         int 0x33
239         pop edi
240         pop esi
241         pop ebx
242         pop ebp
243         ret