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