;CPXTM4.ASM ; 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,1985 ; 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. ; ; This file contains the system-dependent code and data for various ; Tandy Model 4 running under Montezuma Micro CPM ; ; This has the Family name of CPXTM4.ASM. ; ; revision history (last edit first) ; ; edit 5, 8-Feb-1991 by Lance Tagliapietra of the University of Wisconsin- ; Platteville. Corrected error in the VT52 translation table for ; clearing from the cursor to the end of the line. ; ; edit 4, 27 October, 1987 by OBSchou. Massaged into format suitable ; for overlay version 4.09 ; ; Edit 3: Sept 5 1987 GDS Transformed code from Genie III to Tandy Model 4 ; ; Edit 2: Aug 27 1987 GDS Put in code for BREAK and fillited out ; a lot of unnecessary IF's ; ;Edit 1: Nov. 28, 1986 Geof Smith Clinical Research centre Harrow UK. .printx * Assembling for Tandy Model 4* ; drtime EQU 05H ;Default receive time out interval. ; ; the basics... ; mnport EQU 0EBH mnprts EQU 0EAH output EQU 40H input EQU 80H lctrl EQU 0E8H baudpt EQU 0E9H z80 EQU TRUE brkval EQU 0H inout EQU TRUE defesc EQU 'X'-100O ;The default escape character. ;Select initial setting for VT-52 emulation flag. ; default to VT52-EMULATION ON. ; vtval EQU 1 ; ; ; Family is the string used in VERSION to say which of several ; smaller overlay files are used. These are (will be) derived from ; the huge CP4SYS.ASM file, in which case we will never get here. ; Just a Dollar, but put a sting in for a family of machines. ; family: db 'CPXTM4.ASM (5) 8-Feb-91$' ; Used for family versions.... ; ; System-dependent initialization ; Called once at program start. sysxin: ; ;Set up 9600 bd, 8bit words, no parity 1stop bit mvi a,0EEH ;Get byte for desired baud (9600 = CC) and out baudpt ;and put it out of baud port out lctrl ;latch control port with anything lda pstore ;get parity etc and put it out of out mnprts ;port ret ; return from system-dependent routine ; ; ; system-dependent termination processing ; If we've changed anything, this is our last chance to put it back. sysexit: ret ; ; system-dependent processing for start of CONNECT command ; syscon: ret conmsg: ; Messages printed when entering transparent (CONNECT) mode: ;------------------------------------------------------------------------------- ; -- ; ; syscls - system-dependent close routine ; called when exiting transparent session. ; syscls: ret ;------------------------------------------------------------------------------- ; --- ; ; sysinh - help for system-dependent special functions. ; called in response to ?, after listing all the ; system-independent escape sequences. ; sysinh: lxi d,inhlps ; we got options... call prtstr ; print them. ret ;additional, system-dependent help for transparent mode ; (two-character escape sequences) inhlps: db cr,lf,'B Transmit a BREAK' db '$' ;[hh] table terminator ; ; sysint - system dependent special functions ; called when transparent escape character has been typed; ; the second character of the sequence is in A (and in B). ; returns: ; non-skip: sequence has been processed ; skip: sequence was not recognized sysint: ani 137O ; convert lower case to upper, for testing... cpi 'B' ; send break? jz sendbr ; yes, go do it. return nonskip when through. jmp rskp ; take skip return - command not recognized. ;------------------------------------------------------------------------------- sendbr: ; ; Ensure that the transmitter has finished sending buffered chars sndbr1: in mnprts ; get UART status ani output ; everything sent? jz sndbr1 ; no, wait a bit more ; ; Begin sending a break by setting bit in UART command register mvi a,brkval ; SBreak, out lctrl out mnprts ; ; Wait for 250 milliseconds (using hundredths second delay routine) mvi a,25 call delay ; ; Resume normal operation by clearing the SendBreak command bit lda pstore ;get parity etc value out lctrl ;latch control port out mnprts ;and set values ; ret ;done ; ; ; ; sysflt - system-dependent filter ; called with character in E. ; if this character should not be printed, return with A = zero. ; preserves bc, de, hl. ; note: ,,, and are always discarded. sysflt: mov a,e ; get character for testing ret ; mdmflt - modem filter [30] ; called with character to be sent to modem in E ; with parity set as appropriate. ; return with accumulator = 0 do do nothing, ; <> 0 to send char in E. mdmflt: mov a,e ret ; prtflt - printer filter [30] ; called with character to be sent to printer in E ; returns with a = 0 to do nothing ; a <> 0 to print it. ; ; this routine for those printer that automatically insert ; a lf on cr, or cr for lf. Should this be shifted to ; the system indep. stuff, in say 4.06? prtflt: mov a,e ; [30] get character to test ret ; ; ; system-dependent processing for BYE command. ; for apmmdm, heath, and lobo, hang up the phone. sysbye: ret ; ; This is the system-dependent command to change the baud rate. ; DE contains the two-byte value from the baud rate table; this ; value is also stored in 'speed'. sysspd: ;Set up baud rate 8bit words, no parity 1stop bit mov a,e ;get get speed into a out baudpt ;output it as well lda pstore ;get parity etc out lctrl ;do it resetting DLAB at same time out mnprts ret pstore: db 6CH ;Default value for parity word length and stop bits spdtbl: db 10h ;17 entries db 03h,'110$', 22H,22H db 04h,'1200$', 77H,77H db 05h,'134.5$', 33H,33H db 03h,'150$', 44H,44H db 04h,'1800$', 88H,88H db 05h,'19200$', 0FFH,0FFH db 04h,'2000$', 99H,99H db 04h,'2400$', 0AAH,0AAH db 03h,'300$', 55H,55H db 04h,'3600$', 0BBH,0BBH db 04h,'4800$', 0CCH,0CCH db 02h,'50$', 00H,00H db 03h,'600$', 66H,66H db 04h,'7200$', 0DDH,0DDH db 02h,'75$', 11H,11H db 04h,'9600$', 0EEH,0EEH sphtbl: db cr,lf,' 50 75 110 134.5 150 300 600 1200' db cr,lf,' 1800 2000 2400 3600 4800 7200 9600 19200 $' ; This is the system-dependent SET PORT command. ; HL contains the argument from the command table. sysprt: ret ; prttbl equ 0 ; SET PORT not supported prhtbl equ 0 ; ; ; selmdm - select modem port ; selcon - select console port ; selmdm is called before using inpmdm or outmdm; ; selcon is called before using inpcon or outcon. ; For iobyt systems, diddle the I/O byte to select console or comm port; ; For Decision I, switches Multi I/O board to console or modem serial ; port. [Toad Hall] ; For the rest, does nothing. ; preserves bc, de, hl. selmdm: ret selcon: ret ; ; Get character from console, or return zero. ; result is returned in A. destroys bc, de, hl. ; inpcon: mvi c,dconio ;Direct console I/O BDOS call. mvi e,0FFH ;Input. call BDOS ret ; ; Output character in E to the console. ; destroys bc, de, hl ; outcon: mvi c,dconio ;Console output bdos call. call bdos ;Output the char to the console. ret ; ; ; outmdm - output a char from E to the modem. ; the parity bit has been set as necessary. ; returns nonskip; bc, de, hl preserved. outmdm: in mnprts ;Get the output done flag. ani output ;Is it set? jz outmdm ;If not, loop until it is. mov a,e out mnport ;Output it. ret ;-------------------------------------------------------------------------- ; ; get character from modem; return zero if none available. ; for IOBYT systems, the modem port has already been selected. ; destroys bc, de, hl. inpmdm: ;Note: modem port should already be selected for mdI. [Toad Hall] in mnprts ;Get the port status into A. ani input ;See if the input ready bit is on. rz ;If not then return. in mnport ;If so, get the char. ret ; return with character in A ; ; flsmdm - flush comm line. ; Modem is selected. ; Currently, just gets characters until none are available. flsmdm: call inpmdm ; Try to get a character ora a ; Got one? jnz flsmdm ; If so, try for another ret ; Receiver is drained. Return. ;----------------------------------------------------------------------------- ; ; lptstat - get the printer status. Return a=0 if ok, or 0ffh if not. lptstat: xra a ; assume it is ok.. this may not be necessary ret ; ; outlpt - output character in E to printer ; console is selected. ; preserves de. outlpt: push d ; save DE in either case call prtflt ; go through printer filter [30] ana a ; if A = 0 do nothing, jz outlp1 ; [30] if a=0 do nothing mvi c,lstout call bdos ;Char to printer outlp1: pop d ; restore saved register pair ret ;------------------------------------------------------------------------------ ; ; 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.) ; 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 ; ; delchr - make delete look like a backspace. Unless delete is a printing ; character, we just need to print a backspace. (we'll output clrspc ; afterwards) ; For Kaypro and Vector General, delete puts a blotch on the screen. ; For Apple and Osborne 1, delete moves but doesn't print. delchr: mvi e,bs ;get a backspace jmp outcon ; erase the character at the current cursor position clrspc: mvi e,' ' call outcon mvi e,bs ;get a backspace jmp outcon ; erase the current line clrlin: lxi d,eralin jmp prtstr ; erase the whole screen, and go home. preserves b (but not c) clrtop: lxi d,erascr jmp prtstr ;[2] I see no real saving in having all screens in separate file and ;therefore have included screen definition here and commented out ;the link to VDU file ; ; ;Specific definitions for the Model IV screen ; sysver: db 'Tandy Model IV$' outlin: db 1aH,cr,lf,' $' erascr: db 1AH,'$' eralin: db cr,15H,'$' curldn: db esc,'=$' ttab: ta: db 0BH,'$',0,0 ;Cursor up tb: db 0AH,'$',0,0 ;Cursor down tc: db 0CH,'$',0,0 ;Cursor right td: db 08H,'$',0,0 ;Cursor left te: db 1AH,'$',0,0 ;Clear display tf: db 0FH,'$',0,0 ;Reverse on tg: db 0EH,'$',0,0 ;Reverse off th: db 1EH,'$',0,0 ;Cursor home ti: db 0BH,'$',0,0 ;Reverse linefeed tj: db 19H,'$',0,0 ;Clear to end of screen tk: db 15H,'$',0,0 ;Clear to end of line ovlend equ $ ;End of overlay END