NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF DRV/CONSOLE.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/MLI.ERR.I .INB INC/IO.I .INB INC/NET.TELNET.I *-------------------------------------- * 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 To Relocate .DA 0 .DA 0 .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT L.DRV.CS.START .DA DRV.CS.START L.FD.DEV .DA FD.DEV .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL puts >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 >LDYA L.FD.DEV >SYSCALL MKDEV .9 rts CS.END MSG.DETECT .AZ "Apple IIe/IIc 80 Col Driver." *-------------------------------------- FD.DEV .DA #S.FD.T.CDEV .DA #0 HANDLER .DA #0 BUSID .DA #0 DEVID .DA 0 BUSPTR .BS 2 DRVPTR .AZ "CON" NAME .HS 00000000 *-------------------------------------- * Driver Code *-------------------------------------- CURSOR.BLINK.SPEED .EQ 2 ESCSEQ.MAXLEN .EQ 16 OUTBUF.MAXLEN .EQ 32 IACBUF.MAXLEN .EQ 32 *-------------------------------------- ZPBaseL1 .EQ ZPDRV ZPBaseL2 .EQ ZPDRV+2 ZPTmpWord .EQ ZPDRV+4 ZPTmpBool .EQ ZPDRV+6 ZPIOCTL .EQ ZPDRV+8 ZPBufPtr .EQ ZPDRV+10 ZPCount .EQ ZPDRV+12 *-------------------------------------- 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 WRITE .DA A2osX.BADCALL IRQ *-------------------------------------- J.CtrlChars .DA ENQ 5 .DA BS 8 .DA LF 10 .DA CLRSCR 12 .DA CROUT 13 .DA FS 21 .DA ESC 27 *-------------------------------------- J.EscCodes .DA Scroll.Dn M .DA Scroll.Up D .DA RESET c *-------------------------------------- J.EscSequences .DA Esc.LWEnable h .DA Esc.LWDisable l .DA Esc.DispAttr m .DA Esc.Query n .DA Esc.Scroll r .DA Esc.Erase K .DA Esc.Home H *-------------------------------------- J.COUT.IAC.CMDS .DA COUT.IAC.SB .DA COUT.IAC.WILL .DA COUT.IAC.WONT .DA COUT.IAC.DO .DA COUT.IAC.DONT .DA 0 end of relocation *-------------------------------------- STATUS >STYA ZPIOCTL ldy #S.IOCTL.STATCODE lda (ZPIOCTL),y beq .1 cmp #S.IOCTL.STATCODE.GETDIB bne .9 ldx #S.DIB-1 .HS 2C bit abs .1 ldx #3 ldy #S.IOCTL.BUFPTR lda (ZPIOCTL),y sta .3+1 iny lda (ZPIOCTL),y sta .3+2 .2 lda DIB,x .3 sta $ffff,x SELF MODIFIED dex bpl .2 clc rts .9 lda #MLI.E.BADCTL sec rts *-------------------------------------- OPEN sta A2osX.SCRNDEVS DEV.ID in A lda #S.DIB.S.OPENED tsb DIB+S.DIB.S stz CURON stz bEscMode stz bEscModeCSI stz OutPtr stz OutCnt jsr RESET *-------------------------------------- CONTROL sta SETTEXT sta SETALTCHAR sta SET80DISP sta CLR80STORE sta CLRPAGE2 lda #1 sta A2osX.ASCREEN clc rts *-------------------------------------- CLOSE lda #S.DIB.S.OPENED trb DIB+S.DIB.S stz A2osX.SCRNDEVS clc rts *-------------------------------------- READ >STYA ZPIOCTL lda A2osX.ASCREEN cmp #1 is CON active? bne .6 no....go check flush... lda A2osX.TIMER16 and #CURSOR.BLINK.SPEED eor CURON beq .1 jsr CURBLNK .1 lda OPENAPPLE bmi .6 Open apple key, not for us... lda KBD bpl .6 sta KBDSTROBE and #$7F ldx KeyRemapped .2 cmp KeyRemapped,x beq .3 dex bne .2 jsr Char.Out.Put no remap....send char.... bra .7 and flush .3 lda KeyRemappedIdx,x tay .4 lda KeyRemappedTbl,y beq .7 end of remap....flush jsr Char.Out.Put iny bra .4 .6 lda OutCnt beq .9 no char in output buffer... .7 stz .8+1 jsr GetPtrsAndCnt .70 inc ZPCount bne .71 inc ZPCount+1 beq .8 .71 jsr Char.Out.Get bcs .8 ldy .8+1 sta (ZPBufPtr),y iny sty .8+1 bra .70 .8 lda #$ff SELF MODIFIED ldy #S.IOCTL.BYTECNT sta (ZPIOCTL),y iny lda #0 sta (ZPIOCTL),y clc rts .9 lda #0 Error = char sec rts *-------------------------------------- WRITE >STYA ZPIOCTL jsr GetPtrsAndCnt .2 inc ZPCount bne .3 inc ZPCount+1 beq .8 .3 lda (ZPBufPtr) inc ZPBufPtr bne .4 inc ZPBufPtr+1 .4 jsr WRITE.COUT bra .2 .8 clc rts *-------------------------------------- WRITE.COUT bit bEscMode bmi COUT.EscMode bit bIACMode bpl .10 jmp COUT.IAC .10 cmp #IAC bne .1 sta bIACMode stz IACBuf clc rts .1 pha jsr CUROFF pla cmp #$7f beq DEL cmp #32 bcc COUT.Ctrl ora INVFLG jsr SetCharAtCurPos *-------------------------------------- FS ldx CH cpx #79 bne .1 bit LWFLG bpl FS.8 stz CH jmp LF .1 inc CH FS.8 clc rts *-------------------------------------- DEL ldx CH beq .1 dec CH bra .3 .1 ldy CV beq FS.8 lda #79 sta CH dec CV .3 lda #$20 ora INVFLG jmp SetCharAtCurPos *-------------------------------------- COUT.Ctrl ldx #CtrlChars.Cnt-1 .1 cmp CtrlChars,x beq .2 dex bpl .1 clc rts .2 txa asl tax jmp (J.CtrlChars,x) *-------------------------------------- COUT.EscMode bit bEscModeCSI bmi COUT.EscModeCSI cmp #'[' bne .1 dec bEscModeCSI stz EscSeq clc rts .1 stz bEscMode ldx #EscCodes.Cnt-1 .2 cmp EscCodes,x beq .3 dex bne .2 clc rts .3 txa asl tax jmp (J.EscCodes,x) *-------------------------------------- COUT.EscModeCSI inc EscSeq ldx EscSeq sta EscSeq,x cmp #64 End of Seq ? bcs COUT.ExecEscSeq cpx #ESCSEQ.MAXLEN too long? bne .1 stz bEscModeCSI stz bEscMode .1 clc rts COUT.ExecEscSeq stz EscSeqParamCnt stz bEscSeqInNum ldx #0 EscSeq Ptr .10 stz ZPTmpWord stz ZPTmpWord+1 .1 inx lda EscSeq,x cmp #'0' bcc .2 cmp #'9'+1 bcs .2 dec bEscSeqInNum and #$0F pha lda ZPTmpWord ldy ZPTmpWord+1 asl ZPTmpWord param=param*10 rol ZPTmpWord+1 asl ZPTmpWord rol ZPTmpWord+1 clc adc ZPTmpWord sta ZPTmpWord tya adc ZPTmpWord+1 sta ZPTmpWord+1 asl ZPTmpWord rol ZPTmpWord+1 pla clc adc ZPTmpWord sta ZPTmpWord bcc .1 inc ZPTmpWord+1 bra .1 .2 bit bEscSeqInNum bpl .3 stz bEscSeqInNum lda #255 ldy ZPTmpWord+1 bne .21 lda ZPTmpWord .21 ldy EscSeqParamCnt sta EscSeqParam,y inc EscSeqParamCnt .3 lda EscSeq,x cmp #';' beq .10 stz bEscModeCSI stz bEscMode ldx #EscSeqCmds.Cnt-1 .4 cmp EscSeqCmds,x beq .5 dex bne .4 clc rts .5 txa asl tax jmp (J.EscSequences,x) *-------------------------------------- COUT.IAC inc IACBuf ldx IACBuf cpx #IACBUF.MAXLEN beq * sta IACBuf,x cpx #1 CMD ? beq .8 yes, wait for additional bytes ldy IACBuf+1 get back CMD cpy #SB bne .1 not a SB/SE....stop with CMD/SUBCMD cmp #SE bne .8 wait for ending SE....keep bIACMode .1 cpy #IAC beq .9 tya sec sbc #SB bcc .9 asl tax lda IACBuf+2 Get SUBCMD in A cpx #10 bcs * jmp (J.COUT.IAC.CMDS,x) .9 stz bIACMode .8 clc rts *-------------------------------------- COUT.IAC.SB cmp #TELOPT.TTYPE bne .9 lda IACBuf+3 cmp #SB.SEND bne .9 ldy #0 .1 lda SB.IS.TTYPE,y jsr Char.Out.Put iny cpy #SB.IS.TTYPE.LEN bne .1 .9 stz bIACMode clc rts *-------------------------------------- COUT.IAC.WILL ldx #WILLDO.CNT-1 .1 cmp WILLDO,x beq .7 dex bpl .1 ldx #WILLDONT.CNT-1 .2 cmp WILLDONT,x beq .8 dex bpl .2 bra .9 .7 ldx #DO .HS 2C BIT ABS .8 ldx #DONT bra COUT.IAC.SendAX .9 stz bIACMode clc rts *-------------------------------------- COUT.IAC.WONT .9 stz bIACMode clc rts *-------------------------------------- COUT.IAC.DO ldx #DOWILL.CNT-1 .1 cmp DOWILL,x beq .7 dex bpl .1 ldx #DOWONT.CNT-1 .2 cmp DOWONT,x beq .8 dex bpl .2 bra COUT.IAC.SendAX.9 .7 ldx #WILL .HS 2C BIT ABS .8 ldx #WONT *-------------------------------------- COUT.IAC.SendAX pha push CMD phx lda #IAC jsr Char.Out.Put pla jsr Char.Out.Put pla jsr Char.Out.Put COUT.IAC.SendAX.9 stz bIACMode clc rts *-------------------------------------- COUT.IAC.DONT .9 stz bIACMode clc rts *-------------------------------------- RESET jsr CLRSCR lda #23 sta SCROLLBOT lda #0 sta SCROLLTOP dec sta LWFLG *-------------------------------------- RESETATTR lda #$80 sta INVFLG clc rts *-------------------------------------- ESC lda #$80 sta bEscMode clc rts *-------------------------------------- ENQ ldy #0 .1 lda ENQ.String,y beq .8 jsr Char.Out.Put iny bne .1 .8 clc rts *-------------------------------------- BS ldx CH beq .1 dec CH bra .3 .1 ldy CV bne .2 clc rts .2 lda #79 sta CH dec CV .3 clc rts *-------------------------------------- ClrScr stz CH stz CV ldx #23 .1 jsr SETUP.L1X lda #" " sta SETWRITEAUX ldy #39 .2 sta (ZPBaseL1),y dey bpl .2 sta CLRWRITEAUX ldy #39 .3 sta (ZPBaseL1),y dey bpl .3 dex bpl .1 clc rts *-------------------------------------- CROUT jsr CLREOL stz CH clc rts *-------------------------------------- LF ldy CV cpy SCROLLBOT beq SCROLL.UP inc CV clc rts *-------------------------------------- SCROLL.UP ldx SCROLLTOP .1 jsr SETUP.L1X inx jsr COPY.XtoL1 cpx SCROLLBOT bne .1 *-------------------------------------- CLREOL ldy CH Start ldx #80 End bra CLR CLRLINE ldy #0 Start ldx #80 End bra CLR CLRSOL ldy #0 Start ldx CH End CLR stx .2+1 ldx CV .1 lda #" " phy jsr SetCharAtYX X unmodified ply iny .2 cpy #$ff Self Modified bne .1 clc rts *-------------------------------------- SCROLL.DN ldx SCROLLBOT .1 jsr SETUP.L1X dex jsr COPY.XtoL1 cpx SCROLLTOP bne .1 clc rts *-------------------------------------- Esc.LWEnable sec .HS 90 BCC *-------------------------------------- Esc.LWDisable clc ldx EscSeqParamCnt beq .8 dex bne .8 lda EscSeqParam eor #7 bne .8 ror LWFLG .8 clc rts *-------------------------------------- Esc.DispAttr ldx EscSeqParamCnt beq .8 .1 lda EscSeqParam-1,x bne .2 jsr RESETATTR bra .7 .2 cmp #7 bne .8 stz INVFLG .7 dex bne .1 .8 clc rts *-------------------------------------- Esc.Query ldx EscSeqParamCnt beq .8 dex bne .8 lda EscSeqParam cmp #6 bne .8 lda #$1B jsr Char.Out.Put lda #$5B jsr Char.Out.Put lda CV inc jsr Decimal.Out lda #';' jsr Char.Out.Put lda CH inc jsr Decimal.Out lda #'R' jsr Char.Out.Put .8 clc rts *-------------------------------------- Esc.Scroll ldx EscSeqParamCnt bne .1 lda #0 ldy #23 bra .8 .1 cpx #2 bne .9 lda EscSeqParam dec ldy EscSeqParam+1 dey .8 sta SCROLLTOP sty SCROLLBOT .9 clc rts *-------------------------------------- Esc.Erase ldx EscSeqParamCnt bne .1 jmp CLREOL .1 lda EscSeqParam cmp #1 bne .2 jmp CLRSOL .2 cmp #2 bne .9 jmp CLRLINE .9 clc rts *-------------------------------------- Esc.Home ldx EscSeqParamCnt bne .1 stz CH stz CV clc rts .1 ldx #1 lda EscSeqParam beq .2 ldx #24 cmp #24 bcs .2 tax .2 dex stx CV dec EscSeqParamCnt beq .8 ldx #1 lda EscSeqParam+1 beq .3 ldx #80 cmp #80 bcs .3 tax .3 dex stx CH .8 clc rts *-------------------------------------- CUROFF lda CURON beq CUREXIT.RTS CURBLNK lda A2osX.ASCREEN cmp #1 beq CURBLNK1 lda CURON bne CURBLNK.OFF rts do not Light if screen is not active CURBLNK1 lda CURON bne CURBLNK.OFF jsr GetCharAtCurPos sta CURCHAR and #$80 eor #" " bra CUREXIT CURBLNK.OFF lda CURCHAR CUREXIT jsr SetCharAtCurPos lda CURON eor #CURSOR.BLINK.SPEED sta CURON CUREXIT.RTS rts *-------------------------------------- SetCharAtCurPos ldy CH ldx CV *-------------------------------------- SetCharAtYX cmp #$40 bcc .10 cmp #$5F bcs .10 and #$3F .10 pha jsr SETUP.L1X tya lsr tay pla bcs .1 * php * sei sta SETWRITEAUX .1 sta (ZPBaseL1),y sta CLRWRITEAUX * plp rts *.1 sta (ZPBaseL1),y * rts *-------------------------------------- GetCharAtCurPos ldy CH ldx CV *-------------------------------------- GetCharAtYX jsr SETUP.L1X tya lsr tay bcs .1 * php * sei sta SETREADAUX .1 lda (ZPBaseL1),y sta CLRREADAUX * plp rts *.1 lda (ZPBaseL1),y * rts *-------------------------------------- SETUP.L1X lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 rts *-------------------------------------- COPY.XtoL1 lda BASEL,x sta ZPBaseL2 lda BASEH,x sta ZPBaseL2+1 * php * sei sta SETWRITEAUX sta SETREADAUX jsr .1 sta CLRWRITEAUX sta CLRREADAUX * plp .1 ldy #39 .2 lda (ZPBaseL2),y sta (ZPBaseL1),y dey bpl .2 rts *-------------------------------------- Decimal.Out stz ZPTmpWord stz ZPTmpWord+1 ldx #8 sed tay .1 tya asl tay lda ZPTmpWord adc ZPTmpWord sta ZPTmpWord lda ZPTmpWord+1 adc ZPTmpWord+1 sta ZPTmpWord+1 dex bne .1 cld stz ZPTmpBool No leading 0 lda ZPTmpWord+1 and #$0f beq .2 dec ZPTmpBool non zero, print everything jsr Char.Out.Put30 .2 lda ZPTmpWord lsr lsr lsr lsr bne .3 bit ZPTmpBool Print this digit ? bpl .4 .3 jsr Char.Out.Put30 .4 lda ZPTmpWord and #$0f *-------------------------------------- Char.Out.Put30 ora #$30 Char.Out.Put pha lda OutPtr clc adc OutCnt and #OUTBUF.MAXLEN-1 tax pla sta OutBuffer,x inc OutCnt rts *-------------------------------------- Char.Out.Get sec lda OutCnt beq .9 dec OutCnt ldx OutPtr lda OutBuffer,x pha txa inc and #OUTBUF.MAXLEN-1 sta OutPtr pla clc .9 rts *-------------------------------------- GetPtrsAndCnt ldy #S.IOCTL.BUFPTR lda (ZPIOCTL),y sta ZPBufPtr iny lda (ZPIOCTL),y sta ZPBufPtr+1 * ldy #S.IOCTL.BYTECNT iny lda (ZPIOCTL),y eor #$ff sta ZPCount iny lda (ZPIOCTL),y eor #$ff sta ZPCount+1 rts *-------------------------------------- DRV.CS.END *-------------------------------------- BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 *-------------------------------------- CtrlChars .HS 05080A0C0D151B CtrlChars.Cnt .EQ *-CtrlChars *-------------------------------------- EscCodes .AZ "MDc" EscCodes.Cnt .EQ *-EscCodes EscSeqCmds .AS "hlmnrKH" EscSeqCmds.Cnt .EQ *-EscSeqCmds ENQ.String .AZ "XTERM" *-------------------------------------- KeyRemapped .HS 05080A0B0D15 L,D,U,CR,R KeyRemappedIdx .HS 050004080C0F KeyRemappedTbl .EQ * KeyRemappedLEFT .HS 1B5B4400 esc[D KeyRemappedDOWN .HS 1B5B4200 esc[B KeyRemappedUP .HS 1B5B4100 esc[A KeyRemappedCR .HS 0D0A00 crlf KeyRemappedRGHT .HS 1B5B4300 esc[C *-------------------------------------- TELOPS.STATUS *-------------------------------------- WILLDO .DA #TELOPT.BINARY,#TELOPT.SGA WILLDO.CNT .EQ *-WILLDO WILLDONT .DA #TELOPT.TSPEED,#TELOPT.LINEMODE,#TELOPT.STATUS WILLDONT.CNT .EQ *-WILLDONT DOWILL .DA #TELOPT.BINARY,#TELOPT.SGA,#TELOPT.TTYPE,#TELOPT.NAWS DOWILL.CNT .EQ *-DOWILL DOWONT .DA #TELOPT.ECHO,#TELOPT.NEWENVIRON,#TELOPT.XDISPLOC,#TELOPT.TSPEED,#TELOPT.LFLOW DOWONT.CNT .EQ *-DOWONT SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS .AS 'XTERM' .DA #IAC,#SE SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE SB.IS.NAWS .DA #IAC,#SB,#TELOPT.NAWS,#SB.IS .DA 80 .DA 24 .DA #IAC,#SE SB.IS.NAWS.LEN .EQ *-SB.IS.NAWS *-------------------------------------- CH .BS 1 CV .BS 1 LWFLG .BS 1 INVFLG .BS 1 SCROLLTOP .BS 1 SCROLLBOT .BS 1 CURON .BS 1 CURCHAR .BS 1 OutBuffer .BS OUTBUF.MAXLEN OutPtr .BS 1 OutCnt .BS 1 bIACMode .BS 1 IACBuf .BS OUTBUF.MAXLEN+1 bEscMode .BS 1 bEscModeCSI .BS 1 bEscSeqInNum .BS 1 EscSeq .BS ESCSEQ.MAXLEN+1 EscSeqParamCnt .BS 1 EscSeqParam .BS 4 *-------------------------------------- DIB .DA #S.DIB.S.WRITE+S.DIB.S.READ .DA #0,#0,#0 >PSTR "ANSI 80c Console" .DA #S.DIB.T.CHAR .DA #0 .DA K.VER *-------------------------------------- DRV.END MAN SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S ASM