public anstty, ansini, ansrei, ansdsl, anstat, anskbi ; Entry points public ans52t, vclick, vsinit public mar_top, mar_bot, anspflg, scroll ; data for msyibm include ccsdef.h ; * Disclaimer * ; ; DEC and VT are trademarks of Digital Equipment Corporation. ; ; There is a naming convention ; for the ANSI and VT100 functions and flags; generally, the stuff in the ; symbol after "ans" or "at" is the function or mode mnemonic used in the ; VT100 manual. ; ; Every effort has been made to make the VT100 emulation as much like the ; real thing as possible. The reference used was the VT100 User's Guide, 2nd ; ed. Jan. 1979, DEC part no. EK-VT100-UG. Some aspects of the behavior ; of the terminal (e.g., the interaction of the "origin mode", limited ; scrolling region, and indexing), were gleaned from programming experiments ; on an actual VT100 terminal. Implemented features include: (1) Limited ; scolling region, (2) Settable tab stops, (3) Special "graphics" character ; set and UK ASII set, (4) All graphic renditions (underline, blink, and ; high intensity), (5) Simulated "LEDs" on the mode line, (6) Screen mode ; (normal or reverse video), (7) All terminal reports (status, active position, ; terminal parameters, and device attributes), (8) The ANSI new-line mode and ; several of the DEC private modes, including keypad application, cursor key, ; screen, auto-wrap, and origin, (9) cursor position/graphic rendition/ ; character set save/restore, and last (and probably least): (10) VT52 com- ; patibility mode. Also, various details of behavior required by the ANSI ; standard (e.g. most control characters do not affect the interpretation of ; the current escape sequence, relative cursor positioning (up, down, left ; right, and of course tab) stop at the screen margins, etc.) have been ; scrupulously observed. ; ; This was the first thing I ever wrote in 8088 assembler (some of it was ; stolen from CCYIBM), and one of the constraints was that the emulator ; should work with a vanilla PC with a monochrome monitor. Given these and ; other constraints, no attempt was made to implement the following VT100 ; features: (1) Smooth scolling, (2) 132 column lines, (3) Auto repeat, ; (5) Interlace/no interlace, (6) Double-width/double-height lines. The ; escape sequences to set and reset these are recognized, but ignored. ; ; - James A. Harvey, IUPUI Computing Services, DEC Systems Group ; ; * End of Disclamer * ; --------------------------------------------------------------------------- ; ; Description of the global entry points and calls on external routines ; needed by this emulator. [jrd] ; ; vsinit - start up routine called as Kermit initializes. Takes no arguments. ; Sets up address pointers to tabs, reads default terminal parameters ; reads current screen coloring. Examines and updates structure ; "vtemu." which is how mssset communicates changed information ; about many Set Term parameters; "flags." is a Kermit structure ; carrying the other Set Term parameters. ; anstty - starting point for displaying a character, delivered in AL. ; Returns when the display operation is completed and that may ; take many many instructions. All normal "characters received by ; the terminal" are provided by calling anstty with the char in AL. ; ansini - entry point to initialize the emulator. It requires information ; from msy in four registers: the Kermit terminal routine flags ; "yflags" (used mainly to sense debug mode and the mode line toggle) ; "low_rgt" (bh = row, bl = column of the lower right display corner) ; "lbaudtab" (index into baud rate table, for status reporting) ; "lpartab" (index into parity table, for status reporting) ; Ansini causes a full reset of the emulator, including screen ; clearing and a beep. Ansini is also called by msy in response to ; sensing the Alt = key combination to fully reset the emulator. ; ansrei - entry point to reinitialize the emulator. Nearly the same as ; ansini except operating flags, tabs, etc are retained from the ; previous emulator session. Items which can be changed by Set Term ; are examined and updated. The msy flags "yflags" are needed. ; This is the warm-restart entry point used when connect mode ; is reentered gracefully. The screen is cleared only if the coloring ; has changed. The starting cursor location is whereever msy puts it. ; ansdsl - display "led" (status line) information. Invoked by msy when ; the mode line is constructed so the emulator can write the ; terminal type and the VT100 led status lights when Connect mode ; is started. Requires "yflags" from msy to sense whether the mode ; line is to be shown. ; anstat - reports our working flags and screen coloring to msy. Nearly ; obselete but not quite. Reads msy "yflags" and reports "mlbattr" ; the video attributes used on the mode line, "scbattr" the video ; attributes of an empty character cell (background), "curattr" ; the video attributes of displayable characters, and "ansflgs" ; the emulator's working flags (needed for keyboard translations ; done in msy). ; anskbi - a routine called by msy to notify the emulator that a character ; is available from the keyboard. No character is read, just flag ; ttkbi is set. This is actually used only to beep when the cursor ; goes beyond column 72 and the margin bell flag is on. ; ans52t - called by msy to change terminal types "on the fly" without ; fully updating all operating parameters and without losing setup ; information. Msy senses the Alt minus key and calls ans52t with ; no arguments. Ans52t cycles among VT102, VT52 and Heath-19 modes. ; vclick - called by msy to cause a click sound. Simulates keyboard clicks, ; sort of anyway. No arguments. ; other modules in msy are called by this file to handle screen scrolling ; mode line on/off, output to the serial port (reports), screen ; particulars (location, cursor shape, blanking). The list is ; the set of code extrn procedures below; all are in file msy. ; ; data exchange is directly with msy to assist in scrolling (varaibles ; "mar_top", "mar_bot") and in sensing the non-connect ; mode screen coloring ("scbattr"). Screen coloring controlled by ; the emulator is not permitted to influence the non-connect mode ; screens whereas the emulator attempts to use the regular Kermit ; screen colors as defaults. The kind of terminal to emulate is ; held in byte "flags.vtflg" which is set by Set Term and by this ; module for global information within Kermit. ; ; The emulator assumes the screen is laid out in the manner of a conventional ; IBM monochrome or color graphics adapter running in 80 column TEXT ; modes. That layout is one word per displayable location starting at ; the upper left corner (0,0) and running contiguously to the lower ; right corner (24,79). Each word holds the displayable character in ; the low order byte and the display attributes in the high order ; byte. Attributes are, from high to low bits: blinking on, back- ; ground red, green, and blue on, high intensity, foreground red, ; green, and blue on. Normal white chars on a black field is 07H. ; The starting segment of screen memory is given by msy module ; "scrseg" to be TopView/MS Windows compatible. Msy module "scrsync" ; is used to inform these windowing environments of memory updates. ; Variable "crt_mode" is set by msy to indicate which IBM display ; mode is active; only the monochrome and CGA modes are recognized. ; Direct reading and writing of display memory is done, compatibly ; with TopView/Windows, to attain speed over Bios and DOS calls ; when editing of previously entered text is needed. However, IBM ; Bios interrupt 10H is used where possible for normal cursor ; movement/sensing and writing of new characters. See the IBM PC ; hardware Technical Reference Manuals for further details. ; ; Many things have been added, or modified since James Harvey donated this ; code to Columbia University for use in Kermit. [jrd] ; --------------------------------------------------------------------------- screen equ 10h ; Bios screen call swidth equ 132 ; assumed max screen width [dlk] slen equ 60 ; assumed max screen length [jrd] att_low_mask equ 06H ; Various attribute-related equates ;;;att_reverse equ 70H ; these two are now storable items ;;;att_normal equ 07H ; to allow external settings. [jrd] att_underline equ 01H att_intensity equ 08H att_blink equ 80H ; VT100 status flags ansflg ;anslnm equ 01H ; ANSI line feed/new line mode ;decckm equ 02H ; VT100 cursor keys mode ;deckpam equ 04H ; VT100 keypad application mode ;decscnm equ 08H ; VT100 screen mode (n.y.i.) ;decom equ 10H ; VT100 origin mode ;decawm equ 20H ; VT100 autowrap mode ;decanm equ 40H ; ANSI(VT100)/VT52 mode ;dececho equ 80H ; ANSI local echo on (1) ;;;;;;;;;;;;;;;; items for reference from mssdef.h ;;;;;;;;;;;;; ; VT100 SETUP mode flags ;vswdir equ 80H ; Writing direction (0=left to right) ;vsscreen equ 40H ; Screen mode (0 = normal video) ;vscursor equ 20H ; Cursor (0 = block) ;vsmarginbell equ 10H ; Margin bell (0 = off) ;vskeyclick equ 08H ; Keyclick (0 = off) ;vsshift3 equ 04H ; Shift-3 (0 = American pound sign) ;vswrap equ 02H ; Line wrap around (0 = no wrap) ;vsnewline equ 01H ; ANSI new line (0 = off) ;vsdefaults equ 0+vscursor ;[IU1] Definitions for terminal emulation ;TTGENRC EQU 0 ; Type 0 - TTY (no special emulation) ;TTHEATH EQU 1 ; Type 1 - HEATH 19 ;TTVT52 EQU 2 ; Type 2 - VT52 ;TTVT100 EQU 3 ; Type 3 - ANSI (VT100 subset) ;TTTEK EQU 4 ; Type 4: Tektronix 4010 ;TTTYPES equ 5 ; Number of terminal types defined ;emulst struc ; structure of vtemu.xxx for VT100 emulator ;vtflgst db 0 ; VT100 setup flags (from SET) ;vtflgop db 0 ; VT100 runtime flags, like setup flags (here & STAT) ;vttbs dw 0 ; pointer to default tab stops, for SET ;vttbst dw 0 ; pointer to active tab stops, for STATUS ;vtchset db 1 ; value of default character set (1=US-ascii) ;att_ptr dw 0 ; pointer to normal & reverse video attributes ;emulst ends ;;;;;;;;;;;;;;;; end references ;;;;;;;;;;;;;;;;;;;; datas segment public 'datas' extrn vtemu:byte, crt_mode:byte, scbattr:byte, flags:byte extrn crt_lins:byte, crt_cols:byte, rxtable:byte, denyflg:word extrn tekflg:byte extrn isccdos:byte ; Jun 25,1990 ; Early versions of MASM have a bug that causes it to consider the ; expression (offset foo) as non-relocatable if used in an arithmetic ; operation (for example, "sub di,offset foo"), and if foo is defined ; within the first 256 bytes of the data segment. ; ANSI special character table - 32 entries indexed by control char value ansspc dw 5 dup (atign) ; ignore NUL,SOH,STX,ETX,EOT dw atign ; ENQ - answerback message dw atign ; ACK - ignore dw atbel ; BEL - ring terminal bell dw atbs ; BS - ANSI backspace dw atht ; HT - ANSI tab dw atlf ; LF - ANSI line feed dw atlf ; VT - Interpreted as ANSI LF dw atff ; FF - do as LF (but ESC FF does Tek) dw atcr ; CR - ANSI carriage-return dw atso ; SO - Select char set G1 dw atsi ; SI - Select char set G0 dw 8 DUP (atign) ; ignore DLE,DC1,DC2,DC3,DE4,NAK,SYN,ETB dw atcan ; CAN - cancel ANSI sequence dw atign ; EM - ignore dw atcan ; SUB - treat as CAN dw atesc ; ESC - ANSI CSI dw 4 DUP (atign) ; ignore FS,GS,RS,US ; Heath-19 mode escape follower table h19esc db 'YABCD', 'KIHJF', 'G=>','<','Z' db '7','8','c','^','_' db 'W','X',']','V' lv52esc equ $-v52esc ; length of table ; Dispatch for v52esc table v52ejt dw v52pos,atcuu,atcud,atcuf,atcub dw atel,atri,atcup,ated,v52egm dw v52xgm,atkpam,atkpnm,v52ans,decid dw atsc,atrc,v52ris,v52apb,v52ape dw v52pcb,v52pce,v52ps,v52pl ; ANSI escape special character table ansesc db '[','D','E','M','H' db '7','8','=','>','c' db '(',')','#','Z','<' db 'P','*','+',7bh ; 7bh is left curly brace lansesc equ $-ansesc ; length of table ; Dispatch for ansesc table ansejt dw atcsi,atind,atnel,atri,athts dw atsc,atrc,atkpam,atkpnm,atris dw atsg0,atsg1,atsdhl,at52id,atnorm dw atpriv,atpriv,atpriv,atnorm ; Final char table for ANSI escape sequences (ESC [ Pn ; ... Pm ch) anstab db 'H','A','B','C','D' db 'K','J','m','g','r' db 'c','q','x','n','f' db 'l','h','y','P','L' db 'M','i','s','u','z' db '@' lanstab equ $-anstab ; Define table length ; Dispatch for anstab table ansjmp dw atcup,atcuu,atcud,atcuf,atcub dw atel,ated,atsgr,attbc,atstbm dw atda,atll,atreqt,atdsr,atcup dw atrm,atsm,atctst,atdelc,inslin dw dellin,ansprt,htsc,htrc,htrest dw ansich ; "Special graphics" set translation table for characters 137 (octal) ; through 176 when the special graphics set is selected. Some characters ; (142, 143, 144, 145, 150, 151, 157, 160, 162, 163, and 174) do not ; have exact equivalents in the available set on the IBM, so a (some- ; times reasonably close) substitution is made. Table is indexed by ; ASCII char value minus 137 octal for chars 137-176 octal. sgrtab db 032,004,177,026,023 db 027,025,248,241,021 db 018,217,191,218,192 db 197,196,196,196,196 db 196,195,180,193,194 db 179,243,242,227,157 db 156,250 ; Device attributes response string. (Note: If "with AVO" causes problems, ; change the last parameter from "2" to "0". The default is to indicate ; the AVO option is present because the emulator can set all of the graphic ; rendition attributes (bold, blink, etc.) independently). A VT100 reports ; as ESC [ ? 1 ; 2 c but a VT102 uses ESC [ ? 6 ; 2 c. ;;;dastr db escape,'[?6;2c',0 ; VT102 dastr db escape,'[?6c',0 ; shortened to help some mainframes db 5 dup (0) ; patch space ; Identify response used while in VT52 compatibility mode v52str db escape,'/Z',0 db 5 dup (0) ; patch space ; Identify response when a Heath-19 terminal h19str db escape,'/K',0 db 5 dup (0) ; patch space ; ANSI Escape sequence to turn off Media Copy (Print Controller Off) mcoffs db 24 dup (0) ; received chars in sequence mccnt dw 0 ; counter of matched char in mcoff ; Parity code translation table partab db 5 ; Even db 3 ; Mark db 1 ; None db 4 ; Odd db 2 ; Space lpartab equ $-partab ; Baud rate code translation table baudtab db 0 ; 45.5 - no VT100 code (call it 50) db 0 ; 50 db 8 ; 75 db 16 ; 110 db 24 ; 134.5 db 32 ; 150 db 48 ; 300 db 56 ; 600 db 64 ; 1200 db 72 ; 1800 db 80 ; 2000 db 88 ; 2400 db 104 ; 4800 db 112 ; 9600 db 120 ; 19200 db 128 ; 38400 extended beyond DEC lbaudtab equ $-baudtab belcol db ? ; column at which to ring margin bell yflags db ? ; Flags from CCYxxx term routine oldbatr db ? ; old scbattr oldterm db ? ; terminal type from previous entry escdec db 0 ; DEC private sequence (ESC [ ?) seen decmode equ 80H ; "?" seen in lead-in baudidx db ? ; Index into baud rate table parcode db ? ; Parity code (0-4) datbits db ? ; Number of databits (7 or 8) savflgs db ? ; Saved flags for atsc/atrc modeset db ? ; Temp for atsm/atrm h19mod db ? ; flag for atsm/atrm h19l25 db ? ; Heath-19 25th line enabled flag insmod db ? ; Insert mode on (1) or off (0) kbicsr dw ? ; Cursor when keyboard input typed kbiflg db ? ; Set/reset for keyboard input ttstate dw offset atnrm ; terminal automata state ; Start of stuff to save for ESC 7 fxn ukset equ 0 ; Set 1 = UK ASCII set ascset equ 1 ; Set 2 = US ASCII set sgrset equ 2 ; Set 3 = "Special graphics set" alcset equ 3 ; Set 4 = "Alt. Character Set" [bk] svattr_index equ 0 ; To set saved cursor attribute only curattr db 07h ; Cursor attribute cursor dw 0 ; Cursor position video_state db 0 ; video state (0=normal,1=reversed) chr_set dw offset chr_sg0 ; Ptr. to currently selected char set chr_sg0 db ascset ; Current SG0 set chr_sg1 db ascset ; Current SG1 set lsavecu equ $-curattr ; Length of stuff to save savecu db lsavecu dup (?) ; Saved cursor, attr., charset, etc h19ctyp db 1 ; H-19 cursor type (1=ul, 2=bk, 4=off) att_normal db 07H ; retain order: normal then reverse att_reverse db 70H mlbattr db ? ; Mode line background attribute ansflgs db 0 ; ANSI/VT100 mode flags ; (flags are defined in mssdefs.h) vtflags db 0 ; VT100 SETUP flags ; (SETUP flags are defined in mssdefs.h) tmpflags db 0 ; (Temporary for asnrei/stblmds) ; (tab stops are stored here) tabs db swidth dup (?) ; active tab stops deftabs db swidth dup (?) ; default tab stops vttabs dw 0 ; Pointer to default VT100 tab stops ; byte per line, type of line: 0=normal, 1=double wide, 2=double high linetype db slen dup (0) linelen db 79 ; active screen line length (79, 131) low_rgt dw 0 ; text screen dimensions ; byte low_rgt = max columns (79) ; byte low_rgt+1 = max rows (23) oldscrn dw 0 ; old screen. hi=rows-1, low=cols-1 ttkbi db 0 ; Flag for keyboard input seen ; Scrolling region - do not separate or change order of mar_top & mar_bot mar_top db ? ; Scrolling region top margin mar_bot db ? ; Scrolling region bottom margin scroll db 1 ; lines to scroll led_col equ 65 ; column position for "LEDs" display led_off equ '.' ; "Off" LED ansleds db 'VT102 ....' ; "LEDs".Terminal ident (10 bytes) v52leds db ' VT52 ' ; This is used in VT52 mode h19leds db ' Heath-19 ' ; For Heath-19 mode nansarg db 0 ; Index for ANSI argument list ansargs db 16 dup (0) ; Room for 16 ANSI arguments lansarg equ $-ansargs ; Max number of ANSI arguments ; printer support data anspflg db 0 ; printer flag bits and definitions vtautop equ 1 ; autoprint enabled (1) vtcntp equ 2 ; controller print enabled (1) vtextp equ 4 ; printer extent set (1) vtffp equ 8 ; form feed wanted at end of print (1) datas ends