*DECK DB$STD                                                             STD
          IDENT  DB$STD                                                  STD
          TITLE  DB$STD - SYNTAX TABLE DRIVER                            STD
*#                                                                       STD
* *   DB$STD - SYNTAX TABLE DRIVER               PAGE  1                 STD
* *   J. JAN JANIK                               DATE  11/12/75          STD
*                                                                        STD
* DC  PURPOSE                                                            STD
*     TO CRACK THE SOURCE STREAM AND CALL THE PROPER SEMANTIC ROUTINES   STD
*     BY USING THE SYNTAX TABLES PRODUCED BY *SYNGEN*.                   STD
*                                                                        STD
* DC  ENTRY CONDITIONS                                                   STD
*                                                                        STD
*     FIRST PARAMETER = SEMANTIC ROUTINE SWITCH ADDRESS (DB$SYSW) 
*     DB$SCAN MUST HAVE IDENTIFIED A SOURCE WORD.                        STD
*                                                                        STD
* DC  EXIT CONDITIONS                                                    STD
*                                                                        STD
*     STD IS A CO-ROUTINE AND DOES NOT EXIT.  A SEMANTIC ROUTINE MAY     STD
*     CALL *DB$STDR* TO RETURN TO THE CALLER OF *DB$STD*.                STD
*                                                                        STD
* DC  CALLING ROUTINES                                                   STD
*                                                                        STD
*     DB$DDVR - OPERATOR CONSOLE COMMAND DRIVER (CDCS). 
*     DB$DSCF - OPERATOR COMMAND CONFIRMATION HANDLER (CDCS). 
*     DB$MABT (IN DB$DDIF) - OPERATOR COMMAND ABORT (CDCS). 
*     DB$M10M - MAIN ROUTINE FOR OVERLAY 1,0                             STD
*                                                                        STD
* DC  CALLED ROUTINES                                                    STD
*                                                                        STD
*     DB$SCAN - IDENTIFY NEXT SOURCE WORD                                STD
*     DB$SSCN - READ NEW CARD, THEN IDENTIFY NEXT SOURCE WORD            STD
*     DB$DIAG - ISSUE DIAGNOSTIC MESSAGE                                 STD
*     DB$UPRT - PRINT A STRING                                           STD
*     DB$MABT - ABORT DBMSTRD RUN                                        STD
*     DB$SR** - ALL SEMANTIC ROUTINES ARE CALLED VIA DB$SYSW             STD
*     DB$CDIS - CONVERT BINARY NUMBER TO DISPLAY CODE                    STD
                                                                         STD
* DC  NON-LOCAL VARIABLES                                                STD
                                                                         STD
*     DB$CSYN - SYNTAX SECTION FOR CURRENT WORD                          STD
*     DB$NLNG - LENGTH IN CHARS OF NEXT WORD                             STD
*     DB$NLNW - LENGTH IN WORDS OF NEXT WORD                             STD
*     DB$NTYP - SYNTACTICAL TYPE OF NEXT WORD                            STD
*     DB$NWRD - NEXT WORD                                                STD
*     DB$TFLG - TRACE FLAG, 1 = TRACE ON.                                STD
*     DB$TLIM - LIMIT OF NUMBER OF LINES TO TRACE                        STD
*     DB$TLCN - NUMBER OF LINES ALREADY TRACED                           STD
*                                                                        STD
* DC  DESCRIPTION                                                        STD
*                                                                        STD
*     UPON ENTRY, DB$STD INITIALIZES THE INSTRUCTION AND TRANSFER WORD   STD
*     AND PARCEL POINTERS.  IT ALSO INITIALIZES THE REQUEST STACK        STD
*     POINTER AND SETS THE SECTION ADDRESS, SECTAD, TO THE FIRST SECTION STD
*     CONTROL IS THEN TRANSFERED TO *GETINST*.                           STD
*                                                                        STD
*     GETINST FIRST CHECKS TO SEE IF TRACING IS BEING DONE AND IF SO     STD
*     GENERATES A TRACE LINE.  AT *NOTOUT* THE NEXT INSTRUCTION IS       STD
*     EXTRACTED AND THE INSTRUCTION WORD AND PARCEL POINTERS ADJUSTED.   STD
*     THE OPERATOR PORTION OF THE INSTRUCTION, 4 HIGH-ORDER BITS, ARE    STD
*     USED TO INDEX INTO THE JUMP TABLE, *OPRATOR*.  THE ROUTINES JUMPED STD
*     TO EITHER EXIT TO *GETINST*, CALL A SEMANTIC ROUTINE, OR CALL      STD
*     DB$MABT TO ABORT THE RUN.  A SEMANTIC ROUTINE EXITS TO DB$YES,     STD
*     DB$NO, DB$STDR, OR DB$MABT.  DB$YES AND DB$NO BOTH EXIT TO         STD
*     *GETINST*, SO NO MATTER HOW FAR AROUND THE MULBERRY BUSH WE GO, WE STD
*     EITHER GO TO *GETINST* OR EXIT FROM THE SYNTAX TABLE DRIVER.       STD
*                                                                        STD
*     THE ROUTINES JUMPED TO VIA *OPRATOR* AND WHAT THEY DO ARE          STD
*       DIAGNOS - ISSUE DIAGNOSTIC MESSAGE BY PASSING OPERAND TO DB$DIAG STD
*                 AND THEN GO TO *GETINST*.                              STD
*       DRIVEREQ- REQUEST IS EITHER YES, NO, TEST FOR WORD TYPE, +SUBS   STD
*                 SKIP WORD OR CARD, OR TEST FOR END OF INPUT.  IF +SUBS STD
*                 JUMP TO *LBLCALL* WITH PROPER SECTION POINTER.  IF YES STD
*                 OR NO, POP ADDRESS OFF THE REQUEST STACK, SET UP       STD
*                 POINTERS AND GO TO *GETINST*.  FOR ALL REMAINING       STD
*                 REQUESTS, GO TO *AMBIG*.                               STD
*       ERROP   - ABORT RUN BY JUMPING TO *ABRTRNG*.                     STD
*       KEY     - IF NEXT WORD IS TESTED-FOR KEYWORD CALL DB$SCAN THE    STD
*                 GO TO *GETINST*.  IF NOT GO TO *GETINST*.              STD
*       LBLCALL - TRANSFER TO NEW SECTION.  FIRST PLACE SECTAD PLUS      STD
*                 INSTRUCTION AND TRANSFER WORD AND PARCEL POINTERS      STD
*                 ON THE REQUEST STACK.  THEN GET NEW SECTAD BY ADDING   STD
*                 OPERAND TO *LBLPTRS* AND USE THE RESULT TO EXTRACT     STD
*                 THE SECTION ADDRESS.  JUMP TO *GETINST*.               STD
*       SUBCALL - JUMP TO SEMANTIC ROUTINE USING DB$SYSW AND OPERAND.    STD
*       SUBLBL  - TRANSFER TO SUBLABEL WITHIN THE CURRENT SECTION BY     STD
*                 ADJUSTING INSTRUCTION WORD AND PARCEL POINTER.  JUMP   STD
*                 TO *GETINST*.                                          STD
*       TRANSF  - SET UP NEW TRANSFER WORD AND PARCEL POINTERS.  JUMP    STD
*                 TO *GETINST*.                                          STD
*                                                                        STD
*     *AMBIG* IS JUMPED TO BY DRIVEREQ TO DETERMINE WHICH OF MANY TESTS  STD
*     HAVE BEEN REQUESTED.  +SNC, +SNW, +EOT, AND +EOF ARE HANDLED BY    STD
*     TESTING WHETHER DB$NTYP MATCHES THE REQUESTED TYPE.  OTHER         STD
*     REQUESTS ARE FIRST TESTED FOR A MATCH AND IF NO MATCH ARE TESTED   STD
*     VIA JUMP TABLE *TYPECHK* SINCE SOME REQUESTS ARE SATISFIED BY A    STD
*     RANGE OF DB$NTYP.  A MATCH ON ALL TYPES BUT +SNW AND +SNC JUMP TO  STD
*     DB$YES.  NO MATCHES GO TO OUR OLD FRIEND *GETINST*.                STD
*                                                                        STD
*     DB$YES CAUSES INSTRUCTION AND PARCEL POINTERS TO BE SET TO         STD
*     TRANSFER POINTERS AND THE TRANSFER POINTERS TO BE SET TO ZERO.     STD
*     CONTROL THEN PASSES TO, YOU GUESSED IT, *GETINST*.                 STD
*                                                                        STD
*     DB$NO IS *GETINST*.                                                STD
*#                                                                       STD
          ENTRY  DB$STD,DB$STDR,DB$YES,DB$NO                             STD
          EXT    LBLPTRS,SYNTBLE       SYNGEN PRODUCED EXTERNALS
                                       NOTE - TRACEM IS WEAK EXTERNAL 
          EXT    DB$TFLG,DB$TLIM,DB$TLCN   EXTERNALS USED IN TRACE       STD
          EXT    DB$NLNW,DB$NLNG,DB$NWRD,DB$NXID,DB$NTYP                 STD
          EXT    DB$CSYN     SYNTAX SECTION FOR CURRENT WORD             STD
 DFSTKLIM EQU    64          SPACE ALLOCATED FOR PROCESSOR REQUEST STACK STD
 DFSNW    EQU    13          CODE FOR DB$SCAN SCAN-NEXT-WORD REQUEST.    STD
          TITLE  INITIALIZATION, DB$NO, AND TRACE                        STD
 DB$STDR  JP     *+400000B   ENTRY FOR RETURN FROM SEMANTIC ROUTINES.    STD
 DB$STD   JP     *+400000B   ENTRY FOR STARTING SYNTAX ANALYSIS.         STD
          BX6    X1          LOCATION OF SEMANTIC ROUTINE SWITCH
          MX7    0                                                       STD
          SA6    DB$SYSW
          SA7    INSTWD      INITIALIZE NEXT-INSTRUCTION-WORD-POINTER.   STD
          SX6    1                                                       STD
          SA7    TRANWD      INITIALIZE NEXT-TRANSFER-WORD-POINTER.      STD
          SA6    TRANPAR     INITIALIZE NEXT-TRANSFER-PARCEL-POINTER.    STD
          SX1    LBLPTRS     FETCH POINTER TO FIRST SYNTBLE SECTION      STD
          IX1    X1+X6                                                   STD
          SA1    X1                                                      STD
          SA7    INSTPAR     INITIALIZE NEXT-INSTRUCTION-PARCEL-POINTER. STD
          BX6    X1                                                      STD
          SA7    STKPTR      INITIALIZE PROCESSOR REQUEST STACK LEVEL.   STD
          SA6    SECTAD      SAVE POINTER TO 1ST SYNTBLE SECTION.        STD
          EQ     GETINST     FETCH FIRST SYNTBLE INSTRUCTION.            STD
 DB$NO    JP     *+400000B                                               STD
 GETINST  BSS    0           GET NEXT INSTRUCTION, BUT FIRST CHK TRACE   STD
          SA4    DB$TFLG     CHECK TRACE REQUEST FLAG.                   STD
          ZR   X4,NOTOUT     IF ZERO OR NEGATIVE DO NOT                  STD
          NG   X4,NOTOUT     TRACE.                                      STD
                                                                         STD
          SX5    X4-1                                                    STD
          ZR   X5,TROUT      IF TRACE FLAG = 1 TRACE                     STD
                                                                         STD
          SX7    B0          IF GR 1, RESET FLAG AND                     STD
          SA7    A4          DO NOT TRACE                                STD
          EQ   NOTOUT                                                    STD
                                                                         STD
 TROUT    BSS    0                                                       STD
          SA4    DB$TLIM     GET TRACE LIMIT                             STD
          SA5    DB$TLCN                                                 STD
          IX7    X4-X5                                                   STD
          NZ   X7,TLINE      JUMP IF LIMIT NOT REACHED                   STD
                                                                         STD
          SA7    A5          RESET LINE COUNT FOR NEXT TRACE             STD
          SX7    -1                                                      STD
          SA7    DB$TFLG     SET FLAG NEG. NO TRACEING TILL NEXT SET.    STD
          EQ   NOTOUT                                                    STD
                                                                         STD
 TLINE    BSS    0                                                       STD
          SX7    X5+1                                                    STD
          SA7    A5          BUMP LINE COUNT (DB$TLCN) BY 1              STD
          SA1    INSTWD      FETCH NEXT-INSTRUCTION-WORD POINTER         STD
          SA2    INSTPAR     FETCH NEXT-INSTRUCTION-PARCEL POINTER       STD
          LX1    2           USE THE WORD AND PARCEL PTRS TO OBTAIN      STD
          IX5    X1+X2       AN INDEX INTO TRACEM TABLE.                 STD
          SB3    1                                                       STD
          SX4    =YTRACEM    TRACE ENTRY POINT FROM SYNGEN OPTION T=1.
          MI   X4,NOTOUT     TRACE UNDEFINED
          IX4    X4+X5                                                   STD
          SA4    X4          FETCH APPROPRIATE TRACE MESSAGE.            STD
          BX6    X4                                                      STD
          SA6    TMSG+1      STORE TRACE MSG INTO SKELETON MSG.          STD
          SA3    DB$NLNW                                                 STD
          SA2    DB$NLNG                                                 STD
          SX5    X3-5                                                    STD
          SA4    DB$NWRD     PREP FOR STORING NEXT WORD INTO MSG         STD
          NG   X5,LE4WORDS   MAX OF FOUR WRDS LISTED.                    STD
                                                                         STD
          SX3    4           SET WORD AND CHAR LENGTHS                   STD
          SX2    40          FOR FOUR WRD NEXT WORD.                     STD
 LE4WORDS SB2    X3-1                                                    STD
          SX7    X2+40                                                   STD
          SB4    TMSG+3                                                  STD
          SA7    TLG                                                     STD
* MOVE NEXT SOURCE WORD (UP TO 40 CHARS) TO MESSAGE                      STD
          LE   B2,ALLNEXT    SINGLE WORD                                 STD
                                                                         STD
          SB7    1                                                       STD
 LOOPNEX  BX6    X4                                                      STD
          SA4    A4+B3                                                   STD
          SA6    B4+B7                                                   STD
          SB2    B2-B3                                                   STD
          SB4    B4+B7                                                   STD
          NE   B2,LOOPNEX    NOT DONE YET                                STD
                                                                         STD
 ALLNEXT  BX6    X4                                                      STD
          SA6    B4+B3                                                   STD
          SX7    DB$NXID                                                 STD
          RJ   CONVERT       CONVERT LEXICAL ID TO OCTAL DISPLAY         STD
                                                                         STD
          SA4    TMSG+3                                                  STD
          BX4    X0*X4                                                   STD
          BX6    X4+X6                                                   STD
          SA6    A4          STORE IN NESSAGE                            STD
          SX7    DB$NTYP                                                 STD
          RJ   CONVERT       CONVERT SYNTACTICAL TYPE TO OCTAL DISPLAY   STD
                                                                         STD
          SA4    TMSG+2                                                  STD
          BX4    X0*X4                                                   STD
          BX6    X4+X6                                                   STD
          SA6    A4          STORE IN MESSAGE                            STD
          SA1    PRNTPAR                                                 STD
          RJ   =XDB$UPRT     PRINT THE MESSAGE                           STD
          TITLE  MAIN ROUTINES                                           STD
 NOTOUT   BSS    0                                                       STD
*      GET NEXT INSTRUCTION                                              STD
                                                                         STD
          SA1    INSTWD      FETCH NEXT-INSTRUCTION-WORD POINTER         STD
          SA2    INSTPAR     FETCH NEXT-INSTRUCTION-PARCEL POINTER       STD
          SX3    SYNTBLE                                                 STD
          IX3    X3+X1                                                   STD
          SA3    X3                                                      STD
          BX6    X2                                                      STD
          MX0    15          MASK FOR INSTRUCTION.                       STD
          LX6    4           16 * PARCEL.                                STD
          SB1    X6                                                      STD
          SB7    X2+1        INCREMENT NEXT-INSTRUCTION-PARCEL-POINTER.  STD
          SB2    X2                                                      STD
          SB2    B1-B2       15 * PARCEL                                 STD
          SX2    B7-4                                                    STD
          LX6    X3,B2       LEFT-JUSTIFY PROPER PARCEL OF SYNTBLE WORD. STD
          BX5    X0*X6       ISOLATE INSTRUCTION.                        STD
          NZ   X2,SETPAR     JUMP IF NEXT PARCEL IS IN THIS SYNTBLE WORD STD
                                                                         STD
*  NEXT PARCEL IS IN NEXT SYNTBLE WORD SO ADJUST POINTERS                STD
                                                                         STD
          SB7    B0                                                      STD
          SX6    X1+1                                                    STD
          SA6    A1                                                      STD
 SETPAR   SX7    B7                                                      STD
          MX1    56          MASK FOR SEPARATING OPERATOR AND OPERAND.   STD
          SA7    A2          STORE NEXT-INSTRUCTION-PARCEL-POINTER.      STD
          LX1    56                                                      STD
          BX6    X1*X5       PICK OFF OPERAND.                           STD
          BX2    -X1*X5      PICK OFF OPERATOR.                          STD
          AX6    45                                                      STD
          LX2    4                                                       STD
          SA6    OPERAND     SAVE OPERAND.                               STD
          SB1    X2          SAVE OPERATOR IN B1 FOR USE IN A SWITCH     STD
          JP   B1+OPRATOR    SWITCH TO PROPER OPERATOR ROUTINE           STD
                                                                         STD
                                                                         STD
 OPRATOR  EQ     DRIVEREQ    OPERATOR = 0.                               STD
          EQ     DIAGNOS     OPERATOR = 1.                               STD
          EQ     SUBCALL     OPERATOR = 2.                               STD
          EQ     KEY$        OPERATOR = 3.                               STD
          EQ     KEY         OPERATOR = 4.                               STD
          EQ     LBLCALL     OPERATOR = 5.                               STD
          EQ     ERROP       OPERATOR = 6.                               STD
          EQ     ERROP       OPERATOR = 7.                               STD
          EQ     SUBLBL      OPERATOR = 8.                               STD
          EQ     SUBLBL      OPERATOR = 9.                               STD
          EQ     SUBLBL      OPERATOR = 10.                              STD
          EQ     SUBLBL      OPERATOR = 11.                              STD
          EQ     TRANSF      OPERATOR = 12.                              STD
          EQ     TRANSF      OPERATOR = 13.                              STD
          EQ     TRANSF      OPERATOR = 14.                              STD
          EQ     TRANSF      OPERATOR = 15.                              STD
                                                                         STD
                                                                         STD
                                                                         STD
* INPUT TO THE ROUTINES *DIAGNOS* THRU *TRANSF* IS AS FOLLOWS            STD
*     X2 = OPERATOR, X6 = OPERAND, X7 = NEXT PARCEL POINTER, A1 = INSTWD STD
                                                                         STD
                                                                         STD
 DIAGNOS  BSS    0                 OPERATOR = 1                          STD
* CALL THE DIAGNOSTIC ROUTINE TO ISSUE A MESSAGE.  THEN GO TO NEXT INST. STD
                                                                         STD
          SA1    OPNDADD                                                 STD
          RJ   =XDB$DIAG                                                 STD
                                                                         STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 DRIVEREQ BSS    0           OPERATOR = 0                                STD
* ONE OF MANY DRIVER REQUESTS SUPPLIED BY STD.                           STD
                                                                         STD
          ZR   X5,GETINST    PARCEL OF 0 IS A NOOP                       STD
                                                                         STD
          SX4    X6-3                                                    STD
          ZR   X4,SUBS       OPERAND = 3 IS +SUBS                        STD
                                                                         STD
          PL   X4,AMBIG      MAYBE ONE OF MANY                           STD
                                                                         STD
*  REQUEST IS EITHER YES OR NO.  MUST POP BASE ADDR OFF STACK.           STD
                                                                         STD
          SA1    STKPTR      FETCH PTR TO TOP OF PROCESSOR REQUEST STACK STD
          SB1    X1                                                      STD
          SA3    STDSTK+X1   FETCH TOP OF STACK.                         STD
          GE   B1,OKSTK      JUMP IF STACK NOT EMPTY                     STD
                                                                         STD
          SA1    ABORTUN                                                 STD
          RJ   =XDB$MABT     ABORT RANGE ERROR *STD STK UN*              STD
                                                                         STD
 OKSTK    LX3    20                                                      STD
          MX0    2           MASK FOR PARCEL POINTER.                    STD
          LX4    59                                                      STD
          SX7    X3          ISOLATE BASE ADDRESS OF SYNTBLE SECTION.    STD
          PL   X4,NO         REQUEST IS NO                               STD
                                                                         STD
          LX3    20          POSITION TO YES-RETURN POINTERS.            STD
 NO       LX0    20                                                      STD
          SA7    SECTAD      SAVE BASE ADDRESS OF SECTION TO WHICH       STD
                             CONTROL IS RETURNING.                       STD
          LX3    20          POSITION TO YES OR NO RETURN POINTERS.      STD
          SX6    X3          ISOLATE WORD POINTER.                       STD
          BX7    X3*X0       ISOLATE PARCEL POINTER.                     STD
          SA6    INSTWD      STORE NEXT-INSTRUCTION-WORD-POINTER.        STD
          AX7    18                                                      STD
          SA7    INSTPAR     STORE NEXT-INSTRUCTION-PARCEL-POINTER.      STD
          PL   X4,SETRANS    JUMP IF NO REQUEST                          STD
                                                                         STD
          SX6    B0          0 TRANSFER POINTERS SINCE IT IS YES         STD
          MX7    0                                                       STD
          EQ   STORTRN                                                   STD
                                                                         STD
 SETRANS  LX3    20          FOR NO-RETURN, RESET TRANSFER POINTERS WITH STD
          SX6    X3          STACKED VALUES.                             STD
          BX7    X3*X0                                                   STD
 STORTRN  SA6    TRANWD      STORE NEXT-TRANSFER-WORD-POINTER.           STD
          AX7    18                                                      STD
          SX6    X1-1        POP REQUEST STACK.                          STD
          SA7    TRANPAR     STORE NEXT-TRANSFER-PARCEL-POINTER.         STD
          SA6    STKPTR                                                  STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 ERROP    BSS    0           OPERATOR = 6, 7                             STD
* OPERATOR IS ILLEGAL.  ABORT THE RUN.                                   STD
                                                                         STD
          EQ   ABRTRNG                                                   STD
                                                                         STD
                                                                         STD
 KEY      BSS    0           OPERATOR = 4                                STD
* IF NEXT WORD IS THE SPECIFIED KEYWORD ADVANCE TO NEXT WORD AND GO      STD
* EXECUTE THE NEXT INSTRUCTION.  IF NO MATCH, GO TO NEXT INSTRUCTION.    STD
                                                                         STD
          SA1    DB$NXID     FETCH LEXID OF NEXT SOURCE WORD, AND        STD
          MX0    49          COMPARE 11 LOW-ORDER BITS WITH OPERAND      STD
          BX1    -X0*X1      VALUE.                                      STD
          IX4    X6-X1                                                   STD
          NZ   X4,GETINST    IF SOURCE WORD IS NOT THE SPECIFIC KEYWORD  STD
                             TESTED FOR, THEN GO EXECUTE NEXT SYNTBLE    STD
                             INSTRUCTION.                                STD
          RJ   =XDB$SCAN     IF SOURCE = KEYWORD BEING TESTED FOR, CALL  STD
                             LEXSCAN TO ADVANCE IN SOURCE STREAM AND     STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 KEY$     BSS    0           OPERATOR = 3                                STD
* IF NEXT WORD IS THE SPECIFIED KEYWORD ADVANCE TO NEXT WORD AND JUMP TO STD
* THE NEXT TRANSFER POINT (YES). IF NOT GO TO NEXT INSTRUCTION           STD
                                                                         STD
          SA1    DB$NXID     FETCH LEXID AND COMPARE WITH OPERAND        STD
          MX0    49                                                      STD
          BX1    -X0*X1                                                  STD
          IX4    X6-X1                                                   STD
          NZ   X4,GETINST    JUMP IF NOT THE RIGHT KEYWORD               STD
                                                                         STD
          RJ   =XDB$SCAN     KEYWORD RIGHT, ADVANCE TO NEXT SOURCE WORD  STD
                                                                         STD
          EQ   DB$YES+1                                                  STD
                                                                         STD
                                                                         STD
 LBLCALL  BSS    0           OPERATOR = 5                                STD
* TRANSFER TO NEW LABELED SECTION                                        STD
                                                                         STD
          SA2    STKPTR      FETCH DEPTH OF PROCESSOR REQUEST STACK      STD
          SX3    X2-DFSTKLIM CHECK DEPTH OF STACK AGAINST ALLOCATED SIZE STD
          NZ   X3,STKOK      JUMP IF OK, ROOM ON STACK                   STD
                                                                         STD
          SA1    ABORTOV     ABORT RUN WITH RANGE ERROR                  STD
          RJ   =XDB$MABT     STDSTK OV                                   STD
                                                                         STD
 STKOK    BSS    0                                                       STD
          SX4    X2+1        PUSH DOWN STACK BY INCREMENTING DEPTH-PTR.  STD
          SA5    SECTAD      FETCH POINTER TO BASE OF CURRENT SYNTBLE    STD
                             SECTION.                                    STD
          SA1    A1          FETCH NEXT-INSTRUCTION-WORD-POINTER.        STD
          LX5    2                                                       STD
          SA3    TRANWD      FETCH NEXT-TRANSFER-WORD-POINTER.           STD
          BX5    X5+X7       COMBINE SECTADD WITH NEXT-PARCEL-POINTER.   STD
          SA2    TRANPAR     FETCH NEXT-TRANSFER-PARCEL-POINTER.         STD
          LX5    18                                                      STD
          BX5    X1+X5       INSERT NEXT-INSTRUCTION-WORD POINTER.       STD
          LX2    18          POSITION NEXT-TRANSFER-PARCEL-POINTER.      STD
          BX1    X2+X3                                                   STD
          LX5    20                                                      STD
          IX7    X5+X1       PLACE NEXT-INSTRUCTION AND NEXT-TRANSFER    STD
          SA7    STDSTK+X4   POINTERS ON TOP OF PROCESSOR REQUEST STACK. STD
          SX2    LBLPTRS     USE OPERAND (X6) AS INDEX INTO LBLPTRS      STD
          IX2    X2+X6                                                   STD
          SA2    X2                                                      STD
          BX7    X4                                                      STD
          MX6    0           START OF A NEW LABELED SECTION IS ALWAYS    STD
*                            ON A WORD BOUNDARY, PARCEL 0.               STD
          SA7    STKPTR      STORE NEW DEPTH-POINTER VALUE.              STD
          SA6    INSTPAR     STORE NEW NEXT-INSTRUCTION-PARCEL-POINTER.  STD
          BX7    X2                                                      STD
          SA7    SECTAD      SAVE POINTER TO NEW LABELLED SECTION.       STD
          SA7    INSTWD      STORE NEW NEXT-INSTRUCTIO-WORD-POINTER.     STD
          EQ   GETINST       FETCH NEXT INSTRUCTION                      STD
                                                                         STD
                                                                         STD
 SUBCALL  BSS    0           OPERATOR = 2                                STD
* JUMP TO A SEMANTIC ROUTINE.  X6 CONTAINS THE INDEX OF RTN TO JUMP TO.  STD
                                                                         STD
          SB1    X6                                                      STD
          SB4    3777B                                                   STD
          EQ   B1,B4,ABRTRNG       IF B1 = 3777B SEMANTIC RTN WAS        STD
*                                  UNDEFINED AT SYNGEN TIME. ABORT RUN.  STD
          SA1    DB$SYSW     LOCATION OF SEMANTIC ROUTINE SWITCH
          SB1    X1+B1
          JP  B1             JUMP TO PROPER PLACE IN SWITCH 
                                                                         STD
                                                                         STD
 SUBLBL   BSS    0           OPERATOR = 8, 9, 10 OR 11                   STD
* TRANSFER TO SUBLABEL WITHIN THIS SECTION                               STD
                                                                         STD
          MX0    58          LAST TWO BITS OF OPERATOR (X2) GIVE PARCEL  STD
          SA5    SECTAD      GET BASE ADDRESS OF CURRENT LABELLED SECT.  STD
          BX7    -X0*X2                                                  STD
          SA7    A2          SET NEXT-INSTRUCTION-PARCEL-POINTER.        STD
          IX6    X5+X6                                                   STD
          SA6    A1          SET NEXT-INSTRUCTION-WORD-POINTER.          STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 TRANSF   BSS    0           OPERATOR = 12, 13, 14, OR 15.               STD
* SET UP NEXT FAIL/SUCCESS OR SUBLABEL POINTERS                          STD
                                                                         STD
          MX0    58          LAST TWO BITS OF OPERATOR (X2) GIVE PARCEL  STD
          SA5    SECTAD      GET ADDRESS OF CURRENT SYNTBLE SECTION.     STD
          BX7    -X0*X2                                                  STD
          SA7    TRANPAR     SET NEXT-TRANSFER-PARCEL-POINTER.           STD
          IX6    X6+X5       OPERAND VALUE IS NEXT-TRANSFER-WORD-        STD
          SA6    TRANWD      POINTER VALUE RELATIVE TO BASE OF SECTION.  STD
          EQ   GETINST       FETCH NEXT INSTRUCTION                      STD
          TITLE  SUPPORT ROUTINES AND DB$YES                             STD
* THE ROUTINES *AMBIG* AND *SUBS* ARE JUMPED TO FROM *DRIVEREQ*          STD
                                                                         STD
                                                                         STD
 AMBIG    BSS    0           TEST TO SEE WHAT DRIVER REQ IN SPECS        STD
          SB1    X6-100                                                  STD
          LT   B1,SCANREQ    JUMP TO SEE IF +SNC,+SNW,+EOT, OR +EOF      STD
          SB4    3777B-100                                               STD
          EQ   B1,B4,ABRTRNG       ERROR AT SYNGEN TIME. ABORT RUN       STD
                                                                         STD
* TEST IF DB$NTYP IS INCLUDED IN CLASS OF OPERANDS BEING TESTED FOR. IF  STD
* IT IS ADVANCE TO NEXT SOURCE WORD AND GO TO DBSYES                     STD
                                                                         STD
          SA4    DB$NTYP                                                 STD
          SB2    X4-100                                                  STD
          EQ   B1,B2,EQLTYPE       GO TO YES AFTER ADVANCING.            STD
                                                                         STD
          SB3    12                                                      STD
          GT   B1,B3,ABRTRNG       TABLES DESTROYED, ABORT RUN.          STD
                                                                         STD
          JP   B1+TYPECHK    CHECK IF IN RANGE FOR COMBO CLASSES         STD
                                                                         STD
                                                                         STD
 TYPECHK  BSS    0           GETINST IS CALLED IF NOT A COMBO            STD
          EQ   GETINST       TYPE 100, KEYWORD                           STD
          EQ   GETINST       TYPE 101, NAME                              STD
          EQ   NONNUM        TYPE 102, NON-NUMERIC LITERAL               STD
          EQ   NONNUM        TYPE 103, NON-NUMERIC LITERAL               STD
          EQ   GETINST       TYPE 104, CHAR-MASK                         STD
          EQ   GETINST       TYPE 105, BIT-MASK                          STD
          GT   B2,B1,EQLTYPE TYPE 106, ANY NUMERIC LITERAL               STD
          EQ   GETINST                                                   STD
          EQ   GETINST       TYPE 107, INTEGER                           STD
          EQ   GETINST       TYPE 108, FIXED PT                          STD
          EQ   GETINST       TYPE 109, COMPLEX                           STD
          GT   B2,B1,EQLTYPE TYPE 110, SINGLE OR DOUBLE FLT PT           STD
          EQ   GETINST                                                   STD
          EQ   GETINST       TYPE 111, SINGLE FLT PT                     STD
          EQ   GETINST       TYPE 112, DOUBLE FLT PT                     STD
                                                                         STD
                                                                         STD
 EQLTYPE  RJ   =XDB$SCAN     ADVANCE TO NEXT WORD                        STD
                                                                         STD
          EQ   DB$YES+1                                                  STD
                                                                         STD
                                                                         STD
 NONNUM   LT   B2,B1,GETINST TYPE IS NON-NUMERIC IF BETWEEN 102 - 106    STD
                                                                         STD
          SB3    6                                                       STD
          LT   B2,B3,EQLTYPE                                             STD
                                                                         STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 SCANREQ  SB2    X6-DFSNW                                                STD
          GT   B2,B0,SNCREQ  GET NEXT SOURCE RECORD +SNC                 STD
                                                                         STD
          EQ   B2,B0,SNWREQ  ADVANCE TO NEXT WRD, +SNW                   STD
                                                                         STD
          SA4    DB$NTYP                                                 STD
          BX4    X4-X6                                                   STD
          NZ   X4,GETINST    REQUEST WAS EITHER +EOF OR +EOT AND NEXT    STD
*                            WORD IS NOT WHAT WAS REQUESTED              STD
                                                                         STD
          EQ   DB$YES+1                                                  STD
                                                                         STD
                                                                         STD
 SNWREQ   RJ   =XDB$SCAN     GET NEXT SOURCE WORD                        STD
                                                                         STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
 SNCREQ   RJ   =XDB$SSCN     SKIP TO NEXT SOURCE RECORD                  STD
                                                                         STD
          EQ   GETINST                                                   STD
                                                                         STD
                                                                         STD
                                                                         STD
 SUBS     BSS    0           +SUBS WAS REQUEST. JUMP TO SECTION POINTED  STD
*                            TO BY DB$CSYN                               STD
          SA2    DB$CSYN                                                 STD
          ZR   X2,ABRTRNG    0 IS NOT A VALID INDEX. ABORT THE RUN.      STD
                                                                         STD
          BX6    X2                                                      STD
          EQ   LBLCALL       LBLCALL WILL ACT AS IF CALLED WITH OP = 5   STD
                                                                         STD
                                                                         STD
                                                                         STD
 DB$YES   JP     *+400000B                                               STD
          SA1    TRANWD      FETCH NEXT-TRANSFER-WORD-POINTER.           STD
          SA2    TRANPAR     FETCH NEXT-TRANSFER-PARCEL-POINTER.         STD
          MX6    0                                                       STD
          BX7    X1                                                      STD
          SA6    TRANWD      SET NEXT-TRANSFER-WORD-POINTER TO ZERO.     STD
          SA7    INSTWD      STORE NEW VALUE IN NEXT-INSTRUCTION-WORD.   STD
          SA6    A2          SET NEXT-TRANSFER-PARCEL-POINTER TO ZERO.   STD
          BX7    X2                                                      STD
          SA7    INSTPAR     STORE NEW VALUE IN NEXT-INSTRUCTION-PARCEL. STD
          EQ     GETINST                                                 STD
                                                                         STD
                                                                         STD
                                                                         STD
 ABRTRNG  SA1    ABTSYNT     ABORT RUN WITH A RANGE ERR *STD TBL ER*     STD
          RJ   =XDB$MABT                                                 STD
                                                                         STD
                                                                         STD
                                                                         STD
* CONVERT USES DB$COCB TO CONVERT NUM WHOSE ADDR IS IN X7 TO OCTAL
* DISPLAY CODE, JUSTIFIED WITH 1 BLANK TO THE RIGHT AND 30 BITS OF 0 TO  STD
* THE LEFT IS X6, X0 = 30 1-BITS IN LEFT HALF                            STD
                                                                         STD
 CONVERT  JP     *+400000B                                               STD
          SA7    CDISPAR                                                 STD
          SA1    A7                                                      STD
          RJ   =XDB$COCB
                                                                         STD
          LX6    6                                                       STD
          MX0    30                                                      STD
          BX6    -X0*X6                                                  STD
          EQ   CONVERT                                                   STD
          TITLE  CONSTANTS AND VARIABLES                                 STD
 DB$SYSW  DATA   1S17        LOCATION OF SEMANTIC ROUTINE SWITCH
 ABORTOV  VFD    42/0,18/ABCODE 
          VFD    42/0,18/ABPRMOV
 ABORTUN  VFD    42/0,18/ABCODE 
          VFD    42/0,18/ABPRMUN
 ABTSYNT  VFD    42/0,18/ABCODE 
          VFD    42/0,18/ABPARM 
 CDISPAR  DATA   0                                                       STD
          VFD    42/0,18/TEN
 OPNDADD  VFD    42/0,18/OPERAND   PARAM LIST FOR DB$DIAG 
          VFD    42/0,18/NULL 
          VFD    42/0,18/NULL 
 PRNTPAR  VFD    42/0,18/TMSG      PARAM LIST FOR DB$UPRT 
          VFD    42/0,18/TLG
 INSTPAR  BSS    1           NEXT-INSTRUCTION-PARCEL-POINTER             STD
 INSTWD   BSS    1           NEXT-INSTRUCTION-WORD-POINTER               STD
 OPERAND  BSS    1           VALUE OF CURRENT OPERAND                    STD
 SECTAD   BSS    1           POINTER TO 1ST WORD OF CURRENT SYNTBLE SECT STD
 STKPTR   BSS    1           POINTER TO TOP OF PROCESSOR REQUEST STACK   STD
 TLG      DATA   80          NUMBER CHARS IN TRACE OUTPUT LINE.          STD
 TRANPAR  BSS    1           NEXT-TRANSFER-PARCEL-POINTER                STD
 TRANWD   BSS    1           NEXT-TRANSFER-WORD-POINTER                  STD
 STDSTK   BSS    DFSTKLIM    SPACE FOR PROCESSOR REQUEST STACK           STD
 ABCODE   DATA   8           CODE TO DB$MABT FOR RANGE ERROR ABORT       STD
 ABPARM   DIS    1,STD TBL ER                                            STD
 ABPRMOV  DIS    1,STD STK OV                                            STD
 ABPRMUN  DIS    1,STD STK UN                                            STD
 NULL     DATA   0                                                       STD
 TEN      DATA   10                                                      STD
 TMSG     DIS    4, INSTRUCT=          TYPE=     LXID=                   STD
          DATA   40H                                                     STD
          END                                                            STD
