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
/
cpxsyo.asm
< prev
next >
Wrap
Assembly Source File
|
1991-04-23
|
11KB
|
390 lines
IF NOT lasm
.printx * CPXSYO.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.
;
; This file contains the system dependent part for Sanyo MBC 1100
; systems, and has been extracted from the CPMSYO.ASM code (kermit
; version 3.5)
;
; revision history:
;
; edit 1, 27 October, 1987, by OBSchou. Extracted Sanyo code from CPMSYO.ASM
; and massaged fort CP/M kermit V4.09
;
; Keep module name, edit number, and last revision date in memory.
family: db 'CPXSYO.ASM (1) 27-Oct-87 $'
;
; Assembly time message to let me know I'm building the right version.
; LASM generates an 'S' error along with the message, which is messy, but
; better than trying to put everything inside a IF m80 OR mac80 conditional,
; because LASM doesn't like nested IF's, either.
IF sanyo
.printx * Assembling Kermit-80 for Sanyo MBC 1100 *
ENDIF
iobyte EQU 03H ;Location of I/O byte
if sanyo
baudrt EQU 0DAH ;BAUD RATE MEMORY LOCATION
MNPORT EQU 0DCH ;COMMUNICATIONS PORT
MNPRTS EQU 0DDH ;COMMUNICATIONS PORT STATUS
OUTPUT EQU 01H ;OUTPUT READY BIT
INPUT EQU 02H ;INPUT READY BIT
ENDIF;SANYO
defesc EQU '\'-100O ;The default escape character.
; Select initial setting for VT-52 emulation flag.
vtval EQU 1
sysxin: ;system initialisation not covered by sysinit
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
;
;
; 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
inhlps:
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...
ret
; sysflt - system-dependent filter.
; called with the character in E.
; 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 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 ;[30] get character to test
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:
ret
;
; 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 identical bytes or 1 word)
; [Toad Hall]
IF sanyo
spdtbl EQU 0 ; No speed table for the Sanyo
sphtbl EQU 0 ; ditto help for speed.
; The following conditionals were once a huge if not statement. There
; wasn't enough room to add the lobo to the list, so it had to be broken
; into 2, which you can't do with an if not. I redid it as two ifs and
; applied them to those that wouldn't set baud. [Hal Hostetler]
;
; This is the system-dependent SET PORT command.
; HL contains the argument from the command table.
sysprt:
ret
;
;
; Port table not applicable tot he Sanyo...
prttbl EQU 0
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:
IF inout
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
ENDIF;inout
;
;
; get character from modem; return zero if none available.
; for IOBYT systems, the modem port has already been selected.
; destroys bc, de, hl.
inpmdm:
IF inout
;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.
ENDIF;inout
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
ENDIF;NOT (robin OR dmII OR osi OR vector OR termin)
ret ; Can the Sany do cursor opsitioning??
;
;
; 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
call 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 SANYO
outlin: DB ESC,'E',ESC,'H',CR,LF,TAB ;WHATEVER
sysver: DB 'KERMIT-80 V3.9 [SANYO MBC-1100]',CR,LF,'$' ;VERSION HEADING
DELSTR: DB ESC,'K','$' ;WHATS A STRING?
eralin: DB ESC,'P','$' ;CLEAR SPACE
;CLRLIN: DB ESC,'K','$' ;CLEAR LINE
erascr: DB ESC,'E',ESC,'H','$' ;CLEAR SCREEN AND CURSOR HOME
curldn: db esc,'=','$',0 ;cursor lead in
;SCRNP: DB ESC,'=',24H,25H,'$' ;SPOT FOR SCREEN PACKETS
;SCRNRT: DB ESC,'=',25H,25H,'$' ;SPOT FOR # OF RETRIES
;SCRFLN: DB ESC,'=',26H,25H,'$' ;SPOT FOR FILE NAME
;SCRST: DB ESC,'=',28H,25H,'$' ;SPOT FOR STATUS
;SCREND: DB ESC,'=',2AH,25H,'$' ;SPOT FOR PROMPT
;SCRERR: DB ESC,'=',2DH,25H,'$' ;SPOT FOR ERRORS
ttab: ;NO TRANSLATION TABLE
ta: DB ESC,'A',0,0 ;CURSOR UP
tb: DB ESC,'B',0,0 ;CURSOR DOWN
tc: DB ESC,'D',0,0 ;CURSOR RIGHT
td: DB ESC,'C',0,0 ;CURSOR LEFT
te: DB ESC,'E',0,0 ;CLEAR SCREEN
tf: DB 0,0,0,0 ;WHAT???
tg: DB 0,0,0,0 ;WHAT???
th: DB ESC,'H',0,0 ;CURSOR HOME
ti: DB ESC,'A',ESC,'C',0,0 ;REVERSE LINEFEED??
tj: DB ESC,'J',0,0 ;CLEAR TO END OF SCREEN
tk: DB ESC,'K',0,0 ;CLEAR TO END OF LINE
ENDIF;SANYO
ovlend equ $ ; End of overlay
END