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

⟦3d8d1b7e8⟧ TextFile

    Length: 139776 (0x22200)
    Types: TextFile
    Names: »listtrans03«

Derivation

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

TextFile


t290xasm d.810603.1330
  0     1 begin
  1     2   message version 790505;
  1     3 algol copy.tcgproclib;
tcgproclib d.800929.1732
  1     3 procedure init_long_array(arr,init);
  1     4 <***********************************>
  1     5 value init; integer init;
  1     6 long array arr;
  1     7 begin
  2     8 <* intialize an array of type long with the value of init *>
  2     9 integer upper_bound,lower_bound;
  2    10 long array field laf1,laf2;
  2    11 lower_bound := system(3,upper_bound,arr);
  2    12 laf1:= 4 * lower_bound; laf2 := laf1 - 4;
  2    13 arr.laf2(1) := extend init;
  2    14 tofrom(arr.laf1,arr.laf2,(upper_bound - lower_bound) * 4);
  2    15 end init_long_table;
  1    16 procedure std_table(table);
  1    17 <*************************>
  1    18 integer array table;
  1    19 begin integer i;
  2    20 for i:=0 step 1 until 127 do
  2    21 table(i):= case i+1 of
  2    22   ( 0,7,7,7,7,7,7,7,7,7,8,7,8,0,7,7,
  2    23     7,7,7,7,7,7,7,7,7,8,7,7,7,7,7,7,
  2    24     7,7,7,7,7,7,7,5,7,7,7,3,7,3,4,7,
  2    25     2,2,2,2,2,2,2,2,2,2,7,7,7,7,7,7,
  2    26     7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  2    27     6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,
  2    28     7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  2    29     6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0) shift 12 + i;
  2    30 end std_table;
  1    31 \f

  1    31 
  1    31 
  1    31 
  1    31 message cg proc lib 800408                             page xx;
  1    32 integer procedure get_bool_string(search_string,result);
  1    33 <*******************************************************>
  1    34 string search_string; boolean result;
  1    35 begin
  2    36 long array search_name(1:2);
  2    37 real array field raf;
  2    38 raf := 0;
  2    39 movestring(search_name.raf,1,search_string);
  2    40 get_bool_string := get_bool_arg(search_name,result);
  2    41 end get_bool_string;
  1    42 
  1    42 boolean procedure bool_arg_string(search_string);
  1    43 <************************************************>
  1    44 string search_string;
  1    45 begin
  2    46 boolean result;
  2    47 long array search_name(1:2);
  2    48 real array field raf;
  2    49 raf := 0;
  2    50 movestring(search_name.raf,1,search_string);
  2    51 get_bool_arg(search_name,result);
  2    52 bool_arg_string := result;
  2    53 end bool_arg_string;
  1    54 
  1    54 
  1    54 
  1    54 integer procedure get_bool_arg(search_name,result);
  1    55 <**************************************************>
  1    56 long array search_name;
  1    57 boolean result;
  1    58 begin
  2    59 long array param_name,match_name(1:2);
  2    60 integer sep_and_length,item_no;
  2    61 boolean default;
  2    62 real array field raf;
  2    63 raf := 0;
  2    64 result := default := false;
  2    65  
  2    65 if search_param_name(search_name,item_no) = 0 then
  2    66   begin
  3    67   get_bool_arg := 0;
  3    68   item_no := item_no + 1;
  3    69   
  3    69   if system(4,item_no,param_name) extract 12 = 10 then
  3    70     begin
  4    71     if param_name(1) = long <:yes:> or
  4    72        param_name(1) = long <:ja:> then
  4    73        result := true
  4    74      else
  4    75     if param_name(1) = long <:no:> or
  4    76        param_name(1) = long <:nej:> then
  4    77        result := false
  4    78      else
  4    79        get_bool_arg := 4;
  4    80      end
  3    81     else
  3    82     get_bool_arg :=4;
  3    83    end
  2    84  else
  2    85   get_bool_arg := 2;
  2    86 end get_bool_arg;
  1    87 message cg proc lib 800707;
  1    88 integer procedure get_text_string(search_string,return_name);
  1    89 string search_string; long array return_name;
  1    90 begin
  2    91 long array search_name(1:2);
  2    92 real array field raf;
  2    93 raf := 0;
  2    94 movestring(search_name.raf,1,search_string);
  2    95 get_text_string := get_text_arg(search_name,return_name);
  2    96 end get_text_string;
  1    97 
  1    97 integer procedure get_text_arg(search_name,return_name);
  1    98 <*******************************************************>
  1    99 long array search_name,return_name;
  1   100 begin
  2   101 integer item_no,sep_and_length;
  2   102 real array field raf;
  2   103 raf := 0;
  2   104 if search_param_name(search_name,item_no) = 0 then
  2   105   begin
  3   106   item_no := item_no + 1;
  3   107   sep_and_length := system(4,item_no,return_name.raf);
  3   108   if sep_and_length extract 12 = 10 then
  3   109     get_text_arg := 0
  3   110   else
  3   111     get_text_arg := 4;
  3   112   end
  2   113  else get_text_arg := 2;
  2   114 end get_text_arg;
  1   115 message cg proc lib 800707;
  1   116 integer procedure get_int_string(search_string,return);
  1   117 <*****************************************************>
  1   118 string search_string; integer return;
  1   119 begin
  2   120 long array search_name(1:2);
  2   121 real array field raf;
  2   122 raf := 0;
  2   123 movestring(search_name.raf,1,search_string);
  2   124 get_int_string := get_int_arg(search_name,return);
  2   125 end get_int_string;
  1   126 
  1   126 
  1   126 integer procedure get_int_arg(search_name,return);
  1   127 <************************************************>
  1   128 long array search_name;
  1   129 integer return;
  1   130 begin
  2   131 integer sep_and_length,item_no;
  2   132 long array param_name(1:2);
  2   133 real array field raf;
  2   134 raf := 0;
  2   135 if search_param_name(search_name,item_no) = 0 then
  2   136   begin
  3   137   item_no := item_no + 1;
  3   138   sep_and_length := system(4,item_no,param_name.raf);
  3   139   if system(4,item_no,param_name.raf) extract 12 = 4 then
  3   140     begin
  4   141     return := param_name.raf(1);
  4   142     get_int_arg := 0;
  4   143     end
  3   144    else
  3   145     get_int_arg := 4;
  3   146   end
  2   147  else
  2   148   get_int_arg := 2;
  2   149 end get_int_arg;
  1   150 
  1   150 integer procedure get_int_set_arg(search_name,return_set,no_in_set);
  1   151 <******************************************************************>
  1   152 long array search_name;
  1   153 long array return_set;
  1   154 integer no_in_set;
  1   155 begin
  2   156 integer sep_and_length,
  2   157         item_no,
  2   158         set_index,
  2   159         low_set,
  2   160         high_set;
  2   161 long array param_name(1:2);
  2   162 real array field raf;
  2   163 raf := 0;
  2   164 low_set := system(3,high_set,return_set);
  2   165 set_index := low_set;
  2   166 
  2   166 no_in_set := 0;
  2   167 if search_param_name(search_name,item_no) = 0 then
  2   168   begin
  3   169   for item_no := item_no + 1 while
  3   170       set_index <= high_set
  3   171       and
  3   172        system(4,item_no,param_name.raf) = 8 shift 12 + 4 do
  3   173     begin
  4   174     return_set(set_index) := param_name.raf(1);
  4   175     set_index := set_index + 1;
  4   176     end;
  3   177 
  3   177   no_in_set := set_index - low_set;
  3   178   get_int_set_arg := if low_set = set_index then 4 else 0;
  3   179   end
  2   180  else get_int_set_arg := 2;
  2   181 end get_int_set_arg;
  1   182 
  1   182 integer procedure get_int_set_string(search_string,return_set,no_in_set);
  1   183 string search_string;
  1   184 long array return_set;
  1   185 integer no_in_set;
  1   186 begin
  2   187 long array search_name(1:2);
  2   188 real array field raf;
  2   189 raf := 0;
  2   190 movestring(search_name.raf,1,search_string);
  2   191 get_int_set_string := get_int_set_arg(search_name,return_set,no_in_set);
  2   192 end get_int_set_string;
  1   193 
  1   193 
  1   193 message cg proc lib 800707;
  1   194 
  1   194 
  1   194 integer procedure search_param_name(search_name,item_no);
  1   195 <*******************************************************>
  1   196 long array search_name;            
  1   197 integer item_no;
  1   198 begin
  2   199 integer search_no,sep_and_length;
  2   200 long array param_name(1:2);
  2   201 boolean found;
  2   202 real array field raf;
  2   203 raf := 0;
  2   204 found := false;
  2   205 search_no := if get_left_side(param_name) = 0 then 2 else 1;
  2   206 search_param_name := 2;
  2   207 if search_name(1) extract 8 = 0 then search_name(2) := 0;
  2   208 for sep_and_length := system(4,search_no,param_name.raf) while
  2   209     sep_and_length  <> 0 and -, found do
  2   210     begin
  3   211 
  3   211     if param_name(1) = search_name(1) and
  3   212        param_name(2) = search_name(2) then
  3   213        begin
  4   214        item_no := search_no;
  4   215        found := true;
  4   216        search_param_name := 0;
  4   217        end
  3   218      else search_no := search_no + 1;
  3   219 
  3   219      end;
  2   220 end search_param_name;
  1   221 
  1   221 integer procedure get_left_side(param_name);
  1   222 <******************************************>
  1   223 long array param_name;
  1   224 begin
  2   225 integer sep_and_length;
  2   226 real array field raf;
  2   227 raf := 0;
  2   228 
  2   228 get_left_side := 2;
  2   229 if system(4,1,param_name.raf) = 6 shift 12 + 10 
  2   230    <* fp left side *> then
  2   231   begin
  3   232   get_left_side :=0;
  3   233   sep_and_length := system(4,0,param_name.raf);
  3   234   end;
  2   235 end get_left_side;
  1   236 
  1   236 integer procedure get_next_free_text(param_name);
  1   237 <***********************************************>
  1   238 long array param_name;
  1   239 begin own integer no;
  2   240 get_next_free_text := get_free_text(no+1,param_name);
  2   241 no := no + 1;
  2   242 end get_next_free_text;
  1   243 
  1   243 integer procedure get_free_text(no,param_name);
  1   244 <**********************************************>
  1   245 value no;
  1   246 integer no;
  1   247 long array param_name;
  1   248 begin
  2   249 real array look_ahead_param(1:2);
  2   250 real array field raf;
  2   251 integer start_index,sep_and_length,no_found;
  2   252 raf:=0;               
  2   253 no_found := 0;
  2   254 if get_left_side(param_name) = 0 then
  2   255  start_index := 2 else start_index := 1;
  2   256 repeat
  2   257   sep_and_length := system(4,start_index,param_name.raf);
  2   258   if sep_and_length  = 4 shift 12 + 10 then
  2   259     begin
  3   260     sep_and_length :=system(4,start_index + 1,look_ahead_param);                 
  3   261     if sep_and_length shift (-12) < 6 then
  3   262        no_found := no_found + 1;
  3   263      end;
  2   264   start_index := start_index+1;
  2   265  until sep_and_length = 0 or no_found = no;
  2   266  if no = no_found then
  2   267    get_free_text := 0
  2   268   else
  2   269    get_free_text := 2;
  2   270 end get_free_text;
  1   271 message cg proc lib 800707 < connect zone >                     page XX;
  1   272 
  1   272 
  1   272 integer procedure connect_file_in(param_name);
  1   273 <***************************************>
  1   274 long array param_name;
  1   275 begin
  2   276 own boolean called_before;
  2   277 integer result;
  2   278 long array empty_param_name(1:1);
  2   279 empty_param_name(1) := 0;
  2   280 result := get_next_free_text(param_name);
  2   281 if result <> 0 and -, called_before then
  2   282   begin
  3   283   get_connected_name(in,param_name);
  3   284   connect_file_in := 0;
  3   285   end
  2   286  else
  2   287 if result <> 0 and called_before then
  2   288   begin
  3   289   connect_file_in := 2;
  3   290   end
  2   291  else
  2   292 if result = 0 then
  2   293   begin
  3   294   stack_and_connect_in(empty_param_name);
  3   295   connect_file_in := stack_and_connect_in(param_name);
  3   296   end;
  2   297 called_before := true;
  2   298 end connect_file_in;
  1   299 
  1   299 
  1   299 procedure get_connected_name(z,param_name);
  1   300 <*****************************************>
  1   301 zone z;
  1   302 long array param_name;
  1   303 begin
  2   304 integer array tail(1:20);
  2   305 getzone6(z,tail);
  2   306 
  2   306 param_name(1) := extend tail(2) shift 24 + tail (3);
  2   307 param_name(2) := extend tail(4) shift 24 + tail(5);
  2   308 end get_connected_name;
  1   309 
  1   309 integer procedure stack_and_connect_in(doc_name);
  1   310 <**********************************************>
  1   311 long array doc_name;
  1   312 begin
  2   313 <* stack current zone in if docname(1) <> 0 and
  2   314    connect current zone in to docname.
  2   315    if docname = 0 and in is previous stacked
  2   316    then current zone in is unstacked *>
  2   317 own integer stacked;  
  2   318 integer result;
  2   319 
  2   319 if doc_name(1) <> 0 then
  2   320   begin
  3   321   fp_proc(29) stack current in :(0,in,0);
  3   322   fp_proc(27) connect current in:(result,in,doc_name);
  3   323   if result <> 0 then
  3   324     begin
  4   325     fp_proc(30) unstack current in:(0,in,0);
  4   326     stack_and_connect_in := 4
  4   327     end
  3   328    else
  3   329     begin
  4   330     stacked := stacked + 1;
  4   331     stack_and_connect_in := 0
  4   332     end;
  3   333   end
  2   334  else
  2   335   if doc_name(1) = 0 then
  2   336     begin
  3   337     if stacked > 0 then
  3   338       begin
  4   339       fp_proc(30) unstack current in:(0,in,0);
  4   340       stacked := stacked -1;
  4   341       end;
  3   342     stack_and_connect_in := 0;
  3   343     end docname empty;
  2   344 
  2   344 end stack_and_connect_in;
  1   345 integer procedure connect_out_to_left_side(allways,drum);
  1   346 <*******************************************************>
  1   347 value allways,drum; boolean allways,drum;
  1   348 <* if all ways then a area is created on 1 segm 
  1   349    if the file is not existent then a area is created 
  1   350    on 1 segm. if drum the area is created on prefearable drum *>
  1   351 begin
  2   352 own integer connected;
  2   353 integer result, create_mask;
  2   354 long array docname(1:2);
  2   355 result := 0;
  2   356 if  connected = 0 then
  2   357   begin
  3   358   if get_left_side(doc_name)  = 0 then
  3   359      begin
  4   360      create_mask := if allways then ( 1 shift 2 ) else 0;
  4   361      create_mask := if drum then create_mask add 1 else create_mask;
  4   362      result := stack_and_connect_out(doc_name,create_mask);
  4   363      if result = 0 then connected := 2 else connected := 6;
  4   364       end
  3   365      else
  3   366      connected := 4;
  3   367   end
  2   368  else
  2   369 if connected = 2 then
  2   370   begin
  3   371   fp_proc(34) close up:(0,out,25);
  3   372   fp_proc(79) terminate zone :(0,out,0);
  3   373   doc_name(1) :=0;
  3   374   result := stack_and_connect_out(doc_name,create_mask);
  3   375   connected := 6;
  3   376   end;
  2   377 connect_out_to_left_side := result;
  2   378 end connect_out_to_left_side;
  1   379 integer procedure stack_and_connect_out(doc_name,create_mask);
  1   380 <**********************************************************>
  1   381 value create_mask; integer create_mask; long array doc_name;
  1   382 begin
  2   383 own integer stacked_out;
  2   384 own long stack_chain_1,stack_chain_2;
  2   385 integer result;
  2   386 long array stack_chain_address(1:2);
  2   387 
  2   387 if doc_name(1) = 0 and stacked_out > 0 then
  2   388   begin
  3   389   stack_chain_address(1) := stack_chain_1;
  3   390   stack_chain_address(2) := stack_chain_2;
  3   391   fp_proc(30,0,out,stack_chain_address);
  3   392   stacked_out := stacked_out -1;
  3   393   stack_and_connect_out := 1;
  3   394   end
  2   395  else
  2   396 if doc_name(1) <> 0 then
  2   397   begin
  3   398   stacked_out := stacked_out + 1;
  3   399   fp_proc(29,0,out,stack_chain_address);
  3   400   stack_chain_1 := stack_chain_address(1);
  3   401   stack_chain_2 := stack_chain_address(2);
  3   402   result := create_mask;
  3   403   fp_proc(28) connect out:(result,out,doc_name);
  3   404   if result = 0 then
  3   405     stack_and_connect_out := 0 else
  3   406     stack_and_connect_out := result;
  3   407    end
  2   408   else stack_and_connect_out := 4;
  2   409 end stack_and_connect_out;
  1   410 message cg proc lib 800724 < print file and help >     page xx;
  1   411 procedure get_doc_spec(z,mode,kind,name);
  1   412 <***************************************>
  1   413 zone z; integer mode,kind; long array name;
  1   414 begin
  2   415 integer array zone_description(1:20);
  2   416 get_zone6(z,zone_description);
  2   417 mode := zone_description(1) shift (-12);
  2   418 kind := zone_description(1) extract 12;
  2   419 name(1) := extend(zone_description(2)) shift 24
  2   420            add zone_description(3);
  2   421 name(2) := extend(zone_description(4)) shift 24
  2   422            add zone_description(5);
  2   423 end get_doc_spec;
  1   424 
  1   424 
  1   424 procedure help_string(file_name_string);
  1   425 <**************************************>
  1   426 string file_name_string;
  1   427 begin
  2   428 long array file_name(1:2);
  2   429 real array field raf;
  2   430 raf:=0;
  2   431 movestring(file_name.raf,1,file_name_string);
  2   432 help(out,file_name);
  2   433 end help_string;
  1   434 
  1   434 procedure help(out,file_name);
  1   435 <************************>
  1   436 zone out; long array file_name;
  1   437 begin
  2   438 <*  prints the contents of the file <file_name> on current out.
  2   439     if current out is a terminal the file is printed 22 lines at 
  2   440     in blocks of 22 lines, after which a continuation char is
  2   441     asked for.
  2   442     if current out is anything else the whole file is printed.
  2   443 *>
  2   444 
  2   444 zone help_file(128,1,stderror);
  2   445 integer array line(0:132); <* line of 0 contain no of last element *>
  2   446 integer nextchar,linelimit,block_line_limit,
  2   447         continuation_char,line_length_limit,line_no,
  2   448         last_char, mode, kind;
  2   449 long array out_doc_name(1:2);
  2   450 boolean terminal;
  2   451 
  2   451 integer procedure read_line;
  2   452 begin
  3   453 integer char;
  3   454 nextchar := 1;
  3   455 repeat
  3   456   read_char(help_file,char);
  3   457   line(next_char) := char;
  3   458   next_char := next_char + 1;
  3   459 until char = 'nl' or char = 'em' or next_char >= line_length_limit;
  3   460 read_line := char;
  3   461 line(0) := nextchar -1;
  3   462 
  3   462 end;
  2   463 
  2   463 procedure write_line;
  2   464 begin
  3   465 integer char;
  3   466 for index := 1 step 1 until line(0) do
  3   467   outchar(out,line(index));
  3   468 end;
  2   469 line_limit := 22;
  2   470 line_length_limit := 79;
  2   471 
  2   471 open(help_file,4,file_name,0);
  2   472 get_doc_spec(out,mode,kind,out_doc_name);
  2   473 terminal := if kind = 8 then true else false;
  2   474 
  2   474 repeat
  2   475   line_no := 0;
  2   476   for line_no := line_no + 1 while last_char <> 'em' and 
  2   477                                    line_no <= line_limit do
  2   478     begin
  3   479     last_char := read_line;
  3   480     write_line;
  3   481     end;
  2   482  if last_char <> 'em' and terminal then
  2   483   begin
  3   484   write(out,<:<10>>>> MORE HELP? type 'c' otherwise 'e' :>);
  3   485   setposition(out,0,0);
  3   486   repeat
  3   487   read_char(in,continuation_char);
  3   488  until continuation_char>32;
  3   489   end;
  2   490 until continuation_char <> 'c' or last_char = 'em' ;
  2   491 
  2   491  
  2   491 close(help_file,true);
  2   492 setposition(out,0,0);
  2   493  
  2   493 fp_proc(7) finis program:(0,0,0);
  2   494 
  2   494 end help;
  1   495 

t290xasm
  1   495 
  1   495   integer elements_pr_line,                   
  1   496   length_of_code,
  1   497   half_words_pr_instr,no_of_bits_in_code,                  
  1   498   HEAP_length,
  1   499   search_table_length,
  1   500   no_of_errors,
  1   501   name_table_length,index,           
  1   502   code_kind,start_addrs;
  1   503 
  1   503   integer field refference_first_free,refference_last_free;
  1   504   integer comma_class,illegal_class,star_class,left_par_class,
  1   505   right_par_class,period_class,plus_class,minus_class,
  1   506   colon_class,semi_colon_class,equal_class,delim_class,
  1   507   apost_class, <* apostrof used as address identf. in micro code *>
  1   508   quote_class, <* same as above *>
  1   509   double_quote_class,
  1   510   slash_class, <* indicate special print for label def *>
  1   511   text_class,long_text_class,number_class,
  1   512   illegal_number_class,
  1   513   unknown_name_class,stop_line_class,eof_class,
  1   514    class,type,
  1   515    class1,type1,
  1   516    class2,type2,
  1   517    nil, <* end off refference chain *>
  1   518   label_type, <* a generel type *>
  1   519   mask_type, <* type value used by type definitions  value 101 *>
  1   520   not_used; <* a general value used for indicating
  1   521                dummy, nil and not used conditioning 
  1   522                initialized to max negative integer +  10 *>
  1   523 
  1   523   long array
  1   524        param_name, <* used for gettting abitrary parameters *>
  1   525       find_name, <* to find and list lines with specific contents *>
  1   526       current_out_name(1:2);
  1   527   integer current_out_mode_and_kind;
  1   528   integer array tail(1:20);    <* used to change the entry of 
  1   529                                     the object code *>
  1   530 
  1   530   boolean test,
  1   531           test_label_ref,
  1   532           test_label_bit,
  1   533           find,        <* list mode is only to special lines *>
  1   534           found,       <* if a special line is found 
  1   535                           ( detected in get next element) *>
  1   536           list,        <* a listing of relewant lines *>
  1   537           line_num,     <* if listning is wanted then
  1   538                            is line numbers wanted default is yes *>
  1   539           dec_code,     <* if listning then is code numbers in
  1   540                            decimal wanted , default is yes *>
  1   541           octal_code,   <* if listning thenis code numbers wnted in
  1   542                            octal ( basis 8) wanted, defaulst is yes,
  1   543                            the parameter can be set to octal.only,
  1   544                            which will set line_num and dec_code to false *>
  1   545           entry_list_wanted, <* list all entryes marked with slash *>
  1   546           return_from_skip, <* the return to the main loop is from
  1   547                                some skip logic *>
  1   548           list_all,    <* a listing of all lines , also
  1   549                           lines which is skipped *>
  1   550           help_wanted; <* used with parameter check *>
  1   551 
  1   551 
  1   551 
  1   551 
  1   551 
  1   551   boolean procedure lookup_name(name_table,short_name,index);
  1   552   <**********************************************************>
  1   553   value short_name; long array name_table; long short_name,index; 
  1   554   begin
  2   555     integer table_length,hash_index,prim_index;
  2   556     table_length := nametable(0,0);
  2   557     hash_index := (short_name extract 12) +
  2   558     ( short_name shift (-12) extract 12) +
  2   559     (short_name shift (-24) extract 12) +
  2   560     (short_name shift (-36) extract 12);
  2   561     prim_index:=hash_index mod table_length +1;
  2   562     if false then
  2   563     write(out,<:<10>***look::>,<<_dddd>,tablelength,<:index: :>,
  2   564     hashindex,<:prim: :>,primindex,<:name: :>,string shortname);
  2   565 
  2   565     for hash_index := hash_index mod table_length +1 while
  2   566     nametable(hash_index,0) > - 1 and
  2   567     name_table(hash_index,1) <> short_name and
  2   568     hash_index+1 <> prim_index do;
  2   569 
  2   569 
  2   569     index:=hash_index;
  2   570     lookup_name := if name_table(hash_index,1) = short_name
  2   571                        then true else false;
  2   572     if false then
  2   573     write(out,<: index::>,<<_dddd>,hash_index,
  2   574     name_table(hashindex,0),<: :>,string nametable(hash_index,1));
  2   575   end look_up_name;
  1   576   
  1   576   long present_code, <* the object code handled now *>
  1   577        name,number,name1,
  1   578        number1,name2,number2; <* variables for lookup in
  1   579                             tables , and reading from source *>
  1   580 
  1   580 
  1   580   procedure present(func_value,func_mask);
  1   581   <**************************************>
  1   582   value func_value,func_mask; long func_value,func_mask;
  1   583   begin
  2   584   present_code := mask_in(present_code,func_value,func_mask);
  2   585   end present;
  1   586 
  1   586 
  1   586 
  1   586 
  1   586 
  1   586   long procedure mask_in(code,func_value,func_mask);
  1   587   <*************************************************>
  1   588   value  code,func_value,func_mask; 
  1   589   long func_value,func_mask, code;
  1   590   begin
  2   591     integer init_shift,func_bit,mask_bit;
  2   592     long instr,long_one,long_all;
  2   593     init_shift := 0;
  2   594     long_one := 1; long_all := -1;
  2   595 
  2   595     for mask_bit := func_mask extract 1 while func_mask <> 0 do
  2   596     begin
  3   597       if mask_bit = 1 then
  3   598       begin
  4   599         if func_value extract 1 = 1 then
  4   600         code := logor(code,long_one shift init_shift)
  4   601         else
  4   602         code := logand(code,exor(long_all,long_one shift init_shift));
  4   603         func_value := func_value shift (-1);
  4   604       end;
  3   605       func_mask := func_mask shift (-1);
  3   606       init_shift := init_shift +1;
  3   607     end;
  2   608     mask_in := code;
  2   609   end mask_in;
  1   610 
  1   610 
  1   610 
  1   610 
  1   610   long procedure octal(number);
  1   611   value number; long number;
  1   612   begin
  2   613     integer index,tal;
  2   614     tal:=0;
  2   615     for index:=1,index*10 while number <> 0 do
  2   616     begin
  3   617       tal := tal + (index*(number extract 3 ));
  3   618       number := number shift (-3);
  3   619     end;
  2   620     octal := tal;
  2   621   end octal;
  1   622 
  1   622 
  1   622   integer array read_table(0:383);
  1   623 
  1   623   <* init of read classes *>
  1   624   illegal_class := 10;
  1   625   star_class := 11;
  1   626   comma_class := 12;
  1   627   <* ille_gal_class_2 := 13; *>
  1   628   left_par_class := 14;
  1   629   right_par_class :=15;
  1   630   period_class := 16;
  1   631   minus_class := 17;
  1   632   colon_class := 18;
  1   633   semi_colon_class := 19;
  1   634   equal_class := 20;
  1   635   plus_class := 21;
  1   636 quote_class := apost_class := 23;
  1   637 slash_class := 24;
  1   638 double_quote_class := 25;
  1   639   delim_class := 7; <* space and / is resent delim*>
  1   640   text_class := 6;
  1   641   long_text_class := 5;
  1   642   number_class := 2;
  1   643   illegal_number_class := 1;
  1   644   unknown_name_class := 9 ; <* short or long name *>
  1   645   stop_line_class := 8;
  1   646   eof_class := 22; <* this is not in read_table but is calc. 
  1   647                       in get_next_element *>     
  1   648   not_used := -8388598 ;
  1   649 
  1   649   iso_table(read_table);
  1   650   <* 0  - 127 is modified std_table *>
  1   651   <* 128- 255 is 
  1   652   comment shift table 
  1   653           256 - 383 is comment text table *>
  1   654           
  1   654 for index := 128 step 1 until 255 do
  1   655           read_table(index) := 1 shift 12 + 256;
  1   656   semi_colon_class := 19;
  1   657   read_table(128+59):=semi_colon_class shift 12 + 59;
  1   658   for index:= 256 step 1 until 383 do
  1   659   read_table(index):= 6 shift 12 + (index-256);
  1   660   read_table(256+0) := 0 shift 12 + 0;
  1   661   read_table(256+10) := 1 shift 12 + 0;
  1   662   read_table(256+12) := 1 shift 12 + 0;
  1   663   read_table(256+13) := 0 shift 12 + 0;
  1   664   read_table(256+25) := 1 shift 12 + 0;
  1   665   read_table(256+127) := 0 shift 12 + 127;
  1   666 
  1   666 
  1   666   for index := 33 step 1 until 39 do
  1   667   read_table(index):= illegal_class shift 12 + index;
  1   668   read_table(39) := apost_class shift 12 + 39;
  1   669   read_table('"'):=double_quote_class shift 12 + '"';
  1   670 
  1   670   read_table(40):= left_par_class shift 12 + 40;
  1   671   read_table(41) := right_par_class shift 12 + 41;
  1   672   read_table(42) := star_class shift 12 + 42;
  1   673   read_table(44):= comma_class shift 12 + 44;
  1   674   read_table(46):= period_class shift 12 + 46;
  1   675   read_table(47):=slash_class shift 12 + 47;
  1   676   read_table(43):= plus_class shift 12 + 43;
  1   677   read_table(45):= minus_class shift 12 + 45;
  1   678   read_table(58):=colon_class shift 12 + 58;
  1   679   read_table(59) := 1 shift 12 + 128; <* semicolon shift table *>
  1   680   for index := 60 step 1 until 64 do
  1   681   read_table(index) := 10 shift 12 + index;
  1   682   read_table(61) := equal_class shift 12 + 61;
  1   683   for index:= 94 step 1 until 96,126 do
  1   684   read_table(index):= 10 shift 12 + index;
  1   685   intable(read_table);
  1   686 
  1   686 
  1   686 
  1   686 
  1   686 
  1   686 
  1   686   test := false;
  1   687 
  1   687 
  1   687 
  1   687 
  1   687 
  1   687 
  1   687   no_of_bits_in_code := 40;
  1   688   length_of_code := 1024;
  1   689   search_table_length := 253;
  1   690   name_table_length := 511;
  1   691   HEAP_length := 5000;
  1   692   nil := -8388608; <* min integer *>
  1   693   label_type := 97;
  1   694   mask_type := 101;
  1   695    
  1   695   <* search for the parameter help.yes *>
  1   696   get_bool_string(<:help:>,help_wanted);
  1   697   if help_wanted then help_string(<:micasmhelp:>);
  1   698 
  1   698 
  1   698 
  1   698 
  1   698 
  1   698 
  1   698   begin
  2   699     integer instr_index,
  2   700             last_instr_index, 
  2   701             line_no,line_no1,line_pointer,line_pointer_1,
  2   702     line_pointer_2,line_pointer_3,char_value,char_value_1,char_value_2,
  2   703     char_class,char_class_1,element_no,            
  2   704     no_of_elements,
  2   705     reg_op_type,alu_function_type,jump_addrs_type,
  2   706     jump_sekvens_type,load_counter_type,special_type,
  2   707     condition_type,                      
  2   708     condition_type_min,condition_type_max,
  2   709     special_min,special_max;
  2   710 
  2   710 
  2   710     boolean code_generated,eof,eol,alu_function_performed,
  2   711     jump_addrs_performed,jump_sekvens_performed,
  2   712     shift_condition_performed,addrs_performed,
  2   713     print_code,object_file,
  2   714     list_error_lines,
  2   715     message_list,
  2   716     list_bit_lines,
  2   717     line_listed,
  2   718     help_wanted,
  2   719     error_in_this_line;         
  2   720     integer array format(0:no_of_bits_in_code);
  2   721     long array read_value(1:80);
  2   722     integer array read_kind(1:80);
  2   723      integer array search_table(0:search_table_length - 1);
  2   724     long array name_table(0:name_table_length,0:4);
  2   725     integer array HEAP(1:HEAP_length);
  2   726     long array field name_record;
  2   727     long field name_name,
  2   728                name_mask;
  2   729     integer field name_value,
  2   730                name_type,
  2   731                name_chain;
  2   732     integer name_record_length;
  2   733 
  2   733     long array field error_record;
  2   734     long field error_record_text;
  2   735     integer field error_record_line_no;
  2   736     integer field error_record_element_pos;
  2   737     integer field error_record_instr_index;
  2   738     integer field error_record_chain;
  2   739     integer error_record_length;
  2   740     long array field error_record_chain_head;
  2   741     long array field l_d_record, l_d_record_chain_head;
  2   742     long       field l_d_name;
  2   743     integer    spec_class,map_spec,vector_spec; <* and nil *>
  2   744     integer    field l_d_spec, l_d_spec_class;
  2   745     integer    field l_d_index;
  2   746     integer    field l_d_line_no;
  2   747     integer    field l_d_chain;
  2   748     integer l_d_record_length;
  2   749 
  2   749 
  2   749     long array field l_r_record;
  2   750     integer field l_r_chain;
  2   751     long    field l_r_name;
  2   752     integer field l_r_index;
  2   753     integer field l_r_line_no;
  2   754     integer field l_r_element_no;
  2   755     integer l_r_record_length,l_r_record_chain_head;
  2   756     long array op_code(0:length_of_code-1);
  2   757     long array object_file_name(1:2);
  2   758 
  2   758 
  2   758 
  2   758 
  2   758     <* error text variables *>
  2   759     long plus_label_dec,declaration,operand_type,minus_delim,missing_operand,
  2   760     label_dec,illegal_type,plus_name_dec,name_unknown,directive,
  2   761     unknown,name_length,delimiter,undec_label,multiple_function,
  2   762     plus_addrs_def,minus_addrs_def,operand,
  2   763     special_def_type,illegal_source,illegal_dest,
  2   764     illegal_dest_and_source,save_file_name,load_file_name,
  2   765     termination;
  2   766   algol copy.1   <* schould be taken from m290xdec *>;
t2903dec d.791206.1522
  2   766 long            <* declarition of std mask to hc2903 *>
  2   767    condition_enable_mask,
  2   768    sekvens_mask,
  2   769    cond_my_reg_enable_mask,
  2   770 
  2   770   cond_m_reg_enable_mask,
  2   771 
  2   771    
  2   771    condition_select_mask, 
  2   772    condition_full_mask, <* select and kind *>
  2   773    alu_full_length_mask,
  2   774    alu_dest_mask, <* alu bit i8 to both i5 *>
  2   775    alu_short_dest_mask,
  2   776    alu_i5_left_mask,
  2   777    alu_i5_rigth_mask,
  2   778    alu_both_i5_mask,
  2   779    alu_function_mask, <* alu bit i4 to i1 *>
  2   780    alu_full_function_mask, <* alu bit i4 to i0 *>
  2   781    alu_special_control_mask, <* alu bit i0 *>
  2   782    carry_control_mask,
  2   783    set_2904_shift_mask,
  2   784    not_ea_mask,
  2   785    w_reg_enable_mask,
  2   786  
  2   786    w_reg_enable_sel_mask,
  2   787    not_oeb_mask,
  2   788 
  2   788    read_2901_reg_mask,
  2   789 
  2   789    write_2901_reg_mask,
  2   790    alu_full_source_mask, <* not ea and not oeb and alu bit i0 *>
  2   791    source_extern_mask,
  2   792 
  2   792    dest_extern_mask,
  2   793    short_source_mask,
  2   794    short_dest_mask,
  2   795    source_mask,
  2   796    dest_mask,
  2   797    addrs_mask,
  2   798 
  2   798    addrs_and_imm_mask, <* addrs and immidiate mask *>
  2   799    cond_kind_set_mask,
  2   800    not_half_w_move_enable_mask,
  2   801 
  2   801    half_w_move_dir_mask,
  2   802    half_word_move_mask,
  2   803 
  2   803    shift_control_2904_mask, <* controls the 2904 instr bit i6 to i9 *>
  2   804    all_m_reg_enable_mask, <* all bits to contol the great m reg *>
  2   805 
  2   805    select_m_reg_enable_mask, <* only the select bits *>
  2   806    select_interupt_bit_mask,
  2   807    instr_full_length;     <* all bits in instr *>
  2   808 long             <* declaration of hc2903 std values *>
  2   809   <* alu source control values ,
  2   810      use bit not ea , alu i0 , not_oeb *>
  2   811 
  2   811   a_and_b,
  2   812   a_and_direct,
  2   813   a_and_q,
  2   814   im_and_b,
  2   815   im_and_dir,
  2   816   im_and_q;
  2   817 long  <* special functions *>
  2   818   q_regs_value,
  2   819 
  2   819   w_index_value,
  2   820   w_pre_index_value;
  2   821 

t290xasm
  2   821 
  2   821 
  2   821 
  2   821     <* fixed bit long values *>
  2   822     long array bits(0:48);
  2   823   long   prom_code, <* the value not to destroy the used prom *>
  2   824          nop_code; <* the code which will perform nothing abd continue
  2   825                    with the next micro instr.*>
  2   826 
  2   826 
  2   826     procedure init_HEAP;
  2   827     <******************************>
  2   828     begin
  3   829     integer index;
  3   830     refference_first_free := 2*2;
  3   831     for index := 2 step 2 until HEAP_length do
  3   832       begin
  4   833       HEAP(index-1) := index*2-4; <* points to previus element *>
  4   834       HEAP(index)   := index*2+4; <* point to next element *>
  4   835       refference_last_free := index*2;
  4   836       end;
  3   837     end init_HEAP;
  2   838 
  2   838     integer procedure allocate(no_of_halfwords);
  2   839     <******************************************>
  2   840     value no_of_halfwords; integer no_of_halfwords;
  2   841     begin
  3   842     allocate := refference_first_free - 4;
  3   843     if ( no_of_halfwords mod 4) <> 0 then
  3   844       no_of_halfwords := no_of_half_words + (4 -(no_of_halfwords mod 4));
  3   845     refference_first_free := refference_first_free + no_of_half_words;
  3   846     if refference_first_free > refference_last_free then
  3   847       fatal_error(<:REFFERENCE TABLE LENGTH EXEEDED:>);
  3   848     end allocate;
  2   849 
  2   849     procedure fatal_error(error_text);
  2   850     <********************************>
  2   851     string error_text;
  2   852     begin
  3   853     print_error_table;
  3   854     write(out,"nl",1,"*",5,"sp",1,error_text,"nl",1,
  3   855               "sp",7,<:RUN ABORT:>);
  3   856     fp_proc(7,0,0,0);
  3   857     end fatal_error;
  2   858 
  2   858     procedure error(error_text,line_no,element_pos);
  2   859     <**********************************************>
  2   860     value error_text,line_no,element_pos;
  2   861     long error_text;
  2   862     integer line_no,element_pos;
  2   863     begin
  3   864     error_in_this_line := true;
  3   865     no_of_errors := no_of_errors + 1;
  3   866     error_record := allocate(error_record_length);
  3   867     HEAP.error_record.error_record_chain := error_record_chain_head;
  3   868     error_record_chain_head := error_record;
  3   869     HEAP.error_record.error_record_text := error_text;
  3   870     HEAP.error_record.error_record_line_no := line_no;
  3   871     HEAP.error_record.error_record_element_pos := element_pos;
  3   872     HEAP.error_record.error_record_instr_index := instr_index;
  3   873     end error;
  2   874 
  2   874      
  2   874      
  2   874      boolean procedure new_lookup_name(name,name_record_index,name_type);
  2   875      value name; long name;
  2   876      integer name_record_index,name_type;
  2   877      begin
  3   878      long array field look_name_record; 
  3   879      boolean found;
  3   880      found := false;
  3   881      name_record_index := calculate_hash_key(name);
  3   882      look_name_record := search_table(name_record_index);
  3   883      while look_name_record <> nil and -,found do
  3   884        begin
  4   885        if name = HEAP.look_name_record.name_name then
  4   886          found := true
  4   887         else
  4   888          look_name_record := HEAP.look_name_record.name_name;
  4   889         end;
  3   890      name_record_index := look_name_record;
  3   891      new_lookup_name := found;
  3   892      end new_lookup_name;
  2   893 
  2   893     integer procedure new_insert_name(name,reff_index,type,record_length);
  2   894     value name,type,record_length;
  2   895     long name;
  2   896     integer reff_index,type,record_length;
  2   897     begin
  3   898     integer array field insert_name_record;
  3   899     integer hash_key;
  3   900     hash_key := calculate_hash_key(name);
  3   901     insert_name_record := allocate(record_length);
  3   902     new_insert_name := insert_name_record;
  3   903     reff_index := insert_name_record;
  3   904     HEAP.insert_name_record.name_name := name;
  3   905     HEAP.insert_name_record.name_type := type;
  3   906     HEAP.insert_name_record.name_chain := search_table(hash_key);
  3   907     search_table(hash_key) := insert_name_record;
  3   908     end new_insert_name;
  2   909 
  2   909     integer procedure calculate_hash_key(name);
  2   910     value name; long name;
  2   911     begin
  3   912     calculate_hash_key := (( name extract 12) +
  3   913                           ( name shift (-12) extract 12) +
  3   914                           ( name shift (-24) extract 12) +
  3   915                           ( name shift (-36) extract 12) +
  3   916                           ( name shift (-40) extract 8) +
  3   917                           ( name shift (-32) extract 8) +
  3   918                           ( name shift (-24) extract 12) 
  3   919                          )
  3   920                           mod search_table_length;
  3   921     end calculate_hash_key;
  2   922 
  2   922     integer procedure insert_name_table(index,name,type,reff);
  2   923     value index,name,type,reff; long index,name;          
  2   924     integer type,reff;
  2   925     begin
  3   926     name_table(index,1) := name;
  3   927     name_table(index,0) := type;
  3   928     name_table(index,4) := reff;
  3   929     end insert_name_table;
  2   930 
  2   930 
  2   930 
  2   930     integer procedure addrs_ref(name,instr_index,line_no,element_no);
  2   931 
  2   931     value name,instr_index,line_no,element_no;
  2   932     long name;
  2   933     integer instr_index,line_no,element_no;
  2   934     begin
  3   935     l_r_record := allocate(l_r_record_length);
  3   936     HEAP.l_r_record.l_r_chain := l_r_record_chain_head;
  3   937     l_r_record_chain_head := l_r_record;
  3   938     HEAP.l_r_record.l_r_name := name;
  3   939     HEAP.l_r_record.l_r_index := instr_index;
  3   940     HEAP.l_r_record.l_r_line_no := line_no;
  3   941     HEAP.l_r_record.l_r_element_no := element_no;
  3   942     addrs_ref := l_r_record;
  3   943     end addrs_ref;
  2   944 
  2   944     integer procedure new_insert_label_def(name,index,instr_index,line_no,spec,spec_class);
  2   945     value name,index,instr_index,spec,line_no,spec_class;
  2   946     long name,index;
  2   947     integer instr_index,spec,line_no,spec_class;
  2   948     begin
  3   949     l_d_record := allocate(l_d_record_length);
  3   950     insert_name_table(index,name,label_type,l_d_record);
  3   951     HEAP.l_d_record.l_d_chain := l_d_record_chain_head;      
  3   952     l_d_record_chain_head := index;
  3   953     HEAP.l_d_record.l_d_index := instr_index;
  3   954     HEAP.l_d_record.l_d_line_no := line_no;
  3   955     HEAP.l_d_record.l_d_spec := spec;
  3   956     HEAP.l_d_record.l_d_spec_class := spec_class;
  3   957     new_insert_label_def := index;
  3   958     end new_insert_label_def;
  2   959 
  2   959     procedure resolve_labels;
  2   960     begin
  3   961     integer op_code_index;
  3   962     long name_table_index;
  3   963     long array wr_name(1:2); <* used for writing of a name *>
  3   964     wr_name(2):=0;
  3   965 
  3   965     l_r_record := l_r_record_chain_head;
  3   966      while l_r_record >-1 do
  3   967        begin
  4   968        if -, lookup_name(name_table,HEAP.l_r_record.l_r_name,
  4   969                     name_table_index) then
  4   970          begin
  5   971          instr_index := HEAP.l_r_record.l_r_index;
  5   972          error(undec_label,HEAP.l_r_record.l_r_line_no,
  5   973                            HEAP.l_r_record.l_r_element_no);
  5   974          end
  4   975         else
  4   976          begin
  5   977          l_d_record := name_table(name_table_index,4);
  5   978          op_code_index := HEAP.l_r_record.l_r_index;
  5   979          op_code(opcode_index) := mask_in(op_code(op_code_index),
  5   980            extend HEAP.l_d_record.l_d_index,
  5   981            addrs_mask);
  5   982          
  5   982 
  5   982          if test_label_bit or test_label_ref then
  5   983            begin
  6   984            wr_name(1) := HEAP.l_d_record.l_d_name;
  6   985            write(out,"nl",1,"sp",5,<<zddd>,
  6   986                  octal(extend HEAP.l_r_record.l_r_index),
  6   987                  <: label reff to: :>,
  6   988                  octal(extend HEAP.l_d_record.l_d_index),
  6   989                  <: name: :>,wr_name);
  6   990            end;
  5   991          
  5   991          if test_label_bit then
  5   992            begin
  6   993            write(out,"nl",1,"sp",11);
  6   994            print_formated(op_code(op_code_index));
  6   995            end;
  5   996 
  5   996          end;
  4   997        l_r_record := HEAP.l_r_record.l_r_chain;
  4   998        end scan loop;
  3   999     end resolve_labels;
  2  1000 
  2  1000     procedure label_list(only_spec_wanted);
  2  1001     value only_spec_wanted; boolean only_spec_wanted;
  2  1002     begin
  3  1003     integer no_of_spec,max_spec,max_index;
  3  1004     long array wr_name(1:2),hex_number(1:2);
  3  1005     integer index;
  3  1006     no_of_spec := 0;
  3  1007     wr_name(2) := 0;
  3  1008     
  3  1008     for index := 1 step 1 until name_table_length do
  3  1009       begin
  4  1010       if name_table(index,0) = label_type then
  4  1011         begin
  5  1012         l_d_record := name_table(index,4);
  5  1013         if HEAP.l_d_record.l_d_spec <> nil or
  5  1014            -, only_spec_wanted then
  5  1015            begin
  6  1016            wr_name(1) := name_table(index,1);
  6  1017            write(out,"sp",15 - write(out,"nl",1,wr_name),
  6  1018                  "cr",1,"sp",7,<: reff. to address:>,
  6  1019                  <<_zddd>,HEAP.l_d_record.l_d_index,
  6  1020                   octal(extend HEAP.l_d_record.l_d_index),
  6  1021                   if HEAP.l_d_record.l_d_spec = nil then <::> else
  6  1022                   if HEAP.l_d_record.l_d_spec < 0 then
  6  1023                   <:_line_no_:> else <:_spec.____:>,
  6  1024                    if HEAP.l_d_record.l_d_spec <> nil then <<__dddd> else <<b>,
  6  1025                   if HEAP.l_d_record.l_d_spec = nil then
  6  1026                   0 else
  6  1027                    abs HEAP.l_d_record.l_d_spec);
  6  1028           no_of_spec := no_of_spec + 1;
  6  1029           end;
  5  1030        end;
  4  1031       end for loop;
  3  1032      if only_spec_wanted then
  3  1033          begin
  4  1034          for spec_class := nil,map_spec ,vector_spec  do
  4  1035          begin
  5  1036          if no_of_spec > 0 then
  5  1037          write(out,"nl",4,
  5  1038                if spec_class = map_spec then <: MAP ENTRIES :>
  5  1039                else if spec_class = vector_spec then <: VECTOR ENTIES :>
  5  1040                else <::>,"nl",1,
  5  1041                <:_name_____________spec.____instr.___octal____:>);
  5  1042          repeat
  5  1043            begin
  6  1044            max_spec := nil;
  6  1045            for index := 1 step 1 until name_table_length do
  6  1046              begin
  7  1047              if name_table(index,0) = label_type then
  7  1048                begin
  8  1049                l_d_record := name_table(index,4);
  8  1050                if HEAP.l_d_record.l_d_spec > max_spec and
  8  1051                   HEAP.l_d_record.l_d_spec <> nil   and
  8  1052                   HEAP.l_d_record.l_d_spec_class = spec_class  then
  8  1053                   begin
  9  1054                   max_spec := HEAP.l_d_record.l_d_spec;
  9  1055                   max_index := index;
  9  1056                   end;
  8  1057                end;
  7  1058              end loop name_table;
  6  1059           <* write spec *>
  6  1060           if max_spec <> nil then
  6  1061             begin
  7  1062             wr_name(1) := name_table(max_index,1);
  7  1063             l_d_record := name_table(max_index,4);
  7  1064           write(out,"sp",15-write(out,"nl",1,wr_name),
  7  1065                 <<____dddd>,HEAP.l_d_record.l_d_spec,
  7  1066                 HEAP.l_d_record.l_d_index,
  7  1067                 octal(extend HEAP.l_d_record.l_d_index),
  7  1068                 HEAP.l_d_record.l_d_index shift (-8),         
  7  1069                 HEAP.l_d_record.l_d_index extract 8);
  7  1070 
  7  1070           <* delete label entry in name table *>
  7  1071           name_table(max_index,0) := nil;
  7  1072           no_of_spec := no_of_spec-1;
  7  1073           end;
  6  1074          end;           
  5  1075        until max_spec = nil;
  5  1076        end spec_class_loo;
  4  1077        end only_spec_loop;
  3  1078     end label_list;
  2  1079 
  2  1079     boolean procedure print_error_table;
  2  1080     begin
  3  1081     long array field previus,this,min_line;
  3  1082     integer min_line_no;
  3  1083 
  3  1083     if error_record_chain_head = nil then
  3  1084       print_error_table := true
  3  1085     else
  3  1086       begin
  4  1087       print_error_table := false;
  4  1088       while error_record_chain_head <> nil do
  4  1089         begin
  5  1090         min_line_no := 8388606;
  5  1091         this := error_record_chain_head;
  5  1092         previus := nil;
  5  1093         while this <> nil do
  5  1094           begin
  6  1095           if HEAP.this.error_record_line_no <= min_line_no then
  6  1096             begin
  7  1097             min_line_no := HEAP.this.error_record_line_no;
  7  1098             min_line:= previus;
  7  1099             end;
  6  1100           previus := this;
  6  1101           this := HEAP.this.error_record_chain;
  6  1102           end;
  5  1103 
  5  1103         <* remove record from list *>
  5  1104         if min_line = nil then                    
  5  1105           begin
  6  1106           this := error_record_chain_head;
  6  1107           error_record_chain_head := HEAP.this.error_record_chain;
  6  1108           end
  5  1109         else
  5  1110           begin
  6  1111           previus := min_line;
  6  1112           this := HEAP.previus.error_record_chain;
  6  1113          HEAP.previus.error_record_chain :=
  6  1114           HEAP.this.error_record_chain;
  6  1115           end;
  5  1116         write(out,"nl",1,<<_dddd>,
  5  1117               HEAP.this.error_record_line_no,
  5  1118               HEAP.this.error_record_instr_index,
  5  1119               octal(extend HEAP.this.error_record_instr_index),
  5  1120               HEAP.this.error_record_element_pos,
  5  1121               "sp",2,string HEAP.this.error_record_text);
  5  1122         end;
  4  1123        end;
  3  1124      end print_error_table;
  2  1125 
  2  1125 
  2  1125 
  2  1125     procedure print_formated(opcode);
  2  1126     <********************************>
  2  1127     value opcode; long opcode;
  2  1128     begin
  3  1129       integer from,to,number,index;
  3  1130         from := 0;
  3  1131         for index :=-47 step 1 until 0 do
  3  1132         begin
  4  1133           outchar(out,if opcode shift index extract 1 = 1 then
  4  1134           49 else 46);
  4  1135           if format(from) extract 12 = 47 + index then
  4  1136           begin
  5  1137             outchar(out,32);
  5  1138             from:=from+1;
  5  1139           end;
  4  1140         end for loop;
  3  1141     <* for improving readability write an extra newline *>
  3  1142     outchar(out,10);
  3  1143 
  3  1143     end  print_format;
  2  1144 
  2  1144 
  2  1144   algol copy.2  <* source should be m290xproc *>;
t2903proc d.810408.1811
  2  1144 
  2  1145 
  2  1145 
  2  1145 
  2  1145 
  2  1145 
  2  1145 
  2  1145     procedure jump_addrs;
  2  1146     <******************>
  2  1147     begin
  3  1148       if alu_function_performed or jump_sekvens_performed or
  3  1149       jump_addrs_performed or addrs_performed then 
  3  1150       error(multiple_function,line_no,element_no);
  3  1151       present(name_table(number,2),
  3  1152       sekvens_mask);
  3  1153       present(name_table(number,3),
  3  1154       condition_enable_mask);
  3  1155       next;
  3  1156       if class = left_par_class then
  3  1157       begin
  4  1158         scan_sekvens_operands(false);
  4  1159       end;
  3  1160       addrs_performed := jump_addrs_performed :=  code_generated:=true;
  3  1161     end of jump_addrs;
  2  1162 
  2  1162 
  2  1162     procedure jump_sekvens;
  2  1163     begin
  3  1164       if jump_addrs_performed or jump_sekvens_performed then
  3  1165       error(multiple_function,line_no,element_no);
  3  1166       present(name_table(number,2),
  3  1167       sekvens_mask);
  3  1168       present(name_table(number,3),
  3  1169       condition_enable_mask);
  3  1170       next;
  3  1171       if class=left_par_class then
  3  1172       begin
  4  1173            scan_sekvens_operands(true);
  4  1174       end;
  3  1175 
  3  1175       jump_sekvens_performed := true; code_generated:=true;
  3  1176 
  3  1176     end of jump_sekevens;
  2  1177 
  2  1177     procedure load_counter;
  2  1178     begin
  3  1179       jump_addrs;
  3  1180     end of load_counter;
  2  1181 
  2  1181 
  2  1181     procedure special;
  2  1182     <*****************>
  2  1183     begin
  3  1184       long spec_number;
  3  1185       integer kind_1,op_value1,op_value2,kind_2,index;
  3  1186       if name_table(number,3) < special_min or
  3  1187       name_table(number,3) > special_max then
  3  1188       error(special_def_type,line_no,element_no)
  3  1189       else
  3  1190       case name_table(number,3) of
  3  1191       begin
  4  1192               
  4  1192         begin
  5  1193           <* case 1 is                   
  5  1194           value by name_table(number,2)
  5  1195           mask by a mask entry given by 
  5  1196           nametable(nametable(number,4),2)
  5  1197           *>
  5  1198 
  5  1198           present(
  5  1199           name_table(number,2),
  5  1200           name_table(name_table(number,4),2));
  5  1201         end of case 1;
  4  1202         begin
  5  1203                 <* case 2 is no parameters and mask
  5  1204           Is pointed out by name_table(name,4),
  5  1205           among the fixed mask values,
  5  1206           from left to rigth in the format
  5  1207           *>
  5  1208 
  5  1208           present(
  5  1209           name_table(number,2),
  5  1210           std_mask(name_table(number,4)));
  5  1211         end of case 2;
  4  1212         begin
  5  1213           <* case 3.
  5  1214           set or clear depending on value,
  5  1215           the bits taken from argument 1 to 
  5  1216           argument 2 *>
  5  1217           spec_number:=number;
  5  1218           next1;
  5  1219           if class1 <> left_par_class then
  5  1220           error(delimiter,line_no,element_no)
  5  1221           else
  5  1222           begin
  6  1223             if name_table(spec_number,4) = 2 then
  6  1224             get_2_reg_operands(op_value_1,op_value_2)
  6  1225             else
  6  1226             begin
  7  1227               get_a_reg_operand(op_value_1,kind_1);;
  7  1228               op_value_2 := op_value_1;
  7  1229             end;
  6  1230             for index:= op_value_1 step 1 until op_value_2 do
  6  1231             present(name_table(spec_number,2),
  6  1232             (extend 1 ) shift (47 - index));
  6  1233             next;
  6  1234             if class <> right_par_class then
  6  1235             error(delimiter,line_no,element_no)
  6  1236           end;
  5  1237         end case 3;
  4  1238         begin
  5  1239         <* case 4 one bit is set or cleared acording to
  5  1240            the bit number specicfied by nametable(number,4) *>
  5  1241         present(extend ( name_table(number,2)
  5  1242                                extract 1) , extend 1 shift (47 -
  5  1243                                name_table(number,4)));
  5  1244         end case 4;
  4  1245 
  4  1245 
  4  1245 
  4  1245         begin
  5  1246          <* case 5 
  5  1247          load counter from internal register
  5  1248          pointed out by 
  5  1249          pointed out by s address field or q reg.
  5  1250          s address field second bit is set
  5  1251          and w_reg enable is set *>
  5  1252 
  5  1252          if jump_addrs_performed or jump_sekvens_performed or
  5  1253             alu_function_performed  or addrs_performed then
  5  1254            error(multiple_function,line_no,element_no);
  5  1255          jump_addrs_performed := jump_sekvens_performed :=
  5  1256             alu_function_performed := addrs_performed :=true;
  5  1257     
  5  1257          <* first the function of the 2910 is masked in *>
  5  1258          present(name_table(number,2),
  5  1259                          sekvens_mask);
  5  1260          <* if condition schould be forced to true then
  5  1261             name_table(number,4) is 1 *>
  5  1262          present(name_table(number,4),
  5  1263                          condition_enable_mask);
  5  1264         class1:=getnext_element(name_1,number1);
  5  1265         if class1 <> left_par_class then
  5  1266           begin
  6  1267           error(missing_operand,line_no,element_no);
  6  1268           end
  5  1269          else
  5  1270           begin
  6  1271            get_a_reg_operand(op_value_1,kind_1);
  6  1272           if op_value_1 >=0 and op_value_1 <16 then
  6  1273             begin
  7  1274             <* an reg. from alu source *>
  7  1275 
  7  1275             present(extend op_value_1,
  7  1276                                     short_source_mask);
  7  1277             present(extend 0,
  7  1278                                     not_ea_mask);
  7  1279             present(extend 6,
  7  1280                                     alu_function_mask);
  7  1281             present(extend 0,
  7  1282                                       carry_control_mask);
  7  1283             end else
  6  1284           if op_value_1 = q_regs_value then
  6  1285             begin
  7  1286             present(extend 1,
  7  1287                                       alu_special_control_mask);
  7  1288             present(extend 4,
  7  1289                                     alu_function_mask);
  7  1290             end else
  6  1291             error(illegal_type,line_no,element_no);
  6  1292             present(extend 1,
  6  1293                                    w_reg_enable_mask);
  6  1294            present(extend 2,
  6  1295                                    dest_mask);
  6  1296            present(extend 6,
  6  1297                                    alu_short_dest_mask);
  6  1298 
  6  1298            present(extend 0,
  6  1299                                     alu_both_i5_mask);
  6  1300            next;
  6  1301            if class <> right_par_class then
  6  1302              error(minus_delim,line_no,element_no);
  6  1303            end;
  5  1304          end case 5;
  4  1305 
  4  1305          begin 
  5  1306          <* case 6 
  5  1307          load counter from internal register
  5  1308          pointed out by 
  5  1309          pointed out by s address field or q reg.
  5  1310          s address field second bit is set
  5  1311          and w_reg enable is set *>
  5  1312          if jump_addrs_performed or jump_sekvens_performed   
  5  1313             then
  5  1314            error(multiple_function,line_no,element_no);
  5  1315          jump_addrs_performed := jump_sekvens_performed :=  true;
  5  1316     
  5  1316          <* first the function of the 2910 is masked in *>
  5  1317          present(name_table(number,2),
  5  1318                          sekvens_mask);
  5  1319          <* if condition schould be forced to true then
  5  1320             name_table(number,4) is 1 *>
  5  1321          present(name_table(number,4),
  5  1322                          condition_enable_mask);
  5  1323             present(extend 1,
  5  1324                                    w_reg_enable_mask);
  5  1325            present(extend 2,
  5  1326                                    dest_mask);
  5  1327         end case 6;
  4  1328              
  4  1328       end of all cases;
  3  1329       code_generated:=true;
  3  1330       next;
  3  1331       if class = comma_class then 
  3  1332       next;
  3  1333     end of special;
  2  1334 
  2  1334 
  2  1334 
  2  1334 
  2  1334     procedure scan_sekvens_operands(use_of_addrs_field);
  2  1335     <***********************************************>
  2  1336     value use_of_addrs_field; boolean use_of_addrs_field;
  2  1337     begin
  3  1338       next;
  3  1339       for class := class while class <> right_par_class 
  3  1340       and class <> stop_line_class do
  3  1341       begin
  4  1342         if class = text_class  and type = condition_type then
  4  1343           begin
  5  1344           <* condition *>
  5  1345           present(name_table(number,2),
  5  1346           condition_select_mask);
  5  1347         end
  4  1348         else
  4  1349         if class = unknown_name_class or class = number_class or
  4  1350            class = apost_class  or
  4  1351              class = text_class then
  4  1352 
  4  1352         begin
  5  1353           <* addrs. ref. *>
  5  1354           if class = apost_class then next;
  5  1355           if look_ahead_class = right_par_class then
  5  1356           begin
  6  1357             if use_of_addrs_field then error(plus_addrs_def,line_no,element_no);
  6  1358             if class = unknown_name_class or
  6  1359                (class = text_class <*and name_table(number,0) = label_type*>) then
  6  1360             addrs_ref(name,instr_index,line_no,element_no)
  6  1361             else
  6  1362             present(number,
  6  1363                                     addrs_and_imm_mask);
  6  1364             use_of_addrs_field := true;
  6  1365           end else
  5  1366           error(unknown,line_no,element_no);
  5  1367         end
  4  1368         else
  4  1369         begin
  5  1370           error(missing_operand,line_no,element_no);
  5  1371         end;
  4  1372         next;
  4  1373         if class = comma_class then next;
  4  1374       end;                          
  3  1375       if class = right_par_class then next;
  3  1376       if -, use_of_addrs_field then error(minus_addrs_def,line_no,element_no);
  3  1377     end of scan_addrs_operands;
  2  1378 
  2  1378 
  2  1378 
  2  1378 
  2  1378     procedure alu_function;
  2  1379     <*********************>
  2  1380 
  2  1380     begin
  3  1381       integer type_of_operands;
  3  1382       if alu_function_performed  then
  3  1383       error(multiple_function,line_no,element_no);
  3  1384       present(name_table(number,2),
  3  1385       alu_function_mask);
  3  1386       type_of_operands := name_table(number,3);
  3  1387       class := look_ahead_class;
  3  1388       if class = left_par_class then
  3  1389       begin
  4  1390            case type_of_operands of
  4  1391         begin
  5  1392           normal_function(0);
  5  1393           normal_function(1);
  5  1394           special_function(0);
  5  1395           special_function(1);
  5  1396           special_function(2);
  5  1397         end; <* 
  4  1398       end of case *>
  4  1399       next;
  4  1400     end;
  3  1401     code_generated:=true; alu_function_performed:=true;
  3  1402   end of alu_function;
  2  1403 
  2  1403 
  2  1403   procedure normal_function(carry);
  2  1404   value carry; integer carry;
  2  1405   begin
  3  1406   integer dest_value,dest_kind,no_of_operands;
  3  1407   no_of_operands := scan_alu_operands(dest_value,dest_kind);
  3  1408   
  3  1408   if no_of_operands > 0 then
  3  1409     begin
  4  1410     present(extend carry,
  4  1411                             carry_control_mask);
  4  1412     set_alu_output(dest_value,dest_kind,0,element_no -
  4  1413                     ( if no_of_operands = 1 then
  4  1414                     1 else no_of_operands+2));
  4  1415     end;
  3  1416   end procedure normal_function;
  2  1417   procedure special_function(carry);
  2  1418   <********************************>
  2  1419   value carry; integer carry;
  2  1420   begin
  3  1421   long spec_value;
  3  1422   integer dest_value,dest_kind,no_of_operands;
  3  1423   spec_value := name_table(number,2);
  3  1424   no_of_operands := scan_alu_operands(dest_value,dest_kind);
  3  1425   if no_of_operands > 0 then
  3  1426     begin
  4  1427 
  4  1427 
  4  1427     end;
  3  1428   present(extend carry,
  3  1429                           carry_control_mask);
  3  1430   present(extend 0,
  3  1431                           alu_full_function_mask);
  3  1432   present(spec_value,
  3  1433                           alu_dest_mask);
  3  1434 
  3  1434 end procedure special_function;
  2  1435 
  2  1435 
  2  1435 
  2  1435 
  2  1435 
  2  1435 integer procedure scan_alu_operands(dest_val,dest_kind);
  2  1436 <******************************************************>
  2  1437 integer dest_val,dest_kind;
  2  1438 begin
  3  1439 
  3  1439 integer no_of_op,val_1,kind_1,val_2,kind_2,val_3,kind_3;
  3  1440 no_of_op := 
  3  1441   get_all_reg_operands(val_1,kind_1,val_2,kind_2,val_3,kind_3);
  3  1442 if no_of_op > 3 then no_of_op :=3;
  3  1443 scan_alu_operands:= no_of_op;
  3  1444 if no_of_op > 0 then
  3  1445    begin
  4  1446    dest_val := val_1;
  4  1447    dest_kind := kind_1;
  4  1448    end
  3  1449   else
  3  1450    begin
  4  1451    dest_val := 0;
  4  1452    dest_kind := 0;
  4  1453    no_of_op := 0;
  4  1454   end;
  3  1455 
  3  1455 case no_of_op + 1 of
  3  1456   begin
  4  1457 
  4  1457   begin <* 0 operands *>
  5  1458   end;
  4  1459 
  4  1459   begin <* 1 operand *>
  5  1460   if kind_1 <> text_class then
  5  1461   error(illegal_dest,line_no,element_no-1)
  5  1462   else
  5  1463     set_alu_dest(val_1,kind_1,element_no - 1 );
  5  1464   end;
  4  1465 
  4  1465   begin <* 2 operands *>
  5  1466   if val_1 > 15 and kind_2 <> number_class then
  5  1467     begin
  6  1468     set_alu_dest(val_2,kind_2,element_no - 1);
  6  1469     end
  5  1470    else
  5  1471   if ( val_2 <= 15 and val_2 >= 0 )
  5  1472     or kind_2 = number_class then
  5  1473     begin
  6  1474     set_alu_source(val_2,kind_2,element_no - 1);
  6  1475     set_alu_dest(val_1,kind_1,element_no -3);
  6  1476     end
  5  1477    else
  5  1478   if ( val_1 = w_index_value or val_1 = w_pre_index_value) and
  5  1479      val_2 = q_regs_value then
  5  1480     begin
  6  1481     set_alu_dest(val_1,kind_1,element_no -3);
  6  1482     present(extend 1,
  6  1483                             alu_special_control_mask);
  6  1484     end
  5  1485    else
  5  1486     
  5  1486   
  5  1486     begin
  6  1487     set_alu_dest(val_2,kind_2,element_no - 1);
  6  1488     end;
  5  1489   
  5  1489   end case 2 operands;
  4  1490 
  4  1490   begin <*case 3 operands *>
  5  1491   
  5  1491   if kind_2 = number_class or
  5  1492       ( kind_3 = text_class and (val_3 = q_regs_value or
  5  1493      val_3 = w_pre_index_value or val_3 = w_index_value)) then
  5  1494      begin
  6  1495      set_alu_source(val_2,kind_2,element_no -3);
  6  1496      set_alu_dest(val_3,kind_3,element_no - 1);
  6  1497      end
  5  1498     else
  5  1499      begin
  6  1500      set_alu_source(val_3,kind_3,element_no -1);
  6  1501      set_alu_dest(val_2,kind_2,element_no - 3);
  6  1502      end;
  5  1503    end;
  4  1504  
  4  1504  end case loop;
  3  1505 end scan_alu_operands;
  2  1506 
  2  1506 procedure set_alu_output(op_value,op_kind,special,element_no);
  2  1507 <************************************************************>
  2  1508 value op_value,op_kind,special,element_no;
  2  1509 integer op_value,op_kind,special,element_no;
  2  1510 begin
  3  1511 if op_kind = text_class then
  3  1512 begin
  4  1513 if op_value = q_regs_value then
  4  1514   begin
  5  1515   present( extend 3,
  5  1516                      alu_short_dest_mask);
  5  1517   present(extend 0,
  5  1518                           alu_both_i5_mask);
  5  1519   end
  4  1520 
  4  1520   else
  4  1521 if op_value = w_index_value or op_value = w_pre_index_value then
  4  1522   begin
  5  1523   present(extend 2,alu_short_dest_mask);
  5  1524   present(extend 0,alu_both_i5_mask);
  5  1525   present(extend 1,w_reg_enable_mask);
  5  1526   present(if op_value = w_index_value then extend 0 else extend 1,
  5  1527           dest_mask);
  5  1528   end
  4  1529  else
  4  1530 if op_value > 15 then
  4  1531   begin
  5  1532   
  5  1532   present(extend 1,
  5  1533                           write_2901_reg_mask);
  5  1534   present( extend 0,
  5  1535                            not_oeb_mask);
  5  1536   present(extend 6,
  5  1537                           alu_short_dest_mask);
  5  1538   present(extend 0,
  5  1539                           alu_both_i5_mask);
  5  1540   end
  4  1541  else
  4  1542 if op_value >=0 and op_value <=15 then
  4  1543   begin
  5  1544   present(extend 2,
  5  1545                           alu_short_dest_mask);
  5  1546   present(extend 0,
  5  1547                           alu_both_i5_mask);
  5  1548   present(extend op_value,
  5  1549                           dest_mask);
  5  1550   end
  4  1551  else
  4  1552 error(illegal_dest,line_no,element_no);
  4  1553 end else
  3  1554 error(illegal_dest,line_no,element_no);
  3  1555 end  set_alu_output;
  2  1556 
  2  1556 
  2  1556 procedure set_alu_source(op_value,op_kind,element_no);
  2  1557 <****************************************************>
  2  1558 value op_value,op_kind,element_no;
  2  1559 integer op_value,op_kind,element_no;
  2  1560 begin
  3  1561 if op_kind = number_class then
  3  1562   begin
  4  1563   if addrs_performed then
  4  1564       error(multiple_function,line_no,element_no);
  4  1565   addrs_performed := true;
  4  1566   present(extend 1,
  4  1567                           not_ea_mask);
  4  1568   present(extend op_value,
  4  1569                           addrs_and_imm_mask);
  4  1570  end
  3  1571  else
  3  1572 if op_kind = text_class then
  3  1573     begin
  4  1574     if op_value > 16 then
  4  1575       error(illegal_source,line_no,element_no)
  4  1576     else
  4  1577      begin
  5  1578 
  5  1578      present(extend 0,
  5  1579                              not_ea_mask);
  5  1580      present(extend op_value,
  5  1581 
  5  1581                              short_source_mask);
  5  1582      end;
  4  1583    end
  3  1584  else
  3  1585 error(illegal_source,line_no,element_no);
  3  1586 
  3  1586 end of set_alu_source;
  2  1587 
  2  1587 
  2  1587 procedure set_alu_dest(op_value,op_kind,element_no);
  2  1588 <***************************************************>
  2  1589 value op_value,op_kind,element_no;
  2  1590   integer op_value,op_kind,element_no;
  2  1591   begin
  3  1592 
  3  1592   if op_kind = text_class then
  3  1593     begin
  4  1594     if op_value = q_regs_value then
  4  1595       begin
  5  1596 
  5  1596       present(extend 1,
  5  1597                               alu_special_control_mask);
  5  1598       present(extend 0,
  5  1599                               dest_mask);
  5  1600       end
  4  1601      else
  4  1602     if op_value = w_index_value 
  4  1603        or op_value = w_pre_index_value then
  4  1604       begin
  5  1605       present(extend 1,
  5  1606                                   w_reg_enable_mask);
  5  1607       present( 
  5  1608                               if op_value = w_index_value then
  5  1609                               extend 0 else extend 1,
  5  1610                               dest_mask);
  5  1611       present(extend 0,
  5  1612                               not_oeb_mask);
  5  1613       present(extend 0,
  5  1614                                 alu_special_control_mask);
  5  1615       end
  4  1616      else
  4  1617     if op_value > 15 then
  4  1618       begin
  5  1619       present(extend 1,
  5  1620                               not_oeb_mask);
  5  1621       present(extend 0,
  5  1622                               alu_special_control_mask);
  5  1623       present(extend 0,
  5  1624                               dest_mask);
  5  1625       end
  4  1626      else
  4  1627     if op_value >= 0 and op_value < 16 then
  4  1628       begin
  5  1629       present(extend 0,
  5  1630                                not_oeb_mask);
  5  1631       present( extend 0,
  5  1632                               alu_special_control_mask);
  5  1633       present(extend op_value,
  5  1634                               dest_mask);
  5  1635       end
  4  1636      else
  4  1637       error(illegal_dest,line_no,element_no);
  4  1638     end
  3  1639      else
  3  1640     error(illegal_dest,line_no,element_no);
  3  1641   end  set_alu_dest;
  2  1642 long procedure std_mask(mask_no);
  2  1643 <******************************>
  2  1644 value mask_no; long mask_no;
  2  1645 begin
  3  1646 std_mask := case mask_no of
  3  1647   (
  3  1648    condition_enable_mask,
  3  1649    sekvens_mask,
  3  1650    cond_my_reg_enable_mask,
  3  1651 
  3  1651   cond_m_reg_enable_mask,
  3  1652 
  3  1652    
  3  1652    condition_select_mask, 
  3  1653    condition_full_mask, <* select and kind *>
  3  1654    alu_full_length_mask,
  3  1655    alu_dest_mask, <* alu bit i8 to both i5 *>
  3  1656    alu_short_dest_mask,
  3  1657    alu_i5_left_mask,
  3  1658    alu_i5_rigth_mask,
  3  1659    alu_both_i5_mask,
  3  1660    alu_function_mask, <* alu bit i4 to i1 *>
  3  1661    alu_full_function_mask, <* alu bit i4 to i0 *>
  3  1662    alu_special_control_mask, <* alu bit i0 *>
  3  1663    carry_control_mask,
  3  1664    set_2904_shift_mask,
  3  1665    not_ea_mask,
  3  1666    w_reg_enable_mask,
  3  1667  
  3  1667    w_reg_enable_sel_mask,
  3  1668    not_oeb_mask,
  3  1669 
  3  1669    read_2901_reg_mask,
  3  1670 
  3  1670    write_2901_reg_mask,
  3  1671    alu_full_source_mask, <* not ea and not oeb and alu bit i0 *>
  3  1672    source_extern_mask,
  3  1673 
  3  1673    dest_extern_mask,
  3  1674    short_source_mask,
  3  1675    short_dest_mask,
  3  1676    source_mask,
  3  1677    dest_mask,
  3  1678    addrs_mask,
  3  1679 
  3  1679    addrs_and_imm_mask, <* addrs and immidiate mask *>
  3  1680    cond_kind_set_mask,
  3  1681    not_half_w_move_enable_mask,
  3  1682 
  3  1682    half_w_move_dir_mask,
  3  1683    half_word_move_mask,
  3  1684 
  3  1684    shift_control_2904_mask, <* controls the 2904 instr bit i6 to i9 *>
  3  1685    all_m_reg_enable_mask,  <* all bits to control great m reg *>
  3  1686    select_m_reg_enable_mask, <* only to select th bits *>
  3  1687    select_interupt_bit_mask,
  3  1688    instr_full_length);     <* all bits in instr *>
  3  1689 end procedure std_mask;
  2  1690 

t290xasm
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690 
  2  1690   integer procedure 
  2  1691     get_all_reg_operands(op_1,kind_1,op_2,kind_2,op_3,kind_3);
  2  1692   <**********************************************************>
  2  1693   integer op_1,kind_1,op_2,kind_2,op_3,kind_3;
  2  1694   begin
  3  1695   integer no_of_op;
  3  1696   no_of_op := 0;
  3  1697   op_1 := op_2 := op_3 := kind_1 := kind_2 := kind_3 := not_used;
  3  1698   class := look_ahead_class;
  3  1699   if class = left_par_class then
  3  1700     begin
  4  1701     next;
  4  1702     get_a_reg_operand(op_1,kind_1);
  4  1703     no_of_op := 1;
  4  1704    if look_ahead_class = comma_class then
  4  1705       begin
  5  1706       next;
  5  1707       get_a_reg_operand(op_2,kind_2);
  5  1708       no_of_op := 2;
  5  1709       if look_ahead_class = comma_class then
  5  1710          begin
  6  1711          next;
  6  1712          get_a_reg_operand(op_3,kind_3);
  6  1713          no_of_op := 3;
  6  1714          end;
  5  1715      end;
  4  1716    next;
  4  1717   if class <> right_par_class then
  4  1718      error(termination,line_no,element_no);
  4  1719   end else error(missing_operand,line_no,element_no);
  3  1720 get_all_reg_operands := no_of_op;
  3  1721 end  get_all_reg_operands;
  2  1722 <*
  2  1723 
  2  1723 procedure check_unknown_operands(op_kind_1,op_kind_2,op_kind_3,op_kind_4);
  2  1724 value op_kind_1,op_kind_2,op_kind_3,op_kind_4;
  2  1725 integer op_kind_1,op_kind_2,op_kind_3,op_kind_4;
  2  1726 begin
  2  1727 integer no_of_op;
  2  1728 no_of_op := if op_kind_1 = not_used then 0 else
  2  1729             if op_kind_2 = not_used then 1 else
  2  1730             if op_kind_3 = not_used then 2 else
  2  1731             if op_kind_4 = not_used then 3 else 4;
  2  1732  if op_kind_1 = unknown_name_class then
  2  1733   error(operand,line_no,element_no - 1 -(2*(no_of_op-1)));
  2  1734  if op_kind_2 = unknown_name_class then
  2  1735   error(operand,line_no,element_no -1-(2*(no_of_op-2)));
  2  1736  if op_kind_3 = unknown_name_class then
  2  1737   error(operand,line_no,element_no - 1 - 2*(no_of_op-3));
  2  1738  if op_kind_4 = unknown_name_class then
  2  1739   error(operand,line_no,element_no -1);
  2  1740 end check_unkown_operands; *>
  2  1741 
  2  1741 
  2  1741 
  2  1741 
  2  1741 
  2  1741 
  2  1741   procedure get_a_reg_operand(op_value,kind);
  2  1742   <*****************************************>
  2  1743   integer op_value,kind;
  2  1744   begin
  3  1745   long lookup_index;
  3  1746     next;
  3  1747     if class = number_class then
  3  1748    begin
  4  1749    kind := number_class;
  4  1750    op_value := number
  4  1751   end
  3  1752     else
  3  1753     if class = apost_class then
  3  1754       begin
  4  1755       next;
  4  1756       kind := 0;
  4  1757       op_value := 0;
  4  1758       if class = unknown_name_class or
  4  1759          (class = text_class and type = label_type) then
  4  1760          begin
  5  1761          addrs_ref(name,instr_index,line_no,element_no);
  5  1762          kind := number_class;
  5  1763          end
  4  1764        else
  4  1765          error(operand_type,line_no,element_no);
  4  1766     end
  3  1767     else
  3  1768    if class = text_class then
  3  1769     begin
  4  1770       if name_table(number,0) <> reg_op_type then
  4  1771       begin
  5  1772       kind := 0;
  5  1773       error(operand_type,line_no,element_no)
  5  1774       end
  4  1775       else
  4  1776       begin
  5  1777       op_value := name_table(number,2);
  5  1778       kind := text_class;
  5  1779       end;
  4  1780     end
  3  1781    else
  3  1782      begin
  4  1783      kind := unknown_name_class;
  4  1784      error(operand,line_no,element_no);
  4  1785      end;
  3  1786   end of get_a_reg_operand;
  2  1787 
  2  1787 
  2  1787 
  2  1787 
  2  1787   procedure  get_2_reg_operands(op_value_1,op_value_2);
  2  1788   integer op_value_1,op_value_2;
  2  1789   begin
  3  1790   integer kind_1,kind_2;
  3  1791     get_a_reg_operand(op_value_1,kind_1);
  3  1792     next;
  3  1793     if class <> comma_class then error(delimiter,line_no,element_no);
  3  1794     get_a_reg_operand(op_value_2,kind_2);
  3  1795   end of get_2_reg_operands;
  2  1796 
  2  1796 
  2  1796 
  2  1796 
  2  1796 
  2  1796 
  2  1796 
  2  1796 
  2  1796   integer procedure look_ahead_class;
  2  1797   begin
  3  1798     integer to; long name,number;
  3  1799     look_ahead_class := get_element(name,number,line_pointer,to);
  3  1800   end look_ahead_class;
  2  1801 
  2  1801 
  2  1801 
  2  1801   procedure skip_until_delim_class;
  2  1802   begin
  3  1803     for class:=read_kind(line_pointer) while class <> delim_class  
  3  1804     and class <> eof_class 
  3  1805     and class <> stop_line_class do
  3  1806     line_pointer:=line_pointer + 1;
  3  1807   end skip_until_delim_class;
  2  1808 
  2  1808 
  2  1808 
  2  1808 
  2  1808   integer procedure get_long_name(long_name);
  2  1809   long array long_name;
  2  1810   begin
  3  1811     integer class,to;
  3  1812     long name,number;
  3  1813     class := get_element(name,number,line_pointer,to);
  3  1814     if class = unknown_name_class or class = text_class then
  3  1815     begin
  4  1816       get_long_name := 1;
  4  1817       long_name(1) := name;
  4  1818       long_name(2) := 0;
  4  1819     end
  3  1820     else
  3  1821     if class = long_text_class then
  3  1822     begin
  4  1823       long_name(1) := read_value(line_pointer);
  4  1824       long_name(2) := read_value(line_pointer + 2);
  4  1825       get_long_name :=  if read_kind(line_pointer + 3 ) = text_class 
  4  1826       then -2 else 2;
  4  1827     end
  3  1828     else
  3  1829     get_long_name := 0;
  3  1830   end get_long_name;
  2  1831 
  2  1831   <* the following procedures uses getnext element
  2  1832      to get next element into 
  2  1833      class,name,number,type
  2  1834      class1,name1,number1,type2
  2  1835      class2,name2,number2,type2 *>
  2  1836 
  2  1836   integer procedure next;
  2  1837   begin
  3  1838   next := class := get_next_element(name,number);
  3  1839   type := if class = text_class then name_table(number,0) else class;
  3  1840   end next;
  2  1841 
  2  1841   integer procedure next1;
  2  1842   begin
  3  1843   next1 := class1 := get_next_element(name1,number1);
  3  1844   type1 := if class1 = text_class  then name_table(number,0) else class1;
  3  1845   end next1;
  2  1846 
  2  1846   integer procedure next2;
  2  1847   begin
  3  1848   next2:=class2:=get_next_element(name2,number2);
  3  1849   type2 := if class2 = text_class then name_table(number,0) else class2;
  3  1850   end next2;
  2  1851 
  2  1851   integer procedure skip_next;
  2  1852   begin
  3  1853   long dummyname,dummynumber;
  3  1854   skip_next:=get_next_element(dummyname,dummynumber);
  3  1855   end skip_next;
  2  1856 
  2  1856   integer procedure look;
  2  1857   begin
  3  1858   look := class := look_ahead_class;
  3  1859   end look;
  2  1860 
  2  1860   integer procedure look1;
  2  1861   begin
  3  1862   look1 := class1 := look_ahead_class;
  3  1863   end look1;
  2  1864 
  2  1864   integer procedure look2;
  2  1865   begin
  3  1866   look2:= class2 := look_ahead_class;
  3  1867   end look2;
  2  1868 
  2  1868 
  2  1868 
  2  1868 
  2  1868 
  2  1868 
  2  1868 
  2  1868   integer procedure get_next_element(name,number);
  2  1869   long name,number;
  2  1870   begin
  3  1871     integer to,testclass;;
  3  1872     get_next_element := testclass := get_element(name,number,line_pointer,to);
  3  1873     element_no:=element_no+1;
  3  1874     line_pointer := if line_pointer = no_of_elements then line_pointer else to;
  3  1875   end get_next_element;
  2  1876 
  2  1876 
  2  1876 
  2  1876   integer procedure get_element(name,number,from,to);
  2  1877   value from; integer from,to; long name,number;
  2  1878   begin
  3  1879     integer class;
  3  1880     for class:=read_kind(from) while class = delim_class do
  3  1881     from := from + 1;
  3  1882 
  3  1882     if class = text_class then
  3  1883     begin
  4  1884       if read_kind(from+1) <> text_class or
  4  1885       ( read_kind(from+1) = text_class and read_value(from+1) = 0) then
  4  1886       begin
  5  1887         <* short text *>
  5  1888         name := read_value(from);
  5  1889         if name = find_name(1) then found := true;
  5  1890         get_element := if look_up_name(name_table,name,number) then
  5  1891          text_class else  unknown_name_class;
  5  1892       end
  4  1893      else get_element := unknown_name_class;;
  4  1894       <* skip to 1. not text element *>
  4  1895       for from := from+1 while read_kind(from) = text_class do;
  4  1896       to := from;
  4  1897     end
  3  1898     else
  3  1899     if class = plus_class then
  3  1900     begin
  4  1901       if get_integer(number,from+1,to) then get_element := 2
  4  1902 
  4  1902       else get_element := 1;
  4  1903     end
  3  1904     else
  3  1905     if class = minus_class then
  3  1906     begin
  4  1907       if get_integer(number,from+1,to) then get_element:=2
  4  1908       else get_element:=1;
  4  1909       number:= number*(-1);
  4  1910     end else
  3  1911     if class = 2 then
  3  1912     begin
  4  1913       if get_integer(number,from,to) then get_element:=2
  4  1914       else get_element := 1;
  4  1915     end
  3  1916     else
  3  1917     if class = stop_line_class then
  3  1918     begin
  4  1919       number := read_value(from);
  4  1920       if number extract 24 = 25 <* eof value *> then
  4  1921       get_element := eof_class
  4  1922       else
  4  1923       get_element :=class;
  4  1924       to :=from+1;
  4  1925     end else
  3  1926     begin
  4  1927       number:=read_value(from);
  4  1928       to := from+1;
  4  1929       get_element := class;
  4  1930     end;
  3  1931   end get_element;
  2  1932 
  2  1932 
  2  1932   boolean procedure get_integer(number,from,to);
  2  1933   value from; integer from,to; long number;
  2  1934   begin
  3  1935     long base;
  3  1936     if read_kind(from)<> 2 then get_integer:=false
  3  1937     else
  3  1938     begin
  4  1939       if read_kind(from+1) = period_class then
  4  1940       begin
  5  1941         base:=read_value(from);
  5  1942         from:=from+2;
  5  1943         if read_kind(from) <> 2 then
  5  1944         begin
  6  1945           get_integer := false;
  6  1946           to := from-1;
  6  1947         end else
  5  1948         begin
  6  1949           number:=read_value(from);
  6  1950           get_integer:=base_convert(base,number);
  6  1951          to := from + 1;
  6  1952         end;
  5  1953       end else
  4  1954       begin
  5  1955         number:=read_value(from);
  5  1956         get_integer := true;
  5  1957         to := from + 1;
  5  1958       end;
  4  1959     end;
  3  1960   end get_integer;
  2  1961 
  2  1961 
  2  1961   boolean procedure base_convert(base,number);
  2  1962   long base,number;
  2  1963   begin
  3  1964     integer shift_index; long number1,number2;
  3  1965     number2:=0; shift_index :=0;
  3  1966     base_convert := true;
  3  1967     if base = 8 then 
  3  1968     begin
  4  1969       for number1 := number mod 10 while number <> 0 do
  4  1970       begin
  5  1971         number := number // 10;
  5  1972         if number1>7 or number1 < 0 then base_convert := false;
  5  1973         number2:=number2 + number1 shift shift_index;
  5  1974         shift_index := shift_index+3;
  5  1975       end;
  4  1976       number := number2;
  4  1977     end else base_convert:=false;
  3  1978   end base_convert;
  2  1979   boolean procedure read_and_set_bits(operand);
  2  1980   <******************************************>
  2  1981   long array operand;
  2  1982   begin
  3  1983   boolean error;
  3  1984   error := false;
  3  1985   
  3  1985   repeat
  3  1986     begin
  4  1987     next;
  4  1988     if class = left_par_class then
  4  1989       begin
  5  1990       if next1 <> number_class then
  5  1991         error := true
  5  1992        else
  5  1993       if next<> colon_class then
  5  1994         error := true
  5  1995         else
  5  1996       if next2 <> number_class then
  5  1997         error := true
  5  1998        else
  5  1999       if next <> right_par_class then
  5  2000        error := true;
  5  2001         if number_1 <= number_2 and
  5  2002            number_1 >= 0 and
  5  2003            number_2 <= no_of_bits_in_code and
  5  2004            -, error then
  5  2005            error := -, set_bits(operand,number1 extract 24,
  5  2006                     number2 extract 24)
  5  2007          else error := true;
  5  2008        next;
  5  2009 
  5  2009        end else
  4  2010     if class = number_class then
  4  2011      begin
  5  2012      if number >= 0 and  number <= no_of_bits_in_code then
  5  2013      error := -, set_bits(operand,number extract 24,
  5  2014               number extract 24)
  5  2015       else error := true;
  5  2016       next;
  5  2017 
  5  2017       end;
  4  2018     end;
  3  2019   until class <> comma_class or error;
  3  2020   read_and_set_bits := -, error;
  3  2021 
  3  2021   end read_and_set_bits;
  2  2022 
  2  2022   boolean procedure set_bits(operand,bit_low,bit_high);
  2  2023   <****************************************************>
  2  2024   value bit_low,bit_high; integer bit_low,bit_high;
  2  2025   long array operand;
  2  2026   begin
  3  2027   integer 
  3  2028     index_low,
  3  2029     index_high,
  3  2030     bit_high_in_word,
  3  2031     bit_low_in_word,
  3  2032     word_index;
  3  2033 
  3  2033   if bit_high < bit_low then
  3  2034     set_bits := false
  3  2035    else
  3  2036     begin
  4  2037     index_low := case ( bit_low//48) + 1 of
  4  2038                  (1,2,3,4,5,6,7,8);
  4  2039     index_high := case (bit_high//48) + 1 of
  4  2040                  (1,2,3,4,5,6,7,8);
  4  2041     bit_low_in_word := bit_low mod 48;
  4  2042     bit_high_in_word := bit_high mod 48;
  4  2043     if index_low = index_high then
  4  2044       begin
  5  2045       operand(index_low) := log_or(operand(index_low),
  5  2046         extend(-1) shift ((-48)+(bit_high_in_word+1-bit_low_in_word))
  5  2047         shift (47 - bit_high_in_word));
  5  2048       end
  4  2049      else
  4  2050        begin
  5  2051        operand(index_low) := log_or(operand(index_low),
  5  2052          extend (-1) shift ( - bit_low_in_word));
  5  2053        operand(index_high) := log_or(operand(index_high),
  5  2054          extend(-1) shift (47 - bit_high_in_word));
  5  2055        for word_index := index_low+1 step 1 until index_low  - 1 do
  5  2056          operand(word_index) := -1;
  5  2057         end;
  4  2058       set_bits := true;
  4  2059     end;
  3  2060 
  3  2060   end set_bits;
  2  2061 
  2  2061 
  2  2061 
  2  2061   long procedure init_mask(operand,from,to);
  2  2062   <******************************************>
  2  2063   value from,to,operand; long operand; integer from,to;
  2  2064   init_mask:=mask_in(operand,extend (-1),
  2  2065   extend (-1) shift ((-48)+(to+1-from))  shift (47-to));
  2  2066 
  2  2066 
  2  2066   <* *************************************************
  2  2067      directive procedures section
  2  2068      ************************************************* *>
  2  2069 
  2  2069   procedure directive_skip_until;
  2  2070   begin
  3  2071   boolean until_condition_met;
  3  2072 
  3  2072   long skip_end_name;
  3  2073   next1;
  3  2074 
  3  2074   if class1 = text_class or class1 = unknown_name_class then
  3  2075     begin
  4  2076     skip_end_name := name1;
  4  2077     repeat
  4  2078      if list_all then list_line;
  4  2079      read_next_source_line;
  4  2080 
  4  2080      if class = star_class then
  4  2081         begin
  5  2082         next1;
  5  2083         if name1 = long <:until:> then
  5  2084           begin
  6  2085           next1;
  6  2086           if class1 = colon_class then
  6  2087               next1;
  6  2088           if name1 = skip_end_name then 
  6  2089               until_condition_met := true;
  6  2090           end;
  5  2091         end control of first token;
  4  2092      until until_condition_met;
  4  2093      end else
  3  2094       error(directive,line_no,element_no);
  3  2095   return_from_skip := true;
  3  2096   end directive_skip_until;
  2  2097 procedure directive_onlyin_logic(mode);
  2  2098 <********************************>
  2  2099 value mode; boolean mode;
  2  2100 <* if mode is true then skip only in is performed
  2  2101    else skip not in is performed *>
  2  2102 begin
  3  2103 <* check the param list to se the param
  3  2104    mode.<text> , where <text> schall be equal
  3  2105    the next element *>
  3  2106 long array param_name,until_name,only_name(1:2);
  3  2107 integer param_call_result;
  3  2108 boolean until_condition_met;
  3  2109 
  3  2109 
  3  2109 param_call_result := get_text_string(<:version:>,param_name);
  3  2110 class1 := get_long_name(only_name);
  3  2111 if param_call_result <> 0 or
  3  2112    (param_call_result = 0 and
  3  2113      (( mode and (param_name(1) <> only_name(1) or
  3  2114       param_name(2) <> only_name(2)))
  3  2115     or
  3  2116      ( -, mode and  param_name(1) = only_name(1) and
  3  2117                     param_name(2) = only_name(2) ))) then
  3  2118 
  3  2118   begin 
  4  2119   <* skip until a 'until' directive is met with
  4  2120      with the version text as parameter. *>
  4  2121    until_condition_met := false;
  4  2122    repeat
  4  2123      if list_all then list_line;
  4  2124      read_next_source_line;
  4  2125      if class = eof_class then until_condition_met := true;
  4  2126      
  4  2126      if class = star_class then
  4  2127        begin
  5  2128        next1;
  5  2129        if name1 = long <:until:> then
  5  2130          begin
  6  2131          next1;
  6  2132          if class1 = colon_class then
  6  2133            class1 := get_long_name(until_name);
  6  2134          if class1 > 0 and
  6  2135             only_name(1) =until_name(1) and
  6  2136             only_name(2) = until_name(2) then
  6  2137            until_condition_met := true;
  6  2138          end;
  5  2139        end control of first token 'colon' ;
  4  2140     until until_condition_met;
  4  2141  end skip not this version ;
  3  2142 return_from_skip := true;
  3  2143 
  3  2143 
  3  2143 end directive_only_in;
  2  2144 
  2  2144 
  2  2144 procedure include_source_file;
  2  2145 <****************************>
  2  2146 begin
  3  2147 long array file_name(1:2);
  3  2148 integer stack_result;
  3  2149 class1 := get_long_name(file_name);
  3  2150 if class1 > 0 then
  3  2151     begin
  4  2152     stack_result :=  stack_and_connect_in(file_name);
  4  2153     if list then list_line;
  4  2154 
  4  2154     if stack_result <> 0 then
  4  2155       write(out,"*",4,<: copy connect error: :>,file_name,"nl",1)
  4  2156     else
  4  2157       write(out,<: micasm source : :>,file_name,"nl",1);
  4  2158     end else 
  3  2159     error(directive,line_no,element_no);
  3  2160 end include_source_file;
  2  2161 
  2  2161 
  2  2161 
  2  2161 
  2  2161 
  2  2161 
  2  2161 
  2  2161 procedure list_line;
  2  2162 <*******************>
  2  2163 begin
  3  2164 if -, line_listed then
  3  2165 begin
  4  2166 line_listed := true;
  4  2167 if line_num then write(out,<<dddd>,line_no);
  4  2168       if code_generated then
  4  2169       begin
  5  2170       if dec_code then write(out,<<_zddd>,instr_index);
  5  2171       if octal_code then write(out,<<_zddd>,octal(extend instr_index));     
  5  2172       outchar(out,'sp');
  5  2173       end
  4  2174       else
  4  2175        begin
  5  2176        if dec_code then write(out,"sp",5);
  5  2177        if octal_code then write(out,"sp",5);
  5  2178        outchar(out,'sp');
  5  2179        end;
  4  2180       line_pointer := 0;
  4  2181       for line_pointer := line_pointer+1 
  4  2182       while line_pointer <= no_of_elements do
  4  2183       begin
  5  2184         if read_kind(line_pointer) = 6 then
  5  2185         begin
  6  2186           write(out,string read_value(increase(line_pointer)));
  6  2187           line_pointer := line_pointer - 1;
  6  2188         end
  5  2189         else
  5  2190         if read_kind(line_pointer) = 2 then
  5  2191         write(out,<<d>,read_value(line_pointer))
  5  2192         else
  5  2193         outchar(out,read_value(line_pointer) extract 8);
  5  2194       end;
  4  2195   end;
  3  2196 end list_line;
  2  2197 
  2  2197 
  2  2197 
  2  2197 
  2  2197   procedure read_next_source_line;
  2  2198   <******************************>
  2  2199   begin
  3  2200   <* reset boolean control *>
  3  2201   error_in_this_line := false ;
  3  2202 
  3  2202   code_generated := false;
  3  2203   alu_function_performed := false;
  3  2204   jump_sekvens_performed := false;
  3  2205   addrs_performed := false;
  3  2206   shift_condition_performed := false;
  3  2207   jump_addrs_performed := false;
  3  2208   line_listed := false;
  3  2209 
  3  2209   line_pointer := 1;
  3  2210   element_no := 0;
  3  2211   no_of_elements := read_all(in,read_value,read_kind,1);
  3  2212   line_no := line_no + 1;
  3  2213   next;
  3  2214   end read_next_source_line;
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215 
  2  2215   plus_label_dec := long <:plus label dec.:>;
  2  2216   declaration := long <:declaration:>;
  2  2217   operand_type := long <:operand type:>;
  2  2218   minus_delim := long <:minus delim.:>;
  2  2219   missing_operand := long <:missing operand.:>;
  2  2220   label_dec:= long <:label dec.:>;
  2  2221   illegal_type := long <:illegal type:>;
  2  2222   plus_name_dec := long <:plus name dec.:>;
  2  2223   name_unknown := long <:name unknown:>;
  2  2224   directive := long <:directive:>;
  2  2225   unknown := long <:unknown:>;
  2  2226   name_length := long <:name length exeedes 6 char.:>;
  2  2227   delimiter := long <:delimiter:>;
  2  2228   undec_label := long <:undec. label or addrs. :>;
  2  2229   multiple_function := long <:multiple function.:>;
  2  2230   plus_addrs_def := long <:plus addrs def.:>;
  2  2231   minus_addrs_def := long <:minus addrs. def.:>;
  2  2232   illegal_source := long <:illegal source:>;
  2  2233   illegal_dest := long <:illegal destination:>;
  2  2234   illegal_dest_and_source := long <:illegal destination and or source :>;
  2  2235   save_file_name := long <:illegal save file name:>;
  2  2236   load_file_name := long <:illegal load file name:>;
  2  2237   termination := long <:termination:>;
  2  2238   operand := long <:unknown operand:>;
  2  2239   algol copy.3 <* schould be m290xinit *>;
t2903init d.801208.1518
  2  2239 
  2  2240 
  2  2240 
  2  2240 
  2  2240 
  2  2240 
  2  2240   <* def. of micro types *>
  2  2241   alu_function_type := 11;
  2  2242   jump_addrs_type := 12;
  2  2243   <*not def. type := 13 *>
  2  2244   jump_sekvens_type := 14;
  2  2245   load_counter_type :=15;
  2  2246   special_type :=16;
  2  2247   special_min:=0;
  2  2248   special_max:=32;
  2  2249 
  2  2249   reg_op_type := 30;
  2  2250   condition_type := 40;
  2  2251   condition_type_min :=40;
  2  2252   condition_type_max:=45;
  2  2253 <* init of format to be printed *>
  2  2254 
  2  2254 format(0) := 0;
  2  2255 format(1) := 1 shift 12 + 4;
  2  2256 format(2) := 5 shift 12 + 5;
  2  2257 format(3) := 6 shift 12 + 6;
  2  2258 format(4) := 7 shift 12 + 10;
  2  2259 format(5) := 11 shift 12 + 15;
  2  2260 format(6) := 16 shift 12 + 20;
  2  2261 format(7) := 21 shift 12 + 22;
  2  2262 format(8) := 23 shift 12 + 27;
  2  2263 format(9) := 28 shift 12 + 31;
  2  2264 format(10) := 32 shift 12 + 35;
  2  2265 format(11) := 36 shift 12 + 39;
  2  2266 format(12) := 40 shift 12 + 41;
  2  2267 format(13) := 42 shift 12 + 43;
  2  2268 format(14) := 44 shift 12 + 47;
  2  2269 
  2  2269 <* initialiasing standard mask *>
  2  2270 condition_enable_mask := init_mask(extend 0,0,0);
  2  2271 sekvens_mask := init_mask(extend 0,1,4);
  2  2272 cond_my_reg_enable_mask := init_mask(extend 0,5,5);
  2  2273 cond_m_reg_enable_mask := init_mask(extend 0,6,6);
  2  2274 condition_select_mask := init_mask(extend 0,7,10);
  2  2275 condition_full_mask := init_mask(extend 0,6,10);
  2  2276 alu_full_length_mask := init_mask(extend 0,11,20); 
  2  2277 alu_dest_mask := init_mask(extend 0,11,15); <*alubiti8tobothi5*>
  2  2278 alu_short_dest_mask := init_mask(extend 0,11,13); <* alu bit 8 to 6
  2  2279                                               not i5 *>
  2  2280 alu_i5_left_mask := init_mask(extend 0,14,14); 
  2  2281 alu_i5_rigth_mask := init_mask(extend 0,15,15); 
  2  2282 alu_both_i5_mask := init_mask(extend 0,14,15); 
  2  2283 alu_function_mask := init_mask(extend 0,16,19); <*alubiti4toi1*>
  2  2284 alu_full_function_mask := init_mask(extend 0,16,20); <*alubiti4toi0*>
  2  2285 alu_special_control_mask := init_mask(extend 0,20,20); <*alubiti0*>
  2  2286 carry_control_mask := init_mask(extend 0,21,22);
  2  2287 set_2904_shift_mask := init_mask(extend 0,23,23); 
  2  2288 not_ea_mask := init_mask(extend 0,24,24);
  2  2289 w_reg_enable_mask := init_mask(extend 0,25,25);
  2  2290 w_reg_enable_sel_mask := init_mask(init_mask(extend 0,25,25),35,35);
  2  2291 not_oeb_mask := init_mask(extend 0,26,26);
  2  2292 read_2901_reg_mask := init_mask(extend 0,26,26);
  2  2293 write_2901_reg_mask := init_mask(extend 0,27,27);
  2  2294 alu_full_source_mask := init_mask(init_mask(extend 0,20,20),25,27);
  2  2295                             <*noteaandnotoebandalubiti0*>
  2  2296 source_extern_mask := init_mask(extend 0,26,26); 
  2  2297 dest_extern_mask := init_mask(extend 0,27,27); 
  2  2298 short_source_mask := init_mask(extend 0,28,31); 
  2  2299 short_dest_mask := init_mask(extend 0,32,35); 
  2  2300 source_mask := init_mask(extend 0,28,31); 
  2  2301 dest_mask := init_mask(extend 0,32,35); 
  2  2302 addrs_and_imm_mask := init_mask(extend 0,36,47); 
  2  2303 addrs_mask := init_mask(extend 0,36,47);
  2  2304        <* addrs and immidiate operand  m*>
  2  2305 cond_kind_set_mask := init_mask( init_mask(extend 0,23,23),40,41);
  2  2306 not_half_w_move_enable_mask := init_mask(extend 0,42,42);
  2  2307 half_w_move_dir_mask := init_mask(extend 0,43,43);
  2  2308 half_word_move_mask := init_mask(init_mask(extend 0,23,23),42,43);
  2  2309 shift_control_2904_mask := init_mask(init_mask(extend 0,23,23),44,47); <*controlsthe2904instrbiti6toi9*>
  2  2310 all_m_reg_enable_mask := init_mask(init_mask(extend 0,6,6),45,47);
  2  2311 select_m_reg_enable_mask := init_mask(extend 0,45,47);
  2  2312 select_interupt_bit_mask := init_mask(extend 0,46,46);
  2  2313 instr_full_length:= init_mask(extend 0,0,47);
  2  2314 <*allbitsininstr*>
  2  2315 
  2  2315 q_regs_value := -1;
  2  2316 w_pre_index_value := -3;
  2  2317 w_index_value := -2;
  2  2318 code_kind := 31;
  2  2319 start_addrs := 0;
  2  2320 
  2  2320 nop_code := mask_in(extend 0,extend 14,sekvens_mask);
  2  2321 nop_code := mask_in(nop_code,extend 1,cond_m_reg_enable_mask);
  2  2322 nop_code := mask_in(nop_code,extend 6,alu_short_dest_mask);
  2  2323 nop_code := mask_in(nop_code,extend 0,alu_both_i5_mask);
  2  2324 nop_code := mask_in(nop_code,extend 1,alu_special_control_mask);
  2  2325 nop_code := mask_in(nop_code,extend 1,set_2904_shift_mask);
  2  2326 nop_code := mask_in(nop_code,extend 0,not_ea_mask);
  2  2327 nop_code := mask_in(nop_code,extend 0,w_reg_enable_mask);
  2  2328 nop_code := mask_in(nop_code,extend 0,not_oeb_mask);
  2  2329 nop_code := mask_in(nop_code,extend 0,write_2901_reg_mask);
  2  2330 nop_code := mask_in(nop_code,extend 1,cond_kind_set_mask);
  2  2331 nop_code := mask_in(nop_code,extend 3,half_word_move_mask);
  2  2332 nop_code := mask_in(nop_code,extend 0,shift_control_2904_mask);
  2  2333 nop_code := mask_in(nop_code,extend 1,set_2904_shift_mask);
  2  2334 

t290xasm
  2  2334 
  2  2334 
  2  2334   init_long_array(name_table,-1);
  2  2335 
  2  2335   init_HEAP;
  2  2336   <* init of fields *>
  2  2337 
  2  2337   no_of_errors := 0;
  2  2338   error_record_chain_head := nil;
  2  2339   error_record_text := 4;
  2  2340   error_record_line_no := 8;
  2  2341   error_record_element_pos := 10;
  2  2342   error_record_chain := 6;
  2  2343   error_record_instr_index := 12;
  2  2344   error_record_length := 12;
  2  2345 
  2  2345 
  2  2345   l_d_record_chain_head := nil;
  2  2346   l_d_name := 4;
  2  2347   l_d_chain := 8;
  2  2348   l_d_spec := 2;
  2  2349   l_d_index := 4;
  2  2350   l_d_line_no := 6;
  2  2351   l_d_spec_class := 10;
  2  2352   l_d_record_length := 10;
  2  2353   map_spec := 1; vector_spec := 2;
  2  2354 
  2  2354   l_r_chain := 2;
  2  2355   l_r_name  := 6;
  2  2356   l_r_index := 8;
  2  2357   l_r_line_no := 10;
  2  2358   l_r_element_no := 12;
  2  2359   l_r_record_length := 12;
  2  2360   l_r_record_chain_head :=nil; <* no label refference blocks *>
  2  2361   name_name := 8;
  2  2362   name_chain := 2;
  2  2363   name_type := 4;
  2  2364   name_record_length := 8;
  2  2365   name_table(0,0) := name_table_length;
  2  2366   <* asm. begin *>
  2  2367     prom_code := -1;
  2  2368     for index := 0 step 1 until length_of_code-1 do
  2  2369     opcode(index):=prom_code;
  2  2370     begin
  3  2371     integer array tail(1:20);
  3  2372     zone dummy(128,1,stderror);
  3  2373     real r;
  3  2374     integer i,j,lookup_result;
  3  2375     long array mic_asm_prog_name,program_name(1:2);
  3  2376     i:=system(2,j,program_name);
  3  2377     open(dummy,4,programname,0);
  3  2378     lookup_result:=monitor(42,dummy,0,tail);
  3  2379     write(out,"ff",1,<:Micro asm.:__:>,true,12,program_name,
  3  2380                <: version date.:>,
  3  2381           <<zddddd.dddd>,systime(6,tail(6),r) + r/1000000,"nl",1);
  3  2382     close(dummy,true);
  3  2383   if connect_file_in(mic_asm_prog_name) = 4 then
  3  2384   write(out,"nl",1,"*",5,<:Source file connect error::>,
  3  2385         mic_asm_prog_name);
  3  2386     get_connected_name(in,micasm_prog_name);
  3  2387     lookup_result:=monitor(42,in,0,tail);
  3  2388     write(out,"nl",1,<:Source file:_:>,true,12,
  3  2389           mic_asm_prog_name,<: version date.:>,
  3  2390           <<zddddd.dddd>,systime(6,tail(6),r)+r/1000000,"nl",1);
  3  2391 
  3  2391 
  3  2391     <* control if any and get name of object file *>
  3  2392     if get_left_side(object_file_name) = 0 then
  3  2393          object_file := true else object_file := false;
  3  2394     if object_file then
  3  2395     begin
  4  2396     open(dummy,0,object_file_name,0);
  4  2397     lookup_result := monitor(42) lookup tail:(dummy,0,tail);
  4  2398     
  4  2398     if lookup_result <> 0 then
  4  2399        object_file := false;
  4  2400     write(out,"nl",1,if objectfile then       
  4  2401               <:Object file:_:> else <:*** Unknown object file::>,
  4  2402               true,12,object_file_name);       
  4  2403     if objectfile then
  4  2404       write(out,<: version date.:>,
  4  2405             <<zdddddd.dddd>,systime(6,systime(7,0,0.0),r)+r/1000000);
  4  2406     outchar(out,'nl');           
  4  2407     close(dummy,true);
  4  2408     end;
  3  2409   end block with control of files;
  2  2410 
  2  2410 
  2  2410 
  2  2410     <* get and control of other parameters,
  2  2411        unknown parameters is ignored. *>
  2  2412     get_bool_string(<:help:>,help_wanted);
  2  2413     if help_wanted then help_string(<:micasmhelp:>);
  2  2414     if get_bool_string(<:message:>,message_list) <> 0 then
  2  2415       message_list := true;
  2  2416     list_all := false;
  2  2417     if get_bool_string(<:list:>,list) <> 0 then
  2  2418        begin
  3  2419        long array param_name(1:2);
  3  2420        if get_text_string(<:list:>,param_name) = 0 then
  3  2421          begin
  4  2422          if param_name(1) = long <:all:> then list:=list_all := true;
  4  2423          end;
  3  2424        end;
  2  2425     if get_bool_string(<:linenum:>,line_num) <> 0 then line_num:= true;
  2  2426     if get_bool_string(<:deccode:>,dec_code) <> 0 then dec_code := true;
  2  2427     if get_bool_string(<:octal:>,octal_code) <> 0 then
  2  2428       begin
  3  2429       octal_code := true;
  3  2430       if get_text_string(<:octal:>,param_name) = 0 then
  3  2431         begin
  4  2432         if param_name(1) = long <:only:> then dec_code:= line_num := false;
  4  2433         end;
  3  2434       end;
  2  2435     if get_text_string(<:find:>,find_name) = 0 then find := true;
  2  2436 
  2  2436     if get_bool_string(<:errors:>,list_error_lines) <> 0 and
  2  2437       get_bool_string(<:errorlines:>,list_error_lines) <> 0 and
  2  2438       get_bool_string(<:els:>,list_error_lines) <> 0 then
  2  2439          list_error_lines := true;
  2  2440     get_bool_string(<:code:>,print_code);
  2  2441     get_bool_string(<:labelxref:>,test_label_ref);
  2  2442     get_bool_string(<:labelbit:>,test_label_bit);
  2  2443     get_bool_string(<:entry:>,entry_list_wanted);
  2  2444     get_bool_string(<:bitlines:>,list_bit_lines);
  2  2445     return_from_skip := false;
  2  2446 
  2  2446     <* initializing of counting variables and
  2  2447        reading of first code line *>
  2  2448     
  2  2448 
  2  2448     instr_index:=0;            
  2  2449     present_code := nop_code;            
  2  2450     error_in_this_line := false;
  2  2451     line_no := 0;
  2  2452     read_next_source_line;
  2  2453 
  2  2453 while class <> eof_class do
  2  2454     begin
  3  2455       if class = stop_line_class then
  3  2456       begin
  4  2457         <* 
  4  2458       end line , or
  4  2459 comment      . Commant wil be be created by
  4  2460 get_next_element       *>
  4  2461 if (list or (error_in_this_line and list_error_lines )  
  4  2462     or ( find and found ))
  4  2463     and ( -, return_from_skip or list_all) then
  4  2464     list_line;
  4  2465 return_from_skip := false;
  4  2466 found := false;
  4  2467     if print_code and code_generated then
  4  2468     begin
  5  2469     if -, list  and -, list_bit_lines and
  5  2470        -, (error_in_this_line and list_error_lines) then
  5  2471       write(out,<<-zddd>,instr_index,
  5  2472              octal(extend instr_index),"sp",1)
  5  2473       else
  5  2474    if -, list and list_bit_lines  and
  5  2475       -, (error_in_this_line and list_error_lines) then
  5  2476       begin
  6  2477       list_line;
  6  2478       write(out,<:          :>);
  6  2479       end
  5  2480      else
  5  2481       write(out,<:          :>);
  5  2482       print_formated(present_code);
  5  2483       outchar(out,10);
  5  2484     end;
  4  2485     if code_generated then
  4  2486     begin
  5  2487       op_code(instr_index):=present_code;
  5  2488       instr_index:=instr_index+1;
  5  2489       present_code := nop_code;            
  5  2490     end;
  4  2491   <* read next line of source  text *>
  4  2492   read_next_source_line;
  4  2493   end class 2 new line
  3  2494   else
  3  2495   if class = text_class or class = unknown_name_class then
  3  2496   begin
  4  2497     class_2 := look_ahead_class;
  4  2498     if class_2 = colon_class or class_2 = slash_class then
  4  2499       begin
  5  2500       spec_class := nil;
  5  2501       if element_no = 1 and class = unknown_name_class then
  5  2502         begin                    
  6  2503         if class2 = slash_class then
  6  2504           begin
  7  2505           skip_next;
  7  2506           look2;
  7  2507           if class2 = quote_class or class2 = double_quote_class then
  7  2508             begin
  8  2509             spec_class := if class2 = quoteclass then map_spec else vectorspec;
  8  2510             skip_next; <* skip quote or double quote *>
  8  2511             look2;
  8  2512             end;
  7  2513 
  7  2513           if class2 = number_class or class2 = colon_class then
  7  2514              begin
  8  2515 
  8  2515              if class_2 = number_class then
  8  2516                begin
  9  2517                next1;
  9  2518                class2 := look_ahead_class;
  9  2519                end
  8  2520               else
  8  2521               number_1 := line_no;
  8  2522              if class2 = colon_class then
  8  2523                begin
  9  2524                new_insert_label_def(name,number,instr_index,line_no,
  9  2525                                     number1 extract 24,spec_class);
  9  2526                end else
  8  2527               error(directive,line_no,element_no);
  8  2528              end
  7  2529             else
  7  2530              error(directive,line_no,element_no);
  7  2531              end
  6  2532             else
  6  2533              begin
  7  2534              new_insert_label_def(name,number,instr_index,line_no,
  7  2535                                   nil,spec_class)
  7  2536              end;
  6  2537         next;
  6  2538         end
  5  2539            
  5  2539       else
  5  2540       error(label_dec,line_no,element_no);
  5  2541       next;
  5  2542     end 
  4  2543     else
  4  2544     begin
  5  2545       if class = unknown_name_class then
  5  2546       begin
  6  2547         error(name_unknown,line_no,element_no);
  6  2548         skip_until_delim_class;
  6  2549         next;
  6  2550       end
  5  2551       else
  5  2552       if name_table(number,0) = alu_function_type then
  5  2553       alu_function
  5  2554       else
  5  2555       if name_table(number,0) = jump_addrs_type then
  5  2556       jump_addrs
  5  2557       else
  5  2558       if name_table(number,0) = jump_sekvens_type then
  5  2559       jump_sekvens
  5  2560       else
  5  2561       if name_table(number,0) = load_counter_type then
  5  2562       load_counter
  5  2563       else
  5  2564       if name_table(number,0) = special_type then
  5  2565       special
  5  2566       else
  5  2567       begin
  6  2568         error(illegal_type,line_no,element_no);
  6  2569         next
  6  2570       end;
  5  2571     end;
  4  2572   end type equal identifier
  3  2573   else
  3  2574   if class = star_class then
  3  2575   begin
  4  2576     <* After star is assm. directive,
  4  2577     1 direktive pr. line,
  4  2578     after the direktive the rest of the line is skipped,
  4  2579     the direktive schould be the first element in the line *>
  4  2580     if code_generated then error(directive,line_no,element_no)
  4  2581     else
  4  2582     begin
  5  2583       next1;
  5  2584       next2;
  5  2585       if (class1 <> 9 and class1 <> 6 ) or class2 <> colon_class <*colon*> then
  5  2586       error(long <:test dir 1 :>,line_no,if class2 <> colon_class then element_no else
  5  2587       element_no -1)
  5  2588       else
  5  2589       begin
  6  2590         if name1 = long <:name:> then
  6  2591         begin
  7  2592           next1;
  7  2593           if class1 <> 9 then
  7  2594           error(if class1 <> 6 then long <:test dir 2.:> else
  7  2595           plus_name_dec,line_no,element_no)
  7  2596           else
  7  2597           begin
  8  2598             name_table(number1,1) := name1;
  8  2599             index:=0;
  8  2600 
  8  2600             for class2 := next2
  8  2601             while class2 = comma_class and index < 5 do
  8  2602             begin
  9  2603               next2;
  9  2604               if class2 = number_class then
  9  2605               name_table(number1,index) := number2
  9  2606               else
  9  2607               if class2 = 6 <* defined name *> then
  9  2608               name_table(number1,index) := number_2            
  9  2609               else
  9  2610               begin
 10  2611                 error(long <:test dir. 3:>,line_no,element_no);
 10  2612                 index:=100;
 10  2613               end;
  9  2614               if index = 0 then index :=2 else
  9  2615               if index<100 then index:=index+1;
  9  2616             end;
  8  2617           end;
  7  2618         end else
  6  2619         
  6  2619         if name1 = long <:const:> then
  6  2620           begin
  7  2621           next1;
  7  2622           if class1 <> 9 then
  7  2623             error(if class1 <> 6 then directive else
  7  2624                    plus_name_dec,line_no,element_no)
  7  2625            else
  7  2626              begin
  8  2627              next2;
  8  2628              if class2 = comma_class then
  8  2629                begin
  9  2630                next2;
  9  2631                if class2 = number_class then
  9  2632                  begin
 10  2633                  new_insert_label_def(name1,number1,
 10  2634                                       number2 extract 12,line_no,nil,nil);
 10  2635                  end
  9  2636                 else error(directive,line_no,element_no);
  9  2637                end 
  8  2638               else error(directive,line_no,element_no);
  8  2639              end;
  7  2640           end else
  6  2641        
  6  2641         if name1 = long <:mask:> then 
  6  2642         begin
  7  2643         long array operand(1:1); <* only one word used *>
  7  2644         boolean mask_succes;
  7  2645         long mask_name,mask_number;
  7  2646         operand(1) := 0;
  7  2647           if next1 <> unknown_name_class then
  7  2648           error(long <: directive 2:>,line_no,element_no)
  7  2649           else
  7  2650           if next2 <> comma_class  then
  7  2651           error(long <:directive 3:>,line_no,element_no)
  7  2652           else
  7  2653            begin
  8  2654            mask_name := name1;
  8  2655            mask_number := number1;
  8  2656            mask_succes := read_and_set_bits(operand);
  8  2657            if  -, mask_succes then 
  8  2658              error(long <:directive 4:>,line_no,element_no)
  8  2659             else
  8  2660              begin
  9  2661              name_table(mask_number,0) := mask_type;
  9  2662              name_table(mask_number,1) := mask_name;
  9  2663              name_table(mask_number,2) := operand(1);
  9  2664 
  9  2664              end;
  8  2665            end;
  7  2666         end else
  6  2667         if name1 = long <:origo:> then
  6  2668         begin
  7  2669           if next1 <> number_class then
  7  2670           error(long <:test dir. 4:>,line_no,element_no)
  7  2671           else
  7  2672           instr_index := number1;
  7  2673         end
  6  2674         else
  6  2675         if name1 = long <:list:> then
  6  2676         begin
  7  2677           next1;
  7  2678           if name1 = long <:on:> or name1 = long <:yes:> then
  7  2679           list := true
  7  2680           else
  7  2681           if name1 = long <:off:> or name1 = long <:no:> then
  7  2682           list := false
  7  2683           else
  7  2684           error(long <:test dir 5:>,line_no,element_no)
  7  2685         end else
  6  2686         if name1 = long <:page:> then
  6  2687           begin
  7  2688           if list then
  7  2689           outchar(out,12);
  7  2690           end else
  6  2691         if name1 = long <:skip:> then
  6  2692            begin
  7  2693            <* procedure skip logic *>
  7  2694            directive_skip_until;
  7  2695            end else
  6  2696         if name1 = long <:onlyi:>  add 'n' then
  6  2697            begin
  7  2698            <* procedure skip if not in named mode *>
  7  2699            directive_onlyin_logic(true);
  7  2700            end else
  6  2701         if name1 = long <:notin:> then
  6  2702            begin
  7  2703            <* skip if named mode *>
  7  2704            directive_onlyin_logic(false <* invert the onlyin logic *>);
  7  2705            end else
  6  2706         if name1 = long <:until:> then
  6  2707            begin
  7  2708            <* a until directive met outside the
  7  2709               performing of the skip logic is blind *>
  7  2710            return_from_skip := true;
  7  2711            end else
  6  2712         if name1 = long <:load:> then
  6  2713         begin
  7  2714           zone zntb(128,1,stderror);
  7  2715           long array long_name(1:2);
  7  2716           integer move_count,no_of_halfwords;
  7  2717           long array field move_index;
  7  2718           move_index := -4;
  7  2719           class1 := get_long_name(long_name);
  7  2720           if class1 >0 then
  7  2721           begin
  8  2722             open(zntb,4,longname,0);
  8  2723             movecount:=(name_table_length +1)* 5 <*dimension*> * 4 <*halfwords*>;
  8  2724             for movecount :=movecount while movecount > 0 do
  8  2725             begin
  9  2726               no_of_halfwords := if move_count > 512 then 512 else
  9  2727               move_count;
  9  2728               move_count := move_count - no_of_halfwords;
  9  2729               inrec6(zntb,no_of_halfwords);
  9  2730               to_from(name_table.move_index,zntb,no_of_half_words);
  9  2731               move_index := move_index + no_of_half_words;
  9  2732             end read and move;
  8  2733           end else error(load_file_name,0,0);
  7  2734           if false then
  7  2735           begin
  8  2736             <******* test *******>
  8  2737             write(out,<:<12>load contents of name table::>);
  8  2738             for move_count :=0 step 1 until name_table_length do
  8  2739             write(out,<:<10>:>,move_count,name_table(move_count,0),
  8  2740             name_table(move_count,1),
  8  2741             name_table(move_count,2),
  8  2742             name_table(move_count,3),
  8  2743             name_table(move_count,4));
  8  2744           end test;
  7  2745         end else
  6  2746         if name1 = long <:save:> then
  6  2747         begin
  7  2748           zone zntb(128,1,stderror);
  7  2749           integer movecount,no_of_half_words;
  7  2750           integer array field move_index;
  7  2751           long array long_name(1:2);
  7  2752           class1:=get_long_name(long_name);
  7  2753           if class1>0 then
  7  2754           begin
  8  2755             open(zntb,4,long_name,0);
  8  2756             if false then
  8  2757             begin
  9  2758               <***** test ***>
  9  2759               write(out,<:<12>contents of saved name table::>);
  9  2760               for move_count := 0 step 1 until name_table_length do
  9  2761               write(out,<:<10>:>,movecount,name_table(move_count,0),
  9  2762               name_table(move_count,1),
  9  2763               name_table(move_count,2),
  9  2764               name_table(move_count,3),
  9  2765               name_table(move_count,4));
  9  2766             end test;
  8  2767             movecount := (name_table_length +1)* 5 <*dimmension*> * 4 <*halfwords*>;
  8  2768             move_index := -4;
  8  2769             for movecount := movecount while movecount > 0 do
  8  2770             begin
  9  2771               no_of_halfwords := if movecount > 512 then 512 else
  9  2772               movecount;
  9  2773               movecount := movecount - no_of_half_words;
  9  2774               outrec6(zntb,no_of_half_words);
  9  2775               tofrom(zntb,name_table.move_index,no_of_half_words);
  9  2776               move_index := moveindex + no_of_half_words;
  9  2777             end move and write;
  8  2778             close(zntb,true);
  8  2779           end else error(save_file_name,0,0);
  7  2780         end else
  6  2781         if name1 = long <:end:> then
  6  2782         begin
  7  2783           class := eof_class;
  7  2784         if list then list_line;
  7  2785         end else
  6  2786         if name1 = long <:copy:> then
  6  2787           begin
  7  2788           include_source_file;     
  7  2789           end 
  6  2790         else
  6  2791        
  6  2791         if name1 = long <:test:> then
  6  2792         begin
  7  2793           next;
  7  2794           if class <> 9 and class <> 6 then
  7  2795           error(long <:test dir t1:>,line_no,element_no)
  7  2796           else
  7  2797           begin
  8  2798             if name = long <:on:> or name = long <:yes:> then
  8  2799             test := true
  8  2800             else
  8  2801             if name = long <:off:> or name = long <:no:> then
  8  2802             test := false
  8  2803 
  8  2803             else
  8  2804             if name = long <:biton:> or name = long <:bitye:> add 115 then
  8  2805             print_code := true
  8  2806             else
  8  2807             if name = long <:bitof:> add 102 or name = long <:bitno:> then
  8  2808             print_code := false
  8  2809             
  8  2809             else
  8  2810 
  8  2810             if name = long <:labre:>  add 102 then
  8  2811             test_label_ref := true
  8  2812 
  8  2812             else
  8  2813     
  8  2813             if name = long <:labbi:> add 116 then
  8  2814             test_label_bit := true
  8  2815             else error(directive,line_no,element_no);
  8  2816           end;
  7  2817         end
  6  2818      
  6  2818         else
  6  2819         error(long <:unknown directive:>,line_no,element_no-1);
  6  2820       end;
  5  2821     end;
  4  2822     class := if class <> eof_class then stop_line_class 
  4  2823     else eof_class;
  4  2824   end directive class
  3  2825   else
  3  2826   if class = semicolon_class then
  3  2827   begin
  4  2828     <* 
  4  2829     comment start *>
  4  2830             class := stop_line_class;
  4  2831   end
  3  2832   else
  3  2833   if class = long_text_class then
  3  2834   begin
  4  2835     error(name_length,line_no,element_no);
  4  2836     next;
  4  2837   end
  3  2838   else
  3  2839   begin
  4  2840     <* class is something else *>
  4  2841     error(delimiter,line_no,element_no);
  4  2842     next;
  4  2843   end;
  3  2844 if class = eof_class then
  3  2845   begin
  4  2846   long array mic_asm_prog_name(1:2);
  4  2847 
  4  2847   integer result;
  4  2848   result := connect_file_in(mic_asm_prog_name);
  4  2849 
  4  2849   if result = 0 then
  4  2850     begin
  5  2851     write(out,"nl",1,<: micasm source file: :>,mic_asm_prog_name);
  5  2852     read_next_source_line;
  5  2853     end;
  4  2854 
  4  2854    end;
  3  2855 end scan loop;
  2  2856 last_instr_index := instr_index ;
  2  2857 resolve_labels;
  2  2858 <* temp delete
  2  2859 
  2  2859 
  2  2859 
  2  2859 
  2  2859 
  2  2859 for index:=1 step 1 until label_ref_index do
  2  2860 begin
  2  2861 
  2  2861 
  2  2861 name := label_ref_table(index,0);
  2  2862 if -, lookup_name(label_def_table,name,number) then
  2  2863   begin
  2  2864   instr_index := label_ref_table(index,2);
  2  2865   error(undec_label,label_ref_table(index,1) extract 24,
  2  2866   label_ref_table(index,3) extract 24)
  2  2867   end
  2  2868 
  2  2868     else
  2  2869 begin
  2  2870 op_code(label_ref_table(index,2)):=
  2  2871 mask_in(op_code(label_ref_table(index,2)),
  2  2872 extend ( label_def_table(number,0) extract 24),addrs_mask);
  2  2873 if  test_label_bit or test_label_ref then
  2  2874 begin
  2  2875 write(out,"nl",1,"sp",5,<<zddd>,
  2  2876 octal(label_ref_table(index,2)),
  2  2877 <: label ref to: :>,
  2  2878 octal(label_def_table(number,0)));
  2  2879 if test_label_bit then
  2  2880   begin
  2  2881   write(out,<:<10>           :>);
  2  2882   print_formated(opcode(label_ref_table(index,2)));
  2  2883   end;
  2  2884 end;
  2  2885 end;
  2  2886 end label insert loop;
  2  2887 if entry_list_wanted then
  2  2888 begin
  2  2889 <@ print label xref table @>
  2  2890 procedure shellsort(n,file);
  2  2891 value               n;
  2  2892 integer             n;
  2  2893 long array                 file;
  2  2894 begin
  2  2895   integer dist,i,k0,k,kmd;
  2  2896   long a,fkmd,a_help,fkmd_help;
  2  2897 
  2  2897   dist:= -1;
  2  2898   for dist:= dist shift(-1) while dist>0 do
  2  2899   if dist<n then
  2  2900   begin
  2  2901     for k0:= dist+1 step 1 until n do
  2  2902     begin
  2  2903       a:= file(k0,1);
  2  2904       a_help := file(k0,2);
  2  2905       k:= k0;
  2  2906 p:    kmd:= k-dist;
  2  2907       if kmd>0 then
  2  2908       begin
  2  2909         fkmd:= file(kmd,1);
  2  2910         fkmd_help := file(kmd,2);
  2  2911         if fkmd>a then
  2  2912         begin
  2  2913           file(k,2) := fkmd_help;
  2  2914           file(k,1):= fkmd;
  2  2915           k:= kmd;
  2  2916           goto p
  2  2917         end
  2  2918       end;
  2  2919       file(k,1):= a;
  2  2920       file(k,2) := a_help;
  2  2921     end
  2  2922   end
  2  2923 end;
  2  2924 integer sort_index;
  2  2925 long array wr_name(1:2);
  2  2926 comment 
  2  2927 shell_sort(label_def_table_length,label_def_table);
  2  2928 wr_name(2):=0;
  2  2929 for index := 1 step 1 until label_def_table_length do
  2  2930     begin
  2  2931     l_d_record := ((index-1)*8)+4;
  2  2932     if label_def_table(index,0) > 0 and 
  2  2933        (label_def_table.l_d_record.l_d_spec >0)
  2  2934     then
  2  2935       begin
  2  2936       wr_name(1):= label_def_table(index,1);
  2  2937       write(out,false add 32,15 -
  2  2938             write(out,<:<10>:>,wr_name),
  2  2939             <:<13>       :>,<: ref. to addrs.::>,
  2  2940             <<__zddd>,
  2  2941             label_def_table.l_d_record.l_d_index,
  2  2942             octal(extend label_def_table.l_d_record.l_d_index),   
  2  2943             <:  spec or line no.::>,label_def_table.l_d_record.l_d_spec -1);
  2  2944       end;
  2  2945     end;
  2  2946 end write xref label table loop;
  2  2947   end of temp delete *>
  2  2948 
  2  2948 if test_label_ref then label_list(false);
  2  2949 
  2  2949 if entry_list_wanted then label_list(true);
  2  2950 
  2  2950 
  2  2950 if print_error_table then
  2  2951  write(out,<:<10>MIC. ASM. OK! :>)                          
  2  2952 else
  2  2953  write(out,<:<10>MIC. ASM. SORRY!:>,<<_ddd>,no_of_errors,<: error(s):>,
  2  2954 <: found.:>);
  2  2955 write(out,"nl",1,<:LAST INSTR. ADDRS.::>,<<_dddd>,last_instr_index,
  2  2956 <: OCTAL INSTR. ADDRS.::>,octal(extend(last_instr_index)));
  2  2957 
  2  2957 
  2  2957 
  2  2957 
  2  2957 
  2  2957 if object_file then 
  2  2958 begin
  3  2959 zone code_out(128,1,stderror);
  3  2960 long array field code_block;
  3  2961 integer short_clock;
  3  2962 index :=1;
  3  2963 open(code_out,4,object_file_name(increase(index)),0);
  3  2964 setposition(code_out,0,1); <* start on segm 1. due to
  3  2965                               historic reasons *>
  3  2966 for code_block :=-4,code_block + 512 
  3  2967 while code_block < 4*length_of_code - 4 do
  3  2968 begin
  4  2969 outrec6(code_out,512);
  4  2970 to_from(code_out,op_code.code_block,512);
  4  2971 end;
  3  2972 for index := 1 step 1 until 10 do tail(index):=0;
  3  2973 tail(1) :=1 + ( length_of_code//128);
  3  2974 tail(6) := systime(7)short clock:(0,0.0);
  3  2975 tail(9) := code_kind shift 12 + start_addrs extract 12;
  3  2976 
  3  2976 tail(10) := length_of_code*4 + 512 <* first segm is dummy  *>;
  3  2977 monitor(44)change entry:(code_out,0,tail);
  3  2978 close(code_out,true);
  3  2979 end send object code to backing storage area;
  2  2980 end dec of table block;
  1  2981 write(out,<: TRANSLATOR BLOCKS::>,<<__d>,blocksread,"nl",1);
  1  2982 
  1  2982 fp_proc(7,0,0,0); <*  end program *>
  1  2983 end 
algol end 129
▶EOF◀