PR#3 PREFIX /A2OSX.BUILD LOMEM $A00 INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/DRV/CONSOLE.DRV *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/IO.I .INB /A2OSX.BUILD/INC/NET.TELNET.I *-------------------------------------- CURSOR.BLINK.SPEED .EQ 8 ESCSEQ.MAXLEN .EQ 16 *-------------------------------------- ZPBaseL1 .EQ ZPDRV ZPBaseL2 .EQ ZPDRV+2 *-------------------------------------- * 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 .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect >LDYA L.MSG.DETECT >SYSCALL PrintF.YA clc rts CS.END MSG.DETECT >CSTR "Apple IIe/IIc 80 Col Driver.\r\n" *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) .DA #S.DEV.S.WRITE+S.DEV.S.READ .BS 6 >CSTR "CON" NAME .HS 00 NAME must Be 5 bytes long *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START .DA STATUS .DA A2osX.BADCALL .DA A2osX.BADCALL .DA A2osX.BADCALL .DA CONTROL .DA A2osX.BADCALL .DA OPEN .DA CLOSE .DA READ .DA WRITE L.DEVSTAT .DA DEVSTAT *-------------------------------------- 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.DispAttr m .DA Esc.Query n .DA Esc.Scroll r .DA Esc.Erase K .DA Esc.Home H .DA 0 end of relocation *-------------------------------------- STATUS >LDYA L.DEVSTAT clc rts *-------------------------------------- OPEN sta A2osX.SCRNDEVS+1 DEV.ID in A lda #S.DSTAT.S.OPENED tsb DEVSTAT stz CURON stz bEscMode stz bEscModeCSI stz OutPtr stz OutCnt jsr RESET ldy #0 .1 lda TelnetOpt,y beq CONTROL jsr Char.Out.Put iny bne .1 *-------------------------------------- CONTROL sta SETTEXT sta SETALTCHAR sta SET80DISP sta CLR80STORE sta SETPAGE2 lda #2 sta A2osX.ASCREEN clc rts *-------------------------------------- CLOSE stz A2osX.SCRNDEVS+1 clc rts *-------------------------------------- READ jsr Char.Out.Get bcc .8 IF cs,no char in output buffer... lda A2osX.ASCREEN cmp #2 is CON active? bne .9 no....exit lda A2osX.TIMER16 and #CURSOR.BLINK.SPEED eor CURON beq .1 jsr CURBLNK .1 lda OPENAPPLE bmi .9 Open apple key, not for us... lda KBD bpl .9 sta KBDSTROBE and #$7F ldx KeyRemapped .2 cmp KeyRemapped,x beq .3 dex bne .2 bra .8 .3 lda KeyRemappedIdx,x tay .4 lda KeyRemappedTbl,y beq .6 jsr Char.Out.Put iny bra .4 .6 jsr Char.Out.Get .8 clc rts .9 lda #0 Error = char sec rts *-------------------------------------- WRITE bit bEscMode bmi COUT.EscMode bit bIACMode bpl .10 jmp COUT.IACMode .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 beq FS.8 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 ldy #0 ldx #0 .2 iny cmp EscCodes,y beq .3 inx inx cpy EscCodes bne .2 clc rts .3 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 EscSeqParamTmp stz EscSeqParamTmp+1 .1 inx lda EscSeq,x cmp #'0' bcc .2 cmp #'9'+1 bcs .2 dec bEscSeqInNum and #$0F pha lda EscSeqParamTmp ldy EscSeqParamTmp+1 asl EscSeqParamTmp param=param*10 rol EscSeqParamTmp+1 asl EscSeqParamTmp rol EscSeqParamTmp+1 clc adc EscSeqParamTmp sta EscSeqParamTmp tya adc EscSeqParamTmp+1 sta EscSeqParamTmp+1 asl EscSeqParamTmp rol EscSeqParamTmp+1 pla clc adc EscSeqParamTmp sta EscSeqParamTmp bcc .1 inc EscSeqParamTmp+1 bra .1 .2 bit bEscSeqInNum bpl .3 stz bEscSeqInNum lda #255 ldy EscSeqParamTmp+1 bne .21 lda EscSeqParamTmp .21 ldy EscSeqParamCnt sta EscSeqParam,y inc EscSeqParamCnt .3 lda EscSeq,x cmp #';' beq .10 stz bEscModeCSI stz bEscMode ldy #0 ldx #0 .4 iny cmp EscSeqCmds,y beq .5 inx inx cpy EscSeqCmds bne .4 clc rts .5 jmp (J.EscSequences,x) *-------------------------------------- COUT.IACMode inc IACBuf ldx IACBuf sta IACBuf,x cpx #1 VERB ? beq .8 yes, wait for additional bytes ldy IACBuf+1 get back VERB cpy #SB bne .7 not a SB/SE....end of SEQ cmp #SE bne .8 wait for ending SE....keep bIACMode lda IACBuf+2 Get OPT cmp #TELOPT.TTYPE bne .7 lda IACBuf+3 cmp #SB.SEND bne .7 ldy #0 .1 lda SB.IS.TTYPE,y jsr Char.Out.Put iny cpy #SB.IS.TTYPE.LEN bne .1 .7 stz bIACMode .8 clc rts *-------------------------------------- RESET jsr CLRSCR lda #0 sta SCROLLTOP lda #23 sta SCROLLBOT *-------------------------------------- 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 #" " php sei sta SETWRITEAUX ldy #39 .2 sta (ZPBaseL1),y dey bpl .2 sta CLRWRITEAUX plp 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 #23 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.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 #2 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 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 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 DecimalBuffer stz DecimalBuffer+1 ldx #8 sed tay .1 tya asl tay lda DecimalBuffer adc DecimalBuffer sta DecimalBuffer lda DecimalBuffer+1 adc DecimalBuffer+1 sta DecimalBuffer+1 dex bne .1 cld stz bDecimal0Out lda DecimalBuffer+1 and #$0f beq .2 ora #$30 dec bDecimal0Out jsr Char.Out.Put .2 lda DecimalBuffer lsr lsr lsr lsr bne .3 bit bDecimal0Out bpl .4 .3 ora #$30 jsr Char.Out.Put .4 lda DecimalBuffer and #$0f ora #$30 *-------------------------------------- Char.Out.Put pha lda OutPtr clc adc OutCnt and #$0f 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 #$0f sta OutPtr pla clc .9 rts *-------------------------------------- DRV.CS.END EscCodes >PSTR "MDc" EscSeqCmds >PSTR "mnrKH" 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 08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B CH .BS 1 CV .BS 1 INVFLG .BS 1 SCROLLTOP .BS 1 SCROLLBOT .BS 1 CURON .BS 1 CURCHAR .BS 1 OutBuffer .BS 16 OutPtr .BS 1 OutCnt .BS 1 DecimalBuffer .BS 2 bDecimal0Out .BS 1 *-------------------------------------- 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 TelnetOpt .DA #IAC,#DO,#TELOPT.ECHO .DA #0 *-------------------------------------- CtrlChars.Cnt .EQ 7 CtrlChars .HS 05080A0C0D151B bIACMode .BS 1 IACBuf .BS 33 bEscMode .BS 1 bEscModeCSI .BS 1 bEscSeqInNum .BS 1 EscSeq .BS ESCSEQ.MAXLEN+1 EscSeqParamTmp .BS 2 EscSeqParamCnt .BS 1 EscSeqParam .BS 4 *-------------------------------------- DEVSTAT .DA #S.DSTAT.S.WRITE+S.DSTAT.S.READ .DA #0,#0,#0 >PSTR "ANSI 80c Console" .DA #S.DSTAT.T.CHAR .DA #0 .DA $0900 ENQ.String >CSTR "XTERM" SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS .AS 'XTERM' .DA #IAC,#SE SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE *-------------------------------------- MAN SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S ASM