]> git.sur5r.net Git - cc65/blob - libsrc/atari/mouse.s
Atari mouse routines -- original version from F.Offenga
[cc65] / libsrc / atari / mouse.s
1 ;--------------------------------------------------------------------
2 ; Atari 8-bit mouse routines -- 05/07/2000 Freddy Offenga
3 ;
4 ; The following devices are supported:
5 ; - Atari trak-ball
6 ; - ST mouse
7 ; - Amiga mouse
8 ;
9 ; Mouse checks are done in the timer 1 IRQ and the mouse arrow is
10 ; drawn in player 0 during the vertical blank
11 ;--------------------------------------------------------------------
12
13         .export _mouse_init, _mouse_done, _mouse_box
14         .export _mouse_show, _mouse_hide, _mouse_move
15         .export _mouse_down
16
17         .import popa
18
19         .include "atari.inc"
20
21 TRAK_BALL       = 0     ; device Atari trak-ball
22 ST_MOUSE        = 1     ; device ST mouse
23 AMIGA_MOUSE     = 2     ; device Amiga mouse
24 MAX_TYPE        = 3     ; first illegal device type
25
26 defxmin = 48            ; default x minimum
27 defymin = 32            ; default y minimum
28
29 defxmax = 204           ; default x maximum
30 defymax = 211           ; default y maximum
31
32 pmsize  = 16            ; size pm shape
33
34 xinit   = 100            ; init. x pos.
35 yinit   = 100            ; init. y pos.
36
37 pmb     = $2800         ; pm base memory
38 pm0     = pmb+$400      ; pm 0 memory
39
40 ;--------------------------------------------------------------------
41 ; Initialize mouse routines
42 ; int mouse_init(unsigned char type, unsigned char port)
43
44 _mouse_init:
45         ldy     #0
46         sta     (SAVMSC),y
47         sta     port_nr
48         jsr     popa
49         ldy     #1
50         sta     (SAVMSC),y
51         sta     mouse_type
52
53         ldx     mouse_type
54         cpx     #MAX_TYPE
55         bcc     setup
56
57 ifail:
58         lda     #0              ; init. failed
59         tax
60         rts
61
62 setup:
63         lda     lvectab,x
64         sta     mouse_vec+1
65         lda     hvectab,x
66         sta     mouse_vec+2
67
68         lda     #defxmin
69         sta     xmin
70         lda     #defymin
71         sta     ymin
72
73         lda     #defxmax
74         sta     xmax
75         lda     #defymax
76         sta     ymax
77
78         lda     #xinit
79         sta     mousex
80         lda     #yinit
81         sta     mousey
82
83         jsr     pminit
84
85         lda     VTIMR1
86         sta     old_t1
87         lda     VTIMR1+1
88         sta     old_t1+1
89
90         lda     #<t1_vec
91         sta     VTIMR1
92         lda     #>t1_vec
93         sta     VTIMR1+1
94
95         lda     #%00000001
96         sta     AUDCTL
97
98         lda     #0
99         sta     AUDC1
100
101         lda     #15
102         sta     AUDF1
103         sta     STIMER
104
105         sei
106         lda     POKMSK
107         ora     #%00000001              ; timer 1 enable
108         sta     POKMSK
109         sta     IRQEN
110         cli
111
112         lda     VVBLKI
113         sta     vbi_jmp+1
114         lda     VVBLKI+1
115         sta     vbi_jmp+2
116
117         lda     #6
118         ldy     #<vbi
119         ldx     #>vbi
120         jsr     SETVBV
121
122         lda     #$C0
123         sta     NMIEN
124
125         ldx     #0
126         lda     #1
127         sta     mouse_on
128         rts
129
130 ;--------------------------------------------------------------------
131 ; Finish mouse routines
132 ; void mouse_done(void)
133
134 _mouse_done:
135         sei
136         lda     POKMSK
137         and     #%11111110              ; timer 1 disable
138         sta     IRQEN
139         sta     POKMSK
140         cli
141
142         lda     old_t1
143         sta     VTIMR1
144         lda     old_t1+1
145         sta     VTIMR1+1
146
147         lda     #$40
148         sta     NMIEN
149
150         lda     #6
151         ldy     vbi_jmp+1
152         ldx     vbi_jmp+2
153         jsr     SETVBV
154
155         lda     #0
156         sta     GRACTL
157         sta     HPOSP0
158         sta     mouse_on
159         rts
160
161 ;--------------------------------------------------------------------
162 ; Set mouse limits
163 ; void mouse_box(char xmin, char ymin, char xmax, char ymax)
164
165 _mouse_box:
166         sta     ymax
167         jsr     popa
168         sta     xmax
169         jsr     popa
170         sta     ymin
171         jsr     popa
172         sta     xmin
173         rts
174
175 ;--------------------------------------------------------------------
176 ; Set mouse position
177 ; void mouse_move(char xpos, char ypos)
178
179 _mouse_move:
180         sta     mousey
181         jsr     popa
182         sta     mousex
183         rts
184
185 ;--------------------------------------------------------------------
186 ; Show mouse arrow
187 ; void mouse_show(void)
188
189 _mouse_show:
190         lda     #1
191         sta     mouse_on
192         rts
193
194 ;--------------------------------------------------------------------
195 ; Hide mouse arrow
196 ; void mouse_hide(void)
197
198 _mouse_hide:
199         lda     #0
200         sta     mouse_on
201         rts
202
203 ;--------------------------------------------------------------------
204 ; Ask mouse button
205 ; int mouse_down(void)
206
207 _mouse_down:
208         ldx     port_nr
209         lda     STRIG0,x
210         bne     nobut
211         lda     #14
212         sta     COLOR1
213         ldx     #0
214         lda     #1
215         rts
216 nobut:  ldx     #0
217         txa
218         rts
219
220 ;--------------------------------------------------------------------
221 ; Atari trak-ball check, A,Y = 4-bit port value
222
223 trak_check:
224         eor     oldval
225         and     #%00001000
226         beq     horiz
227
228         tya
229         and     #%00000100
230         beq     mmup
231
232         inc     mousey
233         bne     horiz
234
235 mmup:   dec     mousey
236
237 horiz:  tya
238         eor     oldval
239         and     #%00000010
240         beq     mmexit
241
242         tya
243         and     #%00000001
244         beq     mmleft
245
246         inc     mousex
247         bne     mmexit
248
249 mmleft: dec     mousex
250
251 mmexit: sty     oldval
252         rts
253
254 ;--------------------------------------------------------------------
255 ; ST mouse check, A,Y = 4-bit port value
256
257 st_check:
258         and     #%00000011
259         ora     dumx
260         tax
261         lda     sttab,x
262         bmi     nxst
263
264         beq     xist
265         dec     mousex              ; 1 = left
266         bne     nxst
267 xist:   inc     mousex              ; 0 = right
268
269 nxst:   tya
270         and     #%00001100
271         ora     dumy
272         tax
273         lda     sttab,x
274         bmi     nyst
275
276         bne     yst
277         dec     mousey              ; 0 = up
278         bne     nyst
279 yst:    inc     mousey              ; 1 = down
280
281 ; store old readings
282
283 nyst:   tya
284         and     #%00000011
285         asl
286         asl
287         sta     dumx
288         tya
289         and     #%00001100
290         lsr
291         lsr
292         sta     dumy
293         rts
294
295 ;--------------------------------------------------------------------
296 ; Amiga mouse check, A,Y = 4-bit port value
297
298 amiga_check:
299
300         lsr
301         and     #%00000101
302         ora     dumx
303         tax
304         lda     amitab,x
305         bmi     nxami
306
307         bne     xiami
308         dec     mousex              ; 0 = left
309         bne     nxami
310 xiami:  inc     mousex              ; 1 = right
311
312 nxami:  tya
313
314         and     #%00000101
315         ora     dumy
316         tax
317         lda     amitab,x
318         bmi     nyami
319
320         bne     yiami
321         dec     mousey              ; 0 =  up
322         bne     nyami
323 yiami:  inc     mousey              ; 1 = down
324
325 ; store old readings
326
327 nyami:  tya
328         and     #%00001010
329         sta     dumx
330         tya
331         and     #%00000101
332         asl
333         sta     dumy
334         rts
335
336 ;--------------------------------------------------------------------
337 ; timer 1 IRQ routine - check mouse
338
339 t1_vec: tya
340         pha
341         txa
342         pha
343
344         lda     RANDOM
345         sta     COLBK           ; debug
346
347         lda     port_nr
348         lsr                     ; even number 0/2
349         tay
350         lda     PORTA,y
351         ldy     port_nr
352         cpy     #1
353         beq     oddp
354         cpy     #3
355         beq     oddp
356
357         lsr
358         lsr
359         lsr
360         lsr
361 oddp:   tay
362
363 mouse_vec:
364         jsr     st_check        ; will be modified
365
366         pla
367         tax
368         pla
369         tay
370         pla
371         rti
372
373 ;--------------------------------------------------------------------
374 ; VBI - check mouse limits and display mouse arrow
375
376 vbi:    lda     mousex
377         cmp     xmin
378         bcs     ok1             ; xmin <= mousex
379         lda     xmin
380         sta     mousex
381
382 ok1:    lda     mousey
383         cmp     ymin
384         bcs     ok2             ; ymin <= mousey
385         lda     ymin
386         sta     mousey
387
388 ok2:    lda     xmax
389         cmp     mousex
390         bcs     ok3             ; xmax >= mousex
391         lda     xmax
392         sta     mousex
393
394 ok3:    lda     ymax
395         cmp     mousey
396         bcs     ok4             ; ymax >= mousey
397         lda     ymax
398         sta     mousey
399
400 ok4:    jsr     clrpm
401
402         lda     mouse_on
403         bne     mon
404         lda     #0
405         sta     HPOSP0
406         beq     moff
407
408 mon:    jsr     drwpm
409         lda     mousey
410         sta     omy
411
412         lda     #3
413 moff:   sta     GRACTL
414
415 vbi_jmp:
416         jmp     SYSVBV          ; will be modified
417
418 ;--------------------------------------------------------------------
419 ; initialize mouse pm
420
421 pminit: ldx     #0
422         txa
423 clpm:   sta     pm0,x
424         inx
425         bne     clpm
426
427         lda     #>pmb
428         sta     PMBASE
429
430         lda     #62
431         sta     SDMCTL
432
433         lda     #1
434         sta     GPRIOR
435
436         lda     #0
437         sta     PCOLR0
438         sta     SIZEP0
439         rts
440
441 ;--------------------------------------------------------------------
442 ; draw new mouse pm
443
444 drwpm:  lda     mousex
445         sta     HPOSP0
446
447         lda     mousey
448         tax
449
450         ldy     #0
451 fmp2:   lda     mskpm,y
452         sta     pm0,x
453         inx
454         iny
455         cpy     #pmsize
456         bne     fmp2
457         rts
458
459 ;--------------------------------------------------------------------
460 ; clear old mouse pm
461
462 clrpm:  lda omy
463         tax
464
465         ldy #0
466         tya
467 fmp1:   sta pm0,x
468         inx
469         iny
470         cpy #pmsize
471         bne fmp1
472         rts
473
474 ;--------------------------------------------------------------------
475
476         .data
477
478 ; mouse arrow - pm shape
479
480 mskpm:  .byte %00000000
481         .byte %10000000
482         .byte %11000000
483         .byte %11000000
484
485         .byte %11100000
486         .byte %11100000
487         .byte %11110000
488         .byte %11100000
489
490         .byte %11100000
491         .byte %00100000
492         .byte %00100000
493         .byte %00110000
494
495         .byte %00110000
496         .byte %00000000
497         .byte %00000000
498         .byte %00000000
499
500 ; ST mouse lookup table
501
502 sttab:  .byte $FF,$01,$00,$01
503         .byte $00,$FF,$00,$01
504         .byte $01,$00,$FF,$00
505         .byte $01,$00,$01,$FF
506
507 ; Amiga mouse lookup table
508
509 amitab: .byte $FF,$01,$00,$FF
510         .byte $00,$FF,$FF,$01
511         .byte $01,$FF,$FF,$00
512         .byte $FF,$00,$01,$FF
513
514 ; Device vectors
515
516 lvectab:
517         .byte <trak_check, <st_check, <amiga_check
518 hvectab:
519         .byte >trak_check, >st_check, >amiga_check
520
521 ; Misc. vars
522
523 old_t1: .res 2
524
525 dumx:   .res 1
526 dumy:   .res 1
527 oldval: .res 1
528
529 omy:    .res 1
530
531 mousex: .res 1
532 mousey: .res 1
533
534 xmin:   .res 1
535 ymin:   .res 1
536
537 xmax:   .res 1
538 ymax:   .res 1
539
540 mouse_on:
541         .res 1
542
543 mouse_type:
544         .res 1
545
546 port_nr:
547         .res 1