NEW PREFIX /A2OSX.BUILD AUTO 4,1 .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 2 ESCSEQ.MAXLEN .EQ 16 *-------------------------------------- ZPBaseL1 .EQ ZPDRV ZPBaseL2 .EQ ZPDRV+2 ZPTmpWord .EQ ZPDRV+4 ZPTmpBool .EQ ZPDRV+6 *-------------------------------------- * 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 .AZ "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 .AZ "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 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 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 .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 #$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" ENQ.String .AZ "XTERM" SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS .AS 'XTERM' .DA #IAC,#SE SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE 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 *-------------------------------------- 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 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 #0 .DA #91 *-------------------------------------- MAN SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S ASM