˙{23-Nov-81}

{Original version hacked a bit for new subsystem environment}

!  LOAD516 - Program to load 5/16 front-end over PASLA link.
%BEGIN
%CONSTINTEGER  MAIN=1,LISTING=1
%CONSTINTEGER  STMAX = 8191
%SHORTINTEGERARRAY  ST(0:STMAX+12)
%INTEGER  CA,J,K
%recordformat  parmfm(%shortinteger  dsno,dact,ssno,sact,  %c
                      %shortintegerarray  buf(1:12) )
%include "sysinc:command.inc"
%string(63) param

   param = COMMAND_parameter
   %if param = "" %start
      print string("No FEP executive supplied"); newline
      %stop
   %finish
   open input(main,param.".REL")
   select input(main)


%ROUTINE  ERROR(%STRING(63)  S)
   PRINT STRING(S);  NEWLINE
   %SIGNAL 15,15
%END

%ROUTINE  INGEST(%INTEGER  STREAM NO)
%CONSTINTEGER  RECORD LENGTH = 126
%INTEGER  J,K,COUNT,ADDR,C
%SWITCH  LC(0:X'60')
%ROUTINESPEC  NEWRECORD

%INTEGERFN  BYTE
%INTEGER S
   NEW RECORD %IF COUNT = 0
   COUNT = COUNT-1;  READ SYMBOL(S)
   %RESULT = S
%END

%ROUTINE  SKIP(%INTEGER  N)
%INTEGER  K
   K = BYTE %AND N = N-1 %WHILE N > 0
%END

%INTEGERFN  HALFWORD
   %RESULT = BYTE<<8 + BYTE
%END

%ROUTINE  NEWRECORD
%INTEGER  S
   S = BYTE %WHILE COUNT > 0
   COUNT = RECORD LENGTH
   S = HALFWORD;           ! SEQ
   S = HALFWORD;           ! CHECK SUM
%END

%ROUTINE  PUT(%INTEGER  ITEM)
   ERROR("Initial ORG missing") %IF ADDR < 0
   ST(CA) <- ITEM&X'FFFF';  CA = CA+1
   ADDR = ADDR + 1
%END

   SELECT INPUT(STREAM NO)
   COUNT = 0;  NEW RECORD
   ADDR = -1
   %CYCLE
      C = BYTE
      %IF C >= X'20' %START
         K = C-X'20'+1
         C = 16
      %FINISH
      -> LC(C)
LC(0):  NEW RECORD;  %CONTINUE
LC(4):  ! ABSOLUTE ORG. RESET
      SKIP(1);          ! FIRST BYTE OF ADDR
      J = HALFWORD;  ERROR("ORG to odd address") %UNLESS J&1 = 0
      J = J>>1
      %IF ADDR < 0 %START
         ADDR = J
      %ELSE
         CA = CA + (J-ADDR)
         ADDR = J
      %FINISH
      %CONTINUE
LC(15):  SKIP(8);  %CONTINUE
LC(24):  SKIP(6);  %CONTINUE
LC(10):  PUT(HALFWORD)
LC(25):
LC(7):  PUT(HALFWORD);  %CONTINUE
LC(16):
      PUT(HALFW˙ORD) %FOR J = 1,1,K
      %CONTINUE
   %REPEAT
LC(1):
DUMMY:
%END;       ! INGEST

%ROUTINE  TRANSMIT
%INTEGER  J,K
%integer  check
%record(parmfm)  p
   %routine  to fep(%record(parmfm)%name  p)
      p_sact = 111;  svc(127,p)
      p_sact = 111;  svc(16,p);   ! poff
   %end

   p_buf(1) = 0; p_buf(2) = 19;  svc(122,p);   ! uninhibit link
   p_dact = 6;  to fep(p);   ! initialise
   print string("FEP initialised"); newline
   check = -1;  check = check + st(k) %for k = 0,1,ca-1
   st(ca) = (-check)&x'FFFF'
   k = 0
   %cycle
      %for j = 1,1,12 %cycle
         p_buf(j) = st(k)
         k = k+1
      %repeat
      p_dact = 5;  to fep(p)
      %exit %if k > ca
   %repeat
   print string("Loading complete"); newline
%END

%ROUTINE  HEXDUMP(%INTEGER  FROM,TO,RELOC, %STRING(63)  TITLE)
%INTEGER  J,K,L
%ROUTINE  PHEX(%INTEGER N)
%INTEGER  P,Q
   %FOR P = 12,-4,0 %CYCLE
      Q = (N>>P)&15
      %IF Q < 10 %THEN Q = Q+'0' %ELSE Q = Q-10+'A'
      PRINT SYMBOL(Q)
   %REPEAT
%END

   SELECT OUTPUT(LISTING)
   PRINT SYMBOL(12);  PRINT STRING(TITLE)
   K = 0
   %FOR J = FROM,1,TO %CYCLE
      %IF K&7 = 0 %START
         NEWLINE
         PHEX((J-FROM)*2+RELOC);  PRINT STRING(":  ")
      %ELSE %IF K&7 = 4
         SPACES(2)
      %FINISH
      PHEX(ST(J));  SPACE
      K = (K+1)&31
      NEWLINE %IF K = 0
   %REPEAT
   NEWLINES(2)
%END

   ST(J) = 0 %FOR J = 0,1,STMAX
   CA = 0
   K = CA
   INGEST(MAIN)
   %if COMMAND_out1 # "" %start
      HEXDUMP(K,CA-1,X'1020',"Main Program")
   %else
      transmit
   %finish
%ENDOFPROGRAM
 