Mercurial > hg > Members > kono > nitros9-code
comparison level2/modules/joydrv_6551L.asm @ 0:6641a883d6b0
Initial revision
author | boisy |
---|---|
date | Thu, 04 Apr 2002 16:34:12 +0000 |
parents | |
children | 7a973074acbe |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:6641a883d6b0 |
---|---|
1 ******************************************************************** | |
2 * JoyDrv - Joystick Driver for 6551/Logitech Mouse | |
3 * | |
4 * $Id$ | |
5 * | |
6 * Ed. Comments Who YY/MM/DD | |
7 * ------------------------------------------------------------------ | |
8 * 6 L2 Upgrade distribution version | |
9 | |
10 nam JoyDrv | |
11 ttl Joystick Driver for 6551/Logitech Mouse | |
12 | |
13 * Disassembled 98/09/09 09:22:44 by Disasm v1.6 (C) 1988 by RML | |
14 | |
15 ifp1 | |
16 use defsfile | |
17 use l51.defs | |
18 endc | |
19 | |
20 tylg set Systm+Objct | |
21 atrv set ReEnt+rev | |
22 rev set $01 | |
23 edition set 6 | |
24 | |
25 MPISlot set $00 | |
26 | |
27 mod eom,name,tylg,atrv,start,$FF68 | |
28 | |
29 name fcs /JoyDrv/ | |
30 fcb edition | |
31 | |
32 SlotSlct equ MPISlot | |
33 | |
34 start lbra Init | |
35 lbra Term | |
36 lbra SSMsBtn | |
37 lbra SSMsXY | |
38 lbra SSJoyBtn | |
39 | |
40 SSJoyXY pshs x,b,a | |
41 ldx #PIA0Base | |
42 lda <$23,x | |
43 ldb <$20,x | |
44 pshs b,a | |
45 anda #$F7 | |
46 sta <$23,x | |
47 lda $01,x | |
48 ldb $03,x | |
49 pshs b,a | |
50 andb #$F7 | |
51 lsr $04,s | |
52 bcs L0043 | |
53 orb #$08 | |
54 L0043 stb $03,x | |
55 lda ,s | |
56 ora #$08 | |
57 bsr L0065 | |
58 std $06,s | |
59 lda ,s | |
60 anda #$F7 | |
61 bsr L0065 | |
62 std $04,s | |
63 puls b,a | |
64 sta $01,x | |
65 stb $03,x | |
66 puls b,a | |
67 stb <$20,x | |
68 sta <$23,x | |
69 puls pc,y,x | |
70 L0065 sta $01,x | |
71 lda #$7F | |
72 ldb #$40 | |
73 bra L0078 | |
74 L006D lsrb | |
75 cmpb #$01 | |
76 bhi L0078 | |
77 lsra | |
78 lsra | |
79 tfr a,b | |
80 clra | |
81 rts | |
82 L0078 pshs b | |
83 sta <$20,x | |
84 tst ,x | |
85 bpl L0085 | |
86 adda ,s+ | |
87 bra L006D | |
88 L0085 suba ,s+ | |
89 bra L006D | |
90 | |
91 IRQPckt equ * | |
92 Pkt.Flip fcb Stat.Flp D.Poll flip byte | |
93 Pkt.Mask fcb Stat.Msk D.Poll mask byte | |
94 fcb $01 priority | |
95 | |
96 Init clra | |
97 clrb | |
98 sta Btn.Cntr,u set up Rx data sync, no button(s) pressed | |
99 std CrntXPos,u set up X position at left screen edge | |
100 ldd #HResMaxY*2 | |
101 std CrntYPos,u set up Y position at top screen edge | |
102 ldd M$Mem,pcr get base hardware address | |
103 addd #StatReg status register address | |
104 leax IRQPckt,pcr | |
105 leay IRQSvc,pcr | |
106 os9 F$IRQ | |
107 bcs InitExit go report error... | |
108 ldx M$Mem,pcr get base hardware address again | |
109 ldd #(TIC.RTS!Cmd.DTR)*256+(DB.8!Ctl.RClk!BR.01200) [D]=command:control | |
110 pshs cc | |
111 orcc #IntMasks disable IRQs while setting up hardware | |
112 sta PRstReg,x reset 6551 | |
113 std CmdReg,x set command and control registers | |
114 lda >PIA1Base+3 get PIA CART* input control register | |
115 anda #$FC clear PIA CART* control bits | |
116 sta >PIA1Base+3 disable PIA CART* FIRQs | |
117 lda >PIA1Base+2 clear possible pending PIA CART* FIRQ | |
118 lda #$01 GIME CART* IRQ enable | |
119 ora <D.IRQER mask in current GIME IRQ enables | |
120 sta <D.IRQER save GIME CART* IRQ enable shadow register | |
121 sta >IrqEnR enable GIME CART* IRQs | |
122 ldb DataReg,x *ensure old error, | |
123 ldb StatReg,x *Rx data, and | |
124 ldb DataReg,x *IRQ flags | |
125 ldb StatReg,x *are clear | |
126 andb Pkt.Mask,pcr IRQ bits still set? | |
127 bne InitErr yes, go disable ACIA and return... | |
128 lda SlotSlct,pcr get MPI slot select value | |
129 bmi InitExit no MPI slot select, go exit... | |
130 sta >MPI.Slct set MPI slot select register | |
131 puls pc,cc recover original regs, return... | |
132 | |
133 Term pshs cc save regs we alter | |
134 orcc #IntMasks mask IRQs while disabling ACIA | |
135 InitErr ldx M$Mem,pcr get base address | |
136 lda #TIC.RTS!Cmd.RxIE!Cmd.DTR *disable all | |
137 sta CmdReg,x *ACIA IRQs | |
138 puls cc | |
139 leax StatReg,x point to status register | |
140 tfr x,d copy status register address | |
141 ldx #$0000 remove IRQ table entry | |
142 leay IRQSvc,pcr | |
143 os9 F$IRQ | |
144 InitExit rts | |
145 | |
146 SSJoyBtn ldb #$FF | |
147 ldx #PIA0Base | |
148 stb $02,x | |
149 ldb ,x | |
150 comb | |
151 andb #$0F | |
152 rts | |
153 | |
154 SSMsBtn pshs cc | |
155 orcc #IntMasks | |
156 lda ,u | |
157 tfr a,b | |
158 andb #$C0 | |
159 bne L0120 | |
160 bita #$20 | |
161 beq L011A | |
162 orb #$03 | |
163 L011A bita #$10 | |
164 beq L0120 | |
165 orb #$0C | |
166 L0120 anda #$3F | |
167 sta ,u | |
168 puls pc,cc | |
169 | |
170 SSMsXY ldd #$017E | |
171 pshs cc | |
172 orcc #IntMasks | |
173 ldx CrntXPos,u | |
174 subd CrntYPos,u | |
175 lsra | |
176 rorb | |
177 tfr d,y | |
178 puls pc,cc | |
179 | |
180 *** | |
181 * Mouse IRQ service routine. | |
182 * | |
183 * INPUT: A = flipped and masked device status byte | |
184 * U = mouse data area address | |
185 * | |
186 * OUTPUT: updated serial mouse data | |
187 * CC Carry clear | |
188 * D, X, Y, and U registers may be altered | |
189 * | |
190 * ERROR OUTPUT: none | |
191 IRQSvc ldx M$Mem,pcr | |
192 bita #Stat.Err any error(s)? | |
193 beq ChkRDRF no, go check Rx data | |
194 ldb DataReg,x read Rx data register to clear error flags | |
195 ClrRxCnt lda Btn.Cntr,u get current button status and Rx data counter | |
196 anda #^BC.RxCnt clear Rx data counter | |
197 ButnExit sta Btn.Cntr,u reset Rx mouse data counter to wait for sync... | |
198 IRQExit clrb clear Carry to mark IRQ serviced | |
199 rts | |
200 | |
201 ChkRDRF bita #Stat.RxF Rx data? | |
202 beq IRQExit no, but this branch should never be taken... | |
203 ldb DataReg,x get Rx data | |
204 lda Btn.Cntr,u get button status and Rx counter | |
205 anda #BC.RxCnt waiting for sync with mouse data? | |
206 bne ChkOfst no, go check Rx offset... | |
207 tfr b,a copy Rx data | |
208 anda #SyncMask clear button status bits | |
209 cmpa #SyncData is it *PROBABLY* the initial (sync) byte? | |
210 bne IRQExit no, just ignore it... | |
211 comb invert button bits to match SS.Mouse format | |
212 lslb *move button | |
213 lslb *status into | |
214 lslb *bits 5-3 | |
215 andb #BC.Butns clear everything but the button bits | |
216 incb set Rx counter to first XY position byte | |
217 pshs b | |
218 lda ,u | |
219 bita #$08 | |
220 beq L017A | |
221 bitb #$08 | |
222 bne L017A | |
223 lda #$C0 | |
224 ldx CrntXPos,u | |
225 cmpx #$0140 | |
226 bcs L017A | |
227 lsla | |
228 L017A anda #$C0 | |
229 ora ,s+ | |
230 bra ButnExit go save new button status and Rx counter, exit... | |
231 ChkOfst cmpa #PcktSize-1 last byte in mouse packet? | |
232 bcs SaveData no, go save mouse data to Rx buffer... | |
233 ldx #HResMaxY*2 get maximum Y position | |
234 pshs x save it for CalcPos subroutine | |
235 leax CrntYPos,u point to current Y position | |
236 leay Buffer+1,u point to primary Y offset | |
237 bsr CalcPos go calculate & save mouse's new Y position | |
238 ldb Buffer+2,u get mouse packet's secondary X offset | |
239 ldx #HResMaxX get maximum X position | |
240 stx ,s save it for CalcPos subroutine | |
241 leax CrntXPos,u point to current X position | |
242 leay Buffer+0,u point to primary X offset | |
243 bsr CalcPos go calculate & save mouse's new X position | |
244 leas 2,s clean up stack | |
245 bra ClrRxCnt go save button status and clear Rx counter, exit... | |
246 SaveData stb a,u save XY position byte to mouse data Rx buffer | |
247 inc Btn.Cntr,u point to next byte in Rx buffer | |
248 clrb clear Carry to mark IRQ serviced | |
249 rts | |
250 | |
251 CalcPos sex sign extend mouse packet's 2nd XY offset ([D] = -128 to +127) | |
252 pshs d save it temporarily... | |
253 ldb ,y get mouse packet's 1st XY offset | |
254 sex sign extend it ([D] = -128 to +127) | |
255 addd ,s add mouse's 2nd XY offset | |
256 std ,s save XY offset total temporarily... | |
257 bpl PosAdjst go de-sensitize positive "ballistic" XY offset... | |
258 orb #%00000111 if -8<XYoffset<0, no "ballistic" response | |
259 addd #1 "fix" negative offset "ballistic" response | |
260 bra RShiftD go calculate "ballistic" offset... | |
261 PosAdjst andb #%11111000 if 0<XYoffset<8, no "ballistic" response | |
262 RShiftD asra *calculate 50% of XY offset | |
263 rorb *for "ballistic" response | |
264 addd ,s++ add original XY offset total, clean up stack | |
265 addd ,x add mouse's current XY position | |
266 bpl CheckPos zero or positive XY position, go check it... | |
267 clra *set minimum | |
268 clrb *XY position | |
269 CheckPos cmpd 2,s past maximum XY position? | |
270 bls SavePos no, go save it... | |
271 ldd 2,s get maximum XY position | |
272 SavePos std ,x save new XY position | |
273 rts | |
274 | |
275 emod | |
276 eom equ * | |
277 end |