	PAGE 85
	.Z80
	.COMMENT #
VT52.MAC enthaelt einen Ausgabe-Patch fuer XMODEM im VT52-Betrieb.

02.04.87  adaptiert von VTPATCH.MAC (VT100-Version) - A.Herrmann

Achtung: Zum Testen mit VT.MAC ist .PHASE 310H durch ASEG und ORG 103H
	und die Equation OUTPUT EQU 2080H durch OUTPUT EQU DISPLA zu ersetzen. 
	(Die Routine OUTPUT existiert nur in XMODEM bei 2080h.)
	Ferner kann die Uebersetzung der Kontrollsequenzen durch Setzen des
	Display Flags DISFLG unterdrueckt werden. Stattdessen werden dann die
	ankommenden Codes als ASCII-Kombinationen dargestellt.
	Wird bei TMESSG der sofortige Ruecksprung RET durch NOP ersetzt, 
	erscheint Diagnose-Output des Uebersetzers auf dem Bildschirm. 

VT52 uebersetzt die folgenden VT52-Kontrollsequenzen in Steuercodes 
fuer den VIDEO80-Treiber. Wenn kein VIDEO80 Code angegeben ist, wird der
Input ignoriert. 

  VT52        -->  VIDEO80      Bedeutung  (n=ASCII-Integer)
-----------------------------------------------------------------------
  <Esc>A      -->  Ctrl/K       Cursor up  (Default n=1)
  <Esc>B      -->  Ctrl/J       Cursor down
  <Esc>C      -->  Ctrl/I       Cursor forward
  <Esc>D      -->  Ctrl/H       Cursor backward
  <Esc>F      -->		Select graphic character set
  <Esc>G      -->		Select standard US ASCII character set
  <Esc>H      -->  <Esc>V	Cursor home
  <Esc>I      -->  <Esc>\       Reverse line feed (benutzt im VAX-Editor EDT)
  <Esc>J      -->  <Esc>[       Erase to end of screen
  <Esc>K      -->  <Esc>Z       Erase to end of line
  <Esc>Yyx    -->  <Esc>Fyx     Cursor position column,line + 1FHex
				(Default y,x=20H,20H for 1st line, 1st col.)
  <Esc>=      -->		Keypad mode on
  <Esc>>      -->		Keypad mode off
  <Esc><      -->		ANSI mode on


Sobald eine nicht aufgefuehrte Sequenz erkannt wird, wird die Uebersetzung
abgebrochen. Das "ungehoerige" Zeichen und darauffolgende Zeichen werden 
unveraendert ausgegeben.

VT52 wird mit ZSID bei 310H in den XMODEM-File XM.COM gepatcht.
Die Routine erwartet die Ausgabezeichen im Akku A und kann anstelle der
Ausgabe-Routine bei 2080H in XMODEM aufgerufen werden.
Alle Registerwerte werden eingangs gerettet und vor dem Ruecksprung wieder 
restauriert.

Fuer die Benutzung des numerischen Tastenfeldes im VT-"Keypad application mode"
wurde eine UMTAST-Datei XMKEYP.COM angelegt. Diese enthaelt die ANSI-
Sequenzen fuer die 8-Bit-Codes, welche DINTAST in der Betriebsart 7 ("80", 
Umschalten mit Ctrl/Lock 7) bei den betreffenden Tasten ausgibt.
XMKEYP.COM ruft als Autoload-File XM.COM.
#
	ENTRY VT52
	.PHASE 310H
;ASEG		;nur fuer
;ORG 310H	;Testzwecke mit VT.MAC

VT52:	JP START

; GLOBAL ADDRESSES

BDOS	EQU 0005H	;BDOS JUMP ADDRESS
OUTPUT	EQU 2080H	;XMODEM OUTPUT ROUTINE
;OUTPUT	EQU DISPLA	;nur fuer Testzwecke mit VT.MAC

; VARIABLES AND CONSTANTS

CTRLC	EQU 03H
CTRLH	EQU 08H
CTRLI	EQU 09H
CTRLJ	EQU 0AH
CTRLK	EQU 0BH
ESC	EQU 1BH		;ESCAPE

DISFLG:	DB 0		;DISPLAY FLAG (NORMALLY=0)
INIFLG:	DB 0		;0 = INIT PARSER
CHAR:	DB 0		;CHAR TO BE TRANSLATED
STATUS:	DB 0		;CURRENT PARSER STATUS

TEXT	EQU 0
ESCAPE	EQU 1

JPSTA:	DW STTEXT	;STATUS JUMP TABLE 
	DW STESCA	;(STATUS JUMPS ARE CALCULATED, NOT COMPARED!)

; INPUT CHARS AND JUMP ADDRESSES
;(REMEMBER: TABLES OF JUMP ADDRESSES HAVE TO BE IN
; REVERSE ORDER OF THE CORRESPONDING TABLES OF CHARS !)

FCODES:	
F1CODE:	DB 'ABCD'
F1LEN	EQU $-F1CODE

F2CODE:	DB 'HIJKY'
F2LEN	EQU $-F2CODE

F0CODE:	DB 'FG=><'
F0LEN	EQU $-F0CODE
FCDLEN	EQU $-FCODES

; REPLACEMENT CHARACTERS
;(REMEMBER: TABLES OF REPLACEMENT CHARS HAVE TO BE IN
; REVERSE ORDER OF CORRESPONDING TABLES OF CHARS !)

REPLF1:	DB CTRLH	;FOR 'D'
	DB CTRLI	;FOR 'C'
	DB CTRLJ	;FOR 'B'
	DB CTRLK	;FOR 'A'
REPLF2:	DB 'F'		;FOR 'Y'
	DB 'Z'		;FOR 'K'
	DB '['		;FOR 'J'
	DB '\'		;FOR 'I'
	DB 'V'		;FOR 'H'

;------------------------------------------
;	SOME SUBROUTINES
;------------------------------------------
INITVT:	CPL
	LD (INIFLG),A
	LD A,TEXT	;STATUS=TEXT
	LD (STATUS),A
	RET

COMPJP:	ADD HL,BC	;COMPUTE JUMP ADDRESS IN HL
	ADD HL,BC
	LD E,(HL)
	INC HL
	LD D,(HL)
	EX DE,HL
	RET

;------------------------------------------
;	MAIN ROUTINE
;------------------------------------------
START:	PUSH AF
	PUSH BC
	PUSH DE
	PUSH HL
	LD (CHAR),A	;SAVE CHAR

	LD A,(INIFLG)	;INIT. PARSER ?
	OR A
	CALL Z,INITVT
	
	LD A,(DISFLG)	;IF THIS FLAG IS SET
	OR A		;INCOMING CHARS WON'T
	JP Z,STAT	;BE INTERPRETED BUT
	LD A,(CHAR)
	CALL DISPLA	;ONLY DISPLAYED
	JP EXIT

STAT:	LD A,(STATUS)
	LD B,0
	LD C,A
	LD HL,JPSTA
	CALL COMPJP	;COMPUTE JUMP ADDRESS
	LD A,(CHAR)
	JP (HL)

STTEXT:	CP ESC		;= "Esc" ?
	JP NZ,OUTCH
	LD A,ESCAPE
	JP SEXIT

STESCA:	LD HL,FCODES	;=FCODE ?
	LD BC,FCDLEN
	CPIR
	JP NZ,OUTCH
	DEC HL
	LD A,(HL)
	CALL TRANS	;YES, TRANSLATE IT.
	JP TEXIT

OUTCH:	CALL OUTPUT
TEXIT:	LD A,TEXT
SEXIT:	LD (STATUS),A
EXIT:	POP HL
	POP DE
	POP BC
	POP AF
	RET		;BACK TO CALLING PROGRAM

;------------------------------------------
;	OUTPUT OF TRANSLATION SEQUENCE
;------------------------------------------
TRANS:	CALL TMESSG	;DIAGNOSTIC MESSAGE
	LD HL,F1CODE	;= F1CODE ?
	LD BC,F1LEN
	CPIR
	JP NZ,TRAN2

TRAN1:	LD HL,REPLF1	;YES.
	ADD HL,BC	;COMPUTE ADDRESS OF REPL CHAR
	JP TROUT

TRAN2:	LD HL,F2CODE	;= F2CODE ?
	LD BC,F2LEN
	CPIR
	JP NZ,TRAN0
	LD HL,REPLF2
	ADD HL,BC
	PUSH HL
	LD A,ESC
	CALL OUTPUT	;OUTPUT ESCAPE CHAR,
	POP HL
TROUT:	LD A,(HL)	;GET REPLACEMENT CHAR
	CALL OUTPUT	;OUTPUT REPLACEMENT CHAR
	JP TREXIT

TRAN0:			;IGNORE F0CODES
TREXIT: RET

;----------------------------------
; DIAGNOSTIC ROUTINES
;----------------------------------
TMESSG: RET		;FOR A DIAGNOSTIC MESSAGE REPLACE "RET" BY "NOP"
	PUSH AF		;OUTPUT A MESSAGE
	LD DE,TRMSG1
	LD C,9
	CALL BDOS
	POP AF
	PUSH AF
	LD C,2
	LD E,A
	CALL BDOS
	LD DE,TRMSG2
	LD C,9
	CALL BDOS
	POP AF
	RET
TRMSG1:	DB 0DH,0AH
	DB '(VT52: $'
TRMSG2:	DB ')'
	DB 0DH,0AH
	DB '$'
;------------------------------------------
; DISPLAY INCOMING CHARACTER
; (ONLY IF DISFLG IS NOT 0)
;------------------------------------------
DISPLA:	
	CP ESC
	JP NZ,DISPL1
	LD DE,ESCMSG
	LD C,9
	CALL BDOS
	RET
ESCMSG:	DB '<Esc>$'
DISPL1:
	CP 20H
	JP NC,DISPCH
	ADD A,40H
	PUSH AF
	LD A,'^'
	CALL DISPCH
	POP AF
DISPCH:	LD C,2
	LD E,A
	CALL BDOS
	RET
;------------------------------------------
	.DEPHASE
	END
