DataMuseum.dk

Presents historical artifacts from the history of:

RC4000/8000/9000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RC4000/8000/9000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦5d445bede⟧ TextFile

    Length: 14592 (0x3900)
    Types: TextFile
    Names: »tinitboot«

Derivation

└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ.  Detaljer om "HC8000" projekt.
    └─⟦0364f57e3⟧ 
        └─⟦87223b8a0⟧ »kkrcmonfil« 
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦87223b8a0⟧ »kkrcmonfil« 
            └─⟦this⟧ 

TextFile


initboot   version: 18   date: 26.03.81

begin

<* pej 03.11.77    initboot                                page 1 
   bks 23.11.78


initboot
--------
the program is used for installing the bootstrap part of an
rc8000 disc by moving bootstrap loader, rc8000 monitor, 
the name of the command file to s, rc3600
and rc3500 systems to areas on disc identified by absolute
segment numbers. the modules are taken from magnetic tape or
backing storage files.

example
-------
the following command installs a bootstrap on disc11
taking the modules from magnetic tape file 2 - 5:
       disc11=initboot mto.mtpip loader.2 monitor.3 fe1.4 fe2.5
the rc3600 system may be installed on segment 130 and foreward
with input from the file s3600 by the following command which
also specifies that the rc3600 system must not exceed 168
segments:
       disc11=initboot sys3600.s3600.168.130 autostart.initfile
futher the name of an command file to s was specified.
the last example creates the peripheral process 'disc7' on de-
vice 27, installs the bootstrap loader and monitor
and clears the name of an command file to s :
       disc27=initboot device.27 loader.bload monitor.m8000 autostart.0

call
----
                            *
<discname> = initboot <param>
                            0
<param>          ::= <devicespec>!<mtspec>!<bootspec>!<autospec>
<devicespec>     ::= <s> device.<devicenumber>
<mtspec>         ::= <s> <magtapemode> <magtapename>
                                                        1
<bootspec>       ::= <s> <bootpartname>.<file> <segments>
                                                        0
<magtapemode>    ::= mto ! nrz ! mt
<bootpartname>   ::= loader ! monitor ! sys3600 ! sys3500 !
                     fe1 ! fe2 ! fe3 ! fe4 ! fe5
<file>           ::= <discfilename> ! <magtapefileno>
                                                     1
<segments>       ::= .<no of segments> <first segment>
                                                     0
<first segment>  ::= .<first segment no>

<autospec>       ::= autostart.<namespec>

<namespec>       ::= number!name

*>
\f


<* pej 03.11.77    initboot                                page 2
   bks 23.11.78

function
--------
the program installs one or more modules on the bootstrap part of
an rc8000 disc identified by <discname> being the name of a disc-
driver. if <devicespec> is specified the program creates a peri-
pheral process named <discname> to the device.

the files to be installed are defined in the <bootspec> parame-
ters. default values for <no of segments> and <first segment> are:

loader : no of segments   4   first segment   0
monitor:                100                   4
sys3600:                168                 168
sys3500:                168                 336
fe1    :                168                 168
fe2    :                168                 336
fe3    :                168                 504
fe4    :                168                 672
fe5    :                168                 840

if <mtspec> parameter is supplied the modules may be taken from
magnetic tape (mto or nrz) from the files identified by <magtapefileno>.
the tape must have been written with a blocklength of 768 charac-
ters per block.

if <discfilename> parameter is used, the module is taken from the
backing storage file <discfilename>.

the program produces a printout reflecting the installation. the
text '(eof not encountered)' means that the length of the input
file exceeds the allowable number of segments and that only the
allowable number of segments have been output.

error messages
--------------
syntax <paramno>
    syntax error at parameter number <paramno>.
create <result>
    create peripheral process error, <result> = monitor result.
reserve <result>
    not possible to reserve <discname> due to monitor result
    <result>.

*>
\f



<* pej 03.11.77    initboot                             page 3 *>
<* bks 23.11.78                                                *>

  integer dockind, space_separator, point_separator,
          integer_kind, name_kind, deviceno, i, k, p, index,
          newline_separator, magtape_mode, maxsize, firstsegm;

  boolean magtape, disc, eof;

  integer array integer_params(0:8,2:3), dummy(1:1);

  real array autofilename, discname, magfilename, arr(1:2), 
             paramname(1:2);

  zone discfile(128,1,stderror), magfile(128,1,infileerror),
       bsfile(128,1,infileerror);


  procedure syntax(no);
  integer          no ;
  begin
    write(out,<:<10>*** initboot: syntax :>,<<ddd>,no,<:<10>:>);
    goto stop;
  end;

  procedure monitor_error(text,no);
  integer                 text,no ;
  begin
    write(out,<:<10>*** initboot: :>);
    if text = 1 then
    write(out,<:create, :>, case no of (
              <:function forbidden in calling process:>,
              <:calling proc not user; catalog i/o error:>,
              <:name conflict:>,
              <:device no does not exist:>,
              <:device is reserved by another user:>,
              <:name format illegal:>),<:<10>:>)
    else
    write(out,<:reserve, :>, case no of (
              <:reserved by another process:>,
              <:calling proc not user; proc cannot be reserved:>,
              <:process does not exist:>),<:<10>:>);
    goto stop;
  end;

  procedure infileerror(z,s,b);
  zone                  z     ;
  integer                 s,b ;
  if s shift (-16) extract 1 = 1
  or s shift (-18) extract 1 = 1 then
  begin
    if (-, disc and b <> 0) or disc then
    begin
      eof:= true; b:= 512;
    end;
  end
  else
    stderror(z,s,b);
\f


<* pej 03.11.77    initboot                             page 4 *>
<* bks 23.11.78                                                *>

  newline_separator      :=  2;
  space_separator        :=  4;
  point_separator        :=  8;
  integer_kind           :=  4;
  name_kind              := 10;

                    <*maxsize*>                <*first segm*>
  integer_params(0,2):=   4; integer_params(0,3):=   0; <*loader*>
  integer_params(1,2):= 164; integer_params(1,3):=   4; <*monitor*>
  integer_params(2,2):= 168; integer_params(2,3):= 168; <*sys3600*>
  integer_params(3,2):= 168; integer_params(3,3):= 336; <*sys3500*>
  integer_params(4,2):= 168; integer_params(4,3):= 168; <*fe1*>
  integer_params(5,2):= 168; integer_params(5,3):= 336; <*fe2*>
  integer_params(6,2):= 168; integer_params(6,3):= 504; <*fe3*>
  integer_params(7,2):= 168; integer_params(7,3):= 672; <*fe4*>
  integer_params(8,2):= 168; integer_params(8,3):= 840; <*fe5*>

  deviceno:=-1;       <* <devicespec> not entered *>
  magtape:=false;     <* <mtspec> not entered *>
  magtapemode:=0;     <* mto *>
  dockind:=0;         <* internal kind used for disc process *>
autofilename(1):= -1 ;
 


  <********** check <discname> **********>

  k:= system(4,0,discname);
  if k extract 12 <> name_kind
  then syntax(0);



  <********** check <params> **********>

  p       := 2;      <* parameter no of next param *>

  for k:= system(4,p,paramname) while k <> 0 do
  begin
    if k <> space_separator shift 12 add name_kind
    then syntax(p);
    p:= p + 1; k:= system(4,p,arr);
    if k shift (-12) <> point_separator then syntax(p);

    if paramname(1) = real <:test:> then
    begin
      if arr(1) = real <:yes:> then dockind:= 4;
      <* simulate in bs area *>
    end
    else

    if paramname(1) = real <:devic:> add 101
       and k extract 12 = integer_kind
    then begin <* check <devicenumber> , set deviceno *>
      if deviceno=-1 then deviceno:=arr(1) else syntax(p-1);
    end
    else

    if paramname(1) = real <:autos:> add 116
    then begin <* autostart*>
       if k extract 12 = integer_kind then
       autofilename(1) := autofilename(2) := real<::> 
       else begin
         autofilename(1) := arr(1) ;
         autofilename(2) := arr(2) ;
       end
     end
     else

    if (paramname(1) = real <:mto:> or paramname(1) = real <:nrz:>
    or  paramname(1) = real <:mt:>)
       and k extract 12 = name_kind then
    begin <* check <magtapename> , set magtapemode *>
      if magtape then syntax(p-1);
      if paramname(1)=real <:nrz:>
      then magtape_mode:=4 else magtapemode:=0;
      magtape:= true;
      magfilename(1):= arr(1); magfilename(2):= arr(2);
    end
    else
\f


<* pej 03.11.77    initboot                             page 5 *>
<* bks 23.11.78                                                *>

    begin

    <* check parameter <bootpartname> *>
      if     paramname(1) <> real <:loade:> add 114
         and paramname(1) <> real <:monit:> add 111
         and paramname(1) <> real <:sys36:> add  48
         and paramname(1) <> real <:sys35:> add  48
         and paramname(1) <> real <:fe1:>
         and paramname(1) <> real <:fe2:>
         and paramname(1) <> real <:fe3:>
         and paramname(1) <> real <:fe4:>
         and paramname(1) <> real <:fe5:>
      then syntax(p-1);


      <* check if parameter .<file> is ok *>
      if k extract 12 = integer_kind
      then begin
        if -, magtape then magtapemode:=-1;
      end
      else
        if k extract 12 <> name_kind then syntax(p);
  
  
      <* check if <maxsize> and <firstsegment> are entered *>
      for i:= 2 step 1 until 3 do
      begin <* 2 == <maxsize>, 3 == <firstsegment> *>
        k:= system(4,p+1,arr);
        if k shift (-12) = point_separator then
        begin
          if k extract 12 <> integer_kind then syntax(p-1);
          p:= p + 1;
        end
        else
          i:= 4;
      end;
    end;
    p:= p + 1;
  end;


  if magtapemode=-1 
  then begin
    write(out,<:<10>*** initboot: magtape is missing<10>:>);
    goto stop;
  end;
\f


<* pej 03.11.77    initboot                             page 6 *>
<* bks 23.11.78                                                *>


  <********** open discfile, create and reserve discprocess **********>

  i:= 1;
  open(discfile,dockind,string discname(increase(i)),0);
  if deviceno > -1 then
  begin
    i:= monitor(54)create_peripheral:(discfile,deviceno,dummy);
    if i <> 0 and i <> 3 then monitor_error(1,i);
  end;
  if dockind = 0 then
  begin
    i:= monitor(8)reserve_process:(discfile,0,dummy);
    if i <> 0 then monitor_error(2,i);
  end;

  <* open eventual magtape *>
  if magtape then
  begin
    i:= 1;
    open(magfile,magtapemode shift 12 + 18,string magfilename(increase(i)),1 shift 16);
  end;

  <* print heading of printout *>
  i:= 1;
  write(out,<:<10><10>initboot, disc: :>,
            string discname(increase(i)),
            <:<10><10>:>, false add 32,17,
            <:1st segm   no of segms   inputfile<10>:>);
\f


<* pej 03.11.77    initboot                             page 7 *>
<* bks 23.11.78                                                *>


  <********** move modules to bootstrap part **********>

  p:=2;
  for k:=system(4,p,paramname) while k<>0 do
  begin
    if paramname(1)=real <:loade:> add 114 then index:=0 else
    if paramname(1)=real <:monit:> add 111 then index:=1 else
    if paramname(1)=real <:sys36:> add  48 then index:=2 else
    if paramname(1)=real <:sys35:> add  48 then index:=3 else
    if paramname(1)=real <:fe1:> then index:=4 else
    if paramname(1)=real <:fe2:> then index:=5 else
    if paramname(1)=real <:fe3:> then index:=6 else
    if paramname(1)=real <:fe4:> then index:=7 else
    if paramname(1)=real <:fe5:> then index:=8 else
    index:=-1;


    if index>-1 then
    begin
      disc:=false;
      write(out,case index + 1 of
                (<:loader       :>, <:monitor      :>, <:sys3600      :>,
                 <:sys3500      :>, <:1. front end :>, <:2. front end :>,
                 <:3. front end :>, <:4. front end :>, <:5. front end :>),
                <: :    :>);

      p:=p+1;
      k:=system(4,p,paramname);
      if k extract 12 = name_kind
      then begin
        i:=1;
        open(bsfile,4,string paramname(increase(i)),1 shift 18);
        disc:=true;
      end else begin
        i:=paramname(1);
        setposition(magfile,i,0);
      end;

      k:=system(4,p+1,arr);
      if k extract 12 = integer_kind
      then begin
        maxsize:=arr(1);
        p:=p+1;
        k:=system(4,p+1,arr);
        if k extract 12 = integer_kind
        then begin
          firstsegm:=arr(1);
          p:=p+1;
        end else firstsegm:=integerparams(index,3);
      end
      else begin
        maxsize:=integerparams(index,2);
        firstsegm:=integerparams(index,3);
      end;


      eof:=false;
      setposition(discfile,0,firstsegm);

      if disc then
      begin
        inrec6(bsfile,512);
        i:=-1;
        for i:=i+1 while (-, eof and i < maxsize) do
        begin
          outrec6(discfile,512);
          tofrom(discfile,bsfile,512);
          inrec6(bsfile,512);
        end;
      end else begin
        inrec6(magfile,512);
        i:=-1;
        for i:=i+1 while (-, eof and i < maxsize) do
        begin
          outrec6(discfile,512);
          tofrom(discfile,magfile,512);
          inrec6(magfile,512);
        end;
      end;

      k:=1;
      write(out,<<ddd>,firstsegm,
                false add 32,9,i,false add 32,8,
                if disc then string paramname(increase(k))
                else string magfilename(increase(k)));
      if -, disc then
        write(out,<:.:>,<<d>,paramname(1));
      if -, eof then write(out,<:    (eof not encountered):>);
      if disc then close(bsfile,true);
      write(out,<:<10>:>);
      setposition(out,0,0);
    end else begin <* index = -1 *>
      for k:=system(4,p+1,arr) while (k shift (-12) <> space_separator and k <> 0) do
      p:=p+1;
    end;

    p:=p+1;
  end;

  write(out,<:<10>:>);
  if magtape then close(magfile,true);
  close(discfile,false);
   if autofilename(1) <> -1 then
   begin
    i:=1;
   write (out, <:autostart    :>, if autofilename(1) =real<::>
    then <:0:> else string  autofilename(increase(i)), <:<10>:>,1) ;
   setposition(out, 0,0);
   i:=1;
   open (discfile,4,string discname(increase(i)),0);
   swoprec6(discfile,6);
   swoprec6(discfile,8);
   discfile(1):=autofilename(1);

   discfile(2):= autofilename(2);
    close(discfile,true);
   end ;

stop:
end;
▶EOF◀