|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 17664 (0x4500) Types: TextFile Names: »t2903proc«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦this⟧ »t2903proc«
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◀