diff options
| author | Jeff Armstrong <jeff@approximatrix.com> | 2026-10-25 17:42:06 -0400 |
|---|---|---|
| committer | Jeff Armstrong <jeff@approximatrix.com> | 2026-10-25 17:42:06 -0400 |
| commit | ebb2ff2af569d5822b70ee555a32d27cf7494816 (patch) | |
| tree | 7ac5e7b3fa73f7a8d996129086932ecce66374ad /src/cpxgni.asm | |
| download | kermit-80-ebb2ff2af569d5822b70ee555a32d27cf7494816.tar.gz kermit-80-ebb2ff2af569d5822b70ee555a32d27cf7494816.zip | |
Diffstat (limited to 'src/cpxgni.asm')
| -rw-r--r-- | src/cpxgni.asm | 440 |
1 files changed, 440 insertions, 0 deletions
diff --git a/src/cpxgni.asm b/src/cpxgni.asm new file mode 100644 index 0000000..615103f --- /dev/null +++ b/src/cpxgni.asm @@ -0,0 +1,440 @@ +; CPXGNI.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 +; Genie 3 CPM kermit +; +; This has the Family name of CPXGNI.ASM. +; +; revision history (last edit first) +; edit 3: 27 October, a987 by OBSchou. Massaged file to suit V4.09 structure. +; +; 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 Eaca Genie 3 * +; +drtime EQU 05H ;Default receive time out interval. +; +; the basics... +; +mnport EQU 0E8H +mnprts EQU 0EDH +output EQU 20H +input EQU 01H +lctrl EQU 0EBH +divlsb EQU 0E8H +divmsb EQU 0E9H +z80 EQU TRUE +brkval EQU 40H + +defesc EQU ']'-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 'CPXGNI.ASM (3) 27-Oct-87$' ; 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,83H ;enable DLAB by setting bit 7 + out lctrl ;and outputting to control port + mvi a,14H ;get word = 20 decimal + out divlsb ;and put it out + mvi a,00H ;as two separate + out divmsb ;bytes + lda pstore ;get parity etc + out lctrl ;do it resetting DLAB at same time + + 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 <escape>?, 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 +; +; 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 ;and restoring value from parity store + out mnprts +; + 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: <xon>,<xoff>,<del>, and <nul> 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 ; get character to a + 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 + mvi a,83H ;enable DLAB by setting bit 7 + out lctrl ;and outputting to control port + mov a,d ;get LSB + out divlsb ;and put it out + mov a,e ;get MSB + out divmsb ;output it as well + lda pstore ;get parity etc + out lctrl ;do it resetting DLAB at same time + ret + +pstore: db 03H ;Default value for parity word length and stop bits + +spdtbl: db 11h ;17 entries + db 03h,'110$', 06H,0D1H + db 04h,'1200$', 00H,0A0H + db 05h,'134.5$', 05H,94H + db 03h,'150$', 05H,00H + db 04h,'1800$', 00H,6BH + db 05h,'19200$', 00H,0AH + db 04h,'2000$', 00H,60H + db 04h,'2400$', 00H,50H + db 03h,'300$', 02H,80H + db 04h,'3600$', 00H,35H + db 05h,'38400$', 00H,05H + db 04h,'4800$', 00H,28H + db 02h,'50$', 0FH,00H + db 03h,'600$', 01H,40H + db 04h,'7200$', 00H,1BH + db 02h,'75$', 0AH,00H + db 04h,'9600$', 00H,14H + +sphtbl: db cr,lf,' 50 75 110 134.5 150 300 600 1200' + db cr,lf,' 1800 2000 2400 3600 4800 7200 9600 19200 38400$' + +; 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 Genie III screen +; +sysver: db 'Eaca Genie III$' +outlin: db 1aH,cr,lf,' $' +erascr: db 1AH,'$' +eralin: db cr,18H,'$' +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 esc,'R$',0 ;Reverse on +tg: db esc,'S$',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 18H,'$',0,0 ;Clear to end of line + +ovlend equ $ ;End of overlay + +END + + + + + |
