DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦2f2f61c3b⟧ TextFile

    Length: 20320 (0x4f60)
    Types: TextFile
    Names: »SEMANTICS.S«

Derivation

└─⟦f81e11cf7⟧ Bits:30005196 8" CR80 Floppy CR80FD_0194 ( CR/D/2497 TEST-TDX VS0102 Source moduler Att. Holger Bay 820208/AEK )
    └─⟦d066df9e9⟧ 
        └─ ⟦this⟧ »SEMANTICS.S« 

TextFile

«ff»
"SEMANTICS.S     "
"----------------"

PROCEDURE SEMANTICS(ACTION, ATTRIBUTE, STACK_INDEX : INTEGER);
"**********************************************************************
  AUTHOR:           TLM
  DATE:             810316
***********************************************************************
  COMMENTS:
***********************************************************************
  CHANGE RECORD:
  VERSION    AUTHOR/DATE    DESCRIPTION OF CHANGE
  -------    -----------    ---------------------
**********************************************************************"
VAR   I          : INTEGER;
      PARAMNAME  : NAME_TYPE;
BEGIN
   IF (NOT IGNORE_REST_OF_LINE) OR
      (IGNORE_REST_OF_LINE AND (ACTION IN [19, 20] "STATEMENT"))
   THEN
   CASE ACTION OF
       1: "IDENTIFIER"
         BEGIN
            IDENTIFIER.LENGTH := ATTRIBUTE;
            IDENTIFIER.STRING := SYMBOLBUF;
         END;
       2: "CONSTANT"
         BEGIN
            CONSTANT := ATTRIBUTE;
         END;
       3: "STRING"
         BEGIN
            STRING.LENGTH := ATTRIBUTE;
            STRING.STRING := SYMBOLBUF;
         END;
       4: "ERROR"
         BEGIN
            NO_OF_INTEGERS := 0;
            WRITETEXT('?(:7:)(:0:)');
            WRITENL;
         END;
       5: "<GOAL-SYMBOL>     -->  <commandfile> "
         BEGIN
            TERMINATE(0);
         END;
       6:;"<commandfile>     -->  <procdecls> <body> <nl> "
       7:;"                  -->  <body> <nl> "
       8:;"                  -->  END <nl> "
       9:;"<procdecls>       -->  <procdecls> <procdecl> "
      10:;"                  -->  <procdecl> "
      11, "<procdecl>        -->  <proresword> <procname> <paramlist> <nl> <body> <nl> "
      12: "                  -->  <proresword> <procname> <nl> <body> <nl> "
         BEGIN
            PROCEDURES[PROCEDURECOUNT].NO_OF_PARAMS := PARAMETERCOUNT;
            PARAMETERCOUNT := 0;
            PROC_DECLARING := FALSE;
            "--- GENERATE PROCEDURE RETURN CODE ---"
            CODE[CCP] := PROCRETURN_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 0;
            CCP := CCP + 3;
         END;
      13: "<proresword>      -->  PROCEDURE "
         BEGIN
            PROC_DECLARING := TRUE;
            PROC_CODE_PTR := CCP;
            PARAMETERCOUNT := 0;
            INSTALL_PROCNAME := TRUE;
         END;
      14: "<procname>        -->  <identifier> "
         BEGIN
            PROCNAME := '                ';
            I := 0;
            REPEAT
               I := SUCC(I);
               PROCNAME[I] := IDENTIFIER.STRING[I - 1];
            UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
            IF INSTALL_PROCNAME THEN
            BEGIN
               PROCEDURECOUNT := SUCC(PROCEDURECOUNT);
               WITH PROCEDURES[PROCEDURECOUNT] DO
               BEGIN
                  NAME := PROCNAME;
                  CODE_ADR := PROC_CODE_PTR;
               END;
               INSTALL_PROCNAME := FALSE;
            END;
            ACTPARAMETERCOUNT := 0;
            PARAMETERS.VARIABLE_MASK := 0;
            PARAMETERS.NO_OF_PARAMS := 0;
         END;
      15:;"<paramlist>       -->  ( <parameters> )  "
      16, "<parameters>      -->  <parameters> ; <identifier> "
      17: "                  -->  <identifier> "
         BEGIN
            PARAMETERCOUNT := SUCC(PARAMETERCOUNT);
            IF PARAMETERCOUNT <= MAX_PARAMETER THEN
            BEGIN
               FORM_PARAMS[PARAMETERCOUNT].NAME := '                ';
               I := 0;
               REPEAT
                  I := SUCC(I);
                  FORM_PARAMS[PARAMETERCOUNT].NAME[I] :=
                           IDENTIFIER.STRING[I - 1];
               UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
            END
            ELSE
            BEGIN
               WRITETEXT('*** TOO MANY PARAMETERS ***(:0:)');
               WRITENL;
               IGNORE_REST_OF_LINE := TRUE;
            END;
         END;
      18:;"<body>            -->  BEGIN <nl> <statements> END "
      19, "<statements>      -->  <statements> <statement> "
      20: "                  -->  <statement> "
         BEGIN
            IGNORE_REST_OF_LINE := FALSE;
            PARAMETERS.VARIABLE_MASK := 0;
            PARAMETERS.NO_OF_PARAMS  := 0;
         END;
      21: "<statement>       -->  <procedurecall> "
         BEGIN
            CODE[CCP] := PROCCALL_CMD;
            CODE[CCP + XVARMASK] := 
                    LEFTSHIFT(PARAMETERS.VARIABLE_MASK, 1);
            CODE[CCP + XPARAMS ] := PARAMETERS.NO_OF_PARAMS + 1;
            I := GET_PROCEDURE_ADR(PROCNAME);
            IF I <> UNDECLARED THEN
            BEGIN
               CODE[CCP + XPARAMS + 1] := I;
               I := GET_PARAMETER_COUNT(PROCNAME);
               IF I = PARAMETERS.NO_OF_PARAMS THEN
               BEGIN
                  FOR I := 1 TO PARAMETERS.NO_OF_PARAMS DO
                     CODE[CCP + XPARAMS + 1 + I] := 
                                 PARAMETERS.ACT_PARAMS[I];
                  IF REPEAT_DECLARING OR PROC_DECLARING THEN
                  BEGIN
                     CCP := CCP + CODE[CCP + XPARAMS] + 3;
                  END
                  ELSE
                     INTERPRET(CCP, CURR_SP);
               END
               ELSE
               BEGIN
                  WRITETEXT('*** PARAMETER MISMATCH ***(:0:)');
                  WRITENL;
                  IGNORE_REST_OF_LINE := TRUE;
               END;
            END
            ELSE
            BEGIN
               WRITETEXT('*** UNDECLARED PROCEDURE ***(:0:)');
               WRITENL;
               IGNORE_REST_OF_LINE := TRUE;
            END;
         END;
      22: "                  -->  <repeatstatement "
         BEGIN
            CODE[CCP] := ENDREPEAT_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 1;
            CODE[CCP + XPARAMS + 1] := REPEAT_CODE_PTR;
            IF PROC_DECLARING THEN
               CCP := CCP + CODE[CCP + XPARAMS] + 3
            ELSE
            BEGIN
               INTERPRET(REPEAT_CODE_PTR, CURR_SP);
               CCP := REPEAT_CODE_PTR;
            END;
            REPEAT_DECLARING := FALSE;
         END;
      23: "                  -->  <simplecommand> "
         BEGIN
            IF PROC_DECLARING OR REPEAT_DECLARING THEN
               CCP := CCP + CODE[CCP + XPARAMS] + 3
            ELSE
               INTERPRET(CCP, CURR_SP);
         END;
      24:;"                  -->  <error> "
      25:;"<procedurecall>   -->  <procname> ( <actualparams> ) <nl> "
      26:;"                  -->  <procname> <nl> "
      27, "<actualparams>    -->  <actualparams> , <const_or_var> "
      28: "                  -->  <const_or_var> "
         BEGIN
            ACTPARAMETERCOUNT := SUCC(ACTPARAMETERCOUNT);
            IF ANY.VARIABLE THEN
            BEGIN
               SETBIT(PARAMETERS.VARIABLE_MASK, ACTPARAMETERCOUNT);
            END;
            PARAMETERS.NO_OF_PARAMS := ACTPARAMETERCOUNT;
            PARAMETERS.ACT_PARAMS[ACTPARAMETERCOUNT] := ANY.PARAMETER;
         END;
      29:;"<repeatstatement   -->  <repeatresword> <repeats> <nl> <body> <nl> "
      30:;"                  -->  <repeatresword> <repeats> <statement>  "
      31: "<repeatresword>   -->  REPEAT "
         BEGIN
            REPEAT_CODE_PTR := CCP;
            REPEAT_DECLARING := TRUE;
         END;
      32: "<repeats>         -->  <const_or_var> "
         BEGIN
            REPEATS := ANY;
            CODE[CCP] := REPEAT_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF REPEATS.VARIABLE THEN SETBIT(CODE[XVM], 1);
            CODE[CCP + XPARAMS] := 1;
            CODE[CCP + XPARAMS + 1] := REPEATS.PARAMETER;
            CCP := CCP + CODE[CCP + XPARAMS] + 3;
         END;
      33: "<simplecommand>   -->  <driverdefinecom "
         BEGIN
            CODE[ CCP ] := DRIVERDEFINE_CMD;
            CODE[ CCP + XVARMASK ] := 0;
            CODE[ CCP + XPARAMS  ] := 6;
            PACK(STRING.STRING[0], CODE[CCP + XPARAMS + 1], 6);
            PACK(STRING.STRING[7], CODE[CCP + XPARAMS + 5], 4);
            CODE[CCP + XPARAMS + 4] := 0;
         END;
      34: "<simplecommand>   -->  <assigncommand> "
         BEGIN
            CODE[CCP] := ASSIGN_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF CR80ADR.VARIABLE THEN SETBIT(CODE[XVM], 1);
            IF HOSTNO.VARIABLE  THEN SETBIT(CODE[XVM], 2);
            CODE[CCP + XPARAMS] := 2;
            CODE[CCP + XPARAMS + 1] := CR80ADR.PARAMETER;
            CODE[CCP + XPARAMS + 2] := HOSTNO.PARAMETER;
         END;
      35: "<simplecommand>   -->  <deassigncommand "
         BEGIN
            CODE[CCP] := DEASSIGN_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 0;
         END;
      36: "<simplecommand>   -->  <createcommand> "
         BEGIN
            CODE[CCP] := CREATE_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF PROTOCOL.VARIABLE THEN SETBIT(CODE[XVM], 1);
            IF CRID.VARIABLE     THEN SETBIT(CODE[XVM], 2);
            IF SPEED.VARIABLE    THEN SETBIT(CODE[XVM], 3);
            IF MAXPACKET.VARIABLE THEN SETBIT(CODE[XVM], 4);
            CODE[CCP + XPARAMS] := 4;
            CODE[CCP + XPARAMS + 1] := PROTOCOL.PARAMETER;
            CODE[CCP + XPARAMS + 2] := CRID.PARAMETER;
            CODE[CCP + XPARAMS + 3] := SPEED.PARAMETER;
            CODE[CCP + XPARAMS + 4] := MAXPACKET.PARAMETER;
         END;
      37: "<simplecommand>   -->  <dismantlecomman "
         BEGIN
            CODE[CCP] := DISMANTLE_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
            CODE[CCP + XPARAMS] := 1;
            CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
         END;
      38, "<simplecommand>   -->  <readcommand> "
      39: "<simplecommand>   -->  <initreadcommand "
         BEGIN
            IF ACTION = 38 THEN CODE[CCP] := READ_CMD
                           ELSE CODE[CCP] := INITREAD_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
            IF NOOFBYTES.VARIABLE THEN SETBIT(CODE[XVM], 2);
            CODE[CCP + XPARAMS] := 5;
            CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
            CODE[CCP + XPARAMS + 2] := NOOFBYTES.PARAMETER;
            IF ACTION = 38 THEN CODE[CCP + XPARAMS + 3] := 1
                           ELSE CODE[CCP + XPARAMS + 3] := 3;
            IF DATA_EXPECTED THEN
            BEGIN
               IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
               CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
            END
            ELSE CODE[CCP + XPARAMS + 4] := 0;
            IF DUMP_AT_COMPLETION THEN CODE[CCP + XPARAMS + 5] := 1
                                  ELSE CODE[CCP + XPARAMS + 5] := 0;
         END;
      40, "<simplecommand>   -->  <appendcommand> "
      41: "<simplecommand>   -->  <initappendcomma "
         BEGIN
            IF ACTION = 40 THEN CODE[CCP] := APPEND_CMD
                           ELSE CODE[CCP] := INITAPPEND_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
            IF NOOFBYTES.VARIABLE THEN SETBIT(CODE[XVM], 2);
            IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
            CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
            CODE[CCP + XPARAMS + 2] := NOOFBYTES.PARAMETER;
            IF ACTION = 40 THEN "APPEND"
               CODE[CCP + XPARAMS + 3] := 2   "BUFFER NO"
            ELSE                "INITAPPEND"
               CODE[CCP + XPARAMS + 3] := 4;
            CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
            IF PATTERNNO.PARAMETER = 0 THEN
            BEGIN
               FOR I := 1 TO NO_OF_INTEGERS DO
                  CODE[CCP + XPARAMS + 4 + I] := INTEGERS[I];
               CODE[CCP + XPARAMS] := NO_OF_INTEGERS + 4;
            END
            ELSE CODE[CCP + XPARAMS] := 4;
            NO_OF_INTEGERS := 0;
         END;
      42: "<simplecommand>   -->  <consolecommand> "
         BEGIN
            "CODE GENERATED IN 62,63"
         END;
      43: "<simplecommand>   -->  <definecommand> "
         BEGIN
            CODE[CCP] := PATTERN_DEFINE_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 1);
            CODE[CCP + XPARAMS] := NO_OF_INTEGERS + 1;
            CODE[CCP + XPARAMS + 1] := PATTERNNO.PARAMETER;
            FOR I := 1 TO NO_OF_INTEGERS DO
               CODE[CCP + XPARAMS + 1 + I] := INTEGERS[I];
            NO_OF_INTEGERS := 0;
         END;
      44: "<simplecommand>   -->  <dumpcommand> "
         BEGIN
            CODE[CCP] := DUMP_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF BUFFERNO.VARIABLE  THEN SETBIT(CODE[XVM], 1);
            IF STARTADDR.VARIABLE THEN SETBIT(CODE[XVM], 2);
            IF ENDADDR.VARIABLE   THEN SETBIT(CODE[XVM], 3);
            IF PATTERNNO.VARIABLE THEN SETBIT(CODE[XVM], 4);
            CODE[CCP + XPARAMS] := 4;
            CODE[CCP + XPARAMS + 1] := BUFFERNO.PARAMETER;
            CODE[CCP + XPARAMS + 2] := STARTADDR.PARAMETER;
            CODE[CCP + XPARAMS + 3] := ENDADDR.PARAMETER;
            CODE[CCP + XPARAMS + 4] := PATTERNNO.PARAMETER;
         END;
      45: "<simplecommand>   -->  <delaycommand> "
         BEGIN
            CODE[CCP] := DELAY_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF TIME.VARIABLE THEN SETBIT(CODE[XVM], 1);
            CODE[CCP + XPARAMS] := 1;
            CODE[CCP + XPARAMS + 1] := TIME.PARAMETER;
         END;
      46: "<simplecommand>    -->  <cancelcommand> "
         BEGIN
            CODE[CCP] := CANCEL_CMD;
            XVM := CCP + XVARMASK;
            CODE[XVM] := 0;
            IF CRID.VARIABLE THEN SETBIT(CODE[XVM], 1);
            IF OPREF.VARIABLE THEN SETBIT(CODE[XVM], 2);
            CODE[CCP + XPARAMS] := 2;
            CODE[CCP + XPARAMS + 1] := CRID.PARAMETER;
            CODE[CCP + XPARAMS + 2] := OPREF.PARAMETER;
         END;
      47: "<simplecommand>    -->  <listcommand>    "
         BEGIN
            CODE[CCP] := LIST_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 0;
         END;
      48: "<simplecommand>    -->  <waitinitcommand> "
         BEGIN
            CODE[CCP] := WAITINIT_CMD;
            CODE[CCP + XVARMASK] := 0;
            IF TIME.VARIABLE THEN SETBIT(CODE[CCP + XVARMASK], 1);
            CODE[CCP + XPARAMS] := 1;
            CODE[CCP + XPARAMS + 1] := TIME.PARAMETER;
         END;
      49:;"<driverdefinecom   -->  DRIVER = <string> <nl> "
      50:;"<assigncommand>   -->  ASSIGN <cr80adr> <hostno> <nl> "
      51:;"<deassigncommand   -->  DEASSIGN <nl> "
      52:;"<createcommand>   -->  CREATE <protocol> <crid> <speed> <maxpacket> <nl> "
      53:;"<dismantlecomman   -->  DISMANTLE <crid> <nl> "
      54:;"<readcommand>     -->  READ <readparams> <nl> "
      55:;"<initreadcommand   -->  INITREAD <readparams> <nl> "
      56: "<readparams>      -->  <crid> <noofbytes> EXPECT PATTERN <patternno> "
         BEGIN
            DATA_EXPECTED := TRUE;
         END;
      57: "                  -->  <crid> <noofbytes> "
         BEGIN
            DATA_EXPECTED := FALSE;
         END;
      58:;"<appendcommand>   -->  APPEND <appendparams> <nl> "
      59:;"<initappendcomma   -->  INITAPPEND <appendparams> <nl> "
      60:;"<appendparams>    -->  <crid> <noofbytes> PATTERN <patternno> "
      61: "                  -->  <crid> <noofbytes> ( <integers> ) "
         BEGIN
            PATTERNNO.VARIABLE := FALSE;
            PATTERNNO.PARAMETER := 0;
         END;
      62, "<integers>        -->  <integers> <integer> "
      63: "                  -->  <integer> "
         BEGIN
            NO_OF_INTEGERS := SUCC(NO_OF_INTEGERS);
            INTEGERS[NO_OF_INTEGERS] := CONSTANT;
         END;
      64:;"<integer>         -->  <constant> "
      65: "<consolecommand>   -->  CONSOLE IN <nl> "
         BEGIN
            CODE[CCP] := CONSOLE_IN_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 0;
         END;
      66: "                  -->  CONSOLE OUT <nl> "
         BEGIN
            CODE[CCP] := CONSOLE_OUT_CMD;
            CODE[CCP + XVARMASK] := 0;
            CODE[CCP + XPARAMS ] := 0;
         END;
      67:;"<definecommand>   -->  DEFINE PATTERN <patternno> = <pattern> <nl> "
      68: "<dumpcommand>     -->  DUMP BUFFER <bufferno> FROM <startaddr> <nl> "
         BEGIN
            ENDADDR.VARIABLE := FALSE;
            ENDADDR.PARAMETER := MAX_BUFFER_SIZE + 1;
            PATTERNNO.VARIABLE := FALSE;
            PATTERNNO.PARAMETER := 0;
         END;
      69: "<dumpcommand>     -->  DUMP BUFFER <bufferno> FROM <startaddr> TO <endaddr> <nl> "
         BEGIN
            PATTERNNO.VARIABLE := FALSE;
            PATTERNNO.PARAMETER := 0;
         END;
      70: "<dumpcommand>     -->  DUMP PATTERN <patternno> <nl> "
         BEGIN
            STARTADDR.VARIABLE := FALSE;
            STARTADDR.PARAMETER := 0;
            ENDADDR := STARTADDR;
         END;
      71:;"<delaycommand>    -->  DELAY <time> <nl> "
      72:;"<listcommand>     -->  LIST OPERATIONS <nl> "
      73: "<cancelcommand>   -->  CANCEL CRID <crid> <nl> "
         BEGIN
            OPREF.VARIABLE := FALSE;
            OPREF.PARAMETER := 0;
         END;
      74: "<cancelcommand>   -->  CANCEL OPERATION <opref> <nl> "
         BEGIN
            CRID.VARIABLE := FALSE;
            CRID.PARAMETER := 0;
         END;
      75:;"<waitinitcommand> -->  WAITINIT <time> <nl> "
      76: "<cr80adr>         -->  <const_or_var> "
         CR80ADR := ANY;
      77: "<hostno>          -->  <const_or_var> "
         HOSTNO := ANY;
      78: "<protocol>        -->  <const_or_var> "
         PROTOCOL := ANY;
      79: "<crid>            -->  <const_or_var> "
         CRID := ANY;
      80: "<noofbytes>       -->  <const_or_var> "
         NOOFBYTES := ANY;
      81: "<speed>           -->  <const_or_var> "
         SPEED := ANY;
      82: "<maxpacket>       -->  <const_or_var> "
         MAXPACKET := ANY;
      83: "<patternno>       -->  <const_or_var> "
         PATTERNNO := ANY;
      84: "<bufferno>        -->  <const_or_var> "
         BUFFERNO := ANY;
      85: "<startaddr>       -->  <const_or_var> "
         STARTADDR := ANY;
      86: "<endaddr>         -->  <const_or_var>  "
         ENDADDR := ANY;
      87: "<opref>           -->  <const_or_var>  "
         OPREF := ANY;
      88: "<time>            -->  <const_or_var> "
         TIME := ANY;
      89: "<const_or_var>    -->  <identifier> "
         BEGIN
            ANY.VARIABLE := TRUE;
            PARAMNAME := '                ';
            I := 0;
            REPEAT
               I := SUCC(I);
               PARAMNAME[I] := IDENTIFIER.STRING[I - 1];
            UNTIL (I = IDENTIFIER.LENGTH) OR (I = 16);
            I := GET_PARAM_INDEX(PARAMNAME);
            IF I <> UNDECLARED THEN
            BEGIN
               ANY.PARAMETER := I;
            END
            ELSE
            BEGIN
               WRITETEXT('*** UNDECLARED PARAMETER ***(:0:)');
               WRITENL;
               IGNORE_REST_OF_LINE := TRUE;
            END;
         END;
      90: "                  -->  <constant> "
         BEGIN
            ANY.VARIABLE := FALSE;
            ANY.PARAMETER := CONSTANT;
         END;
      91: "<nl>              -->  (:10:) "
         BEGIN
            ACTPARAMETERCOUNT := 0;
            IGNORE_REST_OF_LINE := FALSE;
         END;
      92: "<pattern>         -->  <integers> "
         ;  "DO NOTHING, PATTERN ALREADY IN 'INTEGERS'"
      93: "                  -->  <string> "
         BEGIN
            I := STRING.LENGTH + STRING.LENGTH MOD 2;
            PACK(STRING.STRING[0], INTEGERS[1], I);
            NO_OF_INTEGERS := I DIV 2;
         END;
      94: "<dump_at_completion>   -->  DUMP "
         BEGIN
            DUMP_AT_COMPLETION := TRUE;
         END;
      95: "<dump_at_completion>   -->       "   "empty"
         BEGIN
            DUMP_AT_COMPLETION := FALSE;
         END
      
   END;   " CASE "
END;  " SEMANTICS " «a5»