home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
KERMIT
/
CP411SRC.ARK
/
cpxmrl.asm
< prev
next >
Wrap
Assembly Source File
|
1991-04-23
|
10KB
|
455 lines
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