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

⟦66c63de25⟧ TextFile

    Length: 17664 (0x4500)
    Types: TextFile
    Names: »t2903proc«

Derivation

└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
    └─⟦b2ec5d50f⟧ 
        └─⟦this⟧ »t2903proc« 

TextFile








    procedure jump_addrs;
    <******************>
    begin
      if alu_function_performed or jump_sekvens_performed or
      jump_addrs_performed or addrs_performed then 
      error(multiple_function,line_no,element_no);
      present(name_table(number,2),
      sekvens_mask);
      present(name_table(number,3),
      condition_enable_mask);
      next;
      if class = left_par_class then
      begin
        scan_sekvens_operands(false);
      end;
      addrs_performed := jump_addrs_performed :=  code_generated:=true;
    end of jump_addrs;


    procedure jump_sekvens;
    begin
      if jump_addrs_performed or jump_sekvens_performed then
      error(multiple_function,line_no,element_no);
      present(name_table(number,2),
      sekvens_mask);
      present(name_table(number,3),
      condition_enable_mask);
      next;
      if class=left_par_class then
      begin
           scan_sekvens_operands(true);
      end;

      jump_sekvens_performed := true; code_generated:=true;

    end of jump_sekevens;

    procedure load_counter;
    begin
      jump_addrs;
    end of load_counter;


    procedure special;
    <*****************>
    begin
      long spec_number;
      integer kind_1,op_value1,op_value2,kind_2,index;
      if name_table(number,3) < special_min or
      name_table(number,3) > special_max then
      error(special_def_type,line_no,element_no)
      else
      case name_table(number,3) of
      begin
              
        begin
          <* case 1 is                   
          value by name_table(number,2)
          mask by a mask entry given by 
          nametable(nametable(number,4),2)
          *>

          present(
          name_table(number,2),
          name_table(name_table(number,4),2));
        end of case 1;
        begin
                <* case 2 is no parameters and mask
          Is pointed out by name_table(name,4),
          among the fixed mask values,
          from left to rigth in the format
          *>

          present(
          name_table(number,2),
          std_mask(name_table(number,4)));
        end of case 2;
        begin
          <* case 3.
          set or clear depending on value,
          the bits taken from argument 1 to 
          argument 2 *>
          spec_number:=number;
          next1;
          if class1 <> left_par_class then
          error(delimiter,line_no,element_no)
          else
          begin
            if name_table(spec_number,4) = 2 then
            get_2_reg_operands(op_value_1,op_value_2)
            else
            begin
              get_a_reg_operand(op_value_1,kind_1);;
              op_value_2 := op_value_1;
            end;
            for index:= op_value_1 step 1 until op_value_2 do
            present(name_table(spec_number,2),
            (extend 1 ) shift (47 - index));
            next;
            if class <> right_par_class then
            error(delimiter,line_no,element_no)
          end;
        end case 3;
        begin
        <* case 4 one bit is set or cleared acording to
           the bit number specicfied by nametable(number,4) *>
        present(extend ( name_table(number,2)
                               extract 1) , extend 1 shift (47 -
                               name_table(number,4)));
        end case 4;



        begin
         <* case 5 
         load counter from internal register
         pointed out by 
         pointed out by s address field or q reg.
         s address field second bit is set
         and w_reg enable is set *>

         if jump_addrs_performed or jump_sekvens_performed or
            alu_function_performed  or addrs_performed then
           error(multiple_function,line_no,element_no);
         jump_addrs_performed := jump_sekvens_performed :=
            alu_function_performed := addrs_performed :=true;
    
         <* first the function of the 2910 is masked in *>
         present(name_table(number,2),
                         sekvens_mask);
         <* if condition schould be forced to true then
            name_table(number,4) is 1 *>
         present(name_table(number,4),
                         condition_enable_mask);
        class1:=getnext_element(name_1,number1);
        if class1 <> left_par_class then
          begin
          error(missing_operand,line_no,element_no);
          end
         else
          begin
           get_a_reg_operand(op_value_1,kind_1);
          if op_value_1 >=0 and op_value_1 <16 then
            begin
            <* an reg. from alu source *>

            present(extend op_value_1,
                                    short_source_mask);
            present(extend 0,
                                    not_ea_mask);
            present(extend 6,
                                    alu_function_mask);
            present(extend 0,
                                      carry_control_mask);
            end else
          if op_value_1 = q_regs_value then
            begin
            present(extend 1,
                                      alu_special_control_mask);
            present(extend 4,
                                    alu_function_mask);
            end else
            error(illegal_type,line_no,element_no);
            present(extend 1,
                                   w_reg_enable_mask);
           present(extend 2,
                                   dest_mask);
           present(extend 6,
                                   alu_short_dest_mask);

           present(extend 0,
                                    alu_both_i5_mask);
           next;
           if class <> right_par_class then
             error(minus_delim,line_no,element_no);
           end;
         end case 5;

         begin 
         <* case 6 
         load counter from internal register
         pointed out by 
         pointed out by s address field or q reg.
         s address field second bit is set
         and w_reg enable is set *>
         if jump_addrs_performed or jump_sekvens_performed   
            then
           error(multiple_function,line_no,element_no);
         jump_addrs_performed := jump_sekvens_performed :=  true;
    
         <* first the function of the 2910 is masked in *>
         present(name_table(number,2),
                         sekvens_mask);
         <* if condition schould be forced to true then
            name_table(number,4) is 1 *>
         present(name_table(number,4),
                         condition_enable_mask);
            present(extend 1,
                                   w_reg_enable_mask);
           present(extend 2,
                                   dest_mask);
        end case 6;
             
      end of all cases;
      code_generated:=true;
      next;
      if class = comma_class then 
      next;
    end of special;




    procedure scan_sekvens_operands(use_of_addrs_field);
    <***********************************************>
    value use_of_addrs_field; boolean use_of_addrs_field;
    begin
      next;
      for class := class while class <> right_par_class 
      and class <> stop_line_class do
      begin
        if class = text_class  and type = condition_type then
          begin
          <* condition *>
          present(name_table(number,2),
          condition_select_mask);
        end
        else
        if class = unknown_name_class or class = number_class or
           class = apost_class  or
             class = text_class then

        begin
          <* addrs. ref. *>
          if class = apost_class then next;
          if look_ahead_class = right_par_class then
          begin
            if use_of_addrs_field then error(plus_addrs_def,line_no,element_no);
            if class = unknown_name_class or
               (class = text_class <*and name_table(number,0) = label_type*>) then
            addrs_ref(name,instr_index,line_no,element_no)
            else
            present(number,
                                    addrs_and_imm_mask);
            use_of_addrs_field := true;
          end else
          error(unknown,line_no,element_no);
        end
        else
        begin
          error(missing_operand,line_no,element_no);
        end;
        next;
        if class = comma_class then next;
      end;                          
      if class = right_par_class then next;
      if -, use_of_addrs_field then error(minus_addrs_def,line_no,element_no);
    end of scan_addrs_operands;




    procedure alu_function;
    <*********************>

    begin
      integer type_of_operands;
      if alu_function_performed  then
      error(multiple_function,line_no,element_no);
      present(name_table(number,2),
      alu_function_mask);
      type_of_operands := name_table(number,3);
      class := look_ahead_class;
      if class = left_par_class then
      begin
           case type_of_operands of
        begin
          normal_function(0);
          normal_function(1);
          special_function(0);
          special_function(1);
          special_function(2);
        end; <* 
      end of case *>
      next;
    end;
    code_generated:=true; alu_function_performed:=true;
  end of alu_function;


  procedure normal_function(carry);
  value carry; integer carry;
  begin
  integer dest_value,dest_kind,no_of_operands;
  no_of_operands := scan_alu_operands(dest_value,dest_kind);
  
  if no_of_operands > 0 then
    begin
    present(extend carry,
                            carry_control_mask);
    set_alu_output(dest_value,dest_kind,0,element_no -
                    ( if no_of_operands = 1 then
                    1 else no_of_operands+2));
    end;
  end procedure normal_function;
  procedure special_function(carry);
  <********************************>
  value carry; integer carry;
  begin
  long spec_value;
  integer dest_value,dest_kind,no_of_operands;
  spec_value := name_table(number,2);
  no_of_operands := scan_alu_operands(dest_value,dest_kind);
  if no_of_operands > 0 then
    begin


    end;
  present(extend carry,
                          carry_control_mask);
  present(extend 0,
                          alu_full_function_mask);
  present(spec_value,
                          alu_dest_mask);

end procedure special_function;





integer procedure scan_alu_operands(dest_val,dest_kind);
<******************************************************>
integer dest_val,dest_kind;
begin

integer no_of_op,val_1,kind_1,val_2,kind_2,val_3,kind_3;
no_of_op := 
  get_all_reg_operands(val_1,kind_1,val_2,kind_2,val_3,kind_3);
if no_of_op > 3 then no_of_op :=3;
scan_alu_operands:= no_of_op;
if no_of_op > 0 then
   begin
   dest_val := val_1;
   dest_kind := kind_1;
   end
  else
   begin
   dest_val := 0;
   dest_kind := 0;
   no_of_op := 0;
  end;

case no_of_op + 1 of
  begin

  begin <* 0 operands *>
  end;

  begin <* 1 operand *>
  if kind_1 <> text_class then
  error(illegal_dest,line_no,element_no-1)
  else
    set_alu_dest(val_1,kind_1,element_no - 1 );
  end;

  begin <* 2 operands *>
  if val_1 > 15 and kind_2 <> number_class then
    begin
    set_alu_dest(val_2,kind_2,element_no - 1);
    end
   else
  if ( val_2 <= 15 and val_2 >= 0 )
    or kind_2 = number_class then
    begin
    set_alu_source(val_2,kind_2,element_no - 1);
    set_alu_dest(val_1,kind_1,element_no -3);
    end
   else
  if ( val_1 = w_index_value or val_1 = w_pre_index_value) and
     val_2 = q_regs_value then
    begin
    set_alu_dest(val_1,kind_1,element_no -3);
    present(extend 1,
                            alu_special_control_mask);
    end
   else
    
  
    begin
    set_alu_dest(val_2,kind_2,element_no - 1);
    end;
  
  end case 2 operands;

  begin <*case 3 operands *>
  
  if kind_2 = number_class or
      ( kind_3 = text_class and (val_3 = q_regs_value or
     val_3 = w_pre_index_value or val_3 = w_index_value)) then
     begin
     set_alu_source(val_2,kind_2,element_no -3);
     set_alu_dest(val_3,kind_3,element_no - 1);
     end
    else
     begin
     set_alu_source(val_3,kind_3,element_no -1);
     set_alu_dest(val_2,kind_2,element_no - 3);
     end;
   end;
 
 end case loop;
end scan_alu_operands;

procedure set_alu_output(op_value,op_kind,special,element_no);
<************************************************************>
value op_value,op_kind,special,element_no;
integer op_value,op_kind,special,element_no;
begin
if op_kind = text_class then
begin
if op_value = q_regs_value then
  begin
  present( extend 3,
                     alu_short_dest_mask);
  present(extend 0,
                          alu_both_i5_mask);
  end

  else
if op_value = w_index_value or op_value = w_pre_index_value then
  begin
  present(extend 2,alu_short_dest_mask);
  present(extend 0,alu_both_i5_mask);
  present(extend 1,w_reg_enable_mask);
  present(if op_value = w_index_value then extend 0 else extend 1,
          dest_mask);
  end
 else
if op_value > 15 then
  begin
  
  present(extend 1,
                          write_2901_reg_mask);
  present( extend 0,
                           not_oeb_mask);
  present(extend 6,
                          alu_short_dest_mask);
  present(extend 0,
                          alu_both_i5_mask);
  end
 else
if op_value >=0 and op_value <=15 then
  begin
  present(extend 2,
                          alu_short_dest_mask);
  present(extend 0,
                          alu_both_i5_mask);
  present(extend op_value,
                          dest_mask);
  end
 else
error(illegal_dest,line_no,element_no);
end else
error(illegal_dest,line_no,element_no);
end  set_alu_output;


procedure set_alu_source(op_value,op_kind,element_no);
<****************************************************>
value op_value,op_kind,element_no;
integer op_value,op_kind,element_no;
begin
if op_kind = number_class then
  begin
  if addrs_performed then
      error(multiple_function,line_no,element_no);
  addrs_performed := true;
  present(extend 1,
                          not_ea_mask);
  present(extend op_value,
                          addrs_and_imm_mask);
 end
 else
if op_kind = text_class then
    begin
    if op_value > 16 then
      error(illegal_source,line_no,element_no)
    else
     begin

     present(extend 0,
                             not_ea_mask);
     present(extend op_value,

                             short_source_mask);
     end;
   end
 else
error(illegal_source,line_no,element_no);

end of set_alu_source;


procedure set_alu_dest(op_value,op_kind,element_no);
<***************************************************>
value op_value,op_kind,element_no;
  integer op_value,op_kind,element_no;
  begin

  if op_kind = text_class then
    begin
    if op_value = q_regs_value then
      begin

      present(extend 1,
                              alu_special_control_mask);
      present(extend 0,
                              dest_mask);
      end
     else
    if op_value = w_index_value 
       or op_value = w_pre_index_value then
      begin
      present(extend 1,
                                  w_reg_enable_mask);
      present( 
                              if op_value = w_index_value then
                              extend 0 else extend 1,
                              dest_mask);
      present(extend 0,
                              not_oeb_mask);
      present(extend 0,
                                alu_special_control_mask);
      end
     else
    if op_value > 15 then
      begin
      present(extend 1,
                              not_oeb_mask);
      present(extend 0,
                              alu_special_control_mask);
      present(extend 0,
                              dest_mask);
      end
     else
    if op_value >= 0 and op_value < 16 then
      begin
      present(extend 0,
                               not_oeb_mask);
      present( extend 0,
                              alu_special_control_mask);
      present(extend op_value,
                              dest_mask);
      end
     else
      error(illegal_dest,line_no,element_no);
    end
     else
    error(illegal_dest,line_no,element_no);
  end  set_alu_dest;
long procedure std_mask(mask_no);
<******************************>
value mask_no; long mask_no;
begin
std_mask := case mask_no of
  (
   condition_enable_mask,
   sekvens_mask,
   cond_my_reg_enable_mask,

  cond_m_reg_enable_mask,

   
   condition_select_mask, 
   condition_full_mask, <* select and kind *>
   alu_full_length_mask,
   alu_dest_mask, <* alu bit i8 to both i5 *>
   alu_short_dest_mask,
   alu_i5_left_mask,
   alu_i5_rigth_mask,
   alu_both_i5_mask,
   alu_function_mask, <* alu bit i4 to i1 *>
   alu_full_function_mask, <* alu bit i4 to i0 *>
   alu_special_control_mask, <* alu bit i0 *>
   carry_control_mask,
   set_2904_shift_mask,
   not_ea_mask,
   w_reg_enable_mask,
 
   w_reg_enable_sel_mask,
   not_oeb_mask,

   read_2901_reg_mask,

   write_2901_reg_mask,
   alu_full_source_mask, <* not ea and not oeb and alu bit i0 *>
   source_extern_mask,

   dest_extern_mask,
   short_source_mask,
   short_dest_mask,
   source_mask,
   dest_mask,
   addrs_mask,

   addrs_and_imm_mask, <* addrs and immidiate mask *>
   cond_kind_set_mask,
   not_half_w_move_enable_mask,

   half_w_move_dir_mask,
   half_word_move_mask,

   shift_control_2904_mask, <* controls the 2904 instr bit i6 to i9 *>
   all_m_reg_enable_mask,  <* all bits to control great m reg *>
   select_m_reg_enable_mask, <* only to select th bits *>
   select_interupt_bit_mask,
   instr_full_length);     <* all bits in instr *>
end procedure std_mask;
▶EOF◀