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
/
cpxnor.asm
< prev
next >
Wrap
Assembly Source File
|
1991-04-23
|
17KB
|
588 lines
IF NOT LASM
.printx * CPXNOR.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 code and data for various
; NorthStar KERMITs. This has the Family name of CPXNOR.ASM.
;
; revision history (last edit first)
;
;edit 4, 16-Jan-1991 by MF. Fixed a bug in OUTCON wherein the final RET
; was missing (bug reported by David P. Arnot of Scottish
; Agricultural College).
;edit 3, 12-Oct-1990 by MF. Added a semicolon before the comment
; beginning "Family is the string so we don't get errors
; edit 2, 23 July, 1987 by OBSchou to massage file to suit CPXCOM.ASM.
;
; edit 1: 1 June, 1986 by OBSchou, Loughborogh University, UK.
; Hived off northstar and Comart system dependent modules from
; CPXSYS.ASM. This assembles ok, but I cannot test it. Any comments?
IF norths
.printx * Assembling for NorthStar Horizon with HSIO-4 board *
ENDIF;norths
IF horizon ;[25]
.printx * Assembling KERMIT-80 for the NorthStar Horizon *
ENDIF;horizon
IF advant ;[22]
.printx * Assembling kermit-80 for North Star Advantage *
ENDIF ;[22]
IF basicns ;[29]
.printx * Assembling KERMIT-80 for the Northstar Horizon using printer port *
ENDIF ;basicns [29]
IF comart
.printx * Assembling KERMIT-80 for Comart Communicator *
ENDIF ; comart
; the basics...
IF norths ;The basic Northstar Horizon BIOS does not access ports 2-5
port0d equ 02h ;Port 0 data (console)
port0s equ 03h ;Port 0 status
port1d equ 04h ;Port 1 data (printer)
port1s equ 05h ;Port 1 status
port2b equ 10h ;Port 2 baud
port2i equ 11h ;Port 2 interrupt mask
port2d equ 12h ;Port 2 data
port2s equ 13h ;Port 2 status
port3b equ 14h ;Port 3 baud
port3i equ 15h ;Port 3 interrupt mask
port3d equ 16h ;Port 3 data
port3s equ 17h ;Port 3 status
port4b equ 18h ;Port 4 baud
port4i equ 19h ;Port 4 interrupt mask
port4d equ 1Ah ;Port 4 data
port4s equ 1Bh ;Port 4 status
port5b equ 1Ch ;Port 5 baud
port5i equ 1Dh ;Port 5 interrupt mask
port5d equ 1Eh ;Port 5 data
port5s equ 1Fh ;Port 5 status
NS19K2 EQU 00H ;19.2 kilobaud
NS9600 EQU 01H ;9600 baud
NS4800 EQU 02H ;4800 baud
NS2400 EQU 03H ;2400 baud
NS1200 EQU 04H ;1200 baud
NS0600 EQU 05H ; 600 baud
NS0300 EQU 06H ; 300 baud
NS0110 EQU 07H ; 110 baud
;; Set to use port 5 at 1200 baud
mnport equ port5d ;Data port
mnprts equ port5s ;Status port
baudrt equ port5b ;Baud rate port
baudini equ ns1200 ;Initial baud rate
output EQU 1 ;Bit of UART status for transmitter ready
input EQU 2 ;Bit of UART status for receiver ready
z80 EQU TRUE ;This one's a Z80.
ENDIF;norths
IF basicns ;[29]
mnport equ 04h ;printer port data
mnprts equ 05h ; printer port status
output equ 1 ;transmitter ready
input equ 2 ;receiver ready
z80 equ FALSE ; not important
ENDIF ;basicns [29]
IF horizon ;[25]
mnport EQU 004H ;Modem data port
mnprts EQU 005H ;Modem status port
output EQU 01H ;Transmitter empty
input EQU 02H ;Input data available
TxEmpty EQU 04h ;Transmitter empty
;Note: Needs terminal definition (vt100, vt52, tvi925, adm3a or crt above)
z80 EQU TRUE ;This one's a Z80.
ENDIF;horizon
IF advant ;[22]
vtval EQU 1 ; we do emulation of VT52s
slot EQU 1 ;SIO card slot
mnport EQU (6-slot)*16 ;Modem data port
mnprts EQU mnport+1 ;Modem status port
baudrt EQU mnport+8 ;Baud rate register
output EQU 01H ;Transmitter buffer empty
input EQU 02H ;Input data available
TxEmpty EQU 04h ;Transmitter empty flag
z80 EQU TRUE
ENDIF;[22] advant
IF comart ;[25]
mnport EQU 002H ;Modem data port
mnprts EQU 003H ;Modem status port
output EQU 01H ;Transmitter empty
input EQU 02H ;Input data available
TxEmpty EQU 04h ;Transmitter empty
;Note: Needs terminal definition (vt100, vt52, tvi925, adm3a or crt above)
z80 EQU TRUE ;This one's a Z80.
ENDIF;comart
IF advant
defesc EQU '\'-100O
ENDIF;advant
;
; Family is the string used in VERSION to say which of several
; smaller overlay files are used. These are (will be) derived from
; the juge 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 'CPXNOR.ASM (4) 16-Jan-1991$' ; Used for family versions....
sysxin: ; continuation of system dependent initialisation code
IF advant ;[22]
mvi a,40h
out mnprts ; Reset USART
lxi h,7070h ; Default to 1200 baud
shld speed ; store current speed
xchg
call sysspd ; set default baud rate
mvi a,4Eh ; Set UART mode to async 16x clock, 8 data
out mnprts ; bits, no parity, and 1 stop bit
mvi a,37h ; Set command to Tx enable, DTR on, Rx enable,
out mnprts ; break off, error reset, and RTS on
ENDIF;[22] advant
IF norths
mvi a,baudini ;Get initial speed
out baudrt
sta speed ;save for status display
sta speed+1
ENDIF;norths
IF comart OR horizon ;[25]
; The PD8251/PD8251A is reset by three successive 00 Hex or two
; successive 80 Hex command instructions followed by a software
; reset command instruction (40 Hex).
mvi a,80h ; Send UART reset
out mnprts
mvi a,80h
out mnprts
mvi a,40h
out mnprts
mvi a,4Eh ; Set UART mode to async 16x clock, 8 data
out mnprts ; bits, no parity, and 1 stop bit
mvi a,37h ; Set command to Tx enable, DTR on, Rx enable,
out mnprts ; break off, error reset, and RTS on
ENDIF;comart OR horizon
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:
IF advant OR comart OR horizon ; some more
lxi d,inhlps ; we got options...
call prtstr ; print them.
ENDIF;[22] advant OR comart OR horizon [29]
ret
;additional, system-dependent help for transparent mode
; (two-character escape sequences)
inhlps:
; [16] [18] have added super brain and Torch to the list of Breaking machines.
IF advant OR comart OR horizon ; ... some more
db cr,lf,'B Transmit a BREAK'
ENDIF;[22] advant OR comart OR horizon
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...
IF advant OR comart OR horizon ; [22] [25] ... some more
cpi 'B' ; send break?
jz sendbr ; yes, go do it. return nonskip when through.
ENDIF;advant OR comart OR horizon [32]
jmp rskp ; take skip return - command not recognized.
;
IF advant OR comart OR horizon ;[lmj]
sendbr:
;
; Ensure that the transmitter has finished sending buffered chars
sndbr1: in mnprts ; get UART status
ani TxEmpty ; everything sent?
jz sndbr1 ; no, wait a bit more
;
; Begin sending a break by setting bit in UART command register
mvi a,3Fh ; Set TxEna, DTR, RxEna, SBreak, ErrRst, RTS
out mnprts
;
; Wait for 250 milliseconds (using hundredths second delay routine)
mvi a,25
call delay
;
; Resume normal operation by clearing the SendBreak command bit
mvi a,37h ;Set TxEna, DTR, RxEna, ErrRst, RTS
out mnprts
;
ret ;done
ENDIF;advant OR comart OR horizon
;
;
; 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
IF advant ;[22]
cpi 'D'-100O ;Control-D's reset video
rnz ; if not control-D, it's ok.
xra a ; don't allow control-D out.
ENDIF;[22] advant
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:
IF norths OR advant ;
mov a,e ; get the parsed value
out baudrt ; Tell the baud rate generator.
ret
ENDIF;norths OR advant
IF advant ;[22]
spdtbl: db 6 ; 6 entries
db 04,'1200$', 70h,70h
db 04,'2400$', 78h,78h
db 03,'300$', 40h,40h
db 04,'4800$', 7Ch,7Ch
db 03,'600$', 60h,60h
db 04,'9600$', 7Eh,7Eh
sphtbl: db cr,lf,' 300 600 1200 2400 4800 9600$'
ENDIF;[22] advant
IF norths
spdtbl: db 8 ; 8 entries
db 3,'110$', 07H,07H
db 4,'1200$', 04H,04H
db 5,'19200$', 00H,00H
db 4,'2400$', 03H,03H
db 3,'300$', 06H,06H
db 4,'4800$', 02H,02H
db 3,'600$', 05H,05H
db 4,'9600$', 01H,01H
sphtbl: db cr,lf
db ' 110 300 600 12000 2400 4800 9600 19200$'
ENDIF;norths
; 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]
IF NOT (advant OR norths)
spdtbl EQU 0 ;[hh] SET BAUD not supported.
sphtbl EQU 0 ;[hh] ran out of room above...
ENDIF ;NOT (advant OR norths)
;
;
; 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:
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 ;[MF]per David P. Arnot
;
;
; 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=0ffh if ok, or 0 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
IF advant ; all others require terminals
;
;
; 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 ;advant
;
; 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:
IF advant ;[22]
ret
ENDIF;advant
IF NOT (advant );[22]
mvi e,bs ;get a backspace
jmp outcon
ENDIF;NOT (advant) [22]
; 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 norths
sysver: db 'Northstar Horizon$'
ENDIF;norths
IF basicns ;[29]
sysver: db 'Northstar using printer port$'
ENDIF ;basicns [29]
IF comart ;[25]
sysver: db 'Comart Communicator$'
ENDIF;comart
IF horizon ;[25]
sysver: db 'Northstar Horizon$'
ENDIF;horizon
IF advant ;[22]
sysver: db 'North Star Advantage$'
outlin: db 04H,cr,lf,tab,'$'
erascr: db 04H,'$' ;Clear screen and go home.
eralin: db cr,0EH,'$' ;Clear line.
curldn: db esc,'=$' ;cursor leadin
ttab: ;Table start location.
ta: db 0BH,'$',0,0 ;Cursor up.
tb: db 0AH,'$',0,0 ;Cursor down.
tc: db 0CH,'$',0,0 ;Cursor right.
td: db bs,'$',0,0 ;Cursor left
te: db 04H,'$',0,0 ;Clear display
tf: db 12H,'$',0,0 ;Enter Graphics Mode
tg: db 13H,'$',0,0 ;Exit Graphics mode
th: db 1EH,'$',0,0 ;Cursor home.
ti: db 0BH,'$',0,0 ;Reverse linefeed.
tj: db 0FH,'$',0,0 ;Clear to end of screen.
tk: db 0EH,'$',0,0 ;Clear to end of line.
ENDIF;[22] advant
IF lasm AND (NOT advant)
LINK CPXVDU.ASM
ENDIF ;lasm - m80 will INCLUDE CPXVDU.ASM
IF lasm ; here if not a terminal selected and in LASM
ovlend equ $
END
ENDIF ;lasm