!***********************************************************************
!*
!* Program to send files to microcomputers
!*
!* Copyright R.D. Eager University of Kent MCMLXXXIII
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!* Constants
!*
!***********************************************************************
!
constantbyteinteger soh = x'01'; ! Start character for binary files
constantbyteinteger stx = x'02'; ! Start character for character files
constantbyteinteger eot = x'04'; ! End character for character files
constantbyteinteger lf = x'0a'; ! Linefeed character
constantbyteinteger cr = x'0d'; ! Carriage return character
constantlonginteger int mask = x'0002000a0002000a'
! INT: A,C,Q,a,c,q
constantstring (1) snl = "
"
!
!
!***********************************************************************
!*
!* Record formats
!*
!***********************************************************************
!
recordformat rf(integer conad,filetype,datastart,dataend)
!
!
!***********************************************************************
!*
!* Subsystem references
!*
!***********************************************************************
!
systemroutinespec connect(string (31) file,integer mode,hole,
prot,record (rf)name r,integername flag)
systemroutinespec console(integer ep,integername start,len)
systemstringfunctionspec failuremessage(integer mess)
externalroutinespec messages(string (255) s)
externalstring (255)functionspec modestr
systemintegerfunctionspec parmap
systemroutinespec reroutecontingency(integer ep,class,
longinteger mask,
routine ontrap,
integername flag)
externalroutinespec setmode(string (255) s)
systemroutinespec setpar(string (255) s)
externalroutinespec set return code(integer i)
systemstringfunctionspec spar(integer n)
systemroutinespec signal(integer ep,p1,p2,integername flag)
externalintegerfunctionspec uinfi(integer entry)
!
!
!***********************************************************************
!*
!* Director references
!*
!***********************************************************************
!
externalintegerfunctionspec ddelay(integer secs)
!
!
!***********************************************************************
!*
!* Own variables
!*
!***********************************************************************
!
ownbyteinteger headerbyte; ! One character buffer for output
owninteger message status; ! Holds initial message status
ownstring (255) savemode; ! Holds initial terminal mode
!
!
!***********************************************************************
!*
!* Service routines
!*
!***********************************************************************
!
routine finalise terminal
! Resets the terminal and message status to the original settings.
integer flag
!
if headerbyte = stx then printch(eot)
flag = -1
console(9,flag,flag); ! Await output completion
setmode(savemode)
flag = ddelay(2)
if message status # 0 then messages("ON")
end ; ! of finalise terminal
!
!-----------------------------------------------------------------------
!
externalroutine ontrap(integer class,subclass)
! Entered when INT: A,C,Q,a,c,q are issued. Tidies up terminal and
! message status, then exits.
integer flag
!
finalise terminal
console(7,flag,flag); ! Kill output
if subclass = 'C' or subclass = 'c' then console(8,flag,flag)
! Kill input
signal(3,class,subclass,flag); ! Get the Subsystem to do the rest
end ; ! of ontrap
!
!-----------------------------------------------------------------------
!
routine initialise terminal
externalroutinespec ontrap(integer class,subclass)
integer flag
!
savemode = modestr
message status = uinfi(22)
reroutecontingency(3,65,int mask,ontrap,flag)
setmode("G")
messages("OFF")
end ; ! of initialise terminal
!
!
!***********************************************************************
!*
!* M S E N D
!*
!***********************************************************************
!
externalroutine msend(string (255) parms)
integer flag,i,c
record (rf) rr
string (1) binsw
string (31) file
!
setpar(parms)
if 1 # parmap # 3 then start
flag = 263; ! Wrong number of parameters
-> err
finish
!
file = spar(1)
if file = "?" then start
printstring("Parameters are: file [,B]".snl)
else
connect(file,1,0,0,rr,flag)
-> err if flag # 0
!
binsw <- spar(2); ! Binary mode parameter
if binsw = "B" then headerbyte = soh else headerbyte = stx
!
initialise terminal
!
printch(headerbyte)
for i = rr_conad+rr_datastart,1,rr_conad+rr_dataend-1 cycle
c = byteinteger(i)
printch(cr) if c = lf and headerbyte = stx
printch(c)
repeat
!
finalise terminal
finish
!
set return code(0)
return
!
err:
set return code(flag)
printstring(snl."MSEND fails -".failuremessage(flag))
stop
end ; ! of msend
endoffile