A2osX/SYS/KERNEL.S.TERMX.txt
burniouf 74acfeccd1 KERNEL & DRVs : lot of fixes around DEV.Open() , KCONFIG
SH : fiw for line wrap
ProDOS.FX : removed a strange bug inherited from 2.0.3 trashing FCBs
2023-11-26 14:17:41 +01:00

1691 lines
28 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
AUTO 3,1
*--------------------------------------
CURBLNK.SPEED .EQ 2
*--------------------------------------
.DUMMY
.OR ZPDRV
ZPIOCTL .BS 2
ZPBufPtr .BS 2
ZPDCBPtr .BS 2
ZPCnt .BS 2
ZPBufBL1 .BS 2
ZPBufBL2 .BS 2
ZPScrBL1 .BS 2
ZPScrBL2 .BS 2
*--------------------------------------
bActive .BS 1
ZPTmpX .BS 1
ZPTmpChar .BS 1
CsiH .BS 1
CsiPCnt .BS 1
CsiP .BS 4
.ED
*--------------------------------------
TERMX .DA TERMX.STATUS
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA TERMX.CONTROL
.DA A2osX.BADCALL
.DA TERMX.OPEN
.DA TERMX.CLOSE
.DA TERMX.READ
.DA TERMX.WRITE
*--------------------------------------
TERMX.STATUS tya
beq .1
cmp #S.IOCTL.S.GETDIB
bne .3
ldy #S.DIB-1
.HS 2C BIT ABS
.1 ldy #3
sta IO.CLRWRITEAUX
.2 lda TERMX.DIB,y
sta (ZPBufPtr),y
dey
bne .2
ldy #S.DCB.TTY.S
lda (ZPDCBPtr),y
sta (ZPBufPtr)
clc
rts
.3 cmp #S.IOCTL.S.EOF
bne .9
jsr TERMX.ISOPENED
beq TERMX.OPEN.E
jsr TERMX.CBLNK
ldy #S.DCB.TTY.OUTTAIL
lda (ZPDCBPtr),y
iny
eor (ZPDCBPtr),y OUTHEAD
bne .8
bit bActive
bpl .7
jsr TERMX.CheckOA
bmi .7
bit IO.KBD
bmi .8
.7 lda #$ff EOF = TRUE
.HS 2C BIT ABS
.8 lda #0 EOF = FALSE
clc
rts
.9 lda #MLI.E.BADCTL
.HS 2C BIT ABS
TERMX.OPEN.E lda #MLI.E.OPEN
sec
rts
*--------------------------------------
TERMX.OPEN jsr TERMX.ISOPENED
bne TERMX.OPEN.E
lda (ZPDCBPtr) #S.DCB.TTY.DEVID
tax
lda IO.hFD in ZPTMP
sta IO.CLRWRITEAUX
sta A2osX.SCRNDEVS,x
sta IO.SETWRITEAUX
ldy #S.DCB.TTY.S
lda (ZPDCBPtr),y
ora #S.DIB.S.OPENED
ora TERMX.DIB+S.DIB.S
sta (ZPDCBPtr),y
jsr TERMX.RIS
*--------------------------------------
TERMX.CONTROL lda (ZPDCBPtr) #S.DCB.TTY.DEVID
sta IO.CLRWRITEAUX
sta A2osX.ASCREEN
sta IO.SETWRITEAUX
sta IO.SETTEXT
sta IO.CLRMIXED
jsr TERMX.SCRCPY
lda #0
ldy #S.DCB.TTY.bTITLE
sta (ZPDCBPtr),y
clc
rts
*--------------------------------------
TERMX.CLOSE jsr TERMX.ISOPENED
beq .9
lda TERMX.DIB+S.DIB.S
sta (ZPDCBPtr),y
lda (ZPDCBPtr) #S.DCB.TTY.DEVID
tax
sta IO.CLRWRITEAUX
stz A2osX.SCRNDEVS,x
sta IO.SETWRITEAUX
clc
rts
.9 lda #MLI.E.IO
sec
rts
*--------------------------------------
TERMX.ISOPENED ldy #S.DCB.TTY.S
lda (ZPDCBPtr),y
bit #S.DIB.S.OPENED
rts
*--------------------------------------
TERMX.READ bit bActive is screen active?
bpl .6 no....go check flush...
jsr TERMX.CBLNK
jsr TERMX.CheckOA
bmi .6 Open apple key, not for us...
lda IO.KBD
bpl .6
sta IO.KBDSTROBE
and #$7F
cmp #C.ESC
bne .1
lda #3
.1 ldx #KeyMap.Cnt-1
.2 cmp KeyMap,x
beq .3
dex
bpl .2
cmp #C.CR
bne .21
jsr TERMX.COUT
ldy #S.DCB.TTY.bLNM
lda (ZPDCBPtr),y
bpl .7
lda #C.LF
.21 jsr TERMX.COUT no remap....send char....
bra .7 and flush
.3 jsr TERMX.ESCCSI
lda CsiCodes,x
jsr TERMX.COUT
bra .7
.6 ldy #S.DCB.TTY.OUTTAIL
lda (ZPDCBPtr),y
iny
cmp (ZPDCBPtr),y OUTHEAD
beq .9 no char in output buffer...
.7 stz .8+1
.70 inc ZPCnt
bne .71
inc ZPCnt+1
beq .8
.71 ldy #S.DCB.TTY.OUTTAIL
lda (ZPDCBPtr),y
iny OUTHEAD
cmp (ZPDCBPtr),y
beq .8
tay
lda (ZPDCBPtr),y
pha
tya
inc
cmp #S.DCB.TTY.OUTBUF.MAX
bne .72
lda #S.DCB.TTY.OUTBUF
.72 ldy #S.DCB.TTY.OUTTAIL
sta (ZPDCBPtr),y
pla
ldy .8+1
sta IO.CLRWRITEAUX
sta (ZPBufPtr),y
sta IO.SETWRITEAUX
iny
sty .8+1
bra .70
.8 lda #$ff SELF MODIFIED
sta IO.CLRWRITEAUX
ldy #S.IOCTL.BYTECNT
sta (ZPIOCTL),y
iny
lda #0
sta (ZPIOCTL),y
clc
rts
.9 lda #E.NODATA
* sec
rts
*--------------------------------------
TERMX.WRITE jsr TERMX.CUROFF
.1 inc ZPCnt
bne .2
inc ZPCnt+1
beq .8
.2 ldy #S.DCB.TTY.M
lda (ZPDCBPtr),y
tax
jsr .3
inc ZPBufPtr
bne .1
inc ZPBufPtr+1
bra .1
.3 jmp (.4,x)
.4 .DA TERMX.CIN
.DA TERMX.ESC
.DA TERMX.CSI
.DA TERMX.IAC
.DA TERMX.G0
.DA TERMX.G1
.8 clc
rts
*--------------------------------------
TERMX.CIN jsr TERM.GetBufByte
cmp #IAC
bne .1
lda #S.DCB.TTY.M.IAC
jmp TERMX.SETM
.1 cmp #C.DEL
beq TERMX.DEL
cmp #C.SPACE
bcs .8
ldx #CtrlChars.Cnt-1
.2 cmp CtrlChars,x
beq .3
dex
bpl .2
clc
rts
.3 txa
asl
tax
jmp (.4,x)
.4 .DA TERMX.ENQ
.DA TERMX.BS
.DA TERMX.LF
.DA TERMX.FF
.DA TERMX.CR
.DA TERMX.SO
.DA TERMX.SI
.DA TERMX.SETM.ESC
*--------------------------------------
.8 jsr SetCharAtCurPos
*--------------------------------------
TERMX.FS ldy #S.DCB.TTY.bDECAWM
lda (ZPDCBPtr),y
asl
.HS 89 BIT IMM
TERMX.CUF clc
php
ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
inc
sta (ZPDCBPtr),y
cmp #80
bcc .7
plp
bcc .8
jmp TERMX.NEL
.7 plp
.8 clc
rts
*--------------------------------------
TERMX.CUB sec no wrap
.HS 90 BCC
TERMX.BS clc wrap
jsr TERMX.BS1
clc
rts
*--------------------------------------
TERMX.BS1 ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
beq .1
dec
sta (ZPDCBPtr),y
clc
rts
.1 bcs .9 no wrap
ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
sec
beq .9
dec
sta (ZPDCBPtr),y
ldy #S.DCB.TTY.CH
lda #79
sta (ZPDCBPtr),y
clc
.9 rts
*--------------------------------------
TERMX.DEL clc wrap
jsr TERMX.BS1
bcs TERMX.CR.8
lda #C.SPACE
jmp SetCharAtCurPos
*--------------------------------------
TERMX.CR lda #0
ldy #S.DCB.TTY.CH
sta (ZPDCBPtr),y
TERMX.CR.8 clc
rts
*--------------------------------------
TERMX.SO sec
.HS 90 BCC
*--------------------------------------
TERMX.SI clc
ldy #S.DCB.TTY.bG0G1
ror
sta (ZPDCBPtr),y
clc
rts
*--------------------------------------
TERMX.ESC jsr TERM.GetBufByte y = #S.DCB.TTY.M
ldx #EscCodes.Cnt-1
.2 cmp EscCodes,x
beq .3
dex
bpl .2
bra TERMX.SETM.0
.3 phx
jsr .4
plx
lda EscModes,x
bra TERMX.SETM
.4 txa
asl
tax
jmp (.5,x)
.5 .DA TERMX.DECSC 7
.DA TERMX.DECRC 8
.DA TERMX.IND D
.DA TERMX.NEL E
.DA TERMX.RI M
.DA TERMX.RIS c
.DA TERMX.RTS [
.DA TERMX.RTS (
.DA TERMX.RTS )
*--------------------------------------
TERMX.SETM.ESC lda #S.DCB.TTY.M.ESC
.HS 2C BIT ABS
TERMX.SETM.0 lda #0
TERMX.SETM ldy #S.DCB.TTY.M
sta (ZPDCBPtr),y
ldy #S.DCB.TTY.INBUF
tya
sta (ZPDCBPtr),y
TERMX.SETM.8 clc
rts
*--------------------------------------
TERMX.CSI ldy #S.DCB.TTY.INBUF
lda (ZPDCBPtr),y
inc
sta (ZPDCBPtr),y
tay
jsr TERM.GetBufByte
sta (ZPDCBPtr),y
cmp #64 End of Seq ?
bcs TERMX.CSI.Exec
cpy #S.DCB.TTY.INBUF.MAX-1 buffer full?
bne TERMX.SETM.8
jmp TERMX.SETM.0
TERMX.CSI.Exec stz CsiH
stz CsiPCnt
lda #S.DCB.TTY.INBUF+1 EscSeq Ptr
clc
adc ZPDCBPtr
sta ZPPtr2
lda /S.DCB.TTY.INBUF+1
adc ZPDCBPtr+1
sta ZPPtr2+1
lda (ZPPtr2)
cmp #'?'
bne .2
sta CsiH
.1 jsr SHARED.NextCP2
.2 jsr MATH.Dec2ACC32
bcs .5
jsr SHARED.AddY2P2
lda #255
ldx ACC32+1
bne .3
lda ACC32
.3 ldx CsiPCnt
sta CsiP,x
inc CsiPCnt
lda (ZPPtr2)
cmp #';'
beq .1
.5 jsr TERMX.SETM.0
lda (ZPPtr2)
ldx #CsiCodes.Cnt-1
.6 cmp CsiCodes,x
beq .7
dex
bpl .6
clc
rts
.7 txa
asl
tax
jmp (.8,x)
.8 .DA TERMX.CUx A
.DA TERMX.CUx B
.DA TERMX.CUx C
.DA TERMX.CUx D
.DA TERMX.CUP H
.DA TERMX.ED J
.DA TERMX.EL K
.DA TERMX.HVP f
.DA TERMX.SM h
.DA TERMX.RM l
.DA TERMX.SGR m
.DA TERMX.DSR n
.DA TERMX.DECSTBM r
*--------------------------------------
* LNM : ESC [ 20
* DECAWM : ESC [ ? 7
* CUR : ESC [ ? 25
*--------------------------------------
TERMX.SM sec
.HS 90 BCC
*--------------------------------------
TERMX.RM clc
ldx CsiPCnt
beq .99
dex
bne .99
lda CsiP
ldx CsiH
php
bne .1
cmp #20 bLNM
bne .98
ldy #S.DCB.TTY.bLNM
bra .8
*--------------------------------------
.1 cpx #'?'
bne .98
cmp #7
bne .2
ldy #S.DCB.TTY.bDECAWM
bra .8
*--------------------------------------
.2 eor #25
bne .98
ldy #S.DCB.TTY.bCURON
plp
ror A = 0
sta (ZPDCBPtr),y
bmi .3 let it starts blinking..
jsr TERMX.CUROFF
.3 clc
rts
.8 plp
ror
sta (ZPDCBPtr),y
clc
rts
.98 plp
.99 clc
rts
*--------------------------------------
TERMX.SGR lda CsiPCnt
beq .10
ldx #0
.1 lda CsiP,x
bne .2
jsr .10
bra .7
.2 cmp #7
bne .7
jsr .11
.7 inx
dec CsiPCnt
bne .1
.8 clc
rts
.10 sec
.HS 90 BCC
.11 clc
lda #0
ror
ldy #S.DCB.TTY.bNORMAL
sta (ZPDCBPtr),y
rts
*--------------------------------------
TERMX.DSR ldx CsiPCnt
beq .8
dex
bne .8
lda CsiP
cmp #6
bne .8
jsr TERMX.ESCCSI
ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
inc
jsr TERMX.10OUT
lda #';'
jsr TERMX.COUT
ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
inc
jsr TERMX.10OUT
lda #'R'
jsr TERMX.COUT
.8 clc
rts
*--------------------------------------
TERMX.DECSTBM lda #0
ldx #23
ldy CsiPCnt
beq .8
cpy #2
bne .9
ldy CsiP
beq .9
dey
cpy #24
bcs .9
tya
ldy CsiP+1
beq .9
dey
cpy #24
bcs .9
phy
plx
.8 ldy #S.DCB.TTY.SCROLLTOP
sta (ZPDCBPtr),y
iny S.DCB.TTY.SCROLLBOT
txa
sta (ZPDCBPtr),y
.9 clc
rts
*--------------------------------------
TERMX.CUx ldy #1
lda CsiPCnt
beq .1
dec
bne .8
ldy CsiP
beq .8
.1 lda .80,x
sta .3+1
lda .80+1,x
sta .3+2
.2 phy
.3 jsr $FFFF SELF MODIFIED
ply
dey
bne .2
.8 clc
rts
.80 .DA TERMX.CUU
.DA TERMX.CUD
.DA TERMX.CUF
.DA TERMX.CUB
*--------------------------------------
TERMX.CUP
TERMX.HVP lda CsiPCnt
beq TERMX.HOME
ldx #1
lda CsiP
beq .2
ldx #24
cmp #24
bcs .2
tax
.2 dex
txa
ldy #S.DCB.TTY.CV
sta (ZPDCBPtr),y
dec CsiPCnt
beq .8
ldx #1
lda CsiP+1
beq .3
ldx #80
cmp #80
bcs .3
tax
.3 dex
txa
ldy #S.DCB.TTY.CH
sta (ZPDCBPtr),y
.8 clc
rts
*--------------------------------------
TERMX.HOME lda #0
ldy #S.DCB.TTY.CV
sta (ZPDCBPtr),y
ldy #S.DCB.TTY.CH
sta (ZPDCBPtr),y
clc
rts
*--------------------------------------
TERMX.G0 ldx #$80
.HS 2C BIT ABS
TERMX.G1 ldx #$40
ldy #S.DCB.TTY.bG0G1ALT
jsr TERM.GetBufByte
cmp #'0'
beq .1
txa
eor #$ff
and (ZPDCBPtr),y
bra .8
.1 txa
ora (ZPDCBPtr),y
.8 sta (ZPDCBPtr),y
jmp TERMX.SETM.0
*--------------------------------------
TERMX.RIS ldy #S.DCB.TTY.M
.1 lda RESET.VALUES-S.DCB.TTY.M,y
sta (ZPDCBPtr),y
iny
cpy #S.DCB.TTY.INBUF+1
bne .1
jmp TERMX.ED2 Erase Screen
*--------------------------------------
TERMX.ENQ ldx #0
.1 lda TERMX.ENQ.REP,x
jsr TERMX.COUT
inx
cpx #TERMX.ENQ.REP.L
bne .1
.8 clc
rts
*--------------------------------------
TERMX.LF ldy #S.DCB.TTY.bLNM
lda (ZPDCBPtr),y
bpl TERMX.IND
TERMX.NEL jsr TERMX.CR
TERMX.IND sec scroll
.HS 90 BCC
TERMX.CUD clc no scroll
php
ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
ldy #S.DCB.TTY.SCROLLBOT
cmp (ZPDCBPtr),y
bcs .1
inc
ldy #S.DCB.TTY.CV
sta (ZPDCBPtr),y
plp
.8 clc
rts
.1 plp
bcc .8
ldy #S.DCB.TTY.SCROLLTOP
lda (ZPDCBPtr),y
tax
.2 jsr TERMX.SETUP.L1X
inx
jsr TERMX.COPY.XtoL1
txa
ldy #S.DCB.TTY.SCROLLBOT
cmp (ZPDCBPtr),y
bne .2
bra TERMX.EL2
*--------------------------------------
TERMX.EL ldx CsiPCnt
beq TERMX.EL0 Erase EOL
lda CsiP
beq TERMX.EL0 0:Erase EOL
dec
beq TERMX.EL1 1:Erase SOL
dec 2:Erase Line
beq TERMX.EL2
TERMX.EL.8 clc
rts
*--------------------------------------
TERMX.EL1 ldy #S.DCB.TTY.CH End
lda (ZPDCBPtr),y
cmp #80
bcc TERMX.EL2.1
TERMX.EL2 lda #80 End
TERMX.EL2.1 ldy #0 Start
bra TERMX.EL0.1
TERMX.EL0 ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
tay Start
cpy #80
bcs TERMX.EL.8
lda #80 End
TERMX.EL0.1 sty .1+1 Save Start
sta .2+1 Save End
ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
tax
.1 ldy #$ff SELF MODIFIED
.2 cpy #$ff SELF MODIFIED
bcs TERMX.EL.8
lda #" "
jsr SetCharAtYX X unmodified
inc .1+1
bra .1
*--------------------------------------
TERMX.DECSC ldy #S.DCB.TTY.CH
jsr .1
iny
.1 lda (ZPDCBPtr),y
iny
sta (ZPDCBPtr),y
rts
*--------------------------------------
TERMX.DECRC jsr TERMX.CUROFF
ldy #S.DCB.TTY.CV.SAVE
jsr .1
dey
.1 lda (ZPDCBPtr),y
dey
sta (ZPDCBPtr),y
rts
*--------------------------------------
TERMX.RI sec scroll
.HS 90 BCC
TERMX.CUU clc no scroll
php
ldy #S.DCB.TTY.SCROLLTOP
lda (ZPDCBPtr),y
ldy #S.DCB.TTY.CV
cmp (ZPDCBPtr),y
bcs .1
lda (ZPDCBPtr),y
dec
sta (ZPDCBPtr),y
plp
.8 clc
rts
.1 plp
bcc .8
ldy #S.DCB.TTY.SCROLLBOT
lda (ZPDCBPtr),y
tax
.2 jsr TERMX.SETUP.L1X
dex
jsr TERMX.COPY.XtoL1
txa
ldy #S.DCB.TTY.SCROLLTOP
cmp (ZPDCBPtr),y
bne .2
bra TERMX.EL2
*--------------------------------------
TERMX.CBLNK jsr TERMX.CCheck
bcs TERMX.RTS
* ldy #S.DCB.TTY.bCURON
lda DevMgr.Timer
and #CURBLNK.SPEED
eor (ZPDCBPtr),y
asl
beq TERMX.RTS
lda (ZPDCBPtr),y
eor #CURBLNK.SPEED
sta (ZPDCBPtr),y
asl
beq TERMX.CUROFF.1
TERMX.CURON jsr GetCharAtCurPos
bcs TERMX.RTS Out of screen
and #$80
eor #" "
jmp SetCharAtY.SCR
*--------------------------------------
TERMX.CUROFF jsr TERMX.CCheck
bcs TERMX.RTS
TERMX.CUROFF.1 jsr GetCharAtCurPos
bcs TERMX.RTS Out of screen
jmp SetCharAtY.SCR
*--------------------------------------
TERMX.CCheck sec
bit bActive
bpl .9
ldy #S.DCB.TTY.bCURON
lda (ZPDCBPtr),y
bpl .9
clc
.9
TERMX.RTS rts
*--------------------------------------
TERMX.10OUT jsr MATH.A2STR10NP
ldx #0
.1 lda FOUTBuf,x
beq TERMX.RTS
inx
jsr TERMX.COUT
bra .1
*--------------------------------------
TERMX.ESCCSI lda #C.ESC
jsr TERMX.COUT
lda #'['
*--------------------------------------
TERMX.COUT pha save char
ldy #S.DCB.TTY.OUTHEAD
lda (ZPDCBPtr),y
pha save actual HEAD
inc
cmp #S.DCB.TTY.OUTBUF.MAX
bne .1
lda #S.DCB.TTY.OUTBUF
.1 dey OUTTAIL
cmp (ZPDCBPtr),y HEAD+1 = TAIL ?
beq .9 CS, full!
iny
sta (ZPDCBPtr),y new head
ply old head
pla
sta (ZPDCBPtr),y
clc
rts
.9 pla
pla
rts
*--------------------------------------
TERMX.ED ldx CsiPCnt
beq TERMX.ED0
.1 lda CsiP
beq TERMX.ED0 0...
dec 1 ?
beq TERMX.ED1
.2 dec 2 ?
beq TERMX.ED2
TERMX.ED.8 clc
rts
*--------------------------------------
TERMX.ED0 ldy #S.DCB.TTY.CV Erase Cursor -> Bottom
sta (ZPDCBPtr),y
tax
bra TERMX.ED.1
TERMX.ED1 ldx #0 Erase Top -> Cursor
ldy #S.DCB.TTY.CV
sta (ZPDCBPtr),y
tay
bra TERMX.ED.2
TERMX.FF jsr TERMX.HOME
TERMX.ED2 ldx #0 Erase Screen
TERMX.ED.1 ldy #24
TERMX.ED.2 sty .1+1
.1 cpx #$ff SELF MODIFIED
beq .9
jsr TERMX.SETUP.L1X
lda #" "
bit bActive
bpl .4
sta IO.SETPAGE2
jsr .7
sta IO.CLRPAGE2
jsr .7
.4 ldy #79
.5 sta (ZPBufBL1),y
dey
bpl .5
inx
bra .1
.7 ldy #39
.8 sta (ZPScrBL1),y
dey
bpl .8
.9 rts
*--------------------------------------
TERMX.IAC ldy #S.DCB.TTY.INBUF
lda (ZPDCBPtr),y
inc
sta (ZPDCBPtr),y
tay
jsr TERM.GetBufByte
sta (ZPDCBPtr),y
cpy #S.DCB.TTY.INBUF+1 CMD ?
beq TERMX.ED.8 yes, wait for additional bytes
ldy #S.DCB.TTY.INBUF+1
lda (ZPDCBPtr),y get back CMD
cmp #SB
bne .1 not a SB/SE....stop with CMD/SUBCMD
jsr TERM.GetBufByte
cmp #SE
bne TERMX.ED.8 wait for ending SE....keep bIACMode
bra TERMX.IAC.SB
ldy #S.DCB.TTY.INBUF+1
lda (ZPDCBPtr),y get back CMD
.1 cmp #IAC
beq TERMX.IAC.SB.9
sec
sbc #WILL
bcc TERMX.IAC.SB.9
asl
tax
ldy #S.DCB.TTY.INBUF+2
lda (ZPDCBPtr),y Get SUBCMD in A
jmp (.8,x)
.8 .DA TERMX.IAC.RWILL
.DA TERMX.IAC.RWONT
.DA TERMX.IAC.RDO
.DA TERMX.IAC.RDONT
*--------------------------------------
TERMX.IAC.SB ldy #S.DCB.TTY.INBUF+2
lda (ZPDCBPtr),y Get SUBCMD in A
cmp #TN.O.TTYPE
bne TERMX.IAC.SB.9
iny
lda (ZPDCBPtr),y
cmp #SB.SEND
bne TERMX.IAC.SB.9
ldx #0
.1 lda SB.IS.TTYPE,x
jsr TERMX.COUT
inx
cpx #SB.IS.TTYPE.LEN
bne .1
TERMX.IAC.SB.9 jmp TERMX.SETM.0
*--------------------------------------
TERMX.IAC.RWILL cmp #TN.O.ECHO
* beq TERMX.IAC.SDO
beq TERMX.IAC.SB.9
ldx #TERMX.IAC1.L-1
.1 cmp TERMX.IAC1,x
beq TERMX.IAC.SB.9
dex
bpl .1
.8 bra TERMX.IAC.SDONT
*--------------------------------------
TERMX.IAC.RWONT ldx #TERMX.IAC1.L-1
.1 cmp TERMX.IAC1,x
beq TERMX.IAC.SDO
dex
bpl .1
jmp TERMX.SETM.0
*--------------------------------------
TERMX.IAC.RDO cmp #TN.O.ECHO
beq TERMX.IAC.SWONT
ldx #TERMX.IAC1.L-1
.1 cmp TERMX.IAC1,x
beq TERMX.IAC.SWILL
dex
bpl .1
bra TERMX.IAC.SWONT
*--------------------------------------
TERMX.IAC.RDONT ldx #TERMX.IAC1.L-1
.1 cmp TERMX.IAC1,x
beq TERMX.IAC.SWILL
dex
bpl .1
jmp TERMX.SETM.0
*--------------------------------------
TERMX.IAC.SWILL ldx #WILL
.HS 2C BIT ABS
*--------------------------------------
TERMX.IAC.SWONT ldx #WONT
.HS 2C BIT ABS
*--------------------------------------
TERMX.IAC.SDO ldx #DO
.HS 2C BIT ABS
*--------------------------------------
TERMX.IAC.SDONT ldx #DONT
*--------------------------------------
pha push CMD
phx
lda #IAC
jsr TERMX.COUT
pla
jsr TERMX.COUT
pla
jsr TERMX.COUT
jmp TERMX.SETM.0
*--------------------------------------
TERMX.CheckOA lda IO.OPENAPPLE
php
bpl .5 Restore Title
ldy #S.DCB.TTY.bTITLE
lda (ZPDCBPtr),y
bmi .8
inc
sta (ZPDCBPtr),y
jsr TERM.GetDevName
ldx #0
jsr TERMX.SETUP.L1X.SCR
ldy #0
.1 jsr SHARED.TXTPTRgn
beq .3
cmp #$40
bcc .2
cmp #$60
bcs .2
and #$1F remap UPPERCASE
.2 phy
jsr SetCharAtY.SCR
ply
iny
bne .1
.3 lda #C.SPACE
.4 phy
jsr SetCharAtY.SCR
ply
iny
cpy #80
bne .4
plp
rts
.5 ldy #S.DCB.TTY.bTITLE
lda (ZPDCBPtr),y
bpl .8
dec
sta (ZPDCBPtr),y
ldx #0
jsr TERMX.SCR0CPY
.8 plp
rts
*--------------------------------------
TERMX.SCRCPY ldx #23
TERMX.SCR0CPY lda ZPDCBPtr
clc
adc BUF.BL,x
sta .80+1
lda ZPDCBPtr+1
adc BUF.BH,x
sta .80+2
jsr TERMX.SETUP.L1X.SCR
phx
ldx #78
sta IO.SETPAGE2
ldy #39
jsr .8
ldx #79
sta IO.CLRPAGE2
ldy #39
jsr .8
plx
dex
bpl TERMX.SCR0CPY
rts
.8 ldy #39
.80 lda $ffff,x SELF MODIFIED
sta (ZPScrBL1),y
dex
dex
dey
bpl .80
rts
*--------------------------------------
TERMX.COPY.XtoL1
lda ZPDCBPtr
clc
adc BUF.BL,x
sta ZPBufBL2
lda ZPDCBPtr+1
adc BUF.BH,x
sta ZPBufBL2+1
ldy #79
.1 lda (ZPBufBL2),y
sta (ZPBufBL1),y
dey
bpl .1
bit bActive
bpl .8
lda SCR.BL,x
sta ZPScrBL2
lda SCR.BH,x
sta ZPScrBL2+1
sta IO.SETPAGE2
jsr .6
sta IO.CLRPAGE2
.6 ldy #39
.7 lda (ZPScrBL2),y
sta (ZPScrBL1),y
dey
bpl .7
.8 rts
*--------------------------------------
SetCharAtCurPos pha
ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
tax
ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
tay
pla
cpy #80
bcs SetCharAtYX.8
*--------------------------------------
SetCharAtYX sty ZPTmpX
cmp #$40
bcc .1
cmp #$60
bcs .1
and #$1F remap UPPERCASE
.1 ldy #S.DCB.TTY.bNORMAL
ora (ZPDCBPtr),y
sta ZPTmpChar
ldy #S.DCB.TTY.bG0G1 Select Active Font
lda (ZPDCBPtr),y
clc
bpl .2
sec
.2 lda #$80
bcc .21
lsr
.21 iny #S.DCB.TTY.bG0G1ALT
and (ZPDCBPtr),y
beq .3 not Graphic mode
lda ZPTmpChar
cmp #$E0 Normal lowercase ?
bcc .3
tay
lda REMAP.E0.FF-$E0,y
sta ZPTmpChar
.3 jsr TERMX.SETUP.L1X
ldy ZPTmpX
lda ZPTmpChar
sta (ZPBufBL1),y
bit bActive
bmi SetCharAtY.SCR1
rts
SetCharAtY.SCR sty ZPTmpX
SetCharAtY.SCR1 lsr ZPTmpX
ldy ZPTmpX
bcs .2
sta IO.SETPAGE2
sta (ZPScrBL1),y
sta IO.CLRPAGE2
rts
.2 sta (ZPScrBL1),y
SetCharAtYX.8 rts
*--------------------------------------
GetCharAtCurPos ldy #S.DCB.TTY.CV
lda (ZPDCBPtr),y
cmp #24
bcs .9 Out of screen
tax
jsr TERMX.SETUP.L1X
ldy #S.DCB.TTY.CH
lda (ZPDCBPtr),y
cmp #80
bcs .9 Out of screen
tay
lda (ZPBufBL1),y
cmp #$20
bcs .8
* clc
adc #40 remap $00-$1F uppercase
.8 clc
.9 rts
*--------------------------------------
TERMX.SETUP.L1X lda ZPDCBPtr
clc
adc BUF.BL,x
sta ZPBufBL1
lda ZPDCBPtr+1
adc BUF.BH,x
sta ZPBufBL1+1
bit bActive
bpl TERMX.SETUP.L1X.8
TERMX.SETUP.L1X.SCR
lda SCR.BL,x
sta ZPScrBL1
lda SCR.BH,x
sta ZPScrBL1+1
TERMX.SETUP.L1X.8
rts
*--------------------------------------
KeyMap .DA #11,#10,#21,#8 esc[A,esc[B,esc[C,esc[D
KeyMap.Cnt .EQ *-KeyMap
*--------------------------------------
CtrlChars .DA #C.ENQ,#C.BS,#C.LF,#C.FF,#C.CR,#C.SO,#C.SI,#C.ESC
CtrlChars.Cnt .EQ *-CtrlChars
*--------------------------------------
EscCodes .AZ "78DEMc[()"
EscCodes.Cnt .EQ *-EscCodes
EscModes .DA #0,#0,#0,#0,#0,#0,#S.DCB.TTY.M.CSI,#S.DCB.TTY.M.G0,#S.DCB.TTY.M.G1
*--------------------------------------
CsiCodes .AS "ABCDHJKfhlmnr"
CsiCodes.Cnt .EQ *-CsiCodes
*--------------------------------------
* Enabled both sides
*--------------------------------------
TERMX.IAC1 .DA #TN.O.BINARY,#TN.O.SGA,#TN.O.TTYPE,#TN.O.NAWS
TERMX.IAC1.L .EQ *-TERMX.IAC1
*--------------------------------------
* Disabled both sides
*--------------------------------------
*TERMX.IAC0 .DA #TN.O.TSPEED,#TN.O.LINEMODE,#TN.O.STATUS
* .DA #TN.O.NEWENV,#TN.O.XDISPLOC
* .DA #TN.O.LFLOW,#TN.O.AUTH
*TERMX.IAC0.L .EQ *-TERMX.IAC0
*--------------------------------------
* Enabled Local, Disabled remote
*--------------------------------------
*TERMX.IAC10 .DA #TN.O.ECHO
*TERMX.IAC10.L .EQ *-TERMX.IAC10
*--------------------------------------
SB.IS.TTYPE .DA #IAC,#SB,#TN.O.TTYPE,#SB.IS
TERMX.ENQ.REP .AS "vt100"
TERMX.ENQ.REP.L .EQ *-TERMX.ENQ.REP
.DA #IAC,#SE
SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE
SB.IS.NAWS .DA #IAC,#SB,#TN.O.NAWS,#SB.IS
.DA 80
.DA 24
.DA #IAC,#SE
SB.IS.NAWS.LEN .EQ *-SB.IS.NAWS
*--------------------------------------
RESET.VALUES .DA #0 MODE
.DA #0 CH
.DA #0 CH.SAVE
.DA #0 CV
.DA #0 CV.SAVE
.DA #0 SCROLLTOP
.DA #23 SCROLLBOT
.DA #$80 bCURON
.DA #0 bTITLE
.DA #$80 bNORMAL
.DA #$80 bDECAWM
.DA #$80 bLNM
.DA #0 bG0G1
.DA #0 bG0G1ALT
.DA #S.DCB.TTY.OUTBUF OUTTAIL
.DA #S.DCB.TTY.OUTBUF OUTHEAD
.DA #S.DCB.TTY.INBUF INBUFFER
*--------------------------------------
TERMX.DIB .DA #S.DIB.S.WRITE+S.DIB.S.READ
.DA #0,#0,#0
.PS "A2osX VT100 term"
.DA #S.DIB.T.CHAR
.DA #0
.DA K.VER
*--------------------------------------
* ` a b c d e f g h i j k l m n o
REMAP.E0.FF .HS 5b.41.42.43.44.45.46.47.48.49.20.5e.5a.5a.4e.4f
* p q r s t u v w x y z { | } ~ DEL
.HS 50.5c.52.53.54.55.56.57.5a.59.5a.5b.5c.5d.5e.5f
*--------------------------------------
SCR.BL .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
SCR.BH .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
*--------------------------------------
BUF.BL .DA #S.DCB.TTY+0
.DA #S.DCB.TTY+80
.DA #S.DCB.TTY+160
.DA #S.DCB.TTY+240
.DA #S.DCB.TTY+320
.DA #S.DCB.TTY+400
.DA #S.DCB.TTY+480
.DA #S.DCB.TTY+560
.DA #S.DCB.TTY+640
.DA #S.DCB.TTY+720
.DA #S.DCB.TTY+800
.DA #S.DCB.TTY+880
.DA #S.DCB.TTY+960
.DA #S.DCB.TTY+1040
.DA #S.DCB.TTY+1120
.DA #S.DCB.TTY+1200
.DA #S.DCB.TTY+1280
.DA #S.DCB.TTY+1360
.DA #S.DCB.TTY+1440
.DA #S.DCB.TTY+1520
.DA #S.DCB.TTY+1600
.DA #S.DCB.TTY+1680
.DA #S.DCB.TTY+1760
.DA #S.DCB.TTY+1840
BUF.BH .DA /S.DCB.TTY+0
.DA /S.DCB.TTY+80
.DA /S.DCB.TTY+160
.DA /S.DCB.TTY+240
.DA /S.DCB.TTY+320
.DA /S.DCB.TTY+400
.DA /S.DCB.TTY+480
.DA /S.DCB.TTY+560
.DA /S.DCB.TTY+640
.DA /S.DCB.TTY+720
.DA /S.DCB.TTY+800
.DA /S.DCB.TTY+880
.DA /S.DCB.TTY+960
.DA /S.DCB.TTY+1040
.DA /S.DCB.TTY+1120
.DA /S.DCB.TTY+1200
.DA /S.DCB.TTY+1280
.DA /S.DCB.TTY+1360
.DA /S.DCB.TTY+1440
.DA /S.DCB.TTY+1520
.DA /S.DCB.TTY+1600
.DA /S.DCB.TTY+1680
.DA /S.DCB.TTY+1760
.DA /S.DCB.TTY+1840
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.termx
LOAD usr/src/sys/kernel.s
ASM