NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF drv/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 ZPBIN *-------------------------------------- * 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 PutS 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 PutS .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.MSG.DETECT.OK >PUSHW L.FD.DEV.NAME >PUSHBI 2 >SYSCALL PrintF >PUSHWI DRV.END >PUSHWI DRV.CS.END-DRV.CS.START >PUSHWI DRV.CS.START >LDYA L.DRV.CS.START >SYSCALL InsDrv bcs .99 >STYA FD.DEV+S.FD.DEV.DRVPTR >PUSHW L.FD.DEV >PUSHW L.FD.DEV.NAME >SYSCALL MKDev .99 rts *-------------------------------------- CS.END MSG.DETECT .AZ "Apple Mouse Driver." MSG.DETECT.OK .AZ "Mouse Installed As Device : %s\r\n" MSG.DETECT.KO .AZ "No Mouse Found." 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 bra EXIT *-------------------------------------- OPEN php sei lda #S.DIB.S.OPENED tsb DIB+S.DIB.S 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 bra EXIT *-------------------------------------- CLOSE php sei lda #S.DIB.S.OPENED trb DIB+S.DIB.S ldx DEVSLOT0n lda MOUSEMODx,x keep if VBLInt already activated by kernel and #MOUSEMODx.INTVBL Disable ALL but VBLInt if previously active ldy #SETMOUSE EXIT jsr GOMOUSE 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 *-------------------------------------- .LIST ON DRV.CS.SIZE .EQ DRV.CS.END-DRV.CS.START DRV.SIZE .EQ DRV.END-DRV.CS.START .LIST OFF MAN SAVE usr/src/drv/mouse.drv.s ASM