aboutsummaryrefslogtreecommitdiff
path: root/src/cpxmrl.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/cpxmrl.asm
downloadkermit-80-main.tar.gz
kermit-80-main.zip
Initial import of 4.11HEADmain
Diffstat (limited to 'src/cpxmrl.asm')
-rw-r--r--src/cpxmrl.asm454
1 files changed, 454 insertions, 0 deletions
diff --git a/src/cpxmrl.asm b/src/cpxmrl.asm
new file mode 100644
index 0000000..31d6849
--- /dev/null
+++ b/src/cpxmrl.asm
@@ -0,0 +1,454 @@
+IF NOT lasm
+.printx * CPXMRL.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,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.
+;
+; CPXMRL.ASM created 16 July, 1987 from submitted code by William Rose.
+;
+; Kermit system dependent file for Rair Black Box (British Telecom
+; Merlin, ICL PC etc) originally submitted by William Rose, and
+; modified by OBSchou to work with the Kermit-80 V4.08 and later
+; files. Wills original overlay file a stripped down CPXSYS.ASM
+; file.
+;
+; KERSYS.ASM - version 0.6A dated 17 Jun 87.
+;
+; Cutdown CP4SYS.ASM for Telecom Merlin M2215 only. (ICL PC, Rair Black Box)
+;
+; This uses TTY1: only, and cannot alter it's parameters. It resets the
+; interrupt flag to prevent use of the buffer, and is generally a kludge.
+; However it runs at 4800 baud, and tidying the code might get 9600.
+;
+; Revision History (Last entry first)
+;
+; edit 2, 22 July by OBSchou to massage frile to fit with CPXCOM.ASM
+;
+; edit 1, 17 July by OBSchou for Will Rose, to make file suitable for V4.08
+; overlay etc.
+;
+; Keep module name, edit number, and last revision date in memory.
+;
+family: db 'CPXMRL.ASM (2) 22-Jun-87 $' ; Telecom Merlin added
+
+;
+; Assembly time message to let me know I'm building the right version.
+;
+
+IF m2215
+ .printx * Assembling Kermit-80 for Merlin M2215 *
+ENDIF
+
+IF m2215 ;equates removed because interrupts stopped port access
+;iobase equ 14h ; base address of TTY1
+;mnport equ iobase ; rx and tx data ports
+;mnprts equ iobase+1 ; status port
+;mnmode equ iobase+2 ; mode port
+;mncmd equ iobase+3 ; PCI command port
+;txrdy equ 1 ; tx ready bit set if free
+;output equ txrdy
+;rxrdy equ 2 ; RX ready bit
+;input equ rxrdy
+z80 equ false ; For Merlin M2215
+ENDIF
+
+
+sysxin: ; Continue system initialisation fro sysinit
+
+IF FALSE ; unable to penetrate the 8085 interrupts
+ in mncmd ; clear command register counter
+ mvi a,4eh ; 0100$1110 - 1 stop bit, 8 data bits,
+ ; / by 16 counter
+ out mnmode
+ mvi a,30h+7 ; 0011$0000 - select internal rate generator
+ ; use 1200 baud by default
+ out mnmode
+ mvi a,27h ; 0010$0111 - enable tx and rx, RTS and DTR low
+ out mncmd
+ mvi h, 12
+ mvi l, 12
+ shld speed ; to show its been set up
+
+ENDIF
+
+ ret
+
+porbuf: ds 3 ; original port settings
+
+;
+; system-dependent KERMIT 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:
+
+ db '$'
+
+;
+; 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:
+ ; still can't pentrate interrupts
+ ret
+
+; Additional, system-dependent help for transparent mode
+; (two-character escape sequences)
+;
+inhlps:
+
+IF m2215
+ db cr, lf, 'B Transmit a BREAK'
+ENDIF
+
+ db '$' ; string 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: seqence was not recognized
+;
+sysint: ani 137O ; convert lower case to upper, for testing...
+
+IF FALSE ; as always
+ cpi 'B' ; send break ?
+ jz sendbr
+ENDIF
+ jmp rskp ; take skip return - command not recognised
+
+; Actual commands
+
+IF FALSE ;as always
+sendbr:
+ in mnprts
+ ani 04h ; make sure shift reg is clear
+ jz sendbr
+
+ mvi a,2fh ; set for a break
+ out mncmd
+ mvi a,100 ; wait a bit
+ call delay
+ mvi a,27h ; restore mode
+ out mncmd
+
+ ret
+ENDIF
+
+ ret
+
+;
+; 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
+; called with character to be sent to printer 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 test
+ ret
+
+;
+; prtflt - printer filter
+; 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 ; get character to test
+
+IF FALSE ; strip out lf from printer stream
+ ani 7fh ; make sure it is parity less
+ cpi lf ; is it a line feed?
+ rnz ; no, print it
+; xra a ; yes, don't.
+
+ENDIF
+
+ ret
+
+;
+; system-dependent processing for BYE command.
+;
+sysbye:
+ ret
+
+;
+; This is the system-dependent command to change the baud rate.
+; DE contains the two-byte value from the baud rate table; both
+; bytes of this value are also stored in 'speed'.
+;
+sysspd:
+
+IF FALSE ; as always
+ in mncmd ; clear register counter
+ mvi a,4eh ; set for 1 stop, 8 data bits
+ out mnmode ; save in mode 1 port
+ mvi a,30h ; set bits for rate etc..
+ add e ; add baud rate (bits 0 - 3)
+ out mnmode ; set mode port 2
+ mvi a,27h ; set tx/rx ready, RTS CTS active
+ out mncmd
+ ret
+ENDIF
+ ret ; if routine not supported
+;
+; Speed tables
+; (Note that speed tables MUST be in alphabetical order for later
+; lookup procedures, and must begin with a value showing the total
+; number of entries. The speed help tables are just for us poor
+; humans.
+;
+; db string length, string, divisor (2 bytes or 1 word, ab)
+; the data byte a is return in A and E, and b in D
+; only byte 'a' is the key for the table
+
+IF FALSE ; as always
+spdtbl: db 16 ; sixteen entries for PCI
+ db 3,'110$', 2,2
+ db 4,'1200$', 7,7
+ db 3,'134$', 3,3
+ db 3,'150$', 4,4
+ db 4,'1800$', 8,8
+ db 5,'19200$', 15,15
+ db 4,'2000$', 9,9
+ db 4,'2400$', 10,10
+ db 3,'300$', 5,5
+ db 4,'3600$', 11,11
+ db 4,'4800$', 12,12
+ db 2,'50$', 0,0
+ db 3,'600$', 6,6
+ db 4,'7200$', 13,13
+ db 2,'75$', 1,1
+ db 4,'9600$', 14,14
+
+sphtbl: db ' 50 75 110 134 150 300 600 1200 '
+ db cr,lf,'1800 2000 2400 3600 4800 7200 9600 19200$'
+ENDIF
+
+IF m2215
+spdtbl equ 0 ; routine unsupported
+sphtbl equ 0
+ENDIF
+
+;
+; This is the system-dependent SET PORT command.
+; HL contains the argument from the command table.
+;
+sysprt:
+
+IF m2215
+prttbl equ 0 ; SET PORT is not supported
+prhtbl equ 0 ; Merlin M2215 could, I suppose
+ENDIF
+
+;
+; 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 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:
+ call 0f55dh ;CONST BIOS vector
+ ora a ;set flags
+ rz
+ call 0f56eh ;CONIN BIOS vector
+ ret
+
+;
+; Output character in E to the console.
+; destroys bc, de, hl
+;
+outcon:
+ mov c, e
+ call 0f57fh ;CONOUT BIOS vector
+ 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:
+
+IF m2215
+ push psw
+ push h
+ push d
+ push b
+
+ mov c, e
+ mvi a, 1 ; ie: tty1:
+ mov d, a
+ call 0f6a2h ;PUN BIOS vector
+
+ pop b
+ pop d
+ pop h
+ pop psw
+ENDIF
+
+ ret
+
+;
+; for IOBYT systems, the modem port has already been selected.
+; destroys bc, de, hl.
+;
+inpmdm:
+
+IF m2215
+ ; check status
+ lda 0fa32h ; ie. tty1:
+ ora a
+ rz
+
+ mvi a, 1 ; RDR BIOS vector
+ mov d, a
+ call 0f651h
+; ani 7fh
+
+ push a
+ di
+ mvi a, 0
+ sta 0fa32h ; remove interrupt flag
+ sta 0f2d3h ; zero buffer counter
+ lda 0f2d4h
+ sta 0f2d5h
+ ei
+ nop
+ pop a
+
+ ret
+ENDIF
+
+;
+; 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:
+IF iobyte ;[33]
+ call bprtst ; get status
+ENDIF ;iobyte[33]
+
+IF NOT iobyte ;[33]
+ xra a ; assume it is ok.. this may not be necessary
+ENDIF ;iobyte [33]
+ 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 ; if a=0 do nothing
+
+outlp1: pop d ; restore saved register pair
+ ret
+
+; 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)
+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
+
+
+IF m2215
+sysver: db 'BT Merlin M2215, port TTY1:, settings unchanged.$'
+ENDIF
+
+tstmsg: db 'Test message',cr,lf,'$'
+
+IF lasm
+LINK CPXVDU.ASM ; link to the Terminal definition tables
+ENDIF ;lasm