PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/MOUSE.DRV *-------------------------------------- .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/PRODOS.I *-------------------------------------- ZPGoMouse .EQ ZPDRV ZPTmpPtr1 .EQ ZPDRV+2 *-------------------------------------- EVENT.MOUSEUP .EQ %00000001 EVENT.MOUSEDOWN .EQ %00000010 EVENT.MOUSEMOVE .EQ %00000100 EVENT.MOUSEDRAG .EQ %00001000 EVENT.MOUSECLK .EQ %00010000 EVENT.MOUSEDCLK .EQ %00100000 *-------------------------------------- SETMOUSE .EQ $12 Sets mouse mode SERVEMOUSE .EQ $13 Services mouse interrupt READMOUSE .EQ $14 Reads mouse position CLEARMOUSE .EQ $15 Clears mouse position to 0 (for delta mode) POSMOUSE .EQ $16 Sets mouse position to a user-defined pos CLAMPMOUSE .EQ $17 Sets mouse bounds in a window HOMEMOUSE .EQ $18 Sets mouse to upper-left corner of clamp win INITMOUSE .EQ $19 Resets mouse clamps to default values,sets mouse position to 0,0 LOCLAMPLO .EQ $0478 low byte of low clamp. HICLAMPLO .EQ $04F8 low byte of high clamp. LOCLAMPHI .EQ $0578 high byte of low clamp. HICLAMPHI .EQ $05F8 high byte of high clamp. MOUSEXLOx .EQ $0478 MOUSEYLOx .EQ $04F8 MOUSEXHIx .EQ $0578 MOUSEYHIx .EQ $05F8 * .EQ $0678 * .EQ $06F8 MOUSESTSx .EQ $0778 MOUSESTSx.DOWN .EQ %10000000 MOUSESTSx.LDOWN .EQ %01000000 MOUSESTSx.MOVED .EQ %00100000 MOUSESTSx.INTVBL .EQ %00001000 MOUSESTSx.INTBUT .EQ %00000100 MOUSESTSx.INTMOVE .EQ %00000010 MOUSEMODx .EQ $07F8 MOUSEMODx.INTVBL .EQ %00001000 MOUSEMODx.INTBUT .EQ %00000100 MOUSEMODx.INTMOVE .EQ %00000010 MOUSEMODx.ACTIVE .EQ %00000001 *-------------------------------------- * 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 DEV.HEADER-CS.START Device Header Offset .DA DRV.CS.START-CS.START Driver Code Offset .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- * 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.DEV.HEADER.NAME .DA DEV.HEADER.NAME .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL CPrintFYA stz ZPTmpPtr1 lda #$C1 sta ZPTmpPtr1+1 .1 ldx #DEVSIG.Value-DEVSIG.Offset-1 .2 ldy DEVSIG.Offset,x lda (ZPTmpPtr1),y cmp DEVSIG.Value,x bne .3 dex bpl .2 bra .4 .3 inc ZPTmpPtr1+1 no match, try next slot.... lda ZPTmpPtr1+1 cmp #$C8 bne .1 >LDYA L.MSG.DETECT.KO >SYSCALL CPrintFYA lda #MLI.ERR.NODEV sec rts .4 lda ZPTmpPtr1+1 sta DEVSLOTCn and #$0F sta DEVSLOT0n ora #$30 sta DEV.HEADER.NAME+4 asl asl asl asl sta DEVSLOTn0 >PUSHW L.DEV.HEADER.NAME >LDYA L.MSG.DETECT.OK >SYSCALL CPrintFYA clc rts *-------------------------------------- CS.END MSG.DETECT >CSTR "Apple Mouse Card/IIc Mouse Driver.\n" MSG.DETECT.OK >CSTR "Mouse Installed As Device : %S\n" MSG.DETECT.KO >CSTR "No Mouse Found.\n" DEVSIG.Offset .HS 05070B0CFB DEVSIG.Value .HS 38180120D6 *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER .DA DRV.CS.START .DA #0 DEV.HEADER.NAME >PSTR "MOUx" *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START cld jmp (.1,x) .1 .DA STATUS .DA READBLOCK .DA BADCALL .DA BADCALL .DA BADCALL .DA BADCALL .DA OPEN .DA CLOSE .DA BADCALL .DA BADCALL L.DEVSTAT .DA DEVSTAT L.READBLOCK.FLAGS .DA READBLOCK.FLAGS .DA 0 end or relocation *-------------------------------------- BADCALL lda #MLI.ERR.BADCALL sec rts *-------------------------------------- STATUS >LDYA L.DEVSTAT 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 stz LOCLAMPLO stz LOCLAMPHI lda #559 sta HICLAMPLO lda /559 sta HICLAMPHI lda #0 set X ldy #CLAMPMOUSE jsr GOMOUSE stz LOCLAMPLO stz LOCLAMPHI lda #191 sta HICLAMPLO lda /191 sta HICLAMPHI lda #1 set Y ldy #CLAMPMOUSE jsr GOMOUSE ldy #HOMEMOUSE jsr GOMOUSE plp clc rts *-------------------------------------- READBLOCK php sei ldy #READMOUSE jsr GOMOUSE stz READBLOCK.FLAGS ldx DEVSLOT0n lda MOUSESTSx,x and #MOUSESTSx.DOWN+MOUSESTSx.LDOWN beq .3 no button state change:up & previously up cmp #MOUSESTSx.DOWN+MOUSESTSx.LDOWN beq .3 no button state change:down & previously down asl if CS, down & previoulsy up bcc .1 lda #EVENT.MOUSEUP bra .2 .1 lda #EVENT.MOUSEDOWN .2 sta READBLOCK.FLAGS .3 lda MOUSESTSx,x and #MOUSESTSx.MOVED beq .4 lda READBLOCK.FLAGS ora #EVENT.MOUSEMOVE sta READBLOCK.FLAGS .4 lda MOUSEXLOx,x sta READBLOCK.XY lda MOUSEXHIx,x sta READBLOCK.XY+1 lda MOUSEYLOx,x sta READBLOCK.XY+2 lda MOUSEYHIx,x sta READBLOCK.XY+3 plp lda READBLOCK.FLAGS beq .9 clc rts .9 lda #MLI.ERR.EOF sec 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 plp clc rts *-------------------------------------- * PRIVATE *-------------------------------------- GOMOUSE pha stz ZPGoMouse ldx DEVSLOTCn stx ZPGoMouse+1 lda (ZPGoMouse),y sta ZPGoMouse ldy DEVSLOTn0 pla jmp (ZPGoMouse) *-------------------------------------- DRV.CS.END DEVSLOT0n .BS 1 DEVSLOTn0 .BS 1 DEVSLOTCn .BS 1 *-------------------------------------- DEVSTAT .DA #0 .DA #0,#0,#0 size >PSTR "Apple II Mouse" .BS 2 .DA #S.DEVSTAT.TYPE.XY .DA #0 .DA $0900 *-------------------------------------- READBLOCK.FLAGS .BS 1 READBLOCK.XY .BS 4 *-------------------------------------- MAN SAVE DRV/MOUSE.DRV.S ASM