*COMDECK  FMCOM 
  
CONTROL TRACEBACK;
#  FORM COMMON DEFINITIONS                                             #
#                                                                      #
#  8-BIT SUBROUTINE DEFINITIONS AND POINTERS                           #
#                                                                      #
      DEF RESIDUAL(POINTER) # B<0,24>POINTER #; 
      DEF USED    (POINTER) # B<24,18>POINTER #;
      DEF ADDRESS (POINTER) # B<42,18>POINTER #;
  
      DEF  BPCHAR (POINTER) 
        # B<USED(POINTER),6>BMEMORY[ADDRESS(POINTER)]  #; 
      DEF   PCHAR (POINTER) 
        # C<USED(POINTER)/6>CMEMORY[ADDRESS(POINTER)]  #; 
  
      DEF ADVANCE( PTR )# 
        BEGIN 
        IF RESIDUAL(PTR) NQ 0 
        THEN
          BEGIN 
          PTR = PTR + 6*2**18 - 6*2**36;
          IF USED(PTR) EQ 60
            THEN
              PTR = PTR + 1 - 60*2**18; 
          END 
        END#; 
  
      DEF ALPHA( BCHR ) #((BCHR GQ S"A")AND(BCHR LQ S"Z"))#;
  
      DEF NUMERIC( BCHR ) #((BCHR GQ S"ZERO")AND(BCHR LQ S"NINE"))#;
  
      XREF
        BEGIN 
          ITEM  T8RECRD  I; 
          ITEM  T8INREC  I; 
          ITEM  T8OTREC  I; 
          ITEM  T8COND   I; 
          ITEM  T8STRNG  I; 
          ITEM  T8REL1   I; 
          ITEM  T8I1     I; 
          ITEM  T8W1     I; 
          ITEM  T8T1     I; 
          ITEM  T8M1     I; 
          ITEM  T8REL2   I; 
          ITEM  T8I2     I; 
          ITEM  T8W2     I; 
          ITEM  T8T2     I; 
          ITEM  T8M2     I; 
        END 
  
      DEF  T$RECORD  # UMEMORY[T8RECRD] #; # DIRECT REFERENCING # 
      DEF  T$INREC   # UMEMORY[T8INREC] #;
      DEF  T$OUTREC  # UMEMORY[T8OTREC] #;
      DEF  T$COND    # IMEMORY[T8COND ] #;
      DEF  T$STRING  # CMEMORY[T8STRNG] #;
      DEF  T$REL1    # IMEMORY[T8REL1 ] #;
      DEF  T$I1      # IMEMORY[T8I1   ] #;
      DEF  T$W1      # IMEMORY[T8W1   ] #;
      DEF  T$T1      # IMEMORY[T8T1   ] #;
      DEF  T$M1      # IMEMORY[T8M1   ] #;
      DEF  T$REL2    # IMEMORY[T8REL2 ] #;
      DEF  T$I2      # IMEMORY[T8I2   ] #;
      DEF  T$W2      # IMEMORY[T8W2   ] #;
      DEF  T$T2      # IMEMORY[T8T2   ] #;
      DEF  T$M2      # IMEMORY[T8M2   ] #;
  
      DEF  P$RECORD  #  MEMORY[T8RECRD] #; # PARAMETER REFERENCING #
      DEF  P$INREC   #  MEMORY[T8INREC] #;
      DEF  P$OUTREC  #  MEMORY[T8OTREC] #;
      DEF  P$COND    #  MEMORY[T8COND ] #;
      DEF  P$STRING  #  MEMORY[T8STRNG] #;
      DEF  P$REL1    #  MEMORY[T8REL1 ] #;
      DEF  P$I1      #  MEMORY[T8I1   ] #;
      DEF  P$W1      #  MEMORY[T8W1   ] #;
      DEF  P$T1      #  MEMORY[T8T1   ] #;
      DEF  P$M1      #  MEMORY[T8M1   ] #;
      DEF  P$REL2    #  MEMORY[T8REL2 ] #;
      DEF  P$I2      #  MEMORY[T8I2   ] #;
      DEF  P$W2      #  MEMORY[T8W2   ] #;
      DEF  P$T2      #  MEMORY[T8T2   ] #;
      DEF  P$M2      #  MEMORY[T8M2   ] #;
  
      DEF  T$STRING$MAX  # 80 #; # CHARACTERS # 
      STATUS  CONDITION  REPLACE, NE, LE, LT, GE, GT, EQ; 
#                                                                      #
#  END OF 8-BIT INTERFACE                                              #
#                                                                      #
#                                                                      #
#  CMM/FDL INTERFACE                                                   #
#                                                                      #
      DEF  FWA$SHRINK  # O"4" #;
      DEF  LWA$SHRINK  # O"2" #;
      DEF  LWA$GROW    # O"1" #;
#                                                                      #
#  END OF CMM/FDL INTERFACE                                            #
#                                                                      #
#                                                                      #
#  MISCELLANEOUS DEFINITIONS                                           #
#                                                                      #
      ITEM  I I, J I, K I, L I, M I, N I;  # INDEX TEMPS               #
      ITEM  WHYLE$DUMMY I;                 # DUMMY VAR FOR WHYLE       #
      ITEM  REPEAT$STOP B = FALSE;         # FOR REPEAT-UNTYL CONSTRUCT#
  
      DEF  WHYLE       # FOR WHYLE$DUMMY=WHYLE$DUMMY WHILE #; 
      DEF  FOREVER     # WHYLE TRUE #;
      DEF  REPEAT      # BEGIN WHYLE NOT REPEAT$STOP DO #;
      DEF  UNTYL(COND) # REPEAT$STOP = COND; END REPEAT$STOP = FALSE #; 
      DEF  TO          # STEP 1 UNTIL #;
      DEF  DOWNTO      # STEP -1 UNTIL #; 
      DEF  ELSEIF      # ELSE IF #; 
      DEF  CASE(COND)  # IF COND THEN BEGIN #;
      DEF  ORCASE(COND)# END ELSEIF COND THEN BEGIN #;
      DEF  OTHERWISE   # END ELSE BEGIN #;
      DEF  ESAC        # END #; 
  
      XREF  ARRAY FM$MEMR [1:1] S(1); # NOTE NON-ZERO BASE FOR PASSLOC #
        ITEM
          UMEMORY  U(0),
          IMEMORY  I(0),
          RMEMORY  R(0),
          BMEMORY  B(0,0,60), 
          CMEMORY  C(0,0,240);
  
      DEF  ALLONES     # O"77777 77777 77777 77777"#; 
  
      STATUS CH              # CDC DISPLAY CODE CHARACTER SET          #
        COLON , A     ,  B     , C     , D     , E     , F     , G     ,
        H     , I     ,  J     , K     , L     , M     , N     , O     ,
        P     , Q     ,  R     , S     , T     , U     , V     , W     ,
        X     , Y     ,  Z     , ZERO  , ONE   , TWO   , THREE , FOUR  ,
        FIVE  , SIX   ,  SEVEN , EIGHT , NINE  , PLUS  , MINUS , STAR  ,
        SLASH , LPAREN,  RPAREN, DOLLAR, EQUAL , SPACE , COMMA , POINT ,
        OCTAL , LBRKT ,  RBRKT , PERCT , QUOTE , BREAK , OR    , AND   ,
        APOST , QUERY ,  LT    , GT    , AT    , BACK  , CARET , SEMI  ,
        EOS   ; 
  
      STATUS  LEFT$RIGHT  LEFT, RIGHT;
  
      BASED ARRAY TEXT; 
        ITEM  TXT$ITM  C(0,0,240);
  
      BASED ARRAY  STRING  S(1);
        ITEM
          STRING$PTR  U (0),
          STRING$TEXT C (1,0,240);
  
      BASED ARRAY  WSA;;     # DE-REFERENCING DEFINITIONS              #
      BASED ARRAY  CON; 
        ITEM  CON$PTR  U; 
      BASED ARRAY  EXIT;; 
  
      XREF
        BEGIN 
            ARRAY  FM$IFDB;     # FIT ARRAYS                           #
              ITEM  I$LFN  C(0,0,7);
            ARRAY  FM$LFDB; 
              ITEM  L$LFN  C(0,0,7);
            ARRAY  FM$OWN;
              ITEM  OWN$LFN  C(0,0,7);
  
            ARRAY  FM$COMM S( 5);  # COMMUNICATION AREA                #
              ITEM
                N$FILES    U(0),
                NN$FILES   U(1),
                TRANSFORMG B(2,0,1),
                LFLAGS     U(2,54,6), 
                  L$IBMR   B(2,54), 
                  L$IBMW   B(2,55), 
                  L$QAL    B(2,56), 
                  L$REF    B(2,57), 
                  L$SEQ    B(2,58), 
                  L$PAG    B(2,59), 
                IRL$MAX    U(3),
                IX$$       U(4,6,18), 
                FEX$$      U(4,24,18);
        END 
      STATUS  BGDTYPE  C, X, B, Z;
  
      BASED ARRAY  FDB  S(1) ;  # FILE DATA BLOCK                      #
        ITEM
          LFN      C (0,0,7),   # FILE NAME AND FIT                    #
          FDBWORD  U (0),       # USED TO ZERO THE FDB                 #
          REW      C (35,0,1),  # REWIND FLAG                          #
          POS      I (35,6,12), 
          RMAX     U (35,18,24),
          CON$     U (35,42,18), # POINTER TO CON STRING               #
          CODE     C (36,0,1),
          RECFM    C (36,6,3),
          BLKSIZE  U (36,24,18),
          LRECL    U (36,42,18),
          NOSEC    B (37,0,1),
          MAXFIL   U (37,1,2),   # FLAG FOR MAX/R, MAX/S, MAX/P        #
          FILORG   U (37,3,3),
          LX$$     U (37,6,18),  # $$ MEANS DOUBLE INDIRECT REFERENCE  #
          HRL$$    U (37,24,18), #   THROUGH LOADER ADDRESS TABLE      #
          DCA$$    U (37,42,18),
          CPA$$    I (37,42,18),
          $CON     B (38,0,1),
          $QAL     B (38,1,1),
          $REF     B (38,2,1),
          $SEQ     B (38,3,1),
          $PAG     B (38,4,1),
          $IBM     B (38,5,1),
          CX$$     U (38,6,18), 
          EX$$     U (38,24,18),
          DX$$     U (38,42,18),
          BGD S:BGDTYPE(39,0,6),
          QAL$     U (39,6,18), 
          REF$     U (39,24,18),
          TTL$     U (39,42,18),
          TRANSFORML B(40,0,1),  #TRUE IF TRANSFORMATION THIS FILE# 
          OUTKEY   B (40,1,1),
          NEGKEY   B (40,2,1),
          KEYSTART U (40,6,18), 
          RX$$     U (40,24,18),
          DCT$$    U (40,42,18),
          PAGFMT   C (41,0,1),
          IRL      U (41,6,18), 
          KEY$SIZ  U (41,24,9), 
          TOPSIZE  U (41,33,9), 
          PGL      U (41,42,9), 
          CURPGL   U (41,51,9),  # CURRENT PAGE SIZE                   #
          WSA$     I (42,6,18), 
          XFIL$    I (42,24,18),
          SEQ$     I (42,42,18),
          SEQNEXT  I (43),
          SEQADD   I (44),
          PAGENO   U (45, 0,30),
          RECNO    U (45,30,30),
          POSFIL   U (46,0,2),   # FLAG FOR POS/P, POS/R, POS/S        #
          LAST$FDB$WRD  I (47);  # LAST ENTRY (NOT USED)               #
  
      DEF  FDBSIZE  # 47 #; 
      DEF  FILE$MAX  # 20 #;  # MAXIMUM OUTPUT FILE COUNT              #
  
  
#**   NOTE THAT QAL$CODES AND REF$CODES HAVE THE SAME FORMAT AND
*     'GETITM' IN 'FM$CRACK' DEPENDS ON THIS.  SINCE THESE BASED
*     ARRAYS ARE ALLOCATED AT EXECUTION TIME VIA CMM, THE DIMENSION 
*     INFORMATION IS PRESENT SOLELY TO SET THE LOWER BOUND. 
# 
  
      BASED ARRAY  QAL$CODES [0:1] S(2) ; # ITM STORAGE FOR QAL        #
        ITEM
          QREL     U(0,0,3),
          QT       U(0,3,6),
          QW       U(0,9,6),
          QSTRING  U(0,15,9), 
          QI       U(0,24,18),      # QI[0] = 1 IF SEARCH DISC.        #
          QM       U(0,42,18),      # QM[0] = LOC(Q$TEXT)              #
          QIREL    U(1,0,3),
          QISTRING U(1,3,8),
          QIT$M2   U(1,11,8), 
          QILR$RT  U(1,19,3), 
          QIN      U(1,22,8), 
          QMREL    U(1,30,3), 
          QMSTRING U(1,33,8), 
          QMT$M2   U(1,41,8), 
          QMLR$RT  U(1,49,3), 
          QMN      U(1,52,8); 
  
      BASED ARRAY  Q$TEXT     S(1); # LITERAL STRINGS FROM QAL         #
        ITEM
          QTEXT        C(0,0,240);
  
      BASED ARRAY  QAL$TOKENS [0:1] S(1); # QAL TOKENS IN PREFIX FORM  #
        ITEM
          QTOK         U(0,0,18),   # QTOK[0] = LOC(QAL$CODES)         #
          QCOND        U(0,18,18),  # QCOND[0] = NUMBER OF TOKENS      #
          QPTR         U(0,36,24);  # QPTR[0] = LOC(STRING)            #
  
#     STATUS LIST FOR RELATIVE INDEXING                                #
  
      STATUS QAL$REL PLUS, MINUS, ABS;
  
#     STATUS LIST FOR TOKENS IN QAL$TOKENS                             #
  
      STATUS QLIST LPAR, OR, AND, NOT, TVAL, RPAR, EOS; 
  
  
      DEF  RM$INPUT  # O"11 16 20 25 24 00 00 00 00 00" #; # KEYWORDS  #
      DEF  RM$OUTPUT # O"17 25 24 20 25 24 00 00 00 00" #;
      DEF  RM$DFC    # O" 04 06 03 00 00 00 00 00 00 00 "#; 
      DEF  RM$EFC    # O" 05 06 03 00 00 00 00 00 00 00 "#; 
      DEF  RM$ERL    # O" 05 22 14 00 00 00 00 00 00 00 "#; 
      DEF  RM$NEW    # O"16 05 27 00 00 00 00 00 00 00" #;
      DEF  RM$KL     # O" 13 14 00 00 00 00 00 00 00 00"#;
      DEF  RM$KP     # O" 13 20 00 00 00 00 00 00 00 00"#;
      DEF  RM$ORG    # O" 17 22 07 00 00 00 00 00 00 00"#;
      DEF  RM$RL     # O" 22 14 00 00 00 00 00 00 00 00 " #;
      DEF  RM$MRL     # O"15 22 14 00 00 00 00 00 00 00" #; 
      DEF  RM$FP     # O"06 20 00 00 00 00 00 00 00 00" #;
      DEF  RM$FO     # O"06 17 00 00 00 00 00 00 00 00" #;
      DEF  RM$BT     # O" 02 24 00 00 00 00 00 00 00 00 " #;
      DEF  RM$C      # O" 03 00 00 00 00 00 00 00 00 00 " #;
      DEF  RM$RT     # O" 22 24 00 00 00 00 00 00 00 00 " #;
      DEF  RM$RC     # O" 22 03 00 00 00 00 00 00 00 00 "#; 
      DEF  RM$Z      # O" 32 00 00 00 00 00 00 00 00 00 " #;
      DEF  RM$OF     # O"17 06 00 00 00 00 00 00 00 00" #;
      DEF  RM$CF     # O" 03 06 00 00 00 00 00 00 00 00 " #;
      DEF  RM$OC     # O" 17 03 00 00 00 00 00 00 00 00 " #;
      DEF  RM$ON      # O" 17 16 00 00 00 00 00 00 00 00 " #; 
      DEF  RM$DX     # O"04 30 00 00 00 00 00 00 00 00" #;
      DEF  RM$EX     # O"05 30 00 00 00 00 00 00 00 00" #;
      DEF  RM$LX     # O" 14 30 00 00 00 00 00 00 00 00 " #;
      DEF  RM$HRL    # O" 10 22 14 00 00 00 00 00 00 00 " #;
      DEF  RM$DCT    # O" 04 03 24 00 00 00 00 00 00 00 " #;
      DEF  RM$DCA    # O" 04 03 01 00 00 00 00 00 00 00 " #;
      DEF  RM$CPA    # O" 03 20 01 00 00 00 00 00 00 00 " #;
  
      DEF  FO$SQ  # 0 #;     # FILE ORGANIZATION CODES                 #
      DEF  FO$IS  # 3 #;
      DEF  FO$DA  # 5 #;
      DEF  FO$AK  # 6 #;
  
      DEF  RT$Z   # 3 #;     # RECORD TYPE CODES                       #
  
      DEF  FP$EOS #O"010"#;  # FILE POSITION CODES                     #
      DEF  FP$EOP #O"040"#; 
      DEF  FP$EOI #O"100"#; 
      DEF     EOD #O"150"#;  # ANY END CODE                            #
  
      DEF  OF$N   # O" 16 00 00 00 00 00 00 00 00 00 " #; # OPEN FLAG  #
      DEF  OF$R   # O" 22 00 00 00 00 00 00 00 00 00 " #; 
  
      DEF  OC$OPEN # 1 #;    # OPEN/CLOSE FLAGS                        #
  
      DEF  DFC$ALL # 1 #;    # ERRORS ONLY IN DAYFILE                  #
      DEF  EFC$ALL # 3 #; 
  
      DEF   E$EOS # -1 #;    # XFILE (8-BIT) POSITION CODES            #
      DEF   E$EOP # -2 #; 
      DEF   E$EOI # -3 #; 
  
      DEF   MAX$R # 0 #;     # TYPE OF COUNT FOR MAX=N/R, /S, /P       #
      DEF   MAX$S # 1 #;
      DEF   MAX$P # 2 #;
  
  
      DEF   POS$P # 0 #;      # TYPE OF SKIP FOR POS=N/P, /R, /S       #
      DEF   POS$R # 1 #;
      DEF   POS$S # 2 #;
  
  
#     NAME EQUIVALENCES FOR CLEAN LIBRARY EXTERNALS                    #
  
      DEF     THIS # FM$THIS #; 
      DEF     NEXT # FM$NEXT #; 
      DEF     TNBL # FM$TNBL #; 
      DEF     NNBL # FM$NNBL #; 
      DEF   GETNUM # FM$GTNM #; 
      DEF GETSTRING# FM$GTST #; 
      DEF      MIN # FM$MIN  #; 
      DEF      MAX # FM$MAX  #; 
      DEF      MOD # FM$MOD  #; 
      DEF   MEMORY # FM$MEMR #; 
  
#     END OF COMMON DEFINITIONS                                        #
  
