!***********************************************************************
!*
!*               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