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

⟦de3ff7196⟧ TextFile

    Length: 10752 (0x2a00)
    Types: TextFile
    Names: »kkmaster«

Derivation

└─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ.
    └─⟦4334b4c0b⟧ 
        └─⟦this⟧ »kkmaster« 

TextFile

(o kkmt
master=pascal list.yes codesize.1000
scope user master
o c
finis)
program masterprocess (input,output);

label 10,20,30,40,50,60,70,80,90;

const   m1=' '; m2='  '; m3='   '; m4='    '; m5='     ';
        m6='      '; m7='       '; m8='        '; m9='         ';
        m10='          ';
        one_shift_22 = 4194304;
        one_shift_23 = -8388608;
        three_shift_12=12288;
        mirror    = 8388603;
        buf_stack_top=200;
        first_proc=-14;
        first_buff=-10;

  type  halfword =  -2048 .. 2047;
        linkb    =  ^mes_buf;
        linkp    =  ^proc_descr;
        linkw1   =  ^w1_area;
        linkw3   =  ^w3_area;
        bsclaims =  record
                    key0,key1,key2,key3: record slices,entries: integer;
                                         end;
                    end;
        base     =  record lower,upper: integer; end;
        link     =  record next,prev: integer; end;  
        size     =  record first,last: integer; end;
        save     =  record addr,g20,g21,g22,g23,g24,b18,b19:integer; end;
        i_lev    =  packed record mon,user: halfword; end;

       proc_descr=  record
                    pda_oc:                            integer;
                    type_oc:                           0 .. 5;
                    pda_master:                        integer;
                    ci:packed record comp_no,i_claim:halfword; end;
                    cpu_mask:packed record running,allowed: halfword; end;
                    proc_base:                         base;
                    kind:                              0  .. 64;
                    name:                              alfa;
                    ss: packed record stopcount,state:halfword; end;
                    id_bit:packed record rel,bit: halfword;
                                  end;
                    event:                             link;
                    time_slice:                        link;
                    addr_space:                        size;
                    claims: packed record buff,area,ip,func_m:halfword end;
                    priority:                          -1 .. 8388606;
                    mode:                              integer;
                    int_mask:                          integer;
                    userexc,useresc,i_cpa,i_base:      integer;
                    wr_limits:                         size;
                    int_level:                         i_lev;
                    parent:                            integer;
                    quantum:                           integer;
                    runtime,starttime,startwait:       real;
                    waitaddr:                          integer;
                    cat_base,max_base,std_base:        base;
                    w0,w1,w2,w3:                       integer;
                    status,ic,cause,sb:                integer;
                    curr_cpa,curr_base:                integer;
                    curr_wr_lim:                       size;
                    curr_int_level:                    i_lev; 
                    save_area:                         save;
                    drum,drum1,disc,disc1,disc2,disc3: bsclaims;
                    end;

         mes_buf  =  record
                    addr_oc:                           integer;
                    r_s:packed record rec,sen:halfword; end;
                    rec_oc:                            integer;
                    sen_oc:                            integer;
                    flag_w2:                           integer;
                    buf:                               link;
                    receiver:                          integer;
                    sender:                            integer;
                    om:packed record op,mode:halfword; end;
                    m8,m10,m12,m14,m16,m18,m20,m22:    integer;
                    end;
        w1_area   = record
                    addr_space:                         size;
                    claims:packed record buf,area:halfword end;
                    internal_oc:                        integer;
                    p_type:                               integer;
                    max:                                base;
                    std:                                base;
                    claims_oc:packed record
                                     buf,area,ip,func:halfword;
                                     end;
                    end;

       w3_area    = record name:                          alfa;
                           table_addr:                  integer;
                    end;
  var proc:linkp;
      buf,buf1:linkb;
      pw1:linkw1;
      pw3:linkw3;
      sysrec_addr,wreg2,
      computer_no,buf_a1,res1,res2,res3,f_a_buf1,buff_addr1,
      buf_pointer,f_a_pw1,f_a_pw3,buff_addr,this_comp_no,xx,m_p_n,
      pda_this_proc,systrm_addr,addr,f_a_proc,f_a_buf,res:integer;
      mess: arrayÆ1..8Å of integer;
      answ: arrayÆ1..8Å of integer;
      buf_stack: arrayÆ1..200Å of integer;
      sysdma,name1,wreg1,wreg3:alfa;
procedure move_buff(var a,ba:integer);
begin
  sendfurther(a,ba);
end;
procedure stack_buf(a:integer);
begin
  xx:=buf_stackÆbuf_pointerÅ;
  buf_stackÆbuf_pointerÅ:=a;
  buf_pointer:=xx;
end;

begin
  buf_pointer:=1;
  for xx:=1 to buf_stack_top do
  buf_stackÆxxÅ:=xx+1;
  buf_stackÆbuf_stack_topÅ:=1;
  this_comp_no:=0;
  systrm_addr:=description('systrm');
  sysrec_addr:=description('sysrec');
  pda_this_proc:=description('master');
  f_a_proc:=firstaddress(proc);
  f_a_pw1:=firstaddress(pw1);
  f_a_pw3:=firstaddress(pw3);
  f_a_buf:=firstaddress(buf);
  f_a_buf1:=firstaddress(buf1);
  sysdma:='sysdma';
10:
  buff_addr:=0;
  res:=waitevent(buff_addr);
  addr:=buff_addr+first_buff;
  wordstore(f_a_buf,addr);

  (*   res=1 normal answer to this proc

       res=0 message from
             1) monitor at this computer
             2) a master process (another computer)
                  a) to a real process (this computer)
                      (i) message
                      (ii) answer
                  b) to master (this computer)
             3) systrm at this computer
             4) a useal process to
                  a) a mirror process (this computer)
                  b) master process (another computer)
                  c) master process (this computer)
  *)

  if res=1 then goto 20; (* answer to this proc*)

  if buf^.m8>=one_shift_22 then
  begin
    if buf^.rec_oc=-1 then
    goto 30; (*moncall this computer else*)
    goto 40 (*moncall another computer*)
  end;

  if buf^.receiver=pda_this_proc then goto 50; (*message to master*)

  if buf^.addr_oc=1 then goto 90; (*command is transmitted*)

  if buf^.addr_oc=-1 then 
  begin
    stack_buf(buff_addr);
    goto 10;
  end;  (*stack buffer*)

  if buf^.addr_oc=-2 then goto 60; (*transfer rejected*)

  if (buf^.addr_oc>0) and (buf^.receiver>10) then
  goto 70; (*message from another computer*)

  (* else a buffer (answer or message) from an useal process (this computer)
     to a mirror process (a real process on another computer) *)

  if buf^.receiver>10 then
  begin
    addr:=buf^.receiver+first_proc;
    wordstore(f_a_proc,addr);
    if proc^.pda_master<>pda_this_proc then goto 80; (*reject message*)
    buf^.addr_oc:=buff_addr;
    buf^.r_s.sen:=this_comp_no;
    buf^.r_s.rec:=proc^.ci.comp_no;
    buf^.rec_oc:=proc^.pda_oc;
    addr:=buf^.sender+first_proc;
    wordstore(f_a_proc,addr);
    buf^.sen_oc:=proc^.pda_oc;
  end;
  move_buff(systrm_addr,buff_addr);
  goto 10;  (* wait event *)

20:  (*answer to this proc *)
  goto 10; (* wait event*)

30: (* moncall this computer *)
  buf^.r_s.sen:=computer_no;
  m_p_n:=buf^.m8-one_shift_22;
  wordstore(f_a_pw1,buf^.m12);
  wordstore(f_a_pw3,buf^.m16);
  if (m_p_n<>64) or ((m_p_n=64) and (pw1^.p_type=mirror)) then
  begin
    buf^.r_s.rec:=pw1^.p_type-one_shift_23;
    buf^.r_s.sen:=this_comp_no;
    move_buff(systrm_addr,buff_addr);
  end;
  if m_p_n=56 then
  begin
    (* create an internal mirrorprocess (this computer) *)
    pw1^.p_type:=0;
    wreg3:=pw3^.name;
    buf^.m10:=createinternalprocess(wreg3,ord(pw1));
    wordstore(f_a_proc,pw3^.table_addr);
    proc^.type_oc:=5;
    proc^.pda_master:=pda_this_proc;
  end;
  stack_buf(buff_addr);
  goto 10;

40: (* moncall another computer *)
  messÆ5Å:=buf^.r_s.sen;
  messÆ1Å:=three_shift_12;
  if buf^.m8-one_shift_22=64 then
  begin
    messÆ2Å:=ord(pw1);
    messÆ3Å:=messÆ2Å+18;
    messÆ4Å:=buf^.m12;
    buf_a1:=sendmessage(wreg2,sysdma,mess);
    res1:=waitanswer(buf_a1,answ);
  end;
  messÆ2Å:=ord(pw3);
  messÆ3Å:=messÆ2Å+10;
  messÆ4Å:=buf^.m16;
  buf_a1:=sendmessage(wreg2,sysdma,mess);
  res2:=waitanswer(buf_a1,answ);
  wreg3:=pw3^.name;
 
  case (buf^.m8-one_shift_22) of
    56: res3:=createinternalprocess(wreg3,pw1^);
    (*58: res3:=startinternalprocess(wreg3);*)
    (*60: res3:=modyfiinternalprocess(wreg3);*)
    (*62: res3:=stopinternalprocess(wreg3);*)
    64: res3:=removeprocess(wreg3);
  end;
  goto 10;

50: (*command*)
  if buf^.om.op in Æ2,4,5,6,7,8,10,12Å then
  begin
    move_buff(systrm_addr,buff_addr);
    stack_buf(buff_addr);
    goto 10;  (*wait event*)
  end else goto 80; (*message rejected*)

60: (*disconnected*)
  sendanswer(4,buff_addr,answ);

70: (* message from another computer *)
  if buf^.receiver>10 then
  begin (* a message *)
    xx:=buf^.sen_oc;
    buf^.sen_oc:=buf^.sender;
    buf^.sender:=xx;
    xx:=buf^.rec_oc;
    buf^.rec_oc:=buf^.receiver;
    buf^.receiver:=xx;
    move_buff(buf^.receiver,buff_addr);
  end else
  begin (* an answer *)
    buff_addr1:=0;
    repeat buff_addr1:=buff_addr1+1 until
    (buff_addr1>buf_stack_top) or (buf_stackÆbuff_addr1Å=buf^.addr_oc);
    if buff_addr1>buf_stack_top then
    begin writeln('buffer error',buf^.addr_oc); goto 10 end;
    addr:=buff_addr+first_buff;
    wordstore(f_a_buf1,addr);
    buf1^.addr_oc:=buf^.addr_oc;
    buf1^.r_s.sen:=buf^.r_s.sen;
    buf1^.r_s.rec:=buf^.r_s.rec;
    buf1^.rec_oc:=buf^.receiver;
    buf1^.sen_oc:=buf^.sender;
    buf1^.flag_w2:=buf^.flag_w2;
    buf1^.receiver:=buf^.receiver;
    buf1^.sender:=buf^.sen_oc;
    buf1^.om.op:=buf^.om.op;
    buf1^.om.mode:=buf^.om.mode;
    buf1^.m8:=buf^.m8; buf1^.m10:=buf^.m10; buf1^.m12:=buf^.m12;
    buf1^.m14:=buf^.m14; buf1^.m16:=buf^.m16; buf1^.m18:=buf^.m18;
    buf1^.m20:=buf^.m20; buf1^.m22:=buf^.m22;
    move_buff(sysrec_addr,buff_addr);
    move_buff(buf^.sender,buff_addr1);
  end;
  goto 10;
80: (*message rejected*)
  sendanswer(2,buff_addr,answ);
    goto 10; (* wait event *)

90: (*command is transmitted*)
  sendanswer(1,buff_addr,answ);
  goto 10;
end.
▶EOF◀