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

⟦671684187⟧ TextFile

    Length: 118272 (0x1ce00)
    Types: TextFile
    Names: »mcllist     «

Derivation

└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
    └─⟦39138f30b⟧ 
        └─⟦this⟧ »mcllist     « 

TextFile

*algol mcltxt connect.no list.yes

mcltxt d.870506.1153
     1 begin
     2 <**************************************************************>
     3 <* MCL compiler source text for Terminal Access System        *>
     4 <*                                                            *>
     5 <* Compiles MCL source text to cmcl format code               *>
     6 <* Produce all code in core before writing it to file         *>
     7 <*                                                            *>
     8 <* Henning Godske  870506                                     *>
     9 <* A/S Regnecentralen                                         *>
    10 <*                                                            *>
    11 <* Compiler call:  <result>=algol <source> connect.no         *>
    12 <**************************************************************>
    13 
    13 <**************************************************************>
    14 <* Revision history                                           *>
    15 <*                                                            *>
    16 <* 87.05.06   MCL compiler release 1.0                        *>
    17 <**************************************************************>
    18 
    18 <*--------------------------------------*>
    19 <* Constans used global                 *>
    20 <*--------------------------------------*>
    21 integer max_var,          <* Max. numbers of var's          *>
    22         max_string,       <* Max. numbers of chars. in text *>
    23         max_code,         <* Max. code address              *>
    24         keywords;         <* Number of keywords             *>
    25 array pn(1:2);            <* Program name                   *>
    26 integer i; <* work *>
    27 
    27 <* Reserve 50 segments for algol to run in, *>
    28 <* use rest for code array *>
    29 max_code:=((system(2,i,pn)//512)-50)*512;
    30 keywords:=40;
    31 max_var:=25;
    32 max_string:=80;
    33 begin
    34   <*---------------------------*>
    35   <* Globale scanner variables *>
    36   <*---------------------------*>
    37   integer array newintable(0:255);
    38   integer item;
    39   integer last_item;
    40   integer token_type,
    41           line_number,
    42           token_number_val,
    43           token_string_length,
    44           token_number;
    45   boolean token_var_sub;
    46   long array item_val(0:200);
    47   integer array item_kind(0:200);
    48   long array token_text(1:200);
    49   long array symbol_text(1:keywords);
    50   integer array symbol_val(1:keywords);
    51   zone source_text(256,2,stderror);
    52   <*----------------------------*>
    53   <* Globale compiler variables *>
    54   <*----------------------------*>
    55   boolean list_source,   <* list.yes *>
    56           show_warning,  <* warning.yes *>
    57           show_test,     <* test.yes *>
    58           show_code,     <* code.yes *>
    59           use_note,      <* note.yes *>
    60           make_code,     <* Produce code *>
    61           make_cmcl,     <* make result file *>
    62           warnings;
    63   integer array tail(1:10);
    64   real array cmcl_file,source_file(1:2);
    65   integer next_free,   <* Next free address in code *>
    66           while_start, <* Current while block start *>
    67           att_start,   <* Current att or inc block start *>
    68           s_line,      <* Source line number *>
    69           ii;          <* work *>
    70   real    rr;          <* work *>
    71   boolean in_attention,
    72           in_include;
    73   integer array field op;
    74   boolean array code(0:max_code); <* Code array with index in hw *>
    75   zone cmcl_code(256,2,stderror);
    76   <*------------------------------------------------*>
    77   <* Token constants used global. Set in init_scan  *>
    78   <*------------------------------------------------*>
    79   integer  t_end_file,
    80            t_case,
    81            t_otherwise,
    82            t_endselect,
    83            t_else,
    84            t_endif,
    85            t_point,
    86            t_text,
    87            t_endmenu,
    88            t_endwhile,
    89            t_endattention,
    90            t_endinclude,
    91            t_select,
    92            t_while,
    93            t_menu,
    94            t_attention,
    95            t_include,
    96            t_at,
    97            t_write,
    98            t_nl,
    99            t_erase,
   100            t_read,
   101            t_get,
   102            t_let,
   103            t_send,
   104            t_if,
   105            t_execute,
   106            t_note,
   107            t_direct,
   108            t_loop,
   109            t_exit,
   110            t_output,
   111            t_convert,
   112            t_echo,
   113            t_of,
   114            t_do,
   115            t_then,
   116            t_equal,
   117            t_not,
   118            t_on,
   119            t_off,
   120            t_int_start,
   121            t_int_end,
   122            t_unknown,
   123            t_number,
   124            t_string,
   125            t_errstring,
   126            t_var,
   127            t_and,
   128            t_or;
   129 
   129 procedure init_error(nr);
   130 <*----------------------------------------------------------------*>
   131 <* Write initial error and stop                                   *>
   132 <*----------------------------------------------------------------*>
   133 integer nr;
   134 begin
   135   integer i;
   136   i:=1;
   137   write(out,<:***:>,string pn(increase(i)));
   138   if nr<1 or nr>7 then
   139     nr:=8; <* Max. init error number used + 1 *>
   140   write(out,<:  :>,case nr of
   141             (<:No source file specified:>,
   142              <:Parameter:>,
   143              <:Source file not found:>,
   144              <:Process too small:>,
   145              <:Source file not a text file:>,
   146              <:Can't create result file:>,
   147              <:Can't use result file:>,
   148              <:Undefined error:>),<:<10>:>);
   149   make_code:=false;
   150   goto stop;
   151 end;
   152 
   152 procedure init_compiler;
   153 <*----------------------------------------------------------------*>
   154 <* Read FP parameters and init. global variables                  *>
   155 <*----------------------------------------------------------------*>
   156 begin
   157   real array ra(1:2);
   158   integer sy,i,j;
   159   
   159   trapmode:=1 shift 10;
   160   errorbits:=0;
   161   warnings:=false;
   162   list_source:=use_note:=false;
   163   show_warning:=make_cmcl:=true;
   164   show_code:=show_test:=false;
   165   zero_code; <* nulstil kode område *>
   166   make_code:=true;
   167   next_free:=while_start:=0;
   168   in_attention:=in_include:=false;
   169   if max_code<512 then
   170     init_error(4);
   171   if (system(4,1,ra) shift (-12))=6 then
   172   begin
   173     system(4,0,ra);
   174     make_cmcl:=true;
   175     for j:=1,2 do
   176       cmcl_file(j):=ra(j);
   177     i:=2;
   178   end
   179   else
   180   begin
   181     make_cmcl:=false;
   182     i:=1;
   183   end;
   184   if system(4,i,ra)<>(4 shift 12 + 10) then
   185     <* error in source specification *>
   186     init_error(1);
   187   for j:=1,2 do
   188     source_file(j):=ra(j);
   189   i:=i+1;
   190   sy:=system(4,i,ra);
   191   while sy<>0 do
   192   begin
   193     if ra(1) = real <:test:> then
   194     begin
   195       i:=i+1;
   196       if system(4,i,ra)<>(8 shift 12 + 10) then
   197         <* error in yes/no spec. *>
   198         init_error(2);
   199       if ra(1) = real <:yes:> then
   200         show_test:=true
   201       else
   202       begin
   203         if ra(1) = real <:no:> then
   204           show_test:=false
   205         else
   206           init_error(2);
   207       end;
   208     end;
   209     if ra(1) = real <:code:> then
   210     begin
   211       i:=i+1;
   212       if system(4,i,ra)<>(8 shift 12 + 10) then
   213         <* error in yes/no spec. *>
   214         init_error(2);
   215       if ra(1) = real <:yes:> then
   216         show_code:=true
   217       else
   218       begin
   219         if ra(1) = real <:no:> then
   220           show_code:=false
   221         else
   222           init_error(2);
   223       end;
   224     end;
   225     if ra(1) = real <:list:> then
   226     begin
   227       i:=i+1;
   228       if system(4,i,ra)<>(8 shift 12 + 10) then
   229         <* error in yes/no spec. *>
   230         init_error(2);
   231       if ra(1) = real <:yes:> then
   232         list_source:=true
   233       else
   234       begin
   235         if ra(1) = real <:no:> then
   236           list_source:=false
   237         else
   238           init_error(2);
   239       end;
   240     end;
   241     if ra(1) = real <:note:> then
   242     begin
   243       i:=i+1;
   244       if system(4,i,ra)<>(8 shift 12 + 10) then
   245         <* error in yes/no spec. *>
   246         init_error(2);
   247       if ra(1) = real <:yes:> then
   248         use_note:=true
   249       else
   250       begin
   251         if ra(1) = real <:no:> then
   252           use_note:=false
   253         else
   254           init_error(2);
   255       end;
   256     end;
   257     if ra(1) = real <:warni:> add 'n' then
   258     begin
   259       i:=i+1;
   260       if system(4,i,ra)<>(8 shift 12 + 10) then
   261         <* error in yes/no spec. *>
   262         init_error(2);
   263       if ra(1) = real <:yes:> then
   264         show_warning:=true
   265       else
   266       begin
   267         if ra(1) = real <:no:> then
   268           show_warning:=false
   269         else
   270           init_error(2);
   271       end;
   272     end;
   273     i:=i+1;
   274     sy:=system(4,i,ra);
   275   end;
   276 end;
   277 
   277 procedure init_scan;
   278 <*----------------------------------------------------------------*>
   279 <* Init. intable and keyword table used by scanner                *>
   280 <*----------------------------------------------------------------*>
   281 begin
   282   integer i;
   283 
   283   item_val(0):=0;
   284   item_kind(0):=0;
   285 
   285   <* Init intable                                  *>
   286   <* Kind:                                         *>
   287   <*       1  :  Illegal number                    *>
   288   <*       2  :  Number                            *>
   289   <*       3  -                                    *>
   290   <*       4  -                                    *>
   291   <*       5  -                                    *>
   292   <*       6  :  Keyword                           *>
   293   <*       7  :  Delimiter                         *>
   294   <*       8  :  End line (EM, NL, FF)             *>
   295   <*       9  :  Text start char:  <               *>
   296   <*      10  :  Text stop char:   >               *>
   297   <*      11  :  Char. in text or comment (--)     *>
   298   <*      12  :  & or ^ or _ in text               *>
   299   <*      13  :  Alfa in text or comment           *>
   300   <*      14  :  Interval start char:  (           *>
   301   <*      15  :  Interval stop char:   )           *>
   302   <*      16  :  Symbol !                          *>
   303   <*      17  :  Synbol =                          *>
   304   <*      18  :  Illegal character                 *>
   305   <*                                               *>
   306   for i:=1 step 1 until 256 do
   307     newintable(i-1):=
   308       (case i of    <* Kind  *>
   309       (   0,        <* nul   *>
   310          18,        <* soh   *>
   311          18,        <* stx   *>
   312          18,        <* etx   *>
   313          18,        <* eot   *>
   314          18,        <* enq   *>
   315          18,        <* ack   *>
   316          18,        <* bel   *>
   317          18,        <* bs    *>
   318          18,        <* ht    *>
   319           8,        <* nl    *>
   320          18,        <* vt    *>
   321           8,        <* ff    *>
   322           0,        <* cr    *>
   323          18,        <* so    *>
   324          18,        <* si    *>
   325          18,        <* dle   *>
   326          18,        <* dc1   *>
   327          18,        <* dc2   *>
   328          18,        <* dc3   *>
   329          18,        <* dc4   *>
   330          18,        <* nak   *>
   331          18,        <* syn   *>
   332          18,        <* etb   *>
   333          18,        <* can   *>
   334           8,        <* em    *>
   335          18,        <* sub   *>
   336          18,        <* esc   *>
   337          18,        <* fs    *>
   338          18,        <* gs    *>
   339          18,        <* rs    *>
   340          18,        <* us    *>
   341           7,        <*       *>
   342          16,        <* !     *>
   343          18,        <* "     *>
   344          18,        <* #     *>
   345          18,        <* $     *>
   346          18,        <* %     *>
   347          18,        <* &     *>
   348          18,        <* '     *>
   349          14,        <* (     *>
   350          15,        <* )     *>
   351          18,        <* *     *>
   352          18,        <* +     *>
   353          18,        <* ,     *>
   354           1,        <* -     *>
   355          18,        <* .     *>
   356          18,        <* /     *>
   357           2,        <* 0     *>
   358           2,        <* 1     *>
   359           2,        <* 2     *>
   360           2,        <* 3     *>
   361           2,        <* 4     *>
   362           2,        <* 5     *>
   363           2,        <* 6     *>
   364           2,        <* 7     *>
   365           2,        <* 8     *>
   366           2,        <* 9     *>
   367          18,        <* :     *>
   368          18,        <* ;     *>
   369           1,        <* <     *>
   370          17,        <* =     *>
   371          10,        <* >     *>
   372          18,        <* ?     *>
   373          18,        <* @     *>
   374           6,        <* A     *>
   375           6,        <* B     *>
   376           6,        <* C     *>
   377           6,        <* D     *>
   378           6,        <* E     *>
   379           6,        <* F     *>
   380           6,        <* G     *>
   381           6,        <* H     *>
   382           6,        <* I     *>
   383           6,        <* J     *>
   384           6,        <* K     *>
   385           6,        <* L     *>
   386           6,        <* M     *>
   387           6,        <* N     *>
   388           6,        <* O     *>
   389           6,        <* P     *>
   390           6,        <* Q     *>
   391           6,        <* R     *>
   392           6,        <* S     *>
   393           6,        <* T     *>
   394           6,        <* U     *>
   395           6,        <* V     *>
   396           6,        <* W     *>
   397           6,        <* X     *>
   398           6,        <* Y     *>
   399           6,        <* Z     *>
   400           6,        <* Æ     *>
   401           6,        <* Ø     *>
   402           6,        <* Å     *>
   403          18,        <* ^     *>
   404          18,        <* _     *>
   405          18,        <* `     *>
   406           6,        <* a     *>
   407           6,        <* b     *>
   408           6,        <* c     *>
   409           6,        <* d     *>
   410           6,        <* e     *>
   411           6,        <* f     *>
   412           6,        <* g     *>
   413           6,        <* h     *>
   414           6,        <* i     *>
   415           6,        <* j     *>
   416           6,        <* k     *>
   417           6,        <* l     *>
   418           6,        <* m     *>
   419           6,        <* n     *>
   420           6,        <* o     *>
   421           6,        <* p     *>
   422           6,        <* q     *>
   423           6,        <* r     *>
   424           6,        <* s     *>
   425           6,        <* t     *>
   426           6,        <* u     *>
   427           6,        <* v     *>
   428           6,        <* w     *>
   429           6,        <* x     *>
   430           6,        <* y     *>
   431           6,        <* z     *>
   432           6,        <* æ     *>
   433           6,        <* ø     *>
   434           6,        <* å     *>
   435          18,        <* ü     *>
   436          18,        <* del   *>
   437         <*-------------------*>
   438           0,        <* nul   *>
   439           0,        <* soh   *>
   440           0,        <* stx   *>
   441           0,        <* etx   *>
   442           0,        <* eot   *>
   443           0,        <* enq   *>
   444           0,        <* ack   *>
   445           0,        <* bel   *>
   446           0,        <* bs    *>
   447           0,        <* ht    *>
   448           8,        <* nl    *>
   449           0,        <* vt    *>
   450           8,        <* ff    *>
   451           0,        <* cr    *>
   452           0,        <* so    *>
   453           0,        <* si    *>
   454           0,        <* dle   *>
   455           0,        <* dc1   *>
   456           0,        <* dc2   *>
   457           0,        <* dc3   *>
   458           0,        <* dc4   *>
   459           0,        <* nak   *>
   460           0,        <* syn   *>
   461           0,        <* etb   *>
   462           0,        <* can   *>
   463           8,        <* em    *>
   464           0,        <* sub   *>
   465           0,        <* esc   *>
   466           0,        <* fs    *>
   467           0,        <* gs    *>
   468           0,        <* rs    *>
   469           0,        <* us    *>
   470          11,        <*       *>
   471          11,        <* !     *>
   472          11,        <* "     *>
   473          11,        <* #     *>
   474          11,        <* $     *>
   475          11,        <* %     *>
   476          12,        <* &     *>
   477          11,        <* '     *>
   478          11,        <* (     *>
   479          11,        <* )     *>
   480          11,        <* *     *>
   481          11,        <* +     *>
   482          11,        <* ,     *>
   483          11,        <* -     *>
   484          11,        <* .     *>
   485          11,        <* /     *>
   486          11,        <* 0     *>
   487          11,        <* 1     *>
   488          11,        <* 2     *>
   489          11,        <* 3     *>
   490          11,        <* 4     *>
   491          11,        <* 5     *>
   492          11,        <* 6     *>
   493          11,        <* 7     *>
   494          11,        <* 8     *>
   495          11,        <* 9     *>
   496          11,        <* :     *>
   497          11,        <* ;     *>
   498           9,        <* <     *>
   499          11,        <* =     *>
   500           1,        <* >     *>
   501          11,        <* ?     *>
   502          11,        <* @     *>
   503          13,        <* A     *>
   504          13,        <* B     *>
   505          13,        <* C     *>
   506          13,        <* D     *>
   507          13,        <* E     *>
   508          13,        <* F     *>
   509          13,        <* G     *>
   510          13,        <* H     *>
   511          13,        <* I     *>
   512          13,        <* J     *>
   513          13,        <* K     *>
   514          13,        <* L     *>
   515          13,        <* M     *>
   516          13,        <* N     *>
   517          13,        <* O     *>
   518          13,        <* P     *>
   519          13,        <* Q     *>
   520          13,        <* R     *>
   521          13,        <* S     *>
   522          13,        <* T     *>
   523          13,        <* U     *>
   524          13,        <* V     *>
   525          13,        <* W     *>
   526          13,        <* X     *>
   527          13,        <* Y     *>
   528          13,        <* Z     *>
   529          13,        <* Æ     *>
   530          13,        <* Ø     *>
   531          13,        <* Å     *>
   532          12,        <* ^     *>
   533           8,        <* _     *>
   534          11,        <* `     *>
   535          13,        <* a     *>
   536          13,        <* b     *>
   537          13,        <* c     *>
   538          13,        <* d     *>
   539          13,        <* e     *>
   540          13,        <* f     *>
   541          13,        <* g     *>
   542          13,        <* h     *>
   543          13,        <* i     *>
   544          13,        <* j     *>
   545          13,        <* k     *>
   546          13,        <* l     *>
   547          13,        <* m     *>
   548          13,        <* n     *>
   549          13,        <* o     *>
   550          13,        <* p     *>
   551          13,        <* q     *>
   552          13,        <* r     *>
   553          13,        <* s     *>
   554          13,        <* t     *>
   555          13,        <* u     *>
   556          13,        <* v     *>
   557          13,        <* w     *>
   558          13,        <* x     *>
   559          13,        <* y     *>
   560          13,        <* z     *>
   561          13,        <* æ     *>
   562          13,        <* ø     *>
   563          13,        <* å     *>
   564          11,        <* ü     *>
   565           0       ))<* del   *>
   566       shift 12 +
   567       (case i of    <* Value *>
   568       (   0,        <* nul   *>
   569           0,        <* soh   *>
   570           0,        <* stx   *>
   571           0,        <* etx   *>
   572           0,        <* eot   *>
   573           0,        <* enq   *>
   574           0,        <* ack   *>
   575           0,        <* bel   *>
   576           0,        <* bs    *>
   577           0,        <* ht    *>
   578          10,        <* nl    *>
   579           0,        <* vt    *>
   580          12,        <* ff    *>
   581           0,        <* cr    *>
   582           0,        <* so    *>
   583           0,        <* si    *>
   584           0,        <* dle   *>
   585           0,        <* dc1   *>
   586           0,        <* dc2   *>
   587           0,        <* dc3   *>
   588           0,        <* dc4   *>
   589           0,        <* nak   *>
   590           0,        <* syn   *>
   591           0,        <* etb   *>
   592           0,        <* can   *>
   593          25,        <* em    *>
   594           0,        <* sub   *>
   595           0,        <* esc   *>
   596           0,        <* fs    *>
   597           0,        <* gs    *>
   598           0,        <* rs    *>
   599           0,        <* us    *>
   600          32,        <*       *>
   601          33,        <* !     *>
   602          34,        <* "     *>
   603          35,        <* #     *>
   604          36,        <* $     *>
   605          37,        <* %     *>
   606          38,        <* &     *>
   607          39,        <* '     *>
   608          40,        <* (     *>
   609          41,        <* )     *>
   610          42,        <* *     *>
   611          43,        <* +     *>
   612          44,        <* ,     *>
   613         128,        <* -     *>
   614          46,        <* .     *>
   615          47,        <* /     *>
   616          48,        <* 0     *>
   617          49,        <* 1     *>
   618          50,        <* 2     *>
   619          51,        <* 3     *>
   620          52,        <* 4     *>
   621          53,        <* 5     *>
   622          54,        <* 6     *>
   623          55,        <* 7     *>
   624          56,        <* 8     *>
   625          57,        <* 9     *>
   626          58,        <* :     *>
   627          59,        <* ;     *>
   628         128,        <* <     *>
   629          61,        <* =     *>
   630          62,        <* >     *>
   631          63,        <* ?     *>
   632          64,        <* @     *>
   633          65,        <* A     *>
   634          66,        <* B     *>
   635          67,        <* C     *>
   636          68,        <* D     *>
   637          69,        <* E     *>
   638          70,        <* F     *>
   639          71,        <* G     *>
   640          72,        <* H     *>
   641          73,        <* I     *>
   642          74,        <* J     *>
   643          75,        <* K     *>
   644          76,        <* L     *>
   645          77,        <* M     *>
   646          78,        <* N     *>
   647          79,        <* O     *>
   648          80,        <* P     *>
   649          81,        <* Q     *>
   650          82,        <* R     *>
   651          83,        <* S     *>
   652          84,        <* T     *>
   653          85,        <* U     *>
   654          86,        <* V     *>
   655          87,        <* W     *>
   656          88,        <* X     *>
   657          89,        <* Y     *>
   658          90,        <* Z     *>
   659          91,        <* Æ     *>
   660          92,        <* Ø     *>
   661          93,        <* Å     *>
   662          94,        <* ^     *>
   663          95,        <* _     *>
   664          96,        <* `     *>
   665          65,        <* a     *>
   666          66,        <* b     *>
   667          67,        <* c     *>
   668          68,        <* d     *>
   669          69,        <* e     *>
   670          70,        <* f     *>
   671          71,        <* g     *>
   672          72,        <* h     *>
   673          73,        <* i     *>
   674          74,        <* j     *>
   675          75,        <* k     *>
   676          76,        <* l     *>
   677          77,        <* m     *>
   678          78,        <* n     *>
   679          79,        <* o     *>
   680          80,        <* p     *>
   681          81,        <* q     *>
   682          82,        <* r     *>
   683          83,        <* s     *>
   684          84,        <* t     *>
   685          85,        <* u     *>
   686          86,        <* v     *>
   687          87,        <* w     *>
   688          88,        <* x     *>
   689          89,        <* y     *>
   690          90,        <* z     *>
   691          91,        <* æ     *>
   692          92,        <* ø     *>
   693          93,        <* å     *>
   694         126,        <* ü     *>
   695           0,        <* del   *>
   696         <*-------------------*>
   697           0,        <* nul   *>
   698           0,        <* soh   *>
   699           0,        <* stx   *>
   700           0,        <* etx   *>
   701           0,        <* eot   *>
   702           0,        <* enq   *>
   703           0,        <* ack   *>
   704           0,        <* bel   *>
   705           0,        <* bs    *>
   706           0,        <* ht    *>
   707          10,        <* nl    *>
   708           0,        <* vt    *>
   709          12,        <* ff    *>
   710           0,        <* cr    *>
   711           0,        <* so    *>
   712           0,        <* si    *>
   713           0,        <* dle   *>
   714           0,        <* dc1   *>
   715           0,        <* dc2   *>
   716           0,        <* dc3   *>
   717           0,        <* dc4   *>
   718           0,        <* nak   *>
   719           0,        <* syn   *>
   720           0,        <* etb   *>
   721           0,        <* can   *>
   722          25,        <* em    *>
   723           0,        <* sub   *>
   724           0,        <* esc   *>
   725           0,        <* fs    *>
   726           0,        <* gs    *>
   727           0,        <* rs    *>
   728           0,        <* us    *>
   729          32,        <*       *>
   730          33,        <* !     *>
   731          34,        <* "     *>
   732          35,        <* #     *>
   733          36,        <* $     *>
   734          37,        <* %     *>
   735          38,        <* &     *>
   736          39,        <* '     *>
   737          40,        <* (     *>
   738          41,        <* )     *>
   739          42,        <* *     *>
   740          43,        <* +     *>
   741          44,        <* ,     *>
   742          45,        <* -     *>
   743          46,        <* .     *>
   744          47,        <* /     *>
   745          48,        <* 0     *>
   746          49,        <* 1     *>
   747          50,        <* 2     *>
   748          51,        <* 3     *>
   749          52,        <* 4     *>
   750          53,        <* 5     *>
   751          54,        <* 6     *>
   752          55,        <* 7     *>
   753          56,        <* 8     *>
   754          57,        <* 9     *>
   755          58,        <* :     *>
   756          59,        <* ;     *>
   757          60,        <* <     *>
   758          61,        <* =     *>
   759           0,        <* >     *>
   760          63,        <* ?     *>
   761          64,        <* @     *>
   762          65,        <* A     *>
   763          66,        <* B     *>
   764          67,        <* C     *>
   765          68,        <* D     *>
   766          69,        <* E     *>
   767          70,        <* F     *>
   768          71,        <* G     *>
   769          72,        <* H     *>
   770          73,        <* I     *>
   771          74,        <* J     *>
   772          75,        <* K     *>
   773          76,        <* L     *>
   774          77,        <* M     *>
   775          78,        <* N     *>
   776          79,        <* O     *>
   777          80,        <* P     *>
   778          81,        <* Q     *>
   779          82,        <* R     *>
   780          83,        <* S     *>
   781          84,        <* T     *>
   782          85,        <* U     *>
   783          86,        <* V     *>
   784          87,        <* W     *>
   785          88,        <* X     *>
   786          89,        <* Y     *>
   787          90,        <* Z     *>
   788          91,        <* Æ     *>
   789          92,        <* Ø     *>
   790          93,        <* Å     *>
   791          94,        <* ^     *>
   792          95,        <* _     *>
   793          96,        <* `     *>
   794          97,        <* a     *>
   795          98,        <* b     *>
   796          99,        <* c     *>
   797         100,        <* d     *>
   798         101,        <* e     *>
   799         102,        <* f     *>
   800         103,        <* g     *>
   801         104,        <* h     *>
   802         105,        <* i     *>
   803         106,        <* j     *>
   804         107,        <* k     *>
   805         108,        <* l     *>
   806         109,        <* m     *>
   807         110,        <* n     *>
   808         111,        <* o     *>
   809         112,        <* p     *>
   810         113,        <* q     *>
   811         114,        <* r     *>
   812         115,        <* s     *>
   813         116,        <* t     *>
   814         117,        <* u     *>
   815         118,        <* v     *>
   816         119,        <* w     *>
   817         120,        <* x     *>
   818         121,        <* y     *>
   819         122,        <* z     *>
   820         123,        <* æ     *>
   821         124,        <* ø     *>
   822         125,        <* å     *>
   823         126,        <* ü     *>
   824           0       ))<* del   *>
   825       extract 12;
   826   
   826   intable(newintable);
   827   t_end_file     :=00; 
   828   t_case         :=01; 
   829   t_otherwise    :=02; 
   830   t_endselect    :=03; 
   831   t_else         :=04; 
   832   t_endif        :=05; 
   833   t_point        :=06; 
   834   t_text         :=07; 
   835   t_endmenu      :=08; 
   836   t_endwhile     :=09; 
   837   t_endattention :=10; 
   838   t_endinclude   :=11; 
   839   t_select       :=12; 
   840   t_while        :=13; 
   841   t_menu         :=14; 
   842   t_attention    :=15; 
   843   t_include      :=16; 
   844   t_at           :=17; 
   845   t_write        :=18; 
   846   t_nl           :=19; 
   847   t_erase        :=20; 
   848   t_read         :=21; 
   849   t_get          :=22; 
   850   t_let          :=23; 
   851   t_send         :=24; 
   852   t_if           :=25; 
   853   t_execute      :=26; 
   854   t_note         :=27; 
   855   t_direct       :=28; 
   856   t_loop         :=29; 
   857   t_exit         :=30; 
   858   t_output       :=31; 
   859   t_convert      :=32;
   860   t_echo         :=33; 
   861   t_of           :=34; 
   862   t_do           :=35; 
   863   t_then         :=36; 
   864   t_equal        :=37; 
   865   t_not          :=38; 
   866   t_on           :=39; 
   867   t_off          :=40; 
   868   t_int_start    :=41; 
   869   t_int_end      :=42; 
   870   t_unknown      :=43; 
   871   t_number       :=44; 
   872   t_string       :=45; 
   873   t_errstring    :=46; 
   874   t_var          :=47; 
   875   t_and          :=48;
   876   t_or           :=49;
   877 
   877   <* Keywords for mcl *>
   878   <* Bemærk alfabetisk opstilling *>
   879   for i:=1 step 1 until keywords do
   880   begin
   881     symbol_text(i):=
   882     case i of
   883     ( long <:AND:>,
   884       long <:AT:>,
   885       long <:ATTEN:> add 'T',
   886       long <:CASE:>,
   887       long <:CONVE:> add 'R',
   888       long <:DIREC:> add 'T',
   889       long <:DO:>,
   890       long <:ECHO:>,
   891       long <:ELSE:>,
   892       long <:ENDAT:> add 'T',
   893       long <:ENDIF:>,
   894       long <:ENDIN:> add 'C',
   895       long <:ENDME:> add 'N',
   896       long <:ENDSE:> add 'L',
   897       long <:ENDWH:> add 'I',
   898       long <:ERASE:>,
   899       long <:EXECU:> add 'T',
   900       long <:EXIT:>,
   901       long <:GET:>,
   902       long <:IF:>,
   903       long <:INCLU:> add 'D',
   904       long <:LET:>,
   905       long <:LOOP:>,
   906       long <:MENU:>,
   907       long <:NL:>,
   908       long <:NOTE:>,
   909       long <:OF:>,
   910       long <:OFF:>,
   911       long <:ON:>,
   912       long <:OR:>,  
   913       long <:OTHER:> add 'W',
   914       long <:OUTPU:> add 'T',
   915       long <:POINT:>,
   916       long <:READ:>,
   917       long <:SELEC:> add 'T',
   918       long <:SEND:>,
   919       long <:TEXT:>,
   920       long <:THEN:>,
   921       long <:WHILE:>,
   922       long <:WRITE:>        );
   923 
   923   <* Token values for keywords *>
   924     symbol_val(i):= case i of
   925       (t_and, t_at, t_attention, t_case, t_convert, t_direct,
   926        t_do, t_echo, t_else, t_endattention,
   927        t_endif, t_endinclude, t_endmenu,
   928        t_endselect, t_endwhile, t_erase,
   929        t_execute, t_exit, t_get, t_if,
   930        t_include, t_let, t_loop, t_menu,
   931        t_nl, t_note, t_of, t_off, t_on, t_or,
   932        t_otherwise, t_output, t_point,
   933        t_read, t_select, t_send, t_text,
   934        t_then, t_while, t_write);
   935   end;
   936 end;
   937 
   937 
   937 procedure warning(nr);
   938 <*----------------------------------------------------------------*>
   939 <* Write warning on current output                                *>
   940 <*----------------------------------------------------------------*>
   941 value nr;
   942 integer nr;
   943 begin
   944   if show_warning then
   945   begin
   946     if list_source then
   947       write(out,<:<10>***warning :>)
   948     else
   949       write(out,<:<10>:>,<<dddd >,line_number,<:: warning :>);
   950     if nr<1 or nr>4 then
   951       nr:=5; <* Max. warning number used + 1 *>
   952     write(out,<<  dd>,token_number,<:. :>,case nr of
   953               (<:no link:>,
   954                <:too many menu lines:>,
   955                <:illegal character:>,
   956                <:constant string with interval:>,
   957                <:undefined warning:>));
   958   end;
   959   warnings:=true;
   960 end;
   961 
   961 procedure mcl_error(nr);
   962 <*----------------------------------------------------------------*>
   963 <* Write error on current output                                  *>
   964 <*----------------------------------------------------------------*>
   965 value nr;
   966 integer nr;
   967 begin
   968   if list_source then
   969     write(out,<:<10>***error :>)
   970   else
   971     write(out,<:<10>:>,<<dddd >,line_number,<:: error :>);
   972   if nr<1 or nr>12 then
   973     nr:=12; <* Max. error number used + 1 *>
   974   write(out,<<  dd>,token_number,<:. :>,case nr of
   975             (<:no selectable menu text lines:>,
   976              <:string size:>,
   977              <:non constant string:>,
   978              <:empty string:>,
   979              <:illegal number:>,
   980              <:column > 79:>,
   981              <:line > 24:>,
   982              <:line = 0:>,
   983              <:already in attention or include:>,
   984              <:point not unique:>,
   985              <:source line too long:>,
   986              <:undefined error:>));
   987   make_code:=false;
   988 end;
   989 
   989 procedure comp_error(nr);
   990 <*----------------------------------------------------------------*>
   991 <* Called when error in this program is detected                  *>
   992 <* Write error and goto stop                                      *>
   993 <*----------------------------------------------------------------*>
   994 integer nr;
   995 begin
   996   ii:=1;
   997   write(out,<:<10>***internal :>,nr,<:<10>:>);
   998   goto stop;
   999 end;
  1000 
  1000 
  1000 procedure syntax_error(nr);
  1001 <*----------------------------------------------------------------*>
  1002 <* writes syntax error on current output                          *>
  1003 <* signals that no usefull code is produced                       *>
  1004 <*----------------------------------------------------------------*>
  1005 value nr;
  1006 integer nr;
  1007 begin
  1008   if list_source then
  1009     write(out,<< dddd>,<:<10>***syntax  :>)
  1010   else
  1011     write(out,<:<10>:>,<<dddd >,line_number,<:: syntax  :>);
  1012   if nr<1 or nr>23 then
  1013     nr:=24; <* Max. error number used + 1 *>
  1014   write(out,<<  dd>,token_number,<:. :>,case nr of
  1015             (<:error in string:>,
  1016              <:unknown keyword:>,
  1017              <:number missing:>,
  1018              <:interval error:>,
  1019              <:) missing:>,
  1020              <:variabel missing:>,
  1021              <:OF missing:>,
  1022              <:CASE expected:>,
  1023              <:ENDSELECT expected:>,
  1024              <:= missing:>,
  1025              <:DO missing:>,
  1026              <:ENDWHILE expected:>,
  1027              <:POINT expected:>,
  1028              <:too many points:>,
  1029              <:ENDMENU expected:>,
  1030              <:ENDATTENTION expected:>,
  1031              <:ENDINCLUDE expected:>,
  1032              <:sentence expected:>,
  1033              <:THEN missing:>,
  1034              <:ENDIF expected:>,
  1035              <:ON or OFF missing:>,
  1036              <:structure:>,
  1037              <:illegal variable:>,
  1038              <:undefined error:>));
  1039   make_code:=false;
  1040 end;
  1041 
  1041 procedure syntax_scan(nr);
  1042 <*----------------------------------------------------------------*>
  1043 <* write syntax error and scans to next sentence                  *>
  1044 <*----------------------------------------------------------------*>
  1045 value nr;
  1046 integer nr;
  1047 begin
  1048   syntax_error(nr);
  1049   while token_type>t_echo do
  1050   begin
  1051     next_token;
  1052     if token_type=t_errstring then
  1053       syntax_error(1);
  1054     if token_type=t_unknown then
  1055       syntax_error(2);
  1056   end;
  1057 end;
  1058 
  1058 procedure write_headline;
  1059 <*----------------------------------------------------------------*>
  1060 <* Write form-feed and headline on current output                 *>
  1061 <*----------------------------------------------------------------*>
  1062 begin
  1063   integer i;
  1064   real array on(1:2);
  1065 
  1065   system(6,i,on);
  1066   i:=1;
  1067   write(out,<:<12><10>:>,string on(increase(i)),<:     :>);
  1068   i:=1;
  1069   write(out,<:mcl  d.:>,<<zddddd>,systime(5,0,rr),<:.:>,rr);
  1070   i:=1;
  1071   write(out,<:     source file: :>,string source_file(increase(i)),<:<10>:>);
  1072 end;
  1073 
  1073 
  1073 procedure get_new_line;
  1074 <*----------------------------------------------------------------*>
  1075 <* Read next line from source and list this line                  *>
  1076 <* on current output if LIST.YES                                  *>
  1077 <*----------------------------------------------------------------*>
  1078 begin
  1079   integer ch;
  1080   tableindex:=0;
  1081   last_item:=read_all(source_text,item_val,item_kind,1);
  1082   while item_val(last_item)=95 do
  1083   begin
  1084     item_kind(last_item):=12;
  1085     if table_index=128 then
  1086     begin
  1087       last_item:=last_item+1;
  1088       read_char(source_text,ch);
  1089       item_kind(last_item):=13;
  1090       item_val(last_item):=ch;
  1091       table_index:=128;
  1092     end;
  1093     last_item:=read_all(source_text,item_val,item_kind,last_item+1)+last_item;
  1094   end;
  1095   item:=0;
  1096   token_number:=0;
  1097   if  -,(item_kind(1)=8 and item_val(1)=25) then
  1098   begin
  1099     line_number:=line_number+1;
  1100     if list_source then
  1101     begin
  1102     <* Write line *>
  1103       long array field key_word;
  1104       integer i;
  1105       write(out,<:<10>:>,<<dddd>,line_number,<: : :>);
  1106       for i:=1 step 1 until abs last_item do
  1107       if (item_kind(i)>8) or (item_kind(i)=7) then
  1108       begin
  1109         if (item_kind(i)=12)   and
  1110            (item_val(i)<>95)   and
  1111            (item_val(i-1)<>95) and
  1112            (item_kind(i+1)=13) and
  1113            (item_val(i+1)>96)  then
  1114               item_val(i+1):=item_val(i+1)-32;
  1115         outchar(out,item_val(i) extract 24);
  1116       end
  1117       else
  1118         if item_kind(i)=6 then
  1119         begin
  1120           key_word:=(i-1)*4;
  1121           write(out,item_val.key_word);
  1122           while item_kind(i+1)=6 do
  1123             i:=i+1;
  1124         end 
  1125         else
  1126           if item_kind(i)<3 then
  1127             write(out,<<d>,item_val(i))
  1128           else
  1129             if (item_kind(i)=8) and item_val(i)=12 then
  1130               write_headline;
  1131     end;
  1132     if last_item<0 then
  1133     begin
  1134       while readchar(source_text,ch)<>8 do;
  1135       last_item:=-last_item;
  1136     end;
  1137   end;
  1138 end;
  1139   
  1139 procedure next_item;
  1140 <*----------------------------------------------------------------*>
  1141 <* Get next item from line read from source                       *>
  1142 <*----------------------------------------------------------------*>
  1143 begin
  1144     if item=0 then
  1145       item:=1
  1146     else
  1147       if item_kind(item)=8 then
  1148       begin
  1149         if item_val(item)<>25 then
  1150         begin
  1151           get_new_line;
  1152           item:=1;
  1153         end;
  1154       end
  1155       else
  1156         if item=last_item then
  1157         begin
  1158           item_kind(item):=8;
  1159           item_val(item):=10;
  1160           mcl_error(11);
  1161         end
  1162         else
  1163           item:=item+1;
  1164 end;
  1165 
  1165 procedure next_token;
  1166 <*----------------------------------------------------------------*>
  1167 <* Get next token value evaluated from                            *>
  1168 <* reading one or more items                                      *>
  1169 <*----------------------------------------------------------------*>
  1170 begin      
  1171   integer index,low_index,high_index,
  1172           i,text_ch,ch;
  1173 next_token_start:
  1174   next_item;
  1175   case item_kind(item) of
  1176   begin
  1177    <* 1  Illegal number *>
  1178    comp_error(1);
  1179    <* 2  Number         *>
  1180     begin
  1181       token_number_val:=item_val(item);
  1182       token_type:=t_number;
  1183     end;
  1184    <* 3                 *>       
  1185       comp_error(2);
  1186    <* 4                 *>
  1187       comp_error(3);
  1188    <* 5                 *>
  1189       comp_error(4);
  1190    <* 6  keyword        *>
  1191     begin
  1192       if (item_val(item) shift 8)=0 then
  1193       begin <* 1 char. then VARIABLE *>
  1194         token_type:=t_var;
  1195         token_number_val:=(item_val(item) shift (-40))-65;
  1196         if token_number_val>31 then
  1197           token_number_val:=token_number_val-32;
  1198         if token_number_val>max_var then
  1199           syntax_error(23);
  1200       end
  1201       else
  1202       begin <* Keyword *>
  1203         index:=keywords//2;
  1204         low_index:=1;
  1205         high_index:=keywords;
  1206         <* Use binary search to find value *>
  1207         while item_val(item)<>symbol_text(index) do
  1208         begin
  1209           if low_index>=high_index then
  1210           begin
  1211             <* error keyword not found *>
  1212             token_type:=t_unknown;
  1213             goto key_word_end;
  1214           end;
  1215           if item_val(item) < symbol_text(index) then
  1216             high_index:=index-1
  1217           else
  1218             low_index:=index+1;
  1219           index:=(high_index-low_index)//2+low_index;
  1220           if index<1 or index>keywords then
  1221             comp_error(5);
  1222         end;
  1223         token_type:=symbol_val(index);
  1224        key_word_end:
  1225         while item_kind(item+1)=6 do
  1226           next_item;
  1227       end;
  1228     end;
  1229    <* 7  Delimiter      *>
  1230       goto next_token_start;
  1231    <* 8  End line       *>
  1232     if item_val(item)=25 then
  1233       token_type:=t_end_file
  1234     else
  1235       goto next_token_start;
  1236    <* 9  Text start <   *>
  1237     begin
  1238       boolean string_error;
  1239       string_error:=false;
  1240       <* init token text *>
  1241       for i:=1 step 1 until 15 do
  1242         token_text(i):=0;
  1243       token_var_sub:=false;
  1244       next_item;
  1245       text_ch:=1;
  1246       if (item_kind(item)<9) or (item_kind(item)>13) then
  1247       begin
  1248         string_error:=true;
  1249         goto string_end;
  1250       end;
  1251       while (item_kind(item)<>10) do
  1252       begin
  1253         if (item_kind(item)<9) or (item_kind(item)>13) then
  1254          begin
  1255            string_error:=true;
  1256            goto string_end;
  1257         end;
  1258         if item_kind(item)=12 then
  1259         begin
  1260           if item_val(item)=94 then
  1261           begin
  1262             next_item;
  1263             ch:=item_val(item) extract 5;
  1264             if (item_kind(item)<11) or 
  1265                (item_kind(item)>13) or
  1266                (ch=0) then
  1267             begin
  1268               string_error:=true;
  1269               goto string_end;
  1270             end;
  1271           end
  1272           else
  1273             if item_val(item)=95 then
  1274             begin
  1275               next_item;
  1276               ch:=item_val(item);
  1277               if item_kind(item)=8 then
  1278               begin
  1279                 string_error:=true;
  1280                 goto string_end;
  1281               end;
  1282               if item_kind(item)=10 then
  1283                 table_index:=128;
  1284             end
  1285             else
  1286             begin
  1287               next_item;
  1288               if item_kind(item)<>13 then
  1289               begin
  1290                 string_error:=true;
  1291                 ch:=0;
  1292               end 
  1293               else
  1294               begin
  1295                 ch:=item_val(item)+63;
  1296                 if ch>159 then
  1297                   ch:=ch-32;
  1298                 token_var_sub:=true;
  1299                 if ch-128>max_var then
  1300                   syntax_error(23);
  1301               end;
  1302             end;
  1303         end
  1304         else
  1305           ch:=item_val(item);
  1306         token_text((text_ch-1)//6+1):=
  1307           token_text((text_ch-1)//6+1) shift 8 + ch extract 8;
  1308         if text_ch<82 then
  1309           text_ch:=text_ch+1;
  1310         next_item;
  1311       end; <* Insert in string *>
  1312      string_end:
  1313       token_string_length:=text_ch-1;
  1314       i:=token_string_length mod 6;
  1315       if i<>0 then
  1316         token_text((token_string_length)//6+1):=
  1317           token_text((token_string_length)//6+1) shift ((6-i)*8);
  1318       if string_error then
  1319         token_type:=t_errstring
  1320       else
  1321         token_type:=t_string;
  1322     end;
  1323    <* 10 Illegal char. > *>
  1324       begin
  1325         warning(3);
  1326         goto next_token_start;
  1327       end;
  1328    <* 11 Comment  --    *>
  1329       begin
  1330         next_item;
  1331         if item_kind(item)<>11 then
  1332           warning(3);
  1333         next_item;
  1334         while (item_kind(item)<>8) do
  1335           next_item;
  1336         if item_val(item)=25 then
  1337         begin
  1338           token_type:=t_end_file;
  1339           goto next_token_end;
  1340         end;
  1341         goto next_token_start;
  1342       end;
  1343    <* 12 & in text      *>
  1344       comp_error(7);
  1345    <* 13 Alfa  in text  *>
  1346       comp_error(8);
  1347    <* 14 Int start  (   *>
  1348       token_type:=t_int_start;
  1349    <* 15 Int stop   )   *>
  1350       token_type:=t_int_end;
  1351    <* 16 !=             *>
  1352       begin
  1353         next_item;
  1354         if item_kind(item)<>17 then
  1355           syntax_error(10);
  1356         token_type:=t_not;
  1357       end;
  1358    <* 17 =              *>
  1359       token_type:=t_equal;
  1360    <* 18 Illegal char.  *>
  1361       begin           
  1362         warning(3);
  1363         goto next_token_start;
  1364       end;
  1365   end;
  1366 next_token_end:
  1367   token_number:=token_number+1;
  1368 end; <* Next token *>
  1369 
  1369 procedure zero_code;
  1370 <*----------------------------------------------------------------*>
  1371 <* insert zero's in hole code area                                *>
  1372 <*----------------------------------------------------------------*>
  1373 begin
  1374   long array field laf;
  1375   integer i;
  1376 
  1376   laf:=0;
  1377   code(0):=false;
  1378   for i:=1 step 1 until max_code//4 do
  1379     code.laf(i):=0;
  1380 end;
  1381 
  1381 
  1381 integer procedure set_op(opcode_nr,code_length);
  1382 <*----------------------------------------------------------------*>
  1383 <* Set OP to current opcode start,                                *>
  1384 <* insert opcode nr and s_line, code_length is number             *>
  1385 <* of half word that shall be free in the same segment.           *>
  1386 <* If it's not posible in current segment start in                *>
  1387 <* next segment                                                   *>
  1388 <*----------------------------------------------------------------*>
  1389 value opcode_nr,code_length;
  1390 integer opcode_nr,code_length;
  1391 begin
  1392   integer length_to_limit;
  1393   
  1393   length_to_limit:=512-(next_free mod 512);
  1394   if length_to_limit<code_length then
  1395     op:=next_free+length_to_limit-1
  1396   else
  1397     op:=next_free-1;
  1398   next_free:=op+code_length+1;
  1399   if next_free>=max_code then
  1400     init_error(4);
  1401   code.op(1):=opcode_nr shift 12 +(s_line extract 12);
  1402   set_op:=next_free;
  1403 end;
  1404 
  1404 integer procedure find_string_address(string_length);
  1405 <*----------------------------------------------------------------*>
  1406 <* Find room to insert string_length  hw's in the same            *>
  1407 <* segment starting at next_free                                  *>
  1408 <*----------------------------------------------------------------*>
  1409 value string_length;
  1410 integer string_length;
  1411 begin
  1412   integer length_to_limit,i;
  1413 
  1413   length_to_limit:=512-(next_free mod 512);
  1414   if string_length>length_to_limit then
  1415     i:=next_free+length_to_limit
  1416   else
  1417     i:=next_free;
  1418   find_string_address:=i;
  1419 end;
  1420 
  1420 procedure insert_jump(addr,jump);
  1421 <*----------------------------------------------------------------*>
  1422 <* Insert a jump op-code                                          *>
  1423 <*----------------------------------------------------------------*>
  1424 value jump;
  1425 integer field addr;
  1426 integer jump;
  1427 begin
  1428   integer field next_addr;
  1429 
  1429   while addr<>0 do
  1430   begin
  1431     next_addr:=code.addr;
  1432     code.addr:=jump;
  1433     addr:=next_addr;
  1434   end;
  1435 end;
  1436 
  1436 procedure make_bool(f_addr,t_addr);
  1437 <*----------------------------------------------------------------*>
  1438 <* Producer kode for bool-exp                                     *>
  1439 <* returner peger til false og true                               *>
  1440 <* adresse felterne i koden                                       *>
  1441 <*----------------------------------------------------------------*>
  1442 integer field f_addr,t_addr;
  1443 begin
  1444   integer array left_string,right_string (1:max_string//3+5);
  1445   boolean equal;
  1446 
  1446   if -,make_string(left_string) then
  1447   begin
  1448     syntax_scan(1);
  1449     goto end_bool;
  1450   end;
  1451   equal:=false;
  1452   if token_type=t_equal then
  1453     equal:=true
  1454   else
  1455     if token_type<>t_not then
  1456       syntax_error(10);
  1457   next_token;
  1458   if -,make_string(right_string) then
  1459   begin
  1460     syntax_scan(1);
  1461     goto end_bool;
  1462   end;
  1463   <* make bool-exp *>
  1464   if (left_string(2) shift (-12)=1) and
  1465      (right_string(2) shift (-12)=5) and
  1466      (right_string(3) extract 12 <=3) then
  1467   begin
  1468     set_op(3,10);
  1469     code.op(4):=(left_string(2) extract 12) shift 12 +
  1470                 (right_string(3) extract 12);
  1471     code.op(5):=right_string(4);
  1472   end
  1473   else
  1474   if (right_string(2) shift (-12)=1) and
  1475      (left_string(2) shift (-12)=5) and
  1476      (left_string(3) extract 12 <=3) then
  1477   begin
  1478     set_op(3,10);
  1479     code.op(4):=(right_string(2) extract 12) shift 12 +
  1480                 (left_string(3) extract 12);
  1481     code.op(5):=left_string(4);
  1482   end
  1483   else
  1484   if right_string(2) shift (-12)=0 and
  1485      left_string(2) shift (-12)=1 then
  1486   begin
  1487     set_op(3,10);
  1488     code.op(4):=left_string(2) shift 12;
  1489     code.op(5):=0;
  1490   end
  1491   else
  1492   if left_string(2) shift (-12)=0 and
  1493      right_string(2) shift (-12)=1 then
  1494   begin
  1495     set_op(3,10);
  1496     code.op(4):=right_string(2) shift 12;
  1497     code.op(5):=0;
  1498   end
  1499   else
  1500   begin
  1501     set_op(2,8+left_string(1));
  1502     insert_string(left_string,op+9);
  1503     code.op(4):=find_string_address(right_string(1));
  1504     insert_string(right_string,code.op(4));
  1505   end;
  1506   if equal then
  1507   begin
  1508     f_addr:=op+6;
  1509     t_addr:=op+4; <* true jump *>
  1510   end
  1511   else
  1512   begin
  1513     t_addr:=op+6; <* false jump *>
  1514     f_addr:=op+4;
  1515   end;
  1516 end_bool:
  1517 end;
  1518 
  1518 procedure make_bool_exp(end_token_type,error_nr,f_addr,t_addr);
  1519 <*----------------------------------------------------------------*>
  1520 <* Producer kode for bool-exp ink. AND / OR                       *>
  1521 <* returner peger til false og true                               *>
  1522 <* adresse felterne i koden                                       *>
  1523 <*----------------------------------------------------------------*>
  1524 integer end_token_type,error_nr;
  1525 integer field f_addr,t_addr;
  1526 begin
  1527   integer prev_addr;
  1528 
  1528   make_bool(f_addr,t_addr);
  1529   while token_type=t_and or token_type=t_or do
  1530   begin
  1531     if token_type=t_and then
  1532     begin
  1533       insert_jump(t_addr,next_free);
  1534       prev_addr:=f_addr;
  1535       next_token;
  1536       make_bool(f_addr,t_addr);
  1537       code.f_addr:=prev_addr;
  1538     end
  1539     else
  1540       if token_type=t_or then
  1541       begin
  1542         insert_jump(f_addr,next_free);
  1543         prev_addr:=t_addr;
  1544         next_token;
  1545         make_bool(f_addr,t_addr);
  1546         code.t_addr:=prev_addr;
  1547       end
  1548   end;
  1549   if token_type=end_token_type then
  1550     next_token
  1551   else
  1552     syntax_scan(error_nr);
  1553 end;
  1554 
  1554 boolean procedure make_string(st);
  1555 <*----------------------------------------------------------------*>
  1556 <* Find type of string and insert this in string array            *>
  1557 <* String array format:                                           *>
  1558 <* st(1) : Length of used string array exc. this element          *>
  1559 <*         in half words.                                         *>
  1560 <* st(2) : String type in same format as cmcl code.               *>
  1561 <* st(3) : Text start (first word = HW < 12 + chars.)             *>
  1562 <*----------------------------------------------------------------*>
  1563 integer array st;
  1564 begin
  1565   boolean interval,ok;
  1566   integer first_char,num_of_char,var_ref,i;
  1567 
  1567   make_string:=true;
  1568   ok:=true;
  1569   for ii:=system(3,i,st) step 1 until i do
  1570     st(ii):=0;
  1571   if token_type<t_string or token_type>t_var then
  1572   begin
  1573     ok:=false;
  1574     goto make_string_end;
  1575   end;
  1576   if token_type=t_string then <* Text string *>
  1577   begin
  1578     long array la(1:max_string//6+3);
  1579     integer i,ts_length;
  1580     boolean tvs;
  1581     ts_length:=token_string_length;
  1582     tvs:=token_var_sub;
  1583     if ts_length>max_string then
  1584     begin 
  1585       mcl_error(2);
  1586       ts_length:=max_string;
  1587     end;
  1588     for i:=1 step 1 until max_string//6+2 do
  1589       la(i):=token_text(i);
  1590     next_token;
  1591     interval:=false;
  1592     if token_type=t_int_start then
  1593     begin <* Interval *>
  1594       if -,tvs then
  1595         warning(4);
  1596       next_token;
  1597       if token_type<>t_number then
  1598       begin
  1599         ok:=false;
  1600         syntax_error(3);
  1601         goto make_string_end;
  1602       end;
  1603       first_char:=token_number_val;
  1604       if first_char<1 then
  1605       begin
  1606         first_char:=1;
  1607         syntax_error(4);
  1608       end;
  1609       if first_char>max_string+20 then
  1610       begin
  1611         first_char:=max_string;
  1612         syntax_error(4);
  1613       end;
  1614       next_token;
  1615       if token_type<>t_number then
  1616       begin
  1617         ok:=false;
  1618         syntax_error(3);
  1619         goto make_string_end;
  1620       end;
  1621       num_of_char:=token_number_val;
  1622       if num_of_char<1 then
  1623       begin
  1624         syntax_error(4);
  1625         num_of_char:=1;
  1626       end;
  1627       next_token;
  1628       if token_type<>t_int_end then
  1629       begin
  1630         ok:=false;
  1631         syntax_error(5);
  1632         goto make_string_end;
  1633       end;
  1634       next_token;
  1635       interval:=true;
  1636     end;
  1637     if (ts_length=0) or 
  1638        (interval and -,tvs and (ts_length < first_char)) then    
  1639     begin  <* Null string *>
  1640       st(1):=2;
  1641       st(2):=0;
  1642     end
  1643     else
  1644     begin
  1645       if -,(interval or tvs) then
  1646       begin <* Constant string *>
  1647         st(1):=4+((ts_length+2)//3*2);
  1648         st(2):=5 shift 12;
  1649         st(3):=(st(1)-2) shift 12 + ts_length;
  1650         for i:=1 step 1 until (st(1)-2)//4 do
  1651         begin
  1652           st(2*i+2):=la(i) shift (-24);
  1653           st(2*i+3):=la(i) extract 24;
  1654         end;
  1655       end;
  1656       if tvs and -,interval then
  1657       begin <* Text with varsub *>
  1658         st(1):=4+((ts_length+2)//3*2);
  1659         st(2):=3 shift 12;
  1660         st(3):=(st(1)-2) shift 12 + ts_length;
  1661         for i:=1 step 1 until (st(1)-2)//4 do
  1662         begin
  1663           st(2*i+2):=la(i) shift (-24);
  1664           st(2*i+3):=la(i) extract 24;
  1665         end;
  1666       end;      
  1667       if tvs and interval then
  1668       begin
  1669         st(1):=6+((ts_length+2)//3*2);
  1670         st(2):=4 shift 12;
  1671         st(3):=first_char shift 12 + num_of_char;
  1672         st(4):=(st(1)-4) shift 12 + ts_length;
  1673         for i:=1 step 1 until (st(1)-4)//4 do
  1674         begin
  1675           st(2*i+3):=la(i) shift (-24);
  1676           st(2*i+4):=la(i) extract 24;
  1677         end;
  1678       end;
  1679       if interval and -,tvs then
  1680       begin <* Constant string with interval !!!!! *>
  1681         integer new_length,sti,li,ch,index;
  1682 
  1682         new_length:=if (ts_length-first_char+1)>=num_of_char then
  1683                       num_of_char
  1684                     else
  1685                       ts_length-first_char+1;
  1686         sti:=0;
  1687         <* move new_length characters from la to st *>
  1688         <* starting at character first_char in la   *>
  1689         for li:=first_char-1 step 1 until first_char+new_length-2 do
  1690         begin
  1691           <* find character li+1 in la *>
  1692           ch:=(la(li//6+1) shift (-8*(5-(li mod 6)))) extract 8;
  1693           index:=sti//3+4;
  1694           <* insert character in st at sti+1 *>
  1695           st(index):=st(index) + (ch shift (8*(2-(sti mod 3))));
  1696           sti:=sti+1;
  1697         end;
  1698         st(1):=4+((new_length+2)//3*2);
  1699         st(2):=5 shift 12;
  1700         st(3):=(st(1)-2) shift 12 + new_length;
  1701       end;
  1702     end;
  1703   end  <* Text string *>
  1704   else
  1705   begin <* Variable  or  illegal string *>
  1706     var_ref:=token_number_val;
  1707     if token_type=t_errstring then
  1708       syntax_error(1);
  1709     next_token;
  1710     if token_type=t_int_start then
  1711     begin <* Interval *>
  1712       next_token;
  1713       if token_type<>t_number then
  1714       begin
  1715         ok:=false;
  1716         syntax_error(3);
  1717         goto make_string_end;
  1718       end;
  1719       first_char:=token_number_val;
  1720       if first_char<1 then
  1721       begin
  1722         first_char:=1;
  1723         syntax_error(4);
  1724       end;
  1725       if first_char>max_string+20 then
  1726       begin
  1727         first_char:=max_string;
  1728         syntax_error(4);
  1729       end;
  1730       next_token;
  1731       if token_type<>t_number then
  1732       begin
  1733         ok:=false;
  1734         syntax_error(3);
  1735         goto make_string_end;
  1736       end;
  1737       num_of_char:=token_number_val;
  1738       if num_of_char<1 then
  1739       begin
  1740         syntax_error(4);
  1741         num_of_char:=1;
  1742       end;
  1743       if num_of_char>max_string+20 then
  1744       begin
  1745         syntax_error(4);
  1746         num_of_char:=max_string;
  1747       end;
  1748       next_token;
  1749       if token_type<>t_int_end then
  1750       begin
  1751         ok:=false;
  1752         syntax_error(5);
  1753         goto make_string_end;
  1754       end;
  1755       next_token;
  1756       st(1):=4;
  1757       st(2):=2 shift 12 + var_ref;
  1758       st(3):=first_char shift 12 + num_of_char;
  1759     end
  1760     else
  1761     begin <* No interval *>
  1762       st(1):=2;
  1763       st(2):= 1 shift 12 + var_ref;
  1764     end;
  1765   end;
  1766 make_string_end:
  1767   if -,ok then
  1768   begin
  1769     st(1):=2;
  1770     st(2):=0;  <* Empty string *>
  1771     make_string:=false;
  1772     while token_type=t_int_end or token_type=t_number do
  1773       next_token;
  1774   end;
  1775 end;
  1776 
  1776 boolean procedure make_const_string(cst,point);
  1777 <*----------------------------------------------------------------*>
  1778 <* Find constant string and insert this in const                  *>
  1779 <* string array.                                                  *>
  1780 <* const string array format:                                     *>
  1781 <* cst(1)  : Number of char in text.                              *>
  1782 <* cst(2)  : First char. in text. Converted to capital letter     *>
  1783 <* cst(3)  : Start of text                                        *>
  1784 <*----------------------------------------------------------------*>
  1785 integer array cst;
  1786 boolean point;
  1787 begin
  1788   integer i,j;
  1789   for i:=system(3,j,cst) step 1 until j do
  1790     cst(i):=0;
  1791   if token_type=t_errstring then
  1792   begin
  1793     syntax_error(1);
  1794     cst(1):=cst(2):=cst(3):=0;
  1795   end
  1796   else
  1797   if token_type<>t_string then
  1798   begin
  1799     make_const_string:=false;
  1800     cst(1):=cst(2):=cst(3):=0;
  1801   end
  1802   else
  1803   begin
  1804     make_const_string:=true;
  1805     if token_var_sub then
  1806       mcl_error(3); <* Not constant *>
  1807     if token_string_length=0 then
  1808       cst(1):=cst(2):=cst(3):=0
  1809     else
  1810     begin
  1811       if token_string_length>max_string then
  1812       begin
  1813         mcl_error(2);
  1814         token_string_length:=max_string;
  1815       end;
  1816       cst(1):=token_string_length;
  1817       cst(2):=token_text(1) shift (-40);
  1818       for i:=1 step 1 until cst(1)//6+1 do
  1819       begin
  1820         cst(2*i+1):=token_text(i) shift (-24);
  1821         cst(2*i+2):=token_text(i) extract 24;
  1822       end;
  1823     end;
  1824     if cst(2)>='a' and cst(2)<='å' then
  1825       cst(2):=cst(2)-32;
  1826     if token_string_length=0 and point then
  1827       mcl_error(4);
  1828     next_token;
  1829   end;
  1830 end;
  1831 
  1831 integer procedure insert_string(st,addr);
  1832 <*----------------------------------------------------------------*>
  1833 <* Insert st (string) in code at address addr                     *>
  1834 <* Return next unused address in next_free                        *>
  1835 <*----------------------------------------------------------------*>
  1836 value addr;
  1837 integer array st;
  1838 integer addr;
  1839 begin
  1840   integer i;
  1841   integer array field p;
  1842 
  1842   p:=addr-1;
  1843   for i:=2 step 1 until st(1)//2+1 do
  1844     code.p(i-1):=st(i);
  1845   insert_string:=next_free:=addr+st(1);
  1846 end;
  1847 
  1847 procedure select;
  1848 <*----------------------------------------------------------------*>
  1849 <* Produce code for SELECT                                        *>
  1850 <* Structure of produced kode:                                    *>
  1851 <*
  1852         -- bool exp --     ___
  1853           true address --    *
  1854      !----false address !    *
  1855      !  --------------  !    *
  1856      !               <--!    *
  1857      !    Action             * First CASE
  1858      !                       *
  1859      !  ---- jump ----       *
  1860      !     address   ---!    *
  1861      !  --------------  !  __*
  1862      !-->               !  --*
  1863                         !    * More cases
  1864                         !    *
  1865         --------------  !  --*
  1866          otherwise      !
  1867          action         !
  1868         --------------  !
  1869                      <--!
  1870                                                                   *>
  1871 <*----------------------------------------------------------------*>
  1872 begin
  1873   integer f_jump_hold_addr,
  1874           t_jump_hold_addr,
  1875           jump_hold_addr,
  1876           string_start;
  1877   integer field i;
  1878   integer var_ref;
  1879   integer array case_string(1:max_string//3+5);
  1880 
  1880   f_jump_hold_addr:=jump_hold_addr:=0;
  1881   if token_type<>t_var then 
  1882   begin
  1883     syntax_scan(6);
  1884     goto case_start;
  1885   end;
  1886   var_ref:=token_number_val;
  1887   next_token;
  1888   if token_type<>t_of then 
  1889   begin
  1890     syntax_scan(7);
  1891     goto case_start;
  1892   end;
  1893   next_token;
  1894   if token_type<>t_case then 
  1895     syntax_scan(8);
  1896   case_start:
  1897   while token_type=t_case do <* case *>
  1898   begin
  1899     s_line:=line_number;
  1900     next_token;
  1901     if f_jump_hold_addr<>0 then
  1902     begin
  1903       <* Indsæt adresse på ny bool-exp start i forrige bool-exp *>
  1904       i:=f_jump_hold_addr;
  1905       code.i:=next_free;
  1906     end;
  1907     if -,make_string(case_string) then 
  1908       syntax_scan(1);
  1909     <* Indsæt bool-exp ud fra var_ref og case_string *>
  1910     if (case_string(2) shift (-12)=5) and 
  1911        (case_string(3) extract 12<=3) then
  1912     begin
  1913       set_op(3,10);
  1914       code.op(4):=var_ref shift 12 +(case_string(3) extract 12);
  1915       code.op(5):=case_string(4);
  1916     end
  1917     else
  1918     if (case_string(2) shift (-12)=0) then
  1919     begin
  1920       set_op(3,10);
  1921       code.op(4):=var_ref shift 12;
  1922       code.op(5):=0;
  1923     end
  1924     else
  1925     begin
  1926       set_op(2,10);
  1927       code.op(5):=1 shift 12 + var_ref;
  1928       string_start:=find_string_address(case_string(1));
  1929       code.op(4):=string_start;
  1930       insert_string(case_string,string_start);
  1931     end;
  1932     code.op(2):=next_free;
  1933     f_jump_hold_addr:=op+6;
  1934     action;
  1935     s_line:=line_number;
  1936     <* Indsæt JUMP code efter action *>
  1937     set_op(1,4);
  1938     code.op(2):=jump_hold_addr;
  1939     jump_hold_addr:=op+4;
  1940   end;
  1941   if token_type=t_otherwise then
  1942   begin <* otherwise *>
  1943     <* Indsæt adresse på otherwise i sidste bool-exp *>
  1944     if make_code then
  1945     begin
  1946       i:=f_jump_hold_addr;
  1947       code.i:=next_free;
  1948     end;
  1949     next_token;
  1950     action;
  1951   end
  1952   else
  1953   if make_code then
  1954   begin <* fjern sidste jump *>
  1955     next_free:=next_free-4;
  1956     jump_hold_addr:=code.op(2);
  1957     code.op(1):=code.op(2):=0;
  1958     <* Indsæt adresse på endselect i sidste bool-exp *>
  1959     i:=f_jump_hold_addr;
  1960     code.i:=next_free;
  1961   end;
  1962   <*Indsæt baglens i jump_hold_adr addressen på første sætning efter select *>
  1963   if make_code then
  1964   while jump_hold_addr<>0 do
  1965   begin
  1966     i:=jump_hold_addr;
  1967     jump_hold_addr:=code.i;
  1968     code.i:=next_free;
  1969   end;
  1970   if token_type<>t_endselect then 
  1971     syntax_error(9)
  1972   else
  1973     next_token; <* find first token after SELECT *>
  1974 select_end:
  1975 end; <* select *>
  1976 
  1976 procedure while_sentence;
  1977 <*----------------------------------------------------------------*>
  1978 <* Produce code for WHILE                                         *>
  1979 <* Structure of produced kode                                     *>
  1980 <*
  1981         -- bool exp --        
  1982                      <-------!
  1983           true address --    !
  1984      !----false address !    !
  1985      !  --------------  !    !
  1986      !               <--!    !
  1987      !    action             !           
  1988      !                       !
  1989      !  ---- jump ----       !
  1990      !     address   ---------
  1991      !  --------------
  1992      !-->
  1993                                                                   *>
  1994 <*----------------------------------------------------------------*>
  1995 begin
  1996   integer prev_while_start;
  1997   integer field f_jump_hold_addr,t_jump_hold_addr;
  1998   boolean equal;
  1999 
  1999   prev_while_start:=while_start;
  2000   while_start:=next_free;
  2001   make_bool_exp(t_do,11,f_jump_hold_addr,t_jump_hold_addr);
  2002   if make_code then
  2003     insert_jump(t_jump_hold_addr,next_free);
  2004 first_action:
  2005   action;
  2006   s_line:=line_number;
  2007   <* Insert jump code to while start *>
  2008   set_op(1,4);
  2009   code.op(2):=while_start;
  2010   if make_code then
  2011     insert_jump(f_jump_hold_addr,next_free);
  2012   while_start:=prev_while_start;
  2013   if token_type<>t_endwhile then
  2014   begin
  2015     syntax_error(12);
  2016   end
  2017   else
  2018     next_token;
  2019 end;
  2020 
  2020 procedure menu;
  2021 <*----------------------------------------------------------------*>
  2022 <* Produce code for MENU                                          *>
  2023 <*----------------------------------------------------------------*>
  2024 begin
  2025   integer field end_hold_addr,i;
  2026   integer col,line,num_of_point,menu_text_index,
  2027           ch_index,text_length,ncol;
  2028   integer array menu_text(1:640),point_table(1:3*25);
  2029   integer array field entry,menu_op;
  2030   integer array menu_line(1:max_string//3+5);
  2031   boolean first_text,ctrls;
  2032   boolean array unique(0:127);
  2033 
  2033   
  2033   procedure next_line;
  2034   <* Insert NL in menu text *>
  2035   begin
  2036     if menu_line(2)>31 then
  2037     begin
  2038       line:=line+1;
  2039       if line>24 then
  2040         warning(2);
  2041       pack_char(10);
  2042     end;
  2043   end;
  2044 
  2044   procedure pack_char(ch);
  2045   <* Insert a character in menu text *>
  2046   value ch;
  2047   integer ch;
  2048   begin
  2049     menu_text(menu_text_index):=menu_text(menu_text_index)+
  2050                                 (ch shift (8*ch_index));
  2051     ch_index:=ch_index-1;
  2052     if ch_index=-1 then
  2053     begin
  2054       menu_text_index:=menu_text_index+1;
  2055       if menu_text_index>640 then
  2056         comp_error(9);
  2057       ch_index:=2;
  2058     end;
  2059   end;
  2060 
  2060   procedure pack_const_string(cst);
  2061   <* Indsert string in cst in menu text *>
  2062   integer array cst;
  2063   begin
  2064     integer i,cst_text_index,cst_ch_index;
  2065 
  2065     cst_text_index:=0;
  2066     cst_ch_index:=-2;
  2067     for i:=1 step 1 until cst(1) do
  2068     begin
  2069       pack_char((cst(3+cst_text_index) shift (cst_ch_index*8)) extract 8);
  2070       cst_ch_index:=cst_ch_index+1;
  2071       if cst_ch_index=1 then
  2072       begin
  2073         cst_text_index:=cst_text_index+1;
  2074         cst_ch_index:=-2;
  2075       end;
  2076     end;
  2077   end;
  2078 
  2078   if token_type<>t_number then
  2079   begin
  2080     syntax_error(3);
  2081     col:=line:=-1;
  2082     goto point_start;
  2083   end;
  2084   col:=token_number_val;
  2085   if col>79 then
  2086   begin
  2087     mcl_error(6);
  2088     col:=79;
  2089   end;
  2090   next_token;
  2091   if token_type<>t_number then
  2092   begin
  2093     syntax_error(3);
  2094     col:=line:=-1;
  2095     goto point_start;
  2096   end;
  2097   line:=token_number_val;
  2098   if line>24 then
  2099   begin
  2100     mcl_error(7);
  2101     line:=1;
  2102   end;
  2103   next_token;
  2104   if -,make_const_string(menu_line,false) then
  2105   begin
  2106     syntax_error(1);
  2107     line:=col:=-1; 
  2108   end;
  2109   set_op(22,8);
  2110   code.op(2):=line shift 12;
  2111   point_start:
  2112   if token_type>t_endinclude then
  2113   begin
  2114     if col<>-1 then
  2115       syntax_error(13);
  2116     menu_line(1):=menu_line(2):=1;
  2117     while token_type>t_endinclude do
  2118       next_token;
  2119   end;
  2120   menu_op:=op; <* Rem. menu code pos. *>
  2121   menu_text_index:=1;
  2122   for i:=1 step 1 until 640 do
  2123     menu_text(i):=0;
  2124   ch_index:=2;
  2125   end_hold_addr:=0;
  2126   num_of_point:=0;
  2127   if menu_line(1)>0 and menu_line(2)>31 then
  2128   begin <* Write headline centred in 80 char. *>
  2129     for i:=1 step 1 until (80-menu_line(1))//2 do
  2130       pack_char(32);
  2131     pack_const_string(menu_line);
  2132   end;
  2133   line:=line+1;
  2134   for ii:=0 step 1 until 127 do
  2135     unique(ii):=false;
  2136   ctrls:=true;
  2137   while token_type=t_point or token_type=t_text do
  2138   begin  <* POINT and TEXT *>
  2139     if token_type=t_text then
  2140     begin  <* TEXT *>
  2141       next_token;
  2142       if token_type=t_at then
  2143       begin
  2144         next_token;
  2145         if token_type<>t_number then
  2146           syntax_scan(3)
  2147         else
  2148         begin
  2149           ncol:=token_number_val;
  2150           if ncol>79 then
  2151           begin
  2152             mcl_error(6);
  2153             ncol:=1;
  2154           end;
  2155         end;
  2156         next_token;
  2157       end
  2158       else
  2159         ncol:=col;
  2160       if -,make_const_string(menu_line,false) then
  2161         syntax_scan(1);
  2162       next_line;
  2163       if menu_line(1)>0 and menu_line(2)>31 then 
  2164       begin <* Insert text at collum ncol *>
  2165         for i:=1 step 1 until ncol do
  2166           pack_char(32);
  2167         pack_const_string(menu_line);
  2168       end;
  2169       if menu_line(1)=0 then
  2170       begin
  2171         menu_line(2):=32;
  2172         next_line;
  2173       end;
  2174     end
  2175     else
  2176     begin  <* POINT *>
  2177       integer entry_type;
  2178       num_of_point:=num_of_point+1;
  2179       if num_of_point>25 then
  2180       begin
  2181         num_of_point:=1;
  2182         syntax_error(14);
  2183       end;
  2184       entry:=(num_of_point-1)*6;
  2185       next_token;
  2186 <*    if token_type=t_at then
  2187       begin
  2188         next_token;
  2189         if token_type<>t_number then
  2190           syntax_scan(3)
  2191         else
  2192         begin
  2193           ncol:=token_number_val;
  2194           if ncol>79 then
  2195           begin
  2196             mcl_error(6);
  2197             ncol:=1;
  2198           end;
  2199         end;
  2200         next_token;
  2201       end
  2202       else                            *>
  2203         ncol:=col;
  2204       if -,make_const_string(menu_line,true) then
  2205         syntax_scan(1);
  2206       if unique(menu_line(2)) then
  2207         mcl_error(10);
  2208       unique(menu_line(2)):=true;
  2209       point_table.entry(2):=ncol shift 12 + line;
  2210       next_line;
  2211       if menu_line(1)>0 and menu_line(2)>31 then 
  2212       begin <*Insert text at collum ncol *>
  2213         for i:=1 step 1 until ncol do
  2214           pack_char(32);
  2215         pack_const_string(menu_line);
  2216         ctrls:=false; <* Printeble menu point used *>
  2217       end;
  2218       <* Find entry type bits *>
  2219       entry_type:=0;
  2220       if num_of_point=1 then 
  2221         entry_type:=1; <* Top bit *>
  2222       if menu_line(2)<32 then
  2223         entry_type:=entry_type+8; <* Ctlr char bit *>
  2224       point_table.entry(1):=menu_line(2) shift 12 + entry_type;
  2225       point_table.entry(3):=next_free; <* Action address *>
  2226       action;
  2227       s_line:=line_number;
  2228       set_op(1,4); <* Insert jump to end-menu after action code *>
  2229       code.op(2):=end_hold_addr;
  2230       end_hold_addr:=op+4;
  2231     end;
  2232     if token_type>t_endinclude then
  2233     begin
  2234       syntax_error(15);
  2235       while token_type>t_endinclude do
  2236         next_token;
  2237     end;
  2238   end; <* point and text *>
  2239   <* Indsert bottom bit in last entry *>
  2240   if num_of_point>0 then
  2241   begin
  2242     entry:=6*(num_of_point-1);
  2243     point_table.entry(1):=point_table.entry(1)+2;
  2244   end
  2245   else
  2246     mcl_error(1);
  2247   if ctrls then <* Only controls are used in points *>
  2248     mcl_error(1);
  2249   <* Insert last menu line in all ctrl point *>
  2250   for entry:=0 step 6 until 6*(num_of_point-1) do
  2251     if (point_table.entry(1) shift (-12))<32 then
  2252       point_table.entry(2):=col shift 12 + line;
  2253   <* Find menu text length *>
  2254   text_length:=3*(menu_text_index-1)+(2-ch_index);
  2255   first_text:=true;
  2256   menu_text_index:=0;
  2257   while text_length>0 do
  2258   begin <* Insert menu text entries *>
  2259     integer room;
  2260     room:=512-(next_free mod 512);
  2261     if (room<20) and (((text_length//3)*2+4)>room) then
  2262     begin <* No room for text; min. 30 char in one text-entry *>
  2263       next_free:=next_free+room;
  2264       room:=512;
  2265     end;
  2266     if first_text then  
  2267       code.menu_op(4):=next_free; <* Insert address of first text *>
  2268     entry:=next_free-1; <* Entry in code *>
  2269     first_text:=false;
  2270     if ((text_length//3)*2+4)<room then
  2271     begin <* Last text entry *>
  2272       code.entry(1):=0;
  2273       code.entry(2):=((text_length+2)//3+1)*2 shift 12 + text_length;
  2274     end
  2275     else
  2276     begin
  2277       code.entry(1):=next_free+room; <* Next text start *>
  2278       code.entry(2):=(room-2) shift 12 + ((room-4)//2)*3;
  2279     end;
  2280     for i:=1 step 1 until (code.entry(2) shift (-12))//2 do
  2281       code.entry(2+i):=menu_text(i+menu_text_index);
  2282     next_free:=next_free+(code.entry(2) shift (-12))+2;
  2283     text_length:=text_length-code.entry(2) extract 12;
  2284     menu_text_index:=menu_text_index+(code.entry(2) extract 12)//3;
  2285   end;
  2286   <* Find room for point table (max. 150 hw) *>
  2287   entry:=find_string_address(6*num_of_point)-1;
  2288   code.menu_op(3):=entry+1; <* Insert address of first point *>
  2289   for i:=1 step 1 until 3*num_of_point do
  2290     code.entry(i):=point_table(i);
  2291   next_free:=entry+1+6*num_of_point;
  2292   code.menu_op(2):=code.menu_op(2)+num_of_point;
  2293   <* indsæt i end_hold_jump *>
  2294   if make_code then
  2295     while end_hold_addr<>0 do
  2296     begin
  2297       i:=end_hold_addr;
  2298       end_hold_addr:=code.i;
  2299       code.i:=next_free;
  2300     end;
  2301   if token_type<>t_endmenu then
  2302     syntax_error(15)
  2303   else
  2304     next_token;
  2305 end; <* menu *>
  2306 
  2306 procedure attention;
  2307 <*----------------------------------------------------------------*>
  2308 <* Produce code for ATTENTION                                     *>
  2309 <*----------------------------------------------------------------*>
  2310 begin
  2311   integer field end_att_hold_addr;
  2312   integer array proc_string(1:max_string//3+5);
  2313 
  2313   if in_attention or in_include then
  2314     mcl_error(9);
  2315   in_attention:=true;
  2316   att_start:=next_free;
  2317   if -,make_string(proc_string) then
  2318   begin
  2319     syntax_scan(1);
  2320     goto first_action;
  2321   end;
  2322   set_op(4,10+proc_string(1));
  2323   insert_string(proc_string,op+9);
  2324   code.op(2):=next_free;
  2325   if token_type<>t_var then
  2326   begin
  2327     syntax_scan(6);
  2328     goto first_action;
  2329   end;
  2330   code.op(4):=token_number_val shift 12;
  2331   end_att_hold_addr:=op+6;
  2332   next_token;
  2333  first_action:
  2334   action;
  2335   if make_code then
  2336     code.end_att_hold_addr:=next_free;
  2337   s_line:=line_number;
  2338   set_op(5,2);
  2339   in_attention:=false;
  2340   if token_type<>t_endattention then
  2341     syntax_error(16)
  2342   else
  2343     next_token;
  2344 end;
  2345 
  2345 procedure include;
  2346 <*----------------------------------------------------------------*>
  2347 <* Produce code for INCLUDE                                       *>
  2348 <*----------------------------------------------------------------*>
  2349 begin
  2350   integer field end_inc_hold_addr;
  2351   integer array proc_string,pool_string,local_string(1:max_string//3+5);
  2352   integer bufs;
  2353   
  2353   if in_attention or in_include then
  2354     mcl_error(9);
  2355   in_include:=true;
  2356   att_start:=next_free;
  2357   if -,make_string(pool_string) then
  2358   begin
  2359     syntax_scan(1);
  2360     goto first_action;
  2361   end;
  2362   if -,make_string(proc_string) then
  2363   begin
  2364     syntax_scan(1);
  2365     goto first_action;
  2366   end;
  2367   if -,make_string(local_string) then
  2368   begin
  2369     syntax_scan(1);
  2370     goto first_action;
  2371   end;
  2372   set_op(6,16+local_string(1));
  2373   insert_string(local_string,op+15);
  2374   code.op(6):=find_string_address(pool_string(1));
  2375   insert_string(pool_string,code.op(6));
  2376   code.op(7):=find_string_address(proc_string(1));
  2377   insert_string(proc_string,code.op(7));
  2378   code.op(2):=next_free;
  2379   if token_type<>t_number then
  2380   begin
  2381     syntax_scan(3);
  2382     goto first_action;
  2383   end;
  2384   bufs:=token_number_val;
  2385   if bufs>1 then
  2386     mcl_error(5);
  2387   next_token;
  2388   if token_type<>t_number then
  2389   begin
  2390     syntax_scan(3);
  2391     goto first_action;
  2392   end;
  2393   code.op(5):=bufs shift 12 + token_number_val;
  2394   next_token;
  2395   if token_type<>t_var then
  2396   begin
  2397     syntax_scan(6);
  2398     goto first_action;
  2399   end;
  2400   code.op(4):=token_number_val shift 12;
  2401   end_inc_hold_addr:=op+6;
  2402   next_token;
  2403  first_action:
  2404   action;
  2405   if make_code then
  2406     code.end_inc_hold_addr:=next_free;
  2407   s_line:=line_number;
  2408   set_op(7,2);
  2409   in_include:=false;
  2410   if token_type<>t_endinclude then
  2411     syntax_error(17)
  2412   else
  2413     next_token;
  2414 end;
  2415 
  2415 procedure at;
  2416 <*----------------------------------------------------------------*>
  2417 <* Produce code for AT                                            *>
  2418 <*----------------------------------------------------------------*>
  2419 begin
  2420   integer col,line;
  2421 
  2421   if token_type<>t_number then
  2422     syntax_scan(3)
  2423   else
  2424   begin
  2425     col:=token_number_val;
  2426     if col>79 then
  2427     begin
  2428       mcl_error(6);
  2429       col:=79;
  2430     end;
  2431     next_token;
  2432     if token_type=t_number then
  2433     begin
  2434       line:=token_number_val;
  2435       if line>24 then
  2436       begin
  2437         mcl_error(7);
  2438         line:=24;
  2439       end;
  2440       next_token;
  2441     end
  2442     else
  2443     begin
  2444       line:=-1;
  2445       if token_type>t_echo then
  2446         syntax_scan(18);
  2447     end;
  2448     set_op(8,4);
  2449     code.op(2):=col shift 12 + (line extract 12);
  2450   end;
  2451 end;
  2452 
  2452 procedure write_sentence;
  2453 <*----------------------------------------------------------------*>
  2454 <* Produce code for WRITE                                         *>
  2455 <*----------------------------------------------------------------*>
  2456 begin
  2457   integer array write_string(1:max_string//3+5);
  2458 
  2458   if -,make_string(write_string) then
  2459     syntax_scan(1)
  2460   else
  2461   if write_string(2) shift (-12) <> 0 then
  2462   begin <* Non empty string *>
  2463     set_op(9,6+write_string(1));
  2464     insert_string(write_string,op+5);
  2465     code.op(2):=next_free;
  2466   end;
  2467 end;
  2468 
  2468 procedure nl;
  2469 <*----------------------------------------------------------------*>
  2470 <* Produce code for NL                                            *>
  2471 <*----------------------------------------------------------------*>
  2472 begin
  2473   set_op(10,2);
  2474 end;
  2475 
  2475 procedure erase;
  2476 <*----------------------------------------------------------------*>
  2477 <* Produce code for ERASE                                         *>
  2478 <*----------------------------------------------------------------*>
  2479 begin
  2480   set_op(23,2);
  2481 end;
  2482 
  2482 procedure read_sentence;
  2483 <*----------------------------------------------------------------*>
  2484 <* Produce code for READ                                          *>
  2485 <*----------------------------------------------------------------*>
  2486 begin
  2487   integer array read_string(1:max_string//3+5);
  2488   integer char_to_read;
  2489 
  2489   if -,make_string(read_string) then
  2490     syntax_scan(1)
  2491   else
  2492     if token_type<>t_number then
  2493       char_to_read:=-1
  2494     else
  2495     begin
  2496       char_to_read:=token_number_val;
  2497       if char_to_read>max_string or char_to_read<1 then
  2498       begin
  2499         mcl_error(5);
  2500         char_to_read:=1;
  2501       end;
  2502       next_token;
  2503     end;
  2504     if token_type<>t_var then
  2505       syntax_scan(6)
  2506     else
  2507     begin
  2508       if read_string(2) shift (-12) <> 0 then
  2509       begin <* Non empty string *>
  2510         set_op(9,6+read_string(1));
  2511         insert_string(read_string,op+5);
  2512         code.op(2):=next_free;
  2513       end;
  2514       set_op(11,4);
  2515       code.op(2):=char_to_read shift 12 + token_number_val;
  2516       next_token;
  2517     end;
  2518 end;
  2519 
  2519 
  2519 procedure get;
  2520 <*----------------------------------------------------------------*>
  2521 <* Produce code for GET                                           *>
  2522 <*----------------------------------------------------------------*>
  2523 begin
  2524   integer char_to_get;
  2525 
  2525   if -,(in_attention or in_include) then
  2526     warning(1);
  2527   if token_type<>t_number then
  2528     syntax_scan(3)
  2529   else
  2530   begin
  2531     char_to_get:=token_number_val;
  2532     if char_to_get>max_string or char_to_get<1 then
  2533       mcl_error(5);
  2534     next_token;
  2535     if token_type<>t_var then
  2536       syntax_scan(6)
  2537     else
  2538     begin
  2539       set_op(12,4);
  2540       code.op(2):=char_to_get shift 12 + token_number_val;
  2541       next_token;
  2542     end;
  2543   end;
  2544 end;
  2545 
  2545 procedure let;
  2546 <*----------------------------------------------------------------*>
  2547 <* Produce code for LET                                           *>
  2548 <*----------------------------------------------------------------*>
  2549 begin
  2550   integer var_ref;
  2551   integer array let_string(1:max_string//3+5);
  2552 
  2552   if token_type<>t_var then
  2553     syntax_scan(6)
  2554   else
  2555   begin
  2556     var_ref:=token_number_val;
  2557     next_token;
  2558     if token_type<>t_equal then
  2559       syntax_scan(10)
  2560     else
  2561     begin
  2562       next_token;
  2563       if -,make_string(let_string) then
  2564         syntax_scan(1)
  2565       else
  2566       begin
  2567         set_op(13,8+let_string(1));
  2568         insert_string(let_string,op+7);
  2569         code.op(2):=next_free;
  2570         code.op(3):=var_ref shift 12;
  2571       end;
  2572     end;
  2573   end;
  2574 end;
  2575 
  2575 
  2575 procedure send;
  2576 <*----------------------------------------------------------------*>
  2577 <* Produce code for SEND                                          *>
  2578 <*----------------------------------------------------------------*>
  2579 begin
  2580   integer array send_string(1:max_string//3+5);
  2581 
  2581   if -,(in_attention or in_include) then
  2582     warning(1);
  2583   if -,make_string(send_string) then
  2584     syntax_scan(1)
  2585   else
  2586   begin
  2587     set_op(14,6+send_string(1));
  2588     insert_string(send_string,op+5);
  2589     code.op(2):=next_free;
  2590   end;
  2591 end;
  2592 
  2592 procedure if_sentence;
  2593 <*----------------------------------------------------------------*>
  2594 <* Produce code for IF                                            *>
  2595 <* Structure of produced kode for IF THEN ELSE                    *>
  2596 <*
  2597         -- bool exp --        
  2598           true address --     
  2599      !----false address !     
  2600      !  --------------  !     
  2601      !               <--!     
  2602      !    action                         
  2603      !                       
  2604      !  ---- jump ----      
  2605      !     address   ---!   
  2606      !  --------------  !
  2607      !-->  else         !
  2608           action        !
  2609         --------------  !
  2610                      <--!
  2611 
  2611  Structure of produced kode for IF THEN
  2612   
  2612         -- bool exp --        
  2613           true address --     
  2614      !----false address !     
  2615      !  --------------  !     
  2616      !               <--!     
  2617      !    action                         
  2618      !                       
  2619      !  --------------   
  2620      !-->                
  2621                                                                   *>
  2622 <*----------------------------------------------------------------*>
  2623 begin
  2624   integer field f_jump_hold_addr,t_jump_hold_addr;
  2625   boolean equal;
  2626 
  2626   make_bool_exp(t_then,19,f_jump_hold_addr,t_jump_hold_addr);
  2627   if make_code then
  2628     insert_jump(t_jump_hold_addr,next_free);
  2629 first_action:
  2630   action;
  2631   s_line:=line_number;
  2632   if token_type=t_else then
  2633   begin
  2634     set_op(1,4);
  2635     if make_code then
  2636       insert_jump(f_jump_hold_addr,next_free);
  2637     f_jump_hold_addr:=op+3;
  2638     next_token;
  2639     action;
  2640   end;
  2641   if make_code then
  2642     insert_jump(f_jump_hold_addr,next_free);
  2643   if token_type<>t_endif then
  2644   begin
  2645     syntax_error(20);
  2646   end
  2647   else
  2648     next_token;
  2649 end;
  2650 
  2650 procedure execute;
  2651 <*----------------------------------------------------------------*>
  2652 <* Produce code for EXECUTE                                       *>
  2653 <*----------------------------------------------------------------*>
  2654 begin
  2655   integer array execute_string(1:max_string//3+5);
  2656 
  2656   if -,make_string(execute_string) then
  2657     syntax_scan(1)
  2658   else
  2659   begin
  2660     set_op(15,8+execute_string(1));
  2661     insert_string(execute_string,op+7);
  2662     code.op(2):=next_free;
  2663     if token_type<>t_var then
  2664       syntax_scan(6)
  2665     else
  2666     begin
  2667       code.op(3):=token_number_val shift 12;
  2668       next_token;
  2669     end;
  2670   end;
  2671 end;
  2672 
  2672 
  2672 procedure note;
  2673 <*----------------------------------------------------------------*>
  2674 <* Produce code for NOTE                                          *>
  2675 <*----------------------------------------------------------------*>
  2676 begin
  2677   integer array note_string(1:max_string//3+5);
  2678 
  2678   if -,make_string(note_string) then
  2679     syntax_scan(1)
  2680   else
  2681   if use_note then
  2682   begin
  2683     set_op(9,6+note_string(1));
  2684     insert_string(note_string,op+5);
  2685     code.op(2):=next_free;
  2686     set_op(10,2);
  2687   end;
  2688 end;
  2689 
  2689 procedure direct;
  2690 <*----------------------------------------------------------------*>
  2691 <* Produce code for DIRECT                                        *>
  2692 <*----------------------------------------------------------------*>
  2693 begin
  2694   if -,(in_attention or in_include) then
  2695     warning(1);
  2696   if token_type<>t_var then
  2697     syntax_scan(6)
  2698   else
  2699   begin
  2700     set_op(16,4);
  2701     code.op(2):=token_number_val shift 12;
  2702     next_token;
  2703   end;
  2704 end;
  2705 
  2705 procedure loop;
  2706 <*----------------------------------------------------------------*>
  2707 <* Produce code for LOOP                                          *>
  2708 <*----------------------------------------------------------------*>
  2709 begin
  2710   if in_attention and (while_start<att_start) then
  2711     set_op(5,2);
  2712   if in_include and (while_start<att_start) then
  2713     set_op(5,2);
  2714   set_op(1,4);
  2715   code.op(2):=while_start;
  2716 end;
  2717 
  2717 procedure exit;
  2718 <*----------------------------------------------------------------*>
  2719 <* Produce code for EXIT                                          *>
  2720 <*----------------------------------------------------------------*>
  2721 begin
  2722   integer array exit_string(1:max_string//3+5);
  2723 
  2723   if in_attention then
  2724     set_op(5,2);
  2725   if in_include then
  2726     set_op(7,2);
  2727   if -,make_string(exit_string) then
  2728     syntax_scan(1);
  2729   set_op(17,2+exit_string(1));
  2730   insert_string(exit_string,op+3);
  2731 end;
  2732 
  2732 procedure output;
  2733 <*----------------------------------------------------------------*>
  2734 <* Produce code for OUTPUT                                        *>
  2735 <*----------------------------------------------------------------*>
  2736 begin
  2737   if token_type=t_on then
  2738   begin
  2739     next_token;
  2740     set_op(18,2);
  2741   end
  2742   else
  2743     if token_type=t_off then
  2744     begin
  2745       next_token;
  2746       set_op(19,2);
  2747     end
  2748     else
  2749       syntax_scan(21);
  2750 end;
  2751 
  2751 procedure echo;
  2752 <*----------------------------------------------------------------*>
  2753 <* Produce code for ECHO                                          *>
  2754 <*----------------------------------------------------------------*>
  2755 begin
  2756   if token_type=t_on then
  2757   begin
  2758     next_token;
  2759     set_op(20,2);
  2760   end
  2761   else
  2762     if token_type=t_off then
  2763     begin
  2764       next_token;
  2765       set_op(21,2);
  2766     end
  2767     else
  2768       syntax_scan(21);
  2769 end;
  2770 
  2770 procedure convert;
  2771 <*----------------------------------------------------------------*>
  2772 <* Produce code for CONVERT                                       *>
  2773 <*----------------------------------------------------------------*>
  2774 begin
  2775   if token_type<>t_var then
  2776     syntax_scan(6)
  2777   else
  2778   begin
  2779     set_op(24,4);
  2780     code.op(2):=token_number_val shift 12;
  2781     next_token;
  2782   end;
  2783 end;
  2784 
  2784 
  2784 
  2784 procedure action;
  2785 <*----------------------------------------------------------------*>
  2786 <* Call procedures to produce code for the                        *>
  2787 <* sentence in a action, return if next keyword                   *>
  2788 <* is a 'action-end'                                              *>
  2789 <*----------------------------------------------------------------*>
  2790 begin
  2791   integer tt;
  2792   while token_type>t_endinclude do
  2793   begin
  2794     if (token_type>=t_select) and (token_type<=t_echo) then
  2795     begin
  2796       tt:=token_type-t_endinclude;
  2797       s_line:=line_number;
  2798       next_token;
  2799       case tt of
  2800       begin
  2801         select;
  2802         while_sentence;
  2803         menu;
  2804         attention;
  2805         include;
  2806         at;
  2807         write_sentence;
  2808         nl;
  2809         erase;
  2810         read_sentence;
  2811         get;
  2812         let;
  2813         send;
  2814         if_sentence;
  2815         execute;
  2816         note;
  2817         direct;
  2818         loop;
  2819         exit;
  2820         output;
  2821         convert;
  2822         echo 
  2823       end;
  2824     end;
  2825     if token_type>t_echo then
  2826     begin
  2827       <* Error, not a sentence start *>
  2828       if token_type=t_unknown then <* Unknown keyword *>
  2829       begin
  2830         next_token;
  2831         syntax_scan(2);
  2832       end
  2833       else
  2834         syntax_scan(18);
  2835     end;
  2836   end; <* Other = end action *>
  2837 end;
  2838 
  2838 integer procedure list_string(addr);
  2839 <*----------------------------------------------------------------*>
  2840 <* Used by list-code. List string format                          *>
  2841 <* starting at address addr                                       *>
  2842 <*----------------------------------------------------------------*>
  2843 value addr;
  2844 integer addr;
  2845 begin
  2846   integer type;
  2847   integer field i;
  2848 
  2848   write(out,<:<10>:>,<<dddddd>,addr,<:+ :>);
  2849   i:=addr+1;
  2850   type:=code.i shift (-12);
  2851   if type<0 or type>5 then
  2852     write(out,<:***String error:>,type)
  2853   else
  2854   begin
  2855     case type+1 of
  2856     begin
  2857     <* 0 *> begin
  2858               write(out,<:    Empty string:>);
  2859               list_string:=addr+2;
  2860             end;
  2861     <* 1 *> begin
  2862               write(out,<:    Variable :>);
  2863               outchar(out,(code.i extract 12)+65);
  2864               list_string:=addr+2;
  2865             end;
  2866     <* 2 *> begin
  2867               write(out,<:    Variable with interval :>);
  2868               w_h(i,true);
  2869               w_h(i+1,false);
  2870               w_h(i+2,false);
  2871               list_string:=addr+4;
  2872             end;
  2873     <* 3 *> begin
  2874               write(out,<:    Text with var.sub :>);
  2875               list_string:=list_text(addr+2);
  2876             end;
  2877     <* 4 *> begin
  2878               write(out,<:    Text with var.sub and interval :>);
  2879               w_h(i+1,false);
  2880               w_h(i+2,false);
  2881               list_string:=list_text(addr+4);
  2882             end;
  2883     <* 5 *> begin
  2884               write(out,<:    Constant text :>);
  2885               list_string:=list_text(addr+2);
  2886             end;
  2887     end;
  2888   end;
  2889 end;
  2890 
  2890 integer procedure list_text(addr);
  2891 <*----------------------------------------------------------------*>
  2892 <* Used by code-list. List text starting at addr                  *>
  2893 <*----------------------------------------------------------------*>
  2894 value addr;
  2895 integer addr;
  2896 begin
  2897   integer array field iaf;
  2898   integer field inx;
  2899   integer i,j,ch;
  2900 
  2900   inx:=addr+1;
  2901   write(out,<:<10>:>,<<dddddd>,addr,<:+     Text:>,<< d>,
  2902             code.inx shift (-12), code.inx extract 12);
  2903   iaf:=inx;
  2904   write(out,<:  <60>:>);
  2905   for i:=1 step 1 until (code.inx shift (-12))//2 do
  2906     for j:=-16 step 8 until 0 do
  2907     begin
  2908       ch:=(code.iaf(i) shift j) extract 8;
  2909       if ch<32 then
  2910       begin
  2911         if ch=0 then
  2912           goto text_end;
  2913         write(out,<:^:>);
  2914         ch:=ch+64;
  2915       end;
  2916       if ch>127 then
  2917       begin
  2918         write(out,<:&:>);
  2919         ch:=ch-63;
  2920       end;
  2921       outchar(out,ch);
  2922     end;
  2923  text_end:
  2924   write(out,<:<62>:>);
  2925   list_text:=addr+(code.inx shift (-12));
  2926 end;
  2927 
  2927 procedure w_addr(addr,text);
  2928 integer field addr;
  2929 string text;
  2930 begin
  2931   write(out,<:<10>:>,<<dddddd>,addr,<:+     :>,
  2932             text,<< d>,code.addr);
  2933 end;
  2934 
  2934 procedure w_h(addr,var);
  2935 boolean field addr;
  2936 boolean var;
  2937 begin
  2938   write(out,<:<10>:>,<<dddddd>,addr,<:+     :>);
  2939   if var then
  2940   begin
  2941     write(out,<:Variable :>);
  2942     outchar(out,(code.addr extract 12)+65);
  2943   end
  2944   else
  2945     write(out,<< d>,code.addr extract 12);
  2946 end;
  2947 
  2947 procedure code_list(op_addr,stop_addr);
  2948 <*----------------------------------------------------------------*>
  2949 <* List code formats from address op_addr                         *>
  2950 <* until address stop_addr                                        *>
  2951 <*----------------------------------------------------------------*>
  2952 value stop_addr;
  2953 integer op_addr,stop_addr;
  2954 begin
  2955   integer op_code;
  2956 
  2956   while op_addr<stop_addr do
  2957   begin
  2958     op:=op_addr-1;
  2959     op_code:=code.op(1) shift (-12);
  2960     if op_code<0 or op_code>24 then
  2961     begin
  2962       write(out,<:<10>:>,<<dddddd>,op_addr,
  2963                 <: ***error in op code :>,op_code);
  2964       while op_code<0 or op_code>24 do
  2965       begin
  2966         op_addr:=op_addr+2;
  2967         op:=op_addr-1;
  2968         op_code:=code.op(1) shift (-12);
  2969         write(out,<< d>,op_code);
  2970       end;
  2971     end;
  2972     write(out,<:<10>:>,<<dddddd>,op_addr,<:::>,
  2973               <<dddd >,code.op(1) extract 12,
  2974               case op_code+1 of
  2975               (<:New segment:>,
  2976                <:Jump:>,                                           
  2977                <:Bool-exp:>,
  2978                <:Red-bool-exp:>,
  2979                <:Attention:>,
  2980                <:Endattention:>,
  2981                <:Include:>,
  2982                <:Endinclude:>,
  2983                <:At:>,
  2984                <:Write:>,
  2985                <:Nl:>,
  2986                <:Read:>,
  2987                <:Get:>,
  2988                <:Let:>,
  2989                <:Send:>,
  2990                <:Execute:>,
  2991                <:Direct:>,
  2992                <:Exit:>,
  2993                <:Output-on:>,
  2994                <:Output-off:>,
  2995                <:Echo-on:>,
  2996                <:Echo-off:>,
  2997                <:Menu:>,
  2998                <:Erase:>,
  2999                <:Convert:>));
  3000     case op_code+1 of
  3001     begin
  3002 <*  0 *> begin
  3003            op_addr:=(op_addr shift (-9)+1) shift 9;
  3004          end;
  3005 <*  1 *> begin
  3006            op_addr:=op_addr+4;
  3007            w_addr(op+3,<:addr::>);
  3008          end;
  3009 <*  2 *> begin
  3010            op_addr:=if code.op(2)<code.op(3) then
  3011                       code.op(2)
  3012                     else
  3013                       code.op(3);
  3014            w_addr(op+3,<:equal addr::>);
  3015            w_addr(op+5,<:not equal addr::>);
  3016            w_addr(op+7,<:right s addr::>);
  3017            list_string(op+9);
  3018            list_string(code.op(4));
  3019          end;
  3020 <*  3 *> begin
  3021            op_addr:=if code.op(2)<code.op(3) then
  3022                       code.op(2)
  3023                     else
  3024                       code.op(3);
  3025            w_addr(op+3,<:equal addr::>);
  3026            w_addr(op+5,<:not equal addr::>);
  3027            w_h(op+7,true);
  3028            w_h(op+8,false);
  3029            write(out,<:  :>);
  3030            for ii:=-16 step 8 until -24+8*(code.op(4) extract 12) do
  3031              outchar(out,code.op(5) shift ii);
  3032          end;
  3033 <*  4 *> begin
  3034            op_addr:=code.op(2);
  3035            w_addr(op+3,<:next op.:>);
  3036            w_addr(op+5,<:end att addr::>);
  3037            w_h(op+7,true);
  3038            list_string(op+9);
  3039          end;
  3040 <*  5 *> begin
  3041            op_addr:=op_addr+2;
  3042          end;
  3043 <*  6 *> begin
  3044            op_addr:=code.op(2);
  3045            w_addr(op+3,<:next op.:>);
  3046            w_addr(op+5,<:end inc addr::>);
  3047            w_h(op+7,true);
  3048            w_h(op+9,false);
  3049            w_h(op+10,false);
  3050            w_addr(op+11,<:pool s addr::>);
  3051            w_addr(op+13,<:proc s addr::>);
  3052            list_string(op+15);
  3053            list_string(code.op(6));
  3054            list_string(code.op(7));
  3055          end;
  3056 <*  7 *> begin
  3057            op_addr:=op_addr+2;
  3058          end;
  3059 <*  8 *> begin
  3060            op_addr:=op_addr+4;
  3061            w_h(op+3,false);
  3062            w_h(op+4,false);
  3063          end;
  3064 <*  9 *> begin
  3065            op_addr:=code.op(2);
  3066            w_addr(op+3,<:next op.:>);
  3067            list_string(op+5);
  3068          end;
  3069 <* 10 *> begin
  3070            op_addr:=op_addr+2;
  3071          end;
  3072 <* 11 *> begin
  3073            op_addr:=op_addr+4;
  3074            w_h(op+3,false);
  3075            w_h(op+4,true);
  3076          end;
  3077 <* 12 *> begin
  3078            op_addr:=op_addr+4;
  3079            w_h(op+3,false);
  3080            w_h(op+4,true);
  3081          end;
  3082 <* 13 *> begin
  3083            op_addr:=code.op(2);
  3084            w_addr(op+3,<:next op.:>);
  3085            w_h(op+5,true);
  3086            list_string(op+7);
  3087          end;
  3088 <* 14 *> begin
  3089            op_addr:=code.op(2);
  3090            w_addr(op+3,<:next op.:>);
  3091            list_string(op+5);
  3092          end;
  3093 <* 15 *> begin
  3094            op_addr:=code.op(2);
  3095            w_addr(op+3,<:next op.:>);
  3096            w_h(op+5,true);
  3097            list_string(op+7);
  3098          end;
  3099 <* 16 *> begin
  3100            op_addr:=op_addr+4;
  3101            w_h(op+3,true);
  3102          end;
  3103 <* 17 *> begin
  3104            op_addr:=list_string(op+3);
  3105          end;
  3106 <* 18 *> begin
  3107            op_addr:=op_addr+2;
  3108          end;
  3109 <* 19 *> begin
  3110            op_addr:=op_addr+2;
  3111          end;
  3112 <* 20 *> begin
  3113            op_addr:=op_addr+2;
  3114          end;
  3115 <* 21 *> begin
  3116            op_addr:=op_addr+2;
  3117          end;
  3118 <* 22 *> begin
  3119            integer next_text,point_table,num_of_point,point;
  3120            long array field laf;
  3121            integer field i;
  3122            integer pch;
  3123 
  3123            op_addr:=op_addr+8;
  3124            w_h(op+3,false);
  3125            w_h(op+4,false);
  3126            num_of_point:=code.op(2) extract 12;
  3127            w_addr(op+5,<:first point:>);
  3128            w_addr(op+7,<:menu text:>);
  3129            next_text:=code.op(4);
  3130            point_table:=code.op(3);
  3131            code_list(op_addr,code.op(4));
  3132            while next_text<>0 do
  3133            begin
  3134              write(out,<:<10>:>,<<dddddd>,next_text,<:+     Menu text:>);
  3135              op:=next_text-1;
  3136              next_text:=code.op(1);
  3137              if next_text>0 then
  3138                w_addr(op+1,<:next text:>);
  3139              write(out,<< d>,code.op(2) shift (-12), code.op(2) extract 12);
  3140              laf:=op+4;
  3141              write(out,<:<10>--------Menu-text-start---<10>:>,code.laf,
  3142                        <:<10>--------Menu-text-end-----<10>:>);
  3143            end;
  3144            for op:=point_table-1 step 6 until 
  3145                      (num_of_point-1)*6+point_table-1 do
  3146            begin
  3147              write(out,<:<10>:>,<<dddddd>,op+1,<:+     Point  :>);
  3148              pch:=code.op(1) shift (-12);
  3149              if pch < 32 then
  3150              begin
  3151                pch:=pch+64;
  3152                write(out,<:^:>);
  3153              end
  3154              else
  3155                write(out,<: :>);
  3156              outchar(out,pch);
  3157              write(out,<: :>);
  3158              for ii:=-11 step 1 until 0 do
  3159                write(out,<<d>,(code.op(1) shift ii) extract 1);
  3160              w_h(op+3,false);
  3161              w_h(op+4,false);
  3162              w_addr(op+5,<:action:>);
  3163            end;
  3164            op_addr:=point_table+6*num_of_point;
  3165          end;
  3166 <* 23 *> begin
  3167            op_addr:=op_addr+2;
  3168          end;
  3169 <* 24 *> begin
  3170            op_addr:=op_addr+4;
  3171            w_h(op+3,true);
  3172          end;
  3173     end;
  3174   end;
  3175 end;
  3176 
  3176                
  3176 
  3176   trap(traped);
  3177   init_compiler;
  3178   if list_source then
  3179     write_headline;
  3180   init_scan;
  3181   open(source_text,4,source_file,0);
  3182   if monitor(42,source_text,ii,tail)<>0 then
  3183     init_error(3);
  3184   if tail(9)<>0 then
  3185     init_error(5);
  3186   line_number:=0;
  3187   get_new_line;
  3188   next_token;
  3189   while token_type<>t_end_file do
  3190   begin
  3191     action;
  3192     if token_type<>t_end_file then
  3193     begin
  3194       syntax_error(22);
  3195       while (token_type<t_select or token_type>t_echo) 
  3196             and token_type<>t_end_file do
  3197         next_token;
  3198     end;
  3199   end;
  3200   if false then
  3201     traped: comp_error(alarmcause extract 24);
  3202 stop:
  3203   <* Insert exit at end *>
  3204   s_line:=line_number;
  3205   set_op(17,10);
  3206   <* Default exit text *>
  3207   code.op(2):=5 shift 12;
  3208   code.op(3):=6 shift 12 + 5;
  3209   code.op(4):= long <:exi:> shift (-24) extract 24;
  3210   code.op(5):= long <:t :> shift (-24) extract 24;
  3211   if show_code and make_code then
  3212   begin
  3213     write_headline;
  3214     write(out,<:<10>Code list::>);
  3215     code_list(0,next_free);
  3216   end;
  3217   if make_code and make_cmcl then
  3218   begin
  3219     real array field raf;
  3220     open(cmcl_code,4,cmcl_file,0);
  3221     monitor(42,cmcl_code,ii,tail);
  3222     tail(1):=(next_free//512)+1; 
  3223     tail(6):=systime(7,0,rr);      
  3224     tail(9):=29 shift 12;           <* Contents key 29      *>
  3225     tail(10):=next_free;            <* Size of code in hw's *>
  3226     if monitor(44,cmcl_code,ii,tail)<>0 then
  3227     begin
  3228       for ii:=2,3,4,5,7,8 do
  3229         tail(ii):=0;
  3230       if monitor(40,cmcl_code,ii,tail)<>0 then
  3231         init_error(6);
  3232     end;
  3233     for raf:=-1 step 512 until next_free-2 do
  3234     begin
  3235       outrec6(cmcl_code,512);
  3236       tofrom(cmcl_code,code.raf,512);
  3237     end;
  3238     close(cmcl_code,true);
  3239   end;
  3240   write(out,<:<10>mcl end :>);
  3241   if make_code then
  3242     write(out,<:    code:>,<< d>,next_free,<:<10>:>)
  3243   else
  3244     write(out,<:    no code generated<10>:>);
  3245   if warnings then
  3246     errorbits:=1 shift 1;
  3247   if -,make_code then
  3248     errorbits:=3;
  3249 end;
  3250 end;\f


algol end 125
*o c
▶EOF◀