EscLp:	db	-1			;default terminal done
Term:	dw	AnsiTab			;default Ansi terminal
TPar:	dw	6 dup (?)
TPLP:	db	0			;parameter pointer

;***************************************************************
;*							       *
;*	SCREEN DRIVER II FOR NEC 7220, CTL/ESC HANDLER	       *
;*							       *
;***************************************************************

;======	control code translation ===============================

CtlTab:	dw	6	dup	(noCtl)
	dw	clrEOS		;^f:test
	dw	ring		;^g(07): ring the bell
	dw	Curlft		;^h(08): backspace non destr,inline
	dw	noCtl                
	dw	CurDn		;^j(0a): line feed/scroll
	dw	CurUp		;^k(0b): line feed reverse/scroll
	dw	CurRgt		;^l(0c): forw space non destr,inline
	dw	carret		;^m(0d): carriage return
	dw	17h-0dh-1 dup (NoCtl)        
	dw	clrEOL		;^w(17): clear to eol
	dw	1ah-17h-1 dup (NoCtl)        
	dw	clrscr		;^z(1a): clear full screen
	dw	IniEsc		;branch to esc handler
	dw	1dh-1ah-1 dup (NoCtl)        
	dw	Home			;^^(1e): home cursor

TxCtl:	lea	bx,cs:CtlTab		;bx -> ctl code 0
	sal	al,1			;code in al, 
	xor	ah,ah			;16 bit offset
	add	bx,ax
	lea	bx,cs:bx
	jmp	[bx]
NoCtl:	ret

;====== escape handler =========================================

DoEsc:	mov	bx,word ptr [term]	;bx -> term base ptr
	mov	dl,byte ptr [EscLp]
	sal	dl,1
	xor	dh,dh
	add	bx,dx
	jmp	[bx]

AnsiTab:dw	Ansi0,Ansi1,Ansi2,Ansi3,Ansi4,Ansi5

;------ Escape -------------------------------------------------

IniEsc:	mov	byte ptr [EscLp],0	;1.esc: clr char count
	mov	byte ptr [TPLP],0	;clr parameter count
	ret

;------ byte 0: terminal selection -----------------------------

Ansi0:	cmp	al,'['			
	jnz	NoTerm
;	jmp	noterm		;!

NxtAnsi:inc	byte ptr [EscLp]	;foll chars interpreted
	ret

NoTerm:	mov	byte ptr EscLp,-1
	ret

;------	byte1..:terminal execution -----------------------------

Ansi2:	;jmp	Noterm	;NxtAnsi
Ansi3:	;jmp	NxtAnsi
Ansi4:	;jmp	NxtAnsi
Ansi5:	;jmp	NoTerm

Ansi1:	cmp	al,'9'+1
	jc	TermPar
	cmp	al,'m'
	jz	crtAtr
	jmp	Noterm;	ret

TermPar:lea	bx,cs:[TPar]
	mov	dl,byte ptr [TPLP]
	xor	dh,dh
	add	bx,dx
	mov	[bx],al
	inc	byte ptr [TPLP]
	jmp	NxtAnsi
	


;====== terminal functions =====================================

CrtAtr:	mov	al,byte ptr [EscLp]
	cmp	al,1
	mov	al,0
	jz	NewAtr
	mov	al,byte ptr [TPar]
	sub	al,'0'
NewAtr:	lea	bx,cs:AtrTab
	xor	ah,ah
	add	bx,ax
	mov	al,[bx]
        mov     byte ptr [ChrAtr+1],al;store char attr
   	jmp	Noterm			;done

AtrTab:	db	0,0,dim7220,0,0,bli7220,bli7220,inv7220


;------ ^G: ring the bell --------------------------------------

OutPBuf equ     01h
InpBuf  equ     02h

ring:   in      al,RsKey
        and     al,OutPBuf
        jz      ring1
        in      al,RdKey

ring1:  in      al,RsKey
        and     al,InpBuf
        jnz     ring

        mov     al,07                   ;"push bell key"
        out     KBell,al
        ret

;------ ^h: cursor left ----------------------------------------

Curlft:	call    Int103			;get cursor XY in dx
	and	dl,dl			;already on col 0?
	jz	XBS			;if true, stop BS
        dec     dl			;false:
	call    Int102			;1 x backspace
XBS:    ret

;------ ^m: carriage return ------------------------------------

Carret: call    Int103                  ;get last cursor
        xor     dl,dl                   ;col = 0
        call    int102                  ;set cursor
        ret

;------ ^j: line feed, scroll ----------------------------------

;test:  wschange

CurDn:  call	Int103			;get last cursor
	inc     dh                      ;next line
        cmp     dh,MaxLine+1            ;going below screen?
        jc      CurDn1
	push	dx			;true:store column
        call    ScrUp			;scroll 
	pop	dx
	mov	dh,MaxLine		;bottom line
CurDn1: call    Int102                  ;set cursor
        ret

;------	^K: cursor up ------------------------------------------

CurUp:	call    Int103                  ;get last cursor
	sub	dh,1			;already on top line?
	jnc	XCurUp
	xor	dh,dh			;top line
XCurUp:	call	Int102			;set cursor
	ret

;------	^l: cursor right ---------------------------------------

CurRgt:	call    Int103			;get cursor XY in dx
	cmp	dl,maxcol		;already on end of line?
	jz	XFS			;if true, stop BS
        inc	dl			;false:
	call    Int102			;1 x advance
XFS:    ret
ret

;------	^w: clear to end of line -------------------------------

clrEOL:	call	Int103			;get last cursor
	mov	cx,MaxCol		;loop 1 line,
	sub	cl,dl			;minus left from cursor
	push	dx
	call	blanks
	pop	dx
	call	Int102			;restore cursor
	ret

;------	^z: era full screen ------------------------------------

clrscr:	call	Int103			;get last cursor
	mov	cx,2000			;erase 2000 chars
	push	dx			;store cursor
	xor	dx,dx			;goto origin
	call	blanks			;including goto dx
	pop	dx
	call	Int102			;restore cursor
	ret


;------ ^^: home cursor ----------------------------------------

home:	xor	dx,dx
	call	Int102			;goto origin
	ret

;====== terminal subfunctions ==================================

;------ clear to end of screen ---------------------------------

clrEOS:	call	Int103			;dx <- last cursor XY
	push	dx			;store cursor XY
	call	XYtoADR			;dx <- cursor address
	mov	cx,2000-1		;erase upto 2000 chars,
;!	sub	cx,dx			;from cursor to EOS
	call	blanks			;incl goto xy , [dx]
	pop	dx
	call	Int102			;restore cursor
	ret

;------ scroll up, sreen fixed ---------------------------------

;doing multiple line copying, not vector scroll

ScrUp:	mov	al,1			;scroll 1x
	mov	bh,0			;blank attr
	mov	cx,0			;X0,Y0
	mov	dx,256*MaxLine+MaxCol	;X1,Y1
	call	Int106			;window up
	mov	dh,MaxLine
	ret
