]> icculus.org git repositories - btb/d2x.git/blob - unused/bios/joy.asm
This commit was generated by cvs2svn to compensate for changes in r2,
[btb/d2x.git] / unused / bios / joy.asm
1 ; THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX\r
2 ; SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO\r
3 ; END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A\r
4 ; ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS\r
5 ; IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS\r
6 ; SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE\r
7 ; FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE\r
8 ; CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS\r
9 ; AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  \r
10 ; COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.\r
11 .386\r
12 \r
13 _DATA   SEGMENT BYTE PUBLIC USE32 'DATA'\r
14 \r
15 rcsid   db      "$Id: joy.asm,v 1.1.1.1 2001-01-19 03:30:14 bradleyb Exp $"\r
16 \r
17         LastTick        dd      0\r
18         TotalTicks      dd      0\r
19         \r
20 _DATA   ENDS\r
21 \r
22 DGROUP  GROUP _DATA\r
23 \r
24 \r
25 _TEXT   SEGMENT BYTE PUBLIC USE32 'CODE'\r
26 \r
27         ASSUME  ds:_DATA\r
28         ASSUME  cs:_TEXT\r
29 \r
30         JOY_PORT        EQU     0201h\r
31         TDATA           EQU     40h\r
32         TCOMMAND        EQU     43h\r
33 \r
34 joy_get_timer:\r
35         xor     al, al                  ; Latch timer 0 command\r
36         out     TCOMMAND, al            ; Latch timer\r
37         in      al, TDATA               ; Read lo byte\r
38         mov     ah, al\r
39         in      al, TDATA               ; Read hi byte\r
40         xchg    ah, al\r
41         and     eax, 0ffffh\r
42         ret     \r
43 \r
44 PUBLIC joy_read_stick_asm_\r
45 \r
46 joy_read_stick_asm_:    \r
47                 ; ebx = read mask\r
48                 ; edi = pointer to event buffer\r
49                 ; ecx = timeout value\r
50                 ; returns in eax the number of events\r
51                 and     ebx, 01111b             ; Make sure we only check the right values                                                                              \r
52                                                 ; number of events we found will be in bh, so this also clears it to zero.\r
53 \r
54                 mov     dx, JOY_PORT\r
55 \r
56                 cli                             ; disable interrupts while reading time...\r
57                 call    joy_get_timer           ; Returns counter in EAX\r
58                 sti                             ; enable interrupts after reading time...\r
59                 mov     LastTick, eax\r
60 \r
61 waitforstable:  in      al, dx\r
62                 and     al, bl\r
63                 jz      ready                   ; Wait for the port in question to be done reading...\r
64                 \r
65                 cli                             ; disable interrupts while reading time...\r
66                 call    joy_get_timer           ; Returns counter in EAX\r
67                 sti                             ; enable interrupts after reading time...\r
68                 xchg    eax, LastTick\r
69                 cmp     eax, LastTick\r
70                 jb      @f\r
71                 sub     eax, LastTick\r
72 @@:             ; Higher...\r
73                 add     TotalTicks, eax\r
74                 cmp     TotalTicks, ecx         ; Timeout at 1/200'th of a second\r
75                 jae     ready\r
76                 jmp     waitforstable\r
77                 \r
78 ready:\r
79                 cli\r
80                 mov     al, 0ffh\r
81                 out     dx, al                  ; Start joystick a readin'\r
82 \r
83                 call    joy_get_timer           ; Returns counter in EAX\r
84                 mov     LastTick, eax\r
85                 mov     TotalTicks, 0\r
86                 \r
87                 mov     [edi], eax              ; Store initial count\r
88                 add     edi, 4          \r
89 \r
90         again:  in      al, dx                  ; Read Joystick port\r
91                 not     al\r
92                 and     al, bl                  ; Mask off channels we don't want to read\r
93                 jnz     flip                    ; See if any of the channels flipped\r
94 \r
95                 call    joy_get_timer           ; Returns counter in EAX\r
96                 \r
97                 xchg    eax, LastTick\r
98                 cmp     eax, LastTick\r
99                 jb      @f\r
100                 sub     eax, LastTick\r
101 @@:             ; Higher...\r
102                 add     TotalTicks, eax\r
103                 cmp     TotalTicks, ecx         ; Timeout at 1/200'th of a second\r
104                 jae     timedout\r
105                 jmp     again\r
106 \r
107         flip:   and     eax, 01111b             ; Only care about axis values\r
108                 mov     [edi], eax              ; Record what channel(s) flipped\r
109                 add     edi, 4  \r
110                 xor     bl, al                  ; Unmark the channels that just tripped\r
111 \r
112                 call    joy_get_timer           ; Returns counter in EAX\r
113                 mov     [edi], eax              ; Record the time this channel flipped\r
114                 add     edi, 4          \r
115                 inc     bh                      ; Increment number of events\r
116 \r
117                 cmp     bl, 0   \r
118                 jne     again                   ; If there are more channels to read, keep looping\r
119 \r
120         timedout:\r
121                 movzx   eax, bh                 ; Return number of events\r
122 \r
123                 sti\r
124                 ret\r
125 \r
126 \r
127 PUBLIC joy_read_stick_polled_\r
128 \r
129 joy_read_stick_polled_: \r
130                 ; ebx = read mask\r
131                 ; edi = pointer to event buffer\r
132                 ; ecx = timeout value\r
133                 ; returns in eax the number of events\r
134                 and     ebx, 01111b             ; Make sure we only check the right values                                                                              \r
135                                                 ; number of events we found will be in bh, so this also clears it to zero.\r
136 \r
137                 mov     dx, JOY_PORT\r
138 \r
139                 mov     TotalTicks, 0\r
140 \r
141 waitforstable1: in      al, dx\r
142                 and     al, bl\r
143                 jz      ready1                  ; Wait for the port in question to be done reading...\r
144                 \r
145                 inc     TotalTicks\r
146                 cmp     TotalTicks, ecx         ; Timeout at 1/200'th of a second\r
147                 jae     ready1\r
148                 jmp     waitforstable1\r
149 ready1:\r
150                 cli\r
151                 mov     al, 0ffh\r
152                 out     dx, al                  ; Start joystick a readin'\r
153 \r
154                 mov     TotalTicks, 0\r
155 \r
156                 mov     dword ptr [edi], 0              ; Store initial count\r
157                 add     edi, 4          \r
158 \r
159         again1: in      al, dx                  ; Read Joystick port\r
160                 not     al\r
161                 and     al, bl                  ; Mask off channels we don't want to read\r
162                 jnz     flip1                   ; See if any of the channels flipped\r
163 \r
164                 inc     TotalTicks\r
165                 cmp     TotalTicks, ecx         ; Timeout at 1/200'th of a second\r
166                 jae     timedout1\r
167                 jmp     again1\r
168 \r
169         flip1:  and     eax, 01111b             ; Only care about axis values\r
170                 mov     [edi], eax              ; Record what channel(s) flipped\r
171                 add     edi, 4  \r
172                 xor     bl, al                  ; Unmark the channels that just tripped\r
173 \r
174                 mov     eax, TotalTicks\r
175                 mov     [edi], eax              ; Record the time this channel flipped\r
176                 add     edi, 4          \r
177                 inc     bh                      ; Increment number of events\r
178 \r
179                 cmp     bl, 0   \r
180                 jne     again1                  ; If there are more channels to read, keep looping\r
181 \r
182         timedout1:\r
183                 movzx   eax, bh                 ; Return number of events\r
184 \r
185                 sti\r
186                 ret\r
187 \r
188 PUBLIC joy_read_stick_bios_\r
189 \r
190 joy_read_stick_bios_:   \r
191                 ; ebx = read mask\r
192                 ; edi = pointer to event buffer\r
193                 ; ecx = timeout value\r
194                 ; returns in eax the number of events\r
195                 \r
196                 pusha\r
197 \r
198                 mov     dword ptr [edi], 0\r
199                         \r
200                 mov     eax, 08400h\r
201                 mov     edx, 1\r
202                 cli\r
203                 int     15h\r
204                 sti\r
205         \r
206                 mov     dword ptr [edi+4], 1    ;       Axis 1          \r
207                 and     eax, 0ffffh\r
208                 mov     [edi+8], eax            ;       Axis 1 value\r
209 \r
210                 mov     dword ptr [edi+12], 2   ;       Axis 2\r
211                 and     ebx, 0ffffh\r
212                 mov     [edi+16], ebx           ;       Axis 2 value\r
213 \r
214                 mov     dword ptr [edi+20], 4   ;       Axis 3\r
215                 and     ecx, 0ffffh\r
216                 mov     [edi+24], ecx           ;       Axis 3 value\r
217 \r
218                 mov     dword ptr [edi+28], 8   ;       Axis 3\r
219                 and     edx, 0ffffh\r
220                 mov     [edi+32], edx           ;       Axis 3 value\r
221 \r
222                 popa\r
223                 mov     eax, 4                  ; 4 events\r
224 \r
225                 ret\r
226 \r
227 \r
228 PUBLIC joy_read_buttons_bios_\r
229 \r
230 joy_read_buttons_bios_: \r
231                 ; returns in eax the button settings\r
232                 \r
233                 push    ebx\r
234                 push    ecx\r
235                 push    edx\r
236                 mov     eax, 08400h\r
237                 mov     edx, 0  ; Read switches\r
238                 int     15h\r
239                 pop     edx\r
240                 pop     ecx\r
241                 pop     ebx\r
242                 \r
243                 shr     eax, 4\r
244                 not     eax\r
245                 and     eax, 01111b\r
246                 ret\r
247 \r
248 \r
249 _TEXT   ENDS\r
250 \r
251 \r
252                 END\r