A2osX/DRV/CONSOLE.DRV.S.txt

893 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
*--------------------------------------
* 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 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 #0
.DA #91
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
*--------------------------------------
MAN
SAVE /A2OSX.SRC/DRV/CONSOLE.DRV.S
ASM