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 ?, 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: ,,, and 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