From: Oliver Schmidt 
Date: Tue, 28 May 2013 20:07:04 +0000 (+0200)
Subject: Brought back mouse driver source code.
X-Git-Tag: V2.15~278
X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=56b6dcf814768c42b137bf85afa1f1139483f54d;p=cc65
Brought back mouse driver source code.
The mouse driver source code in question was removed two years
ago with commit 6cbbe66c87fc19c322a0dd72a5c8ef094ea90c90.
It seems however desirable to have it around visible in the source
code tree for reference purposes.
---
diff --git a/libsrc/atari/mouse.s_ b/libsrc/atari/mouse.s_
new file mode 100644
index 000000000..9c722b49c
--- /dev/null
+++ b/libsrc/atari/mouse.s_
@@ -0,0 +1,576 @@
+;--------------------------------------------------------------------
+; Atari 8-bit mouse routines -- 05/07/2000 Freddy Offenga
+; Some changes by Christian Groessler, Ullrich von Bassewitz
+;
+; The following devices are supported:
+; - Atari trak-ball
+; - ST mouse
+; - Amiga mouse
+;
+; Mouse checks are done in the timer 1 IRQ and the mouse arrow is
+; drawn in player 0 during the vertical blank
+;--------------------------------------------------------------------
+
+	.export		_mouse_init, _mouse_done, _mouse_box
+	.export 	_mouse_show, _mouse_hide, _mouse_move
+	.export 	_mouse_buttons, _mouse_pos, _mouse_info
+	.constructor	initmouse,27
+
+	.import 	popax
+	.importzp	ptr1
+
+	.include "atari.inc"
+
+TRAK_BALL	= 0	; device Atari trak-ball
+ST_MOUSE	= 1	; device ST mouse
+AMIGA_MOUSE	= 2	; device Amiga mouse
+MAX_TYPE	= 3	; first illegal device type
+
+; the default values force the mouse cursor inside the test screen (no access to border)
+defxmin = 48		; default x minimum
+defymin = 31		; default y minimum
+defxmax = 204		; default x maximum
+defymax = 211		; default y maximum
+
+pmsize	= 16		; y size pm shape
+
+xinit	= defxmin	; init. x pos.
+yinit	= defymin	; init. y pos.
+
+;--------------------------------------------------------------------
+; reserve memory for the mouse pointer
+
+initmouse:
+	lda	APPMHI+1
+	and	#%11111000	; make 2k aligned
+	sec
+	sbc	#%00001000	; reserve 2k
+	tax
+	adc	#3		; add 4 (C = 1)
+	sta	mouse_pm0
+	lda	#0
+	sta	APPMHI
+	stx	APPMHI+1
+	rts
+
+
+;--------------------------------------------------------------------
+; Initialize mouse routines
+; void __fastcall__ mouse_init (unsigned char type);
+
+_mouse_init:
+	cmp	#MAX_TYPE+1	; Check for a valid type
+	bcc	setup
+
+ifail:	lda	#0		; init. failed
+	tax
+	rts
+
+setup:	tax
+	lda	lvectab,x
+	sta	mouse_vec+1
+	lda	hvectab,x
+	sta	mouse_vec+2
+
+	jsr	pminit
+
+	lda	VTIMR1
+	sta	old_t1
+	lda	VTIMR1+1
+	sta	old_t1+1
+
+	lda	#t1_vec
+	sta	VTIMR1+1
+
+	lda	#%00000001
+	sta	AUDCTL
+
+	lda	#0
+	sta	AUDC1
+
+	lda	#15
+	sta	AUDF1
+	sta	STIMER
+
+	sei
+	lda	POKMSK
+	ora	#%00000001		; timer 1 enable
+	sta	POKMSK
+	sta	IRQEN
+	cli
+
+	lda	VVBLKI
+        sta     vbi_jmp+1
+	lda	VVBLKI+1
+        sta     vbi_jmp+2
+
+	lda	#6
+	ldy	#vbi
+	jsr	SETVBV
+
+	lda	#$C0
+	sta	NMIEN
+
+	ldx	#0
+	lda	#1
+	sta    	mouse_off
+	rts
+
+;--------------------------------------------------------------------
+; Finish mouse routines
+; void mouse_done(void)
+
+_mouse_done:
+	sei
+	lda	POKMSK
+	and	#%11111110		; timer 1 disable
+	sta	IRQEN
+	sta	POKMSK
+	cli
+
+	lda	old_t1
+	sta	VTIMR1
+	lda	old_t1+1
+	sta	VTIMR1+1
+
+	lda	#$40
+	sta	NMIEN
+
+	lda	#6
+        ldy     vbi_jmp+1
+        ldx     vbi_jmp+2
+	jsr	SETVBV
+
+	ldx    	#0
+	stx	GRACTL
+	stx	HPOSP0
+	inx
+	stx    	mouse_off
+	rts
+
+;--------------------------------------------------------------------
+; Set mouse limits
+; void __fastcall__ mouse_box(int xmin, int ymin, int xmax, int ymax)
+
+_mouse_box:
+	sta	ymax
+        jsr     popax		; always ignore high byte
+	sta	xmax
+	jsr	popax
+	sta	ymin
+        jsr     popax
+	sta	xmin
+	rts
+
+;--------------------------------------------------------------------
+; Set mouse position
+; void __fastcall__ mouse_move(int xpos, int ypos)
+
+_mouse_move:
+	sta	mousey		; always ignore high byte
+	jsr	popax
+	sta	mousex
+	rts
+
+;--------------------------------------------------------------------
+; Show mouse arrow
+; void mouse_show(void)
+
+_mouse_show:
+	lda     mouse_off	; Already on?
+	beq	@L1
+       	dec	mouse_off
+@L1:	rts
+
+;--------------------------------------------------------------------
+; Hide mouse arrow
+; void mouse_hide(void)
+
+_mouse_hide:
+	inc	mouse_off
+	rts
+
+;--------------------------------------------------------------------
+; Ask mouse button
+; unsigned char mouse_buttons(void)
+
+_mouse_buttons:
+    	ldx	#0
+    	lda	STRIG0
+    	bne	nobut
+;   	lda	#14
+;???	sta	COLOR1
+    	lda	#1
+    	rts
+nobut:	txa
+    	rts
+
+;--------------------------------------------------------------------
+; Get the mouse position
+; void mouse_pos (struct mouse_pos* pos);
+
+_mouse_pos:
+	sta	ptr1
+	stx	ptr1+1			; Store argument pointer
+	ldy	#0
+	lda	mousex			; X position
+	sta	(ptr1),y
+	lda	#0
+	iny
+	sta	(ptr1),y
+	lda	mousey			; Y position
+	iny
+	sta	(ptr1),y
+	lda	#0
+	iny
+	sta	(ptr1),y
+    	rts
+
+;--------------------------------------------------------------------
+; Get the mouse position and button information
+; void mouse_info (struct mouse_info* info);
+
+_mouse_info:
+
+; We're cheating here to keep the code smaller: The first fields of the
+; mouse_info struct are identical to the mouse_pos struct, so we will just
+; call _mouse_pos to initialize the struct pointer and fill the position
+; fields.
+
+        jsr	_mouse_pos
+
+; Fill in the button state
+
+	jsr     _mouse_buttons		; Will not touch ptr1
+	ldy	#4
+	sta	(ptr1),y
+
+      	rts
+
+;--------------------------------------------------------------------
+; Atari trak-ball check, A,Y = 4-bit port value
+
+trak_check:
+    	eor	oldval
+    	and	#%00001000
+    	beq	horiz
+
+    	tya
+    	and	#%00000100
+	beq	mmup
+
+	inc	mousey
+	bne	horiz
+
+mmup:	dec	mousey
+
+horiz:	tya
+	eor	oldval
+	and	#%00000010
+	beq	mmexit
+
+	tya
+	and	#%00000001
+	beq	mmleft
+
+	inc	mousex
+	bne	mmexit
+
+mmleft: dec	mousex
+
+mmexit: sty	oldval
+	rts
+
+;--------------------------------------------------------------------
+; ST mouse check, A,Y = 4-bit port value
+
+st_check:
+	and	#%00000011
+	ora	dumx
+	tax
+	lda	sttab,x
+	bmi	nxst
+
+	beq	xist
+	dec	mousex		    ; 1 = left
+	bne	nxst
+xist:	inc	mousex		    ; 0 = right
+
+nxst:	tya
+	and	#%00001100
+	ora	dumy
+	tax
+	lda	sttab,x
+	bmi	nyst
+
+	bne	yst
+	dec	mousey		    ; 0 = up
+	bne	nyst
+yst:	inc	mousey		    ; 1 = down
+
+; store old readings
+
+nyst:	tya
+	and	#%00000011
+	asl
+	asl
+	sta	dumx
+	tya
+	and	#%00001100
+	lsr
+	lsr
+	sta	dumy
+	rts
+
+;--------------------------------------------------------------------
+; Amiga mouse check, A,Y = 4-bit port value
+
+amiga_check:
+
+	lsr
+	and	#%00000101
+	ora	dumx
+	tax
+	lda	amitab,x
+	bmi	nxami
+
+	bne	xiami
+	dec	mousex		    ; 0 = left
+	bne	nxami
+xiami:	inc	mousex		    ; 1 = right
+
+nxami:	tya
+
+	and	#%00000101
+	ora	dumy
+	tax
+	lda	amitab,x
+	bmi	nyami
+
+	bne	yiami
+	dec	mousey		    ; 0 =  up
+	bne	nyami
+yiami:	inc	mousey		    ; 1 = down
+
+; store old readings
+
+nyami:	tya
+	and	#%00001010
+	sta	dumx
+	tya
+	and	#%00000101
+	asl
+	sta	dumy
+	rts
+
+;--------------------------------------------------------------------
+; timer 1 IRQ routine - check mouse
+
+t1_vec: tya
+	pha
+	txa
+	pha	
+
+.ifdef DEBUG
+	lda	RANDOM
+	sta	COLBK		; debug
+.endif
+
+	lda	PORTA
+	tay
+
+mouse_vec:
+        jsr     st_check        ; will be modified; won't be ROMmable
+
+	pla
+	tax
+	pla
+	tay
+        pla
+	rti
+
+;--------------------------------------------------------------------
+; VBI - check mouse limits and display mouse arrow
+
+vbi:	lda	mousex
+	cmp	xmin
+        bcs     ok1             ; xmin <= mousex
+        lda     xmin
+	sta	mousex
+
+ok1:	lda	mousey
+	cmp	ymin
+        bcs     ok2             ; ymin <= mousey
+	lda	ymin
+	sta	mousey
+
+ok2:    lda     xmax
+        cmp     mousex
+        bcs     ok3             ; xmax >= mousex
+	lda	xmax
+	sta	mousex
+
+ok3:    lda     ymax
+        cmp     mousey
+        bcs     ok4             ; ymax >= mousey
+	lda	ymax
+	sta	mousey
+
+ok4:    jsr     clrpm
+
+	lda	mouse_off
+        beq     mon
+        lda     #0
+        sta     HPOSP0
+        beq     moff
+
+mon:    jsr     drwpm
+	lda	mousey
+	sta	omy
+
+        lda     #3
+moff:	sta	GRACTL
+
+vbi_jmp:
+        jmp     SYSVBV          ; will be modified; won't be ROMmable
+
+;--------------------------------------------------------------------
+; initialize mouse pm
+
+pminit:	lda	mouse_pm0
+	sta	mpatch1+2
+	sta	mpatch2+2
+	sta	mpatch3+2
+
+	ldx	#0
+	txa
+mpatch1:
+clpm:	sta	$1000,x		; will be patched
+	inx
+	bne	clpm
+
+	lda	mouse_pm0
+	sec
+	sbc	#4
+	sta	PMBASE
+
+	lda	#62
+	sta	SDMCTL
+
+        lda     #1
+	sta	GPRIOR
+
+	lda	#0
+	sta	PCOLR0
+        sta     SIZEP0
+	rts
+
+;--------------------------------------------------------------------
+; draw new mouse pm
+
+drwpm:	lda	mousex
+	sta	HPOSP0
+
+	lda	mousey
+	tax
+
+	ldy	#0
+fmp2:	lda	mskpm,y
+mpatch2:
+	sta	$1000,x		; will be patched
+	inx
+	iny
+	cpy	#pmsize
+	bne	fmp2
+	rts
+
+;--------------------------------------------------------------------
+; clear old mouse pm
+
+clrpm:	lda	omy
+        tax
+
+	ldy	#0
+	tya
+mpatch3:
+fmp1:	sta	$1000,x		; will be patched
+	inx
+	iny
+	cpy	#pmsize
+	bne	fmp1
+	rts
+
+;--------------------------------------------------------------------
+        .rodata
+
+; mouse arrow - pm shape
+
+mskpm:	.byte %00000000
+	.byte %10000000
+	.byte %11000000
+	.byte %11000000
+
+	.byte %11100000
+	.byte %11100000
+	.byte %11110000
+	.byte %11100000
+
+	.byte %11100000
+	.byte %00100000
+	.byte %00100000
+	.byte %00110000
+
+	.byte %00110000
+	.byte %00000000
+	.byte %00000000
+	.byte %00000000
+
+; ST mouse lookup table
+
+sttab:  .byte $FF,$01,$00,$01
+        .byte $00,$FF,$00,$01
+        .byte $01,$00,$FF,$00
+        .byte $01,$00,$01,$FF
+
+; Amiga mouse lookup table
+
+amitab: .byte $FF,$01,$00,$FF
+        .byte $00,$FF,$FF,$01
+        .byte $01,$FF,$FF,$00
+        .byte $FF,$00,$01,$FF
+
+; Device vectors
+
+lvectab:
+	.byte trak_check, >st_check, >amiga_check
+
+; default values
+
+xmin:   .byte	defxmin
+ymin:   .byte	defymin
+xmax:	.byte	defxmax
+ymax:	.byte	defymax
+
+mousex:	.byte	xinit
+mousey:	.byte	yinit
+
+;--------------------------------------------------------------------
+	.bss
+
+; Misc. vars
+
+old_t1: .res 2		; old timer interrupt vector
+oldval: .res 1		; used by trakball routines
+dumx:	.res 1
+dumy:	.res 1
+omy:	.res 1		; old y pos
+
+mouse_off:
+	.res 1
+mouse_pm0:
+	.res 1