aboutsummaryrefslogtreecommitdiff
path: root/src/cpxvdu.asm
diff options
context:
space:
mode:
authorJeff Armstrong <jeff@approximatrix.com>2026-10-25 17:42:06 -0400
committerJeff Armstrong <jeff@approximatrix.com>2026-10-25 17:42:06 -0400
commitebb2ff2af569d5822b70ee555a32d27cf7494816 (patch)
tree7ac5e7b3fa73f7a8d996129086932ecce66374ad /src/cpxvdu.asm
downloadkermit-80-ebb2ff2af569d5822b70ee555a32d27cf7494816.tar.gz
kermit-80-ebb2ff2af569d5822b70ee555a32d27cf7494816.zip
Initial import of 4.11HEADmain
Diffstat (limited to 'src/cpxvdu.asm')
-rw-r--r--src/cpxvdu.asm462
1 files changed, 462 insertions, 0 deletions
diff --git a/src/cpxvdu.asm b/src/cpxvdu.asm
new file mode 100644
index 0000000..332fd8f
--- /dev/null
+++ b/src/cpxvdu.asm
@@ -0,0 +1,462 @@
+IF NOT lasm
+.printx * CPXVDU.ASM *
+ENDIF ;NOT lasm
+; KERMIT - (Celtic for "FREE")
+;
+; This is the CP/M-80 implementation of the Columbia University
+; KERMIT file transfer protocol.
+;
+; Version 4.0
+;
+; Copyright June 1981,1982,1983,1984
+; Columbia University
+;
+; Originally written by Bill Catchings of the Columbia University Center for
+; Computing Activities, 612 W. 115th St., New York, NY 10025.
+;
+; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
+; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
+; others.
+;
+;edit 6, 12-Oct-1990 by MF. Added a semicolon to the comment "If we
+; need cursor ..." so it isn't seen as an undefined symbol
+; edit 5, 20 July by OBSchou. Put in the cursor positioning code for
+; all the terminal supported, and moved the vtval EQUs and defesc EQUs
+; here if the system requires andn external terminal. If the system
+; has a 'built in' terminal (ie own scrteen driver) you will not come
+; to this file, so you must declare these three lables etc in your
+; own code.
+; This will allow only those systems requiring a terminal to require
+; CPXVDU.ASM during assembly.
+;
+; edit 4, 16 July, 1987 by OBSchou for will Rose.
+; Added code for Ampro 230 terminal
+;
+; edit 3, 15 July, 1987 by OBSchou for David Moore. Added adm22 terminal
+; codes.
+;
+; edit 2 21 May, 1987 by OBSchou. Added in definitions for Hazeltine 1500
+; submitted by Colin Burns of the Institute of Neurological Sciences
+; in Glasgow.
+; edit 1 ??? date. Split the terminal codes off from the CPXSYS.ASM file
+;
+vduver: db 'CPXVDU.ASM (6) 12-Oct-1990 $' ;file, edit version,, date.
+
+
+; First, print out what terminal (if any) we are assembling for
+
+IF crt
+.printx * generic CRT selected *
+ENDIF
+
+IF adm3a
+.printx * ADM3A selected *
+ENDIF
+
+IF adm22
+.printx * ADM22 selected *
+ENDIF
+
+IF smrtvd ;[7]
+.printx * Netronics Smartvid-80 selected *
+ENDIF ;[7]
+
+IF tvi912
+.printx * TVI912/920 selected *
+ENDIF
+
+IF tvi925
+.printx * TVI925 selected *
+ENDIF
+
+IF vt52
+.printx * VT52 selected *
+ENDIF
+
+IF vt100
+.printx * VT100 selected *
+ENDIF
+
+IF am230
+.printx * Ampro 230 terminal selected *
+ENDIF
+
+IF wyse
+.printx * Wyse 100 terminal selected *
+ENDIF
+;
+
+;
+; If we need cursor positioning, here is the code to do it
+;
+; Screen manipulation routines
+; csrpos - move to row B, column C
+;
+; csrpos for terminals that use a leadin sequence followed
+; by (row + 31.) and (column + 31.)
+;
+IF NOT (vt100 OR crt OR h1500)
+csrpos: push b ; save coordinates
+ lxi d,curldn ; get cursor leadin sequence
+ call prtstr ; print it
+ pop h ; restore coordinates
+ mov a,h ; get row
+ adi (' '-1) ; space is row one
+ mov e,a
+ push h
+ call outcon ; output row
+ pop h
+ mov a,l ; get column
+ adi (' '-1) ; space is column one
+ mov e,a
+ jmp outcon ; output it and return
+ENDIF;NOT (vt100 OR crt OR h1500)
+;
+;
+;
+;
+; csrpos for ANSI terminals
+;
+IF vt100
+csrpos: push b ; save coordinates
+ lxi d,curldn ; get cursor leadin sequence
+ call prtstr ; print it
+ pop h ; peek at coordinates
+ push h ; then save away again
+ mov l,h ; l = row
+ mvi h,0 ; hl = row
+ call nout ; output in decimal
+ mvi e,';' ; follow with semicolon
+ call outcon ; print it
+ pop h ; restore column
+ mvi h,0 ; hl = column
+ call nout
+ mvi e,'H' ; terminate with 'move cursor' command
+ jmp outcon ; output it and return
+ENDIF;vt100
+
+;Definition for Hazeltine 1500 does things a little strange.
+;
+IF h1500
+csrpos: push b ; save coordinates
+ lxi d,curldn ; get cursor leadin sequence
+ call prtstr ; print it
+ pop h ; restore coordinates
+ mov a,l ; get col
+ nop
+ nop
+; adi (' '-1) ; space is row one
+ mov e,a
+ push h
+ call outcon ; output row
+ pop h
+ mov a,h ; get row
+ adi (' '-1) ; space is column one
+ mov e,a
+ jmp outcon ; output it and return
+ENDIF; h1500
+
+
+IF crt ; systems without cursor positioning
+csrpos: ret ; dummy routine referenced by linkage section
+ENDIF;crt
+;
+;
+;
+; Now for the rest of CPXVDU.ASM
+;
+;
+;
+IF crt ;Set flags etc for systems with CRT selected
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+vtval EQU 0FFH ; we can't support VT52 emulation
+ttytyp: db 'Generic (Dumb) CRT Terminal type selected $'
+ENDIF;crt
+
+;
+
+IF vt52 ; DEC VT52
+ttytyp: db 'VT52$'
+ENDIF;vt52
+
+IF vt52
+vtval EQU 0 ; we don't need VT52 emulation
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+outlin: db esc,'H',esc,'J',cr,lf,tab,tab,'$'
+erascr: db esc,'H',esc,'J$' ;Clear screen and go home.
+eralin: db cr,esc,'K$' ;Clear line.
+curldn: db esc,'Y$' ;cursor leadin
+ttab: ;Table start location.
+ta: db esc,'A$',0 ;Cursor up.
+tb: db esc,'B$',0 ;Cursor down.
+tc: db esc,'C$',0 ;Cursor right.
+td: db esc,'D$',0 ;Cursor left
+te: db esc,'E$',0 ;Clear display
+tf: db esc,'F$',0 ;Enter Graphics Mode
+tg: db esc,'G$',0 ;Exit Graphics mode
+th: db esc,'H$',0 ;Cursor home.
+ti: db esc,'I$',0 ;Reverse linefeed.
+tj: db esc,'J$',0 ;Clear to end of screen.
+tk: db esc,'K$',0 ;Clear to end of line.
+ENDIF;vt52
+;
+
+IF adm22
+vtval EQU 1 ; we can do VT52 emulation
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+ttytyp: db 'ADM22$'
+outlin: db 1ah,cr,lf,tab,tab,'$'
+erascr: db 1ah,'$' ;Clear screen and go home.
+eralin: db esc,'>$' ;Clear line.
+curldn: db esc,'=$' ;Cursor lead-in
+ttab: ;Table start location.
+ta: db 0BH,'$',0,0 ;Cursor up.
+tb: db lf,'$',0,0 ;Cursor down.
+tc: db 0CH,'$',0,0 ;Cursor right.
+td: db bs,'$',0,0 ;Cursor left
+te: db 1ah,':$',0 ;Clear display
+tf: db '$',0,0,0 ;(can't) Enter Graphics Mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 1EH,'$',0,0 ;Cursor home.
+ti: db 0BH,'$',0,0 ;Reverse linefeed.
+tj: db esc,'Y$',0 ;Clear to end of screen.
+tk: db esc,'T$',0 ;Clear to end of line.
+ENDIF;adm22
+;
+
+IF am230
+; Select initial setting for VT-52 emulation flag.
+vtval EQU 1
+defesc EQU '\'-100O ;The default is Control-\ -- it's easier
+ttytyp: db 'Am230$'
+outlin: db 'Z'-64,0,0,cr,lf,'$'
+erascr: db 'Z'-64,0,0,'$' ;Clear screen and home
+eralin: db esc,'R$',0 ;Erase line
+curldn: db cr,esc,'=$' ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 'K'-64,'$',0,0 ;Cursor up, stop at top
+tb: db 'V'-64,'$',0,0 ;Cursor down, stop at bottom
+tc: db 'L'-64,'$',0,0 ;Cursor right, stop at right
+td: db 'H'-64,'$',0,0 ;Cursor left, stop at left
+te: db 'Z'-64,0,0,'$' ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 1EH,'$',0,0 ;Cursor home
+ti: db esc,'j$',0 ;Reverse linefeed, scroll
+tj: db esc,'Y$',0 ;Clear to end of sreen
+tk: db esc,'T$',0 ;Clear to end of line
+ENDIF
+;
+;
+
+
+IF vt100
+ttytyp: db 'VT100$'
+ENDIF;vt100
+
+
+IF vt100
+; Note that we cannot support Graphics Mode or the H19 erase-screen command
+; (<esc>E), because the sequences are more than three bytes.
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+vtval EQU 0 ; we probably don't want VT52 emulation
+outlin: db esc,3CH,esc,'[H',esc,'[J',cr,lf,tab,tab,'$'
+erascr: db esc,'[H',esc,'[J$' ;Clear screen and go home.
+eralin: db cr,esc,'[K$' ;Clear line.
+curldn: db esc,'[$' ; Cursor leadin
+ttab:
+ta: db esc,'[A$' ; Cursor up.
+tb: db esc,'[B$' ; Cursor down.
+tc: db esc,'[C$' ; Cursor right.
+td: db esc,'[D$' ; Cursor left
+te: db '$',0,0,0 ; (can't) Clear display
+tf: db '$',0,0,0 ; (don't) Enter Graphics Mode
+tg: db '$',0,0,0 ; (don't) Exit Graphics mode
+th: db esc,'[H$' ; Cursor home.
+ti: db esc,'M$',0 ; Reverse linefeed.
+tj: db esc,'[J$' ; Clear to end of screen.
+tk: db esc,'[K$' ; Clear to end of line.
+ENDIF;vt100
+;
+
+IF gener or cpm3
+sysver: db 'Generic CP/M-80$'
+ENDIF;gener or cpm3
+
+
+IF soroq ;[29] Should this not be with terminals.....
+ttytyp: db 'Soroc IQ-120$'
+outlin: db 1EH,esc,'Y',cr,lf,tab,tab,'$'
+erascr: db 1EH,esc,'Y$' ;clear screen and home cursor
+eralin: db cr,esc,'T$' ;clear line
+curldn: db esc,'=$' ;cursor lead-in string
+delstr: db bs,' ',bs,bs,'$' ;??adjust for echoing delete
+ttab: ;table start location
+ta: db 0BH,'$',0 ;cursor up
+tb: db 0AH,'$',0 ;cursor down
+tc: db 0CH,'$',0 ;cursor right
+td: db 08H,'$',0 ;cursor left
+te: db esc,'*$',0 ;clear display (homes cursor)
+tf: db esc,')$',0 ;enter inverse video mode
+tg: db esc,'($',0 ;exit inverse video mode
+th: db 01EH,'$',0 ;home cursor
+ti: db 0BH,'$',0 ;reverse linefeed (insert line)
+tj: db esc,'Y$',0 ;clear to end of screen
+tk: db esc,'T$',0 ;clear to end of line
+ENDIF;soroq
+
+IF crt
+outlin: db cr,lf,'Starting ...$'
+erascr equ crlf ;"Home & clear" (best we can do).
+eralin: db '^U',cr,lf,'$' ;Clear line.
+prpack: db cr,lf,'RPack: $'
+pspack: db cr,lf,'SPack: $'
+ttab equ 0 ; no VT52 table
+ENDIF;crt
+;
+
+IF tvi912
+vtval EQU 1 ; we do emulation
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+ttytyp: db 'TVI912/920$'
+outlin: db 'Z'-64,0,0,cr,lf,'$'
+erascr: db 'Z'-64,0,0,'$' ;Clear screen and home
+eralin: db esc,'Y$',0 ;Clear to end of sreen
+curldn: db cr,esc,'=$' ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 'K'-64,'$',0,0 ;Cursor up, stop at top
+tb: db 'J'-64,'$',0,0 ;Cursor down, stop at bottom
+tc: db 'L'-64,'$',0,0 ;Cursor right, stop at right
+td: db 'H'-64,'$',0,0 ;Cursor left, stop at left
+te: db 'Z'-64,0,0,'$' ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 1EH,'$',0,0 ;Cursor home
+ti: db esc,'j$',0 ;Reverse linefeed, scroll
+tj: db esc,'Y$',0 ;Clear to end of sreen
+tk: db esc,'T$',0 ;Clear to end of line
+ENDIF;tvi912
+;
+;
+
+IF tvi925
+;(incidentally, works fine for Freedom 100 also [Toad Hall])
+;adm3a entry and tvi925 entry separated to remove warning message.
+vtval EQU 1 ; we VT52 emulation
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+ttytyp: db 'TVI925$'
+outlin: db 'Z'-64,0,0,cr,lf,'$'
+erascr: db 'Z'-64,0,0,'$' ;Clear screen and home
+eralin: db esc,'Y$',0 ;Clear to end of sreen
+curldn: db cr,esc,'=$' ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 'K'-64,'$',0,0 ;Cursor up, stop at top
+tb: db 'V'-64,'$',0,0 ;Cursor down, stop at bottom
+tc: db 'L'-64,'$',0,0 ;Cursor right, stop at right
+td: db 'H'-64,'$',0,0 ;Cursor left, stop at left
+te: db 'Z'-64,0,0,'$' ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 1EH,'$',0,0 ;Cursor home
+ti: db esc,'j$',0 ;Reverse linefeed, scroll
+tj: db esc,'Y$',0 ;Clear to end of sreen
+tk: db esc,'T$',0 ;Clear to end of line
+ENDIF;tvi925
+;
+;
+
+IF adm3a
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+ttytyp: db 'ADM3A$'
+outlin: db 'Z'-64,0,0,cr,lf,'$'
+erascr: db 'Z'-64,0,0,'$' ;Clear screen and home
+eralin: db esc,'Y$',0 ;Clear to end of sreen
+curldn: db cr,esc,'=$' ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 'K'-64,'$',0,0 ;Cursor up, stop at top
+tb: db 'J'-64,'$',0,0 ;Cursor down CTRL-J
+tc: db 'L'-64,'$',0,0 ;Cursor right, stop at right
+td: db 'H'-64,'$',0,0 ;Cursor left, stop at left
+te: db 'Z'-64,0,0,'$' ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 1EH,'$',0,0 ;Cursor home
+ti: db 'K'-64,'$',0,0 ;Reverse linefeed
+tj: db '$',0,0,0 ;(can't) Clear to end of screen
+tk: db '$',0,0,0 ;(can't) Clear to end of line
+ENDIF;adm3a
+
+
+IF smrtvd ; [7] new terminal
+vtval EQU 1 ; we do VT52 emulation
+defesc EQU '\'-100O ; escpae character, ok?
+ttytyp: db 'Smartvid-80$'
+outlin: db esc,'+',cr,lf,tab,tab,'$'
+eralin: db cr,esc,'T$' ;Clear to end of line.
+erascr: db esc,'+$' ;Clear screen and go home.
+curldn: db esc,'=$' ;Cursor lead-in
+ttab: ;Table start location.
+ta: db ('K'-100O),'$',0,0 ;Cursor up.
+tb: db 12O,'$',0,0 ;Cursor down.
+tc: db ('A'-100O),'$',0,0 ;Cursor right.
+td: db ('H'-100O),'$',0,0 ;Cursor left.
+te: db ('L'-100O),'$',0,0 ;Clear screen and home cursor
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db ('Z'-100O),'$',0,0 ;Cursor home.
+ti: db ('K'-100O),'$',0,0 ;Reverse linefeed.
+tj: db esc,'Y$',0 ;Clear to end of screen.
+tk: db esc,'T$',0 ;Clear to end of line.
+ENDIF;smrtvd
+
+IF h1500
+vtval EQU 1 ; we can do VT52 emulation
+defesc EQU '\'-100O ;Still Control-\ (just ran out of room...)
+ttytyp: db 'Hazeltine$'
+outlin: db 7eh,1ch,7eh,12h,'$'
+erascr: db 7eh,1ch,7eh,12h,'$' ;Clear screen and home
+eralin: db 7eh,13h,'$',0 ;Clear to end of sreen
+curldn: db 7eh,11h,'$',0 ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 7eh,0ch,'$',0 ;Cursor up, stop at top
+tb: db 7eh,0bh,'$',0 ;Cursor down CTRL-J
+tc: db 10h,'$',0,0 ;Cursor right, stop at right
+td: db 8h,'$',0,0 ;Cursor left, stop at left
+te: db 7eh,1ch,'$',0 ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;(can't) Enter Graphics mode
+tg: db '$',0,0,0 ;(can't) Exit Graphics mode
+th: db 7eh,0ch,'$',0 ;Cursor home
+ti: db 7eh,0ch,'$',0 ;Reverse linefeed
+tj: db '$',0,0,0 ;(can't) Clear to end of screen
+tk: db 7eh,0fh,'$',0 ;Clear to end of line
+ENDIF;h1500
+
+IF wyse ;[gv]
+vtval equ 1 ; we can do VT52 emulation
+defesc EQU '\' ;Still Control-\ (just ran out of room...)
+ttytyp: db ' [Wyse 100]',cr,lf,'$'
+outlin: db esc,'+$',0 ;Clear screen and home
+erascr: db esc,'+$',0 ;Clear screen and home
+eralin: db esc,'Y$',0 ;Clear to end of sreen
+curldn: db cr,esc,'=$' ;Cursor lead-in
+ttab: ;Table start location ;(MUST be 4 bytes each)
+ta: db 03h,'$',0,0 ;Cursor up, stop at top
+tb: db lf,'$',0,0 ;Cursor down, stop at bottom
+tc: db ff,'$',0,0 ;Cursor right, stop at right
+td: db bs,'$',0,0 ;Cursor left, stop at left
+te: db sub,0,0,'$' ;Clear display (2 pad nulls)
+tf: db '$',0,0,0 ;Enter Graphics mode NONE
+tg: db '$',0,0,0 ;Exit Graphics mode NONE
+th: db 1eh,'$',0,0 ;Cursor home
+ti: db esc,'v$',0 ;Reverse linefeed, scroll ???
+tj: db esc,'Y$',0 ;Clear to end of sreen
+tk: db esc,'T$',0 ;Clear to end of line
+ENDIF;wyse
+
+
+
+ovlend equ $ ; End of overlay
+
+IF lasm ;Not really needed, as M80 ignores END in include files
+ END
+ENDIF ;lasm