|
|
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: 14592 (0x3900)
Types: TextFile
Names: »t2901proc«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »t2901proc«
procedure jump_addrs;
<*******************>
begin
if alu_function_performed or jump_sekvens_performed or
jump_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_addrs_operands;
end;
jump_addrs_performed := true; code_generated:=true;
end 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_condition_operands;
end;
jump_sekvens_performed := true; code_generated:=true;
end jump_sekevens;
procedure load_counter;
<**********************>
begin
jump_addrs;
end load_counter;
procedure special;
<****************>
begin
long spec_number;
integer op_value1,op_value2,index,
kind_1,kind_2;
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.
1 bit is cleared or set depending of nametable
nametable(index,4) specifi the number. *>
<* only last bit of nametable(number,2) is used *>
present(
extend( name_table(number,2) extract 1),
extend 1 shift (47 - name_table(number,4)));
end case 4;
end of all cases;
code_generated:=true;
next;
if class = comma_class then
next;
end special;
procedure scan_sekvens_operands(addrs_performed);
<************************************************>
boolean addrs_performed;
begin
integer type;
next;
for class := class while class <> right_par_class
and class <> stop_line_class do
begin
if class = text_class and name_table(number,0) = condition_type then
begin
<* condition *>
type:= name_table(number,0);
if type <> condition_type then
error(illegal_type,line_no,element_no)
else
present(name_table(number,2),
name_table(name_table(number,4),2));
<* write(out,<:<10>test mask :>,<<-d>,
name_table(number,2),
name_table(number,4),
name_table(name_table(number,4),2) shift (-24),
name_table(name_table(number,4),2) extract 24,"nl",1);
*>
end
else
if class = unknown_name_class or class = number_class or
class = apost_class or
( class = text_class and name_table(number,0) =label_type) then
begin
<* addrs. ref. *>
if class = apost_class then
next;
if look_ahead_class = right_par_class then
begin
if addrs_performed then error(plus_addrs_def,line_no,element_no);
if class = unknown_name_class or class = text_class then
addrs_ref(name,instr_index,line_no,element_no)
else
present(number,addrs_mask);
addrs_performed := true;
end else
error(operand,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 -, addrs_performed then error(minus_addrs_def,line_no,element_no);
end scan_sekvens_operands;
procedure scan_addrs_operands;
<****************************>
begin
scan_sekvens_operands(false);
end scan_addrs_operands;
procedure scan_condition_operands;
<*********************************>
begin
scan_sekvens_operands(true);
end scan_condition_operands;
procedure alufunction;
<********************>
begin
integer type_of_operands;
if alu_function_performed or jump_addrs_performed then
error(multiple_function,line_no,element_no);
present(name_table(number,2),
alu_func_mask);
type_of_operands := name_table(number,3);
case type_of_operands of
begin
internal_operands(0);
internal_operands(1);
internal_and_external(0);
internal_and_external(1);
zero_one_operand(0);
one_operand(0);
one_operand(1);
end;
next;
code_generated:=true; alu_function_performed:=true;
end alu_function;
integer procedure set_alu_dest(op_value);
<********************************>
value op_value; integer op_value;
begin
<* result 0 = ok
-1 = operand error
-3 = impossiple *>
integer dest_value;
set_alu_dest := 0;
dest_value := noload;
if op_value > 15 then
dest_value := no_load
else
if op_value = q_regs_value then
dest_value := q_reg
else
if op_value < 16 and op_value >= 0 then
dest_value := ramf
else
set_alu_dest := 3;
present(extend dest_value,alu_dest_mask);
end set alu_dest;
integer procedure set_alu_source(op_value_1,op_value_2);
<******************************************************>
value op_value_1,op_value_2; integer op_value_1,op_value_2;
begin
integer source_value;
set_alu_source := 0; <* for o.k. *>
<* -1 for 1. operand error
-2 for 2. operand error
-3 for impossible error *>
if op_value_1 = not_used or op_value_2 = not_used then
begin
if op_value_1 = not_used then op_value_1 := op_value_2;
if op_value_1 = q_regs_value then
source_value := z_and_q
else
if op_value_1 > 15 then
source_value := d_and_z
else
if op_value_1 <15 and op_value_1 >= 0 then
begin
if op_value_2 = not_used then
source_value := z_and_b
else
source_value := z_and_a;
end
else
set_alu_source := if op_value_2 = not_used then -1 else -2;
end
else
if op_value_1 = q_regs_value or op_value_2 = q_regs_value then
begin
if op_value_1 = q_regs_value then op_value_1 := op_value_2;
if op_value_1 > 15 then
source_value := d_and_q
else
if op_value_1 >= 0 and op_value_1 <= 15 then
source_value := a_and_q
else
begin
set_alu_source := if op_value_2 = q_regs_value then -1 else -2;
end
end
else
if op_value_1 > 15 or op_value_2 > 15 then
begin
source_value := d_and_a;
end
else
if op_value_1 >= 0 and op_value_2 >= 0 then
begin
source_value := a_and_b;
end
else
set_alu_source := -3 ; <* schould be impossiple *>
present(extend source_value,alu_source_mask);
end set_alu_source;
procedure internal_operands(carry);
<*********************************>
value carry; integer carry;
begin
integer op_value_1,op_value_2,op_value_3,
kind_1,kind_2,kind_3,no_of_op,set_result,
dest_value,source_value;
no_of_op := get_all_reg_operands(op_value_1,kind_1,
op_value_2,kind_2,
op_value_3,kind_3);
case no_of_op + 1 of
begin
begin <* case 0 operands *>
end;
begin <* case 1 operands *>
set_result := set_alu_dest(op_value_1);
set_result := set_alu_source(op_value_1,not_used);
source_value := dest_value := op_value_1;
end;
begin <* case 2 operands *>
set_result := set_alu_dest(op_value_1);
set_result := set_alu_source(op_value_1,op_value_2);
dest_value := op_value_1;
source_value := if op_value_2 = q_regs_value
then op_value_1 else op_value_2;
end;
begin <* case 3 operands *>
set_result := set_alu_dest(op_value_1);
set_result := set_alu_source(op_value_2,opvalue_3);
if op_value_1 = q_regs_value then
begin
dest_value := if op_value_2 > 15 then op_value_3 else op_value_2;
source_value := if op_value_2 > 15 then op_value_2 else op_value_3;
end
else
if op_value_2 = q_regs_value or op_value_3 = q_regs_value then
begin
dest_value := op_value_1;
source_value := if op_value_2 = q_regs_value then op_value_3 else
opvalue_2;
end
end;
end all case;
if dest_value <> q_regs_value then
present( extend dest_value,dest_mask);
if source_value <> q_regs_value then
present(extend source_value,source_mask);
present(extend( if source_value > 15 then 1 else 0) ,
special_source_mask);
present(extend( if source_value > 15 then 1 else 0),
control_enable_mask);
present(extend carry,carry_mask);
end internal operands;
procedure internal_and_external(carry);
<**************************************>
value carry; integer carry;
begin
integer op_value_1,op_value_2,op_value_3,
kind_1,kind_2,kind_3,no_of_op,set_result;
no_of_op := get_all_reg_operands(op_value_1,kind_1,opvalue_2,kind_2,
op_value_3,kind_3);
if no_of_op = 2 then
begin
if op_value_1 <> q_regs_value then
present(extend op_value_1,dest_mask);
if op_value_2 <> q_regs_value then
present(extend op_value_2,source_mask);
if op_value_2 > 15 then
begin
present(extend 1,special_source_mask);
present(extend 1,control_enable_mask);
end;
set_alu_dest(op_value_1);
set_alu_source(not_used,op_value_2);
end else
error(illegal_dest_and_source,line_no,element_no);
present(extend carry,carry_mask);
end internal_and_external;
procedure zero_one_operand(carry);
<*******************************>
value carry; integer carry;
begin
integer op_value,kind,op_value_1,kind_1,op_value_2,kind_2,
op_value_3,kind_3,no_of_op,set_result;
no_of_op := get_all_reg_operands(op_value,kind,op_value_2,kind_2,
op_value_3,kind_3);
if op_value <> q_regs_value then
present(extend op_value,dest_mask);
present(z_and_q,alu_source_mask);
if op_value > 15 then
present(no_load,alu_dest_mask)
else
if op_value = q_regs_value then
present(q_reg,alu_dest_mask)
else
present(ramf,alu_dest_mask);
present(extend carry, carry_mask);
end zero_one_operand;
procedure one_operand(carry);
<***************************>
value carry; integer carry;
begin
integer op_value,kind,op_value_1,kind_1,op_value_2,kind_2,
op_value_3,kind_3,no_of_op,set_result;
no_of_op := get_all_reg_operands(op_value,kind,op_value_2,kind_2,
op_value_3,kind_3);
if op_value>15 then
error(operand_type,line_no,element_no - 2);
present(extend op_value,short_dest_mask);
present(extend op_value,short_source_mask);
if op_value = q_regs_value then
begin
present(q_reg,alu_dest_mask);
present(z_and_q,alu_source_mask);
end
else
begin
present(ramf,alu_dest_mask);
present(z_and_b,alu_source_mask);
end;
present(extend carry,carry_mask);
end one_operand;
long procedure std_mask(mask_no);
<*******************************>
value mask_no; long mask_no;
begin
<* uses mask_no to select among the standard
hc2901 mask *>
std_mask := case mask_no of
(
parity_mask,
sekvens_mask,
condition_enable_mask,
condition_select_mask,
condition_pol_mask,
status_reg_enable_mask,
interupt_enable_mask,
spare_1_mask,
control_enable_mask,
control_code_mask,
dest_extern_mask,
source_extern_mask,
carry_mask,
alu_dest_mask,
alu_source_mask,
alu_func_mask,
short_dest_mask,
short_source_mask,
addrs_mask,
dest_mask,
source_mask,
alu_addrs_mode_mask,
alu_full_length_mask,
control_full_mask
);
end std_mask;
▶EOF◀