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
