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 stz CURON stz bEscMode stz bEscModeCSI stz OutPtr stz OutCnt sta A2osX.SCRNDEVS DEV.ID in A 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 CLRPAGE2 lda #1 sta A2osX.ASCREEN clc rts *-------------------------------------- CLOSE stz A2osX.SCRNDEVS clc rts *-------------------------------------- READ jsr Char.Out.Get bcc .8 IF cs,no char in output buffer... lda A2osX.ASCREEN cmp #1 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 ldx CH ldy CV jsr SetCharAtXY *-------------------------------------- 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 ldx CH ldy CV jmp SetCharAtXY *-------------------------------------- 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 jsr IsDigit 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 lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 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 lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 inx lda BASEL,x sta ZPBaseL2 lda BASEH,x sta ZPBaseL2+1 jsr COPY.L2toL1 cpx SCROLLBOT bne .1 *-------------------------------------- CLREOL ldx CH ldy #80 bra CLR CLRLINE ldx #0 ldy #80 bra CLR CLRSOL ldx #0 ldy CH CLR sty .2+1 .1 lda #" " ldy CV jsr SetCharAtXY X,Y unmodified inx .2 cpx #$ff Self Modified bne .1 clc rts *-------------------------------------- SCROLL.DN ldx SCROLLBOT .1 lda BASEL,x sta ZPBaseL1 lda BASEH,x sta ZPBaseL1+1 dex lda BASEL,x sta ZPBaseL2 lda BASEH,x sta ZPBaseL2+1 jsr COPY.L2toL1 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 #1 beq CURBLNK1 lda CURON bne CURBLNK.OFF rts do not Light if screen is not active CURBLNK1 lda CURON bne CURBLNK.OFF ldx CH ldy CV jsr GetCharAtXY sta CURCHAR and #$80 ldx CH ldy CV eor #" " jsr SetCharAtXY bra CUREXIT CURBLNK.OFF ldx CH ldy CV lda CURCHAR jsr SetCharAtXY CUREXIT lda CURON eor #CURSOR.BLINK.SPEED sta CURON CUREXIT.RTS rts *-------------------------------------- SetCharAtXY cmp #$40 bcc .10 cmp #$5F bcs .10 and #$3F .10 php pha txa lsr bcs .1 sei sta SETWRITEAUX .1 clc adc BASEL,y sta ZPBaseL1 lda BASEH,y sta ZPBaseL1+1 pla sta (ZPBaseL1) sta CLRWRITEAUX plp clc rts *-------------------------------------- GetCharAtXY php txa lsr bcs .1 sei sta SETREADAUX .1 clc adc BASEL,y sta ZPBaseL1 lda BASEH,y sta ZPBaseL1+1 lda (ZPBaseL1) sta CLRREADAUX plp rts *-------------------------------------- COPY.L2toL1 php sei sta SETWRITEAUX sta SETREADAUX ldy #39 .1 lda (ZPBaseL2),y sta (ZPBaseL1),y dey bpl .1 sta CLRWRITEAUX sta CLRREADAUX plp ldy #39 .2 lda (ZPBaseL2),y sta (ZPBaseL1),y dey bpl .2 rts *-------------------------------------- IsDigit cmp #'0' bcc .9 cmp #'9'+1 rts cc if ok, cs if not .9 sec 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 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 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.DEVSTAT.S.WRITE+S.DEVSTAT.S.READ .DA #0,#0,#0 >PSTR "ANSI 80c Console" .DA #S.DEVSTAT.T.CHAR .DA #0 .DA $0900 ENQ.String >CSTR "A2osXTERM" SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS .AS 'A2osXTERM' .DA #IAC,#SE SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE *-------------------------------------- MAN SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S ASM