NEW
PREFIX
AUTO 4,1
				.LIST OFF	
				.OP	65C02
				.OR $2000
				.TF DRV/GUI/MOUSE.DRV
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/IO.I
				.INB INC/MLI.E.I
				.INB INC/XY.MOUSE.I
				.INB INC/LIBGUI.I
*--------------------------------------
ZPSlotPtr		.EQ ZPDRV
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp Dev.Detect			cld,jmp abs=DRV
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					DRV Layout Version 1
				.DA 0
				.DA CS.END-CS.START			Code Length
				.DA 0
				.DA 0
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
L.MSG.DETECT	.DA MSG.DETECT
L.MSG.DETECT.OK	.DA MSG.DETECT.OK
L.MSG.DETECT.KO	.DA MSG.DETECT.KO
L.DRV.CS.START	.DA DRV.CS.START
L.FD.DEV		.DA FD.DEV
L.FD.DEV.NAME	.DA FD.DEV.NAME
				.DA 0					End Of Reloc Table
*--------------------------------------
Dev.Detect		>LDYA L.MSG.DETECT
				>SYSCALL printf

				stz ZPSlotPtr
				lda #$C1
.1				sta ZPSlotPtr+1
				
				ldx #DEVSIG.Value-DEVSIG.Offset-1

.2				ldy DEVSIG.Offset,x
				lda (ZPSlotPtr),y
				cmp DEVSIG.Value,x
				bne .3
				dex
				bpl .2
				bra .8
				
.3				lda ZPSlotPtr+1			no match, try next slot....
				inc
				cmp #$C8
				bne .1	
				
				>LDYA L.MSG.DETECT.KO
				>SYSCALL printf

.9				lda #MLI.E.NODEV
				sec
				rts
				
.8				lda ZPSlotPtr+1
				sta GOMOUSE+2
				sta GOMOUSE.Cn+1
				sta GOMOUSE.JMP+2
				and #$0F
				sta DEVSLOT0n
				ora #$30
				sta FD.DEV.NAME+3
				asl
				asl
				asl
				asl
				sta GOMOUSE.n0+1
				
				>PUSHW L.FD.DEV.NAME
				>PUSHBI 2
				>LDYA L.MSG.DETECT.OK
				>SYSCALL printf
	
				>PUSHWI DRV.END
				>PUSHWI DRV.CS.END
				>PUSHWI DRV.CS.START
				>LDYA L.DRV.CS.START
				>SYSCALL InsDrv
				bcs .9
				>STYA FD.DEV+S.FD.DEV.DRVPTR
				
				>PUSHW L.FD.DEV.NAME
				>LDYA L.FD.DEV
				>SYSCALL MKDEV

				rts
*--------------------------------------
CS.END
MSG.DETECT		.AZ "Apple Mouse Driver.\r\n"
MSG.DETECT.OK	.AZ "Mouse Installed As Device : %s\r\n"
MSG.DETECT.KO	.AZ "No Mouse Found.\r\n"
DEVSIG.Offset	.HS 05070B0CFB
DEVSIG.Value	.HS 38180120D6
*--------------------------------------
FD.DEV			.DA #S.FD.T.CDEV
				.DA #0					HANDLER
				.DA #0					BUSID
				.DA #0					DEVID
				.DA 0					BUSPTR
				.BS 2					DRVPTR
				.DA 0					DCBPTR
				.DA 0					BUFPTR
FD.DEV.NAME		.AZ "MOUx"
*--------------------------------------
*			Driver Code
*--------------------------------------
ZPIOCTL			.EQ ZPDRV
ZPBufPtr		.EQ ZPDRV+2
*--------------------------------------
DRV.CS.START	cld
				jmp (.1,x)
.1				.DA STATUS
				.DA A2osX.BADCALL
				.DA A2osX.BADCALL
				.DA A2osX.BADCALL
				.DA CONTROL
				.DA A2osX.BADCALL
				.DA OPEN
				.DA CLOSE
				.DA READ
				.DA A2osX.BADCALL
				.DA 0					end or relocation
*--------------------------------------
STATUS			>STYA ZPIOCTL

				ldy #S.IOCTL.BUFPTR
				lda (ZPIOCTL),y
				sta ZPBufPtr
				iny 
				lda (ZPIOCTL),y
				sta ZPBufPtr+1

				ldy #S.IOCTL.STATCODE
				lda (ZPIOCTL),y
				beq .1
				
				cmp #S.IOCTL.STATCODE.GETDIB
				bne STATUS.DCB
				
				ldy #S.DIB-1
				.HS 2C					bit abs
.1				ldy #3
				
.2				lda DIB,y
				sta (ZPBufPtr),y
				dey
				bpl .2
				
				clc
				rts

STATUS.DCB		
				
STATUS.9		lda #MLI.E.BADCTL
				sec
				rts
*--------------------------------------
CONTROL			>STYA ZPBufPtr			NON STANDARD

				php
				sei
				
				ldy #0
				ldx #0					set X
				jsr SETCLAMP
				
				ldy #4
				ldx #1					set Y
				jsr SETCLAMP
				
				ldy #HOMEMOUSE				
				jsr GOMOUSE

				plp
				clc
				rts
*--------------------------------------
OPEN			php
				sei

				ldx DEVSLOT0n
				lda MOUSEMODx,x			keep if VBLInt already activated by kernel
				and #MOUSEMODx.INTVBL
				ora #MOUSEMODx.ACTIVE	Enable, Polling mode
				ldy #SETMOUSE
				jsr GOMOUSE
				
				ldy #INITMOUSE			Reset
				jsr GOMOUSE

				lda #S.DIB.S.OPENED
				tsb DIB+S.DIB.S
				
				plp
				
				clc
				rts
*--------------------------------------
CLOSE			php
				sei
				
				ldx DEVSLOT0n
				lda MOUSEMODx,x			keep if VBLInt already activated by kernel
				and #MOUSEMODx.INTVBL	Disable ALL but VBLInt if previously active
				ldy #SETMOUSE
				jsr GOMOUSE
				
				lda #S.DIB.S.OPENED
				trb DIB+S.DIB.S
				
				plp
				
				clc
				rts
*--------------------------------------
READ			>STYA ZPBufPtr			NON STANDARD

				stz READ.S+1			Reset Flags

				php
				sei

				sta SET80STORE
				sta CLRPAGE2
				
*				ldy #READMOUSE			DONE BY IRQ MANAGER
*				jsr GOMOUSE
				
				ldx DEVSLOT0n
				
				lda MOUSESTSx,x
				and #MOUSESTSx.MOVED
				beq .1
				
				ldy #S.MOUSE.X1

				lda MOUSEXLOx,x
				sta (ZPBufPtr),y
				
				iny
				lda MOUSEXHIx,x
				sta (ZPBufPtr),y
				
				iny
				lda MOUSEYLOx,x
				sta (ZPBufPtr),y
				
				iny
				lda MOUSEYHIx,x
				sta (ZPBufPtr),y

				lda #S.MOUSE.S.MOVE
				tsb READ.S+1			
				
				stz bDblClick			Reset DblClick flag
							
.1				lda MOUSESTSx,x
				and #MOUSESTSx.DOWN+MOUSESTSx.LDOWN
				beq .8					no button state change:up & previously up
					
				cmp #MOUSESTSx.DOWN+MOUSESTSx.LDOWN
				beq .8					no button state change:down & previously down
				
				asl						if CS, down & previously up
				bcc .2
				
				lda #S.MOUSE.S.DOWN
				tsb READ.S+1			button has been pressed, start drag...
				
				lda MOUSEXLOx,x
				sta SrcDrag
				
				lda MOUSEXHIx,x
				sta SrcDrag+1
				
				lda MOUSEYLOx,x
				sta SrcDrag+2
				
				lda MOUSEYHIx,x
				sta SrcDrag+3
				
				bra .8
				
.2				lda READ.S+1
				
				pha						save move state
				
				ora #S.MOUSE.S.UP
				sta READ.S+1
				
				pla						get back move state
				
				bne	.4					no move...click!
				
				lda #S.MOUSE.S.CLK
				bit bDblClick
				bpl .3
				
				lda #S.MOUSE.S.DCLK
				
				ldy #1
				sty bDblClick
				
.3				dec bDblClick

				tsb READ.S+1
				bra .8
				
.4				lda #S.MOUSE.S.DRAGSTART
				tsb READ.S+1
				
				ldy #S.MOUSE.X2+3
				
.5				lda SrcDrag-S.MOUSE.X2,y
				sta (ZPBufPtr),y
				dey
				bpl .5
				
.8				plp

READ.S			lda #$ff				SELF MODIFIED
				beq .9

				ldy #S.MOUSE.S
				sta (ZPBufPtr),y
				clc
				rts

.9				lda	#MLI.E.EOF
				sec
				rts				
*--------------------------------------
* PRIVATE
*--------------------------------------
SETCLAMP		lda (ZPBufPtr),y
				sta LOCLAMPLO
				
				iny
				lda (ZPBufPtr),y
				sta LOCLAMPHI

				iny
				lda (ZPBufPtr),y
				sta HICLAMPLO

				iny
				lda (ZPBufPtr),y
				sta HICLAMPHI
				
				txa
				ldy #CLAMPMOUSE 
*--------------------------------------
GOMOUSE			ldx $FF00,y				SELF MODIFIED
				stx GOMOUSE.JMP+1
GOMOUSE.Cn		ldx #$ff				SELF MODIFIED
GOMOUSE.n0		ldy #$ff				SELF MODIFIED
GOMOUSE.JMP		jmp $FFFF				SELF MODIFIED
*--------------------------------------
DRV.CS.END
DEVSLOT0n		.BS 1
bDblClick		.BS 1
SrcDrag			.BS 4
*--------------------------------------
DIB				.DA #0
				.DA #0,#0,#0
				>PSTR "Apple II Mouse"
				.BS 2
				.DA #S.DIB.T.XY
				.DA #0
				.DA K.VER
*--------------------------------------
DRV.END
MAN
SAVE USR/SRC/DRV/MOUSE.DRV.S
ASM
