*DECK SKELGEN 
          IDENT  SKELGEN
          ENTRY  SKELGEN
          B1=1
          SST 
          LIST   F           LIST IF-SKIPPED LINES
          COMMENT  RELOCATABLE AND OVERLAY SKELETON GENERATOR.
 SKELGEN  TITLE  SKELGEN - RELOCATABLE AND OVERLAY SKELETON GENERATOR.
          SPACE  4,10 
*****     SKELGEN - RELOCATABLE AND OVERLAY SKELETON GENERATOR. 
* 
*         C. F. RICHARDS     76/09/18 
*         G. E. LOGG         77/02/29    OVCAP AND DIAG PROCESSING. 
*         C. F. RICHARDS     78/11/14    WEOF AND MULTIPLE (0,0). 
*         D. J. FORTHOFFER   80/06/01    CAPSULES 
* 
*         CONTROL DATA PROPRIETARY PRODUCT. 
*         COPYRIGHT CONTROL DATA CORP. 1977,1978,1979.
          SPACE  4,10 
***            SKELGEN GENERATES A SKELETON FILE THAT LOOKS LIKE A
*         STRING OF RELOCATABLES WITH OVERLAY DIRECTIVES, ETC.
*         BY USING *COPYLM* TO REPLACE THE DUMMY RELOCATABLES 
*         WITH THE FUNCTIONAL ROUTINES, ONE HAS AN INPUT FILE WHICH 
*         CAN BE USED BY LOADER TO CREATE ABSOLUTE OVERLAYS.
          SPACE  4,10 
***       SKELGEN CONTROL CARD FORMAT.
* 
* 
*         SKELGEN,(LFN),(NOLIB).
* 
*              THE FILE NAME *LFN* IS USED TO CONTROL WHICH FILE
*         SKELGEN WRITES THE SKELETON TO.  IF NO FILE NAME IS SPECIFIED 
*         THEN THE FILE *IMAGE* IS USED.  THIS FILE IS REWOUND BEFORE 
*         AND AFTER IT IS USED.  SKELGEN ISSUES A DAYFILE MESSAGE 
*         GIVING THE FILE NAME USED BY SKELGEN. 
* 
*              THE *NOLIB* OPTION IF PRESENT SPECIFIES THAT THE 
*         L-DECKS (DECKS WITH LDSET TABLES) SHOULD CONTAIN NO LOADER
*         *LIB* INFORMATION.  THIS RE-ACTIVATES THE ABILITY TO USE
*         LDSET(LIB1/LIB2/LIB3) AS A CONTROL CARD.  OTHERWISE 
*         SKELGEN WILL BUILD *LDSET* TABLES WHICH CLEAR THE LOCAL 
*         LIBRARY SET AND RESET IT TO THOSE LIBRARIES WHICH ARE 
*         SPECIFIED.  IT IS STILL POSSIBLE TO LOAD ROUTINES 
*         FROM LIBRARIES OTHER THAN THOSE SPECIFIED BY ADDING THE 
*         LIBRARY NAME TO THE GLOBAL LIBRARY SET.  SKELGEN PUTS *LIB* 
*         OR *NOLIB* INTO THE PREFIX TABLES OF THE L-DECKS SO THE 
*         USER CAN DISTINGUISH UNDER WHICH OPTION THE L-DECKS 
*         WERE CREATED. 
          SPACE  4,10 
***       QU DIAGNOSTICS AND HELP TEXT. 
* 
* 
*              SKELGEN ALSO GENERATES ALL DIAGNOSTIC MESSAGES AND 
*         HELP TEXT INFORMATION FOR QU.  THE OVERLAYS QU1000 TO QU1077
*         ARE RESERVED FOR QU DIAGNOSTIC OVERLAYS.  FURTHERMORE THE 
*         INDEX OVERLAY QU0700 IS USED TO FIND THE CORRECT TEXT OVERLAY 
*         TO LOAD.
* 
* 
*              THE INDEX OVERLAY CONSISTS OF INDEX TABLE ENTRIES AS 
*         GIVEN BELOW TERMINATED BY A ZERO WORD.  ALL HELP TEXT 
*         OVERLAYS PRECEDE THE DIAGNOSTIC OVERLAYS.  A NEW OVERLAY IS 
*         STARTED FOR THE FIRST DIAGNOSTIC TEXT SO THAT BOTH HELP AND 
*         DIAGNOSTIC TEXT ARE NOT MIXED IN ONE OVERLAY. 
* 
*         VFD    1/H,23/0,12/L,6/L1,6/L2,12/N 
* 
*         H    = 1 IF THIS IS A HELP TEXT OVERLAY.
*         L    = LENGTH OF A BUFFER THAT WILL HOLD ANY DIAGNOSTIC OR
*                HELP TEXT OVERLAY. 
*         L1   = PRIMARY LEVEL NUMBER OF THIS OVERLAY.
*         L2   = SECONDARY OVERLAY NUMBER FOR THIS OVERLAY. 
*         N    = MAX LEXICAL ID (HELP TEXT OVERLAY) OR DIAGNOSTIC 
*                NUMBER (FOR DIAGNOSTIC AND HELP OVERLAY) WHICH OCCURS
*                IN THIS OVERLAY. 
* 
* 
*              HELP TEXT OVERLAYS CONSIST OF HELP TEXT ENTRIES AS 
*         GIVEN BELOW TERMINATED BY A ZERO WORD.  EACH HELP TEXT ENTRY
*         HAS A HEADER WORD GIVING THE LEXICAL ID AND THE LENGTH OF THE 
*         TEXT THAT FOLLOWS.  THE TEXT MAY BE MADE UP OF MORE THAN ONE
*         ZERO BYTE TERMINATED LINE.
* 
*         VFD    1/1,35/0,12/L,12/N 
*         DATA   C* HELP TEXT LINE 1 *
*         ...    ...
*         DATA   C* HELP TEXT LINE M *
* 
*         L    = LENGTH OF THE TEXT FOLLOWING THIS HEADER WORD. 
*         N    = LEXICAL ID FOR THIS HELP TEXT. 
* 
* 
*              DIAGNOSTIC TEXT OVERLAYS CONSIST OF DIAGNOSTIC TABLE 
*         ENTRIES GIVEN BELOW TERMINATED BY A ZERO WORD.  EACH ENTRY
*         HAS TWO HEADER WORDS.  ONE FOR THE DIAGNOSTIC PORTION AND 
*         ONE FOR THE HELP TEXT PORTION OF THE DIAGNOSTIC.  THE 
*         DIAGNOSTIC PORTION MUST CONSIST OF ONLY ONE ZERO BYTE 
*         TERMINATED LINE.  THE HELP TEXT PORTION MAY CONSIST OF MANY 
*         ZERO BYTE TERMINATED LINES WITH THE ONLY RESTRICTION THAT 
*         THE ENTIRE DIAGNOSTIC ENTRY FITS IN ONE OVERLAY.
* 
*         VFD    1/0,35/0,12/L3,12/N
*         DATA   C* DIAGNOSTIC TEXT * 
*         VFD    1/1,35/0,12/L4,12/N
*         DATA   C* HELP TEXT LINE 1 *
*         ...    ...
*         DATA   C* HELP TEXT LINE M *
* 
*         L3   = LENGTH OF THE DIAGNOSTIC TEXT THAT FOLLOWS.
*         L4   = LENGTH OF THE HELP TEXT PORTION OF THE TEXT THAT 
*                FOLLOWS. 
*         N    = DIAGNOSTIC NUMBER. 
          SPACE  4,10 
**        MACROS DEFINITIONS. 
  
  
*CALL MACRO 
          SPACE  4,10 
**        KEYW - MACRO USED TO BUILD DECISION TABLES. 
* 
*         KEYW   TYPE,ADDR
* 
*         TYPE = TYPE OF TABLE. 
*         ADDR = ADDRESS OF PROCESSING ROUTINE. 
* 
*              TABLES GENERATED BY THIS MACRO ARE OF THE FORM:  
*                12/TYPE,30/0,18/ADDR 
  
          PURGMAC KEYW
  
 KEYW     MACRO  TYPE,ADDR
          VFD    12/TYPE,30/0,18/ADDR 
          ENDM
          TITLE  GLOBAL SYMBOL DEFINITIONS. 
          SPACE  4,10 
**        THE FOLLOWING ARE THE TABLE TYPES USED FOR INTERNAL TABLES. 
  
  
 T.DIAG   EQU    1112B       START OF DIAGNOSTIC TEXT 
 T.END    EQU    7777B       END OF ALL SKELGEN INTERNAL TABLES 
 T.EPT    EQU    0025B       ENTRY POINT TABLE - SAME AS LOADER EPT 
 T.FPRFX  EQU    4444B       FAKE PREFIX TABLE - SKELGEN USE ONLY 
 T.HELP   EQU    1113B       START OF HELP TEXT 
 T.INCL   EQU    3400B       INCLUDE TABLE - SKELGEN USE ONLY 
 T.LDSET  EQU    7000B       LDSET TABLE - SAME AS LOADER LDSET 
 T.LFN    EQU    1115B       LFN TABLE - NEW LFN ONTO WHICH OVLS WRITTEN
 T.LIB    EQU    0010B       LIBRARY TABLE - SAME AS LOADER LIB 
 T.LPRFX  EQU    3333B       L-DECK PREFIX TABLE - SKELGEN USE ONLY 
 T.NOEPT  EQU    0026B       NO-ENTRY POINT TABLE - SAME AS LOADER NOEPT
 T.NULL   EQU    2222B       NULL TABLE - TO BE IGNORED 
 T.OMIT   EQU    0020B       OMIT TABLE - SAME AS LOADER OMIT 
 T.MAP    EQU    0011B       MAP TABLE - SAME AS LOADER MAP 
 T.OVL    EQU    1111B       OVERLAY TABLE - SKELGEN USE ONLY 
 T.PRST   EQU    0012B       PRESET TABLE - SAME AS LOADER PRESET 
 T.SUBST  EQU    0017B       SUBSTITUTE TABLE - SAME AS LOADER SUBST
 T.TSUBST EQU    5555B       TSUBST TABLE - SKELGEN USE ONLY
 T.USE    EQU    0016B       USE TABLE - SAME AS LOADER USE 
 T.USEP   EQU    0015B       USEP TABLE - SAME AS LOADER USEP 
 T.WEOF   EQU    1114B       WEOF TABLE - WRITE EOF ON SKELETON 
          SPACE  4,10 
**        OTHER GLOBAL FLAGS AND SYMBOLS. 
  
  
  
 BYTE     EQU    12D         12 BIT BYTE
 CHAR     EQU    6           6 BIT CHAR 
 DN       MICRO  1,,**       CURRENT DIAGNOSTIC NUMBER
 IMBUFFLG EQU    1001B       LENGTH OF BUFFER FOR FET *IMAGE* 
 IO       SET    0700B       INDEX OVERLAY NUMBER 
 LIB.ACT  SET    0           INITIALLY NO LIB MACRO ACTIVE
 MAXTRAP  EQU    32D         MAX NUMBER OF TRAPS IN AN OVERLAY
 NO       SET    0           CURRENT NUMBER OF NON-DIAGNOSTIC OVERLAYS
 OVL.ACT  SET    0           INITIALLY NO OVLAY MACROS ACTIVE 
 PRST.ACT SET    0           INITIALLY NO PRESET MACRO ACTIVE 
                                                                        004100
                                                                        004110
          LIST   X           LIST THE CTEXT OF COMSOVL                  004120
          CTEXT  COMSOVL - SYMBOLS DESCRIBING QU OVERLAYS.              004130
***              THE FOLLOWING SYMBOLS DEFINE THE NUMBER AND SIZE OF    004140
*         QU OVERLAYS.  THESE SYMBOLS ARE USED TO CONTROL THE SIZE OF   004150
*         BUFFERS ALLOCATED FOR THE DIAGNOSTIC/HELP OVERLAYS AND THE    004160
*         DIAGNOSTIC INDEX OVERLAY.  THESE SYMBOLS ALSO ARE USED TO     004170
*         DEFINE THE LENGTH OF THE FOL DIRECTORY IN THE (0,0) OVERLAY   004180
*         HEADER.                                                       004190
                                                                        004200
                                                                        004210
 ND       EQU    01B         MAX NUMBER OF DIAG OVERLAYS (.LE. 100B)    004220
 NN       EQU    20B         MAXIMUM NUMBER OF NON (0,0) OVERLAYS/OVCAPS004230
 OL       EQU    400B        MAX LENGTH OF EACH DIAGNOSTIC OVERLAY      004240
          ENDX                                                          004250
          LIST   -X          TURN OFF LISTING OF TEXT DECKS             004260
          SPACE  4,10 
**        FETS AND BUFFERS. 
  
  
 IMAGE    FILEB  IMBUFF,IMBUFFLG  FET FOR SKELETON FILE 
  
  
          USE    // 
 IMBUFF   BSS    IMBUFFLG    IMAGE FILE BUFFER
 IB       BSS    ND+1        DIAGNOSTIC INDEX BUFFER
          USE    *
          SPACE  4,10 
**        GLOBAL DEFINITIONS. 
  
  
 CI       CON    0           CURRENT ENTRY IN DIAGNOSTIC INDEX BUFFER 
 CL       CON    0           CURRENT OVERLAY LENGTH 
 CO       CON    1000B       CURRENT DIAGNOSTIC OVERLAY NUMBER
 CURTBL   VFD    60/TBLBEGIN CURRENT SKELGEN TABLE FOR MAIN LOOP
 DN       CON    0           LAST DIAGNOSTIC NUMBER IN OVERLAY
 LDSETPTR DATA   0           POINTER TO LDSET TBL IN IMAGE BUFFER 
 NOLIB    CON    0           NZ MEANS INHIBIT LIB ENTRIES IN L-DECKS
 TBLPTR   DATA   0           CURRENT TBL FOR LPRFX LOOP 
 TRAPTBL  BSS    0           TABLE OF TRAP NAMES FOR AN OVERLAY 
          DUP    MAXTRAP,1   *MAXTRAP* NAMES POSSIBLE FOR EACH OVERLAY
          DATA   -1          -1 INDICATES UNUSED ENTRY
          DATA   0           0 INDICATES END OF TABLE 
          SPACE  4,10 
****      DAYFILE MESSAGES ISSUED BY SKELGEN. 
  
  
 INFM1    DATA   C* GENERATING SKELETON ON LFN - IMAGE* 
 INFM2    DATA   C* SKELGEN COMPLETE.*
 INFM3    DATA   C* OVERLAYS WILL BE WRITTEN TO -.......* 
 ERRABT   DATA   C* SKELGEN ABORTED.* 
 ERRM1    DATA   C* UNKNOWN TABLE IN SKELGEN INPUT.*
 ERRM2    DATA   C* TRAP TABLE OVERFLOW.* 
 ERRM3    DATA   C* ILLEGAL CONTROL CARD OPTION -.......* 
 ERRM4    DATA   C* TOO MANY DIAGNOSTIC OVERLAYS.*
****
          SPACE  4,10 
**        LOADER TABLES FOR DUMMY PROGRAMS. 
* 
*              SKELGEN GENERATES TWO TYPES OF RELOCATABLE PROGRAMS.  ONE
*         TYPE IS GENERATED SO THAT THE UTILITY *COPYL* CAN REPLACE 
*         THE DUMMY RELOCATABLE WITH THE REAL THING.  THIS RELOCATABLE
*         CONSISTS OF JUST A PREFIX TABLE AND A *PIDL* TABLE.  THE
*         SECOND TYPE OF PROGRAM IS USED FOR GENERATING THE DIAGNOSTIC
*         AND HELP TEXT PROGRAMS.  THIS RELOCATABLE CONSISTS OF THE 
*         PREFIX TABLE, *PIDL* TABLE, *XFER* TABLE AND THE *ENTR* 
*         TABLE.  SKELGEN WILL LATER ADD THE APPROPRIATE *TEXT* TABLES
*         FOR A COMPLETE BINARY PROGRAM.
  
  
 LPRFX    VFD    12/7700B,12/16B,36/0            PRFX 
 N1       DATA   0L*NAME* 
 DATE     DATA   L*DATE*
 TIME     DATA   L*TIME*
          DATA   10H
          DATA   30HSKELGEN2.1
 LIB      DATA   10HLIB 
          BSSZ   6
          VFD    12/3400B,12/1,36/0              PIDL 
 N2       DATA   0L*NAME* 
 LPRFXLG  EQU    *-LPRFX     TOTAL LENGTH OF DUMMY PROGRAM
          VFD    12/7000B,12/1,36/0              LDSET
          VFD    12/0011B,29/0,18/0,1/1          NO MAP 
          VFD    12/3600B,12/2,36/0              ENTR 
 N3       DATA   L*NAME*
          VFD    42/1,18/0
          VFD    12/4600B,12/1,36/0              XFER 
 N4       DATA   L*NAME*
 LPRG     EQU    *-LPRFX     TOTAL LENGTH OF EXECUTABLE PROGRAM TABLES
 SKELGEN  TITLE  SKELGEN MAIN LOOP. 
**        MAIN LOOP OF SKELGEN. 
  
  
 SKELGEN  RJ     INIT        INITIALIZE SKELGEN AND CRACK CONTROL CARD
          SA1    CURTBL      (X1) = FWA OF TABLES TO SCAN 
          SA1    X1          (X1) = HEADER WORD OF FIRST TABLE
 SKELGEN2 MX0    BYTE        (X0) = MASK FOR BYTE 0 (TABLE TYPE)
          BX3    X0*X1       (X3) = TYPE OF THIS NEW TABLE
          SA2    D.TBL1      (X2) = FIRST ENTRY OF DECISION TBL 1 
 SKELGEN3 ZR     X2,ERR01    IF END OF DECISION TABLE 1 
          SB2    X2          PROCESSING ADDRESS FOR THIS TABLE TYPE 
          BX2    X0*X2       (X2) = TYPE CODE FROM DEC. TBL.
          BX2    X2-X3       (X2) = DIFF BETWEEN TWO TYPE CODES 
          ZR     X2,SKELGEN4 IF TYPE CODES ARE THE SAME 
          SA2    A2+1        (X2) = NEXT ENTRY OF DECISION TBL 1
          EQ     SKELGEN3 
  
 SKELGEN4 JP     B2          TRANSFER TO ROUTINE TO PROCESS THIS TABLE
          SPACE  4,10 
**        TABLE PROCESSING ROUTINES RETURN HERE.
  
  
 SKELGEN1 SA1    CURTBL      (X1) = FWA OF TABLE JUST SCANNED 
          SA1    X1          (X1) = HEADER WORD OF TABLE SCANNED
          SB3    X1          (B3) = LENGTH OF SCANNED TABLE 
          SA1    A1+B3       (X1) = HEADER OF NEXT TABLE
          SX6    A1          (X6) = FWA OF TABLE TO SCAN
          SA6    CURTBL      NEW CURRENT TABLE
          EQ     SKELGEN2 
          SPACE  4,10 
**        DECISION TABLE FOR PROCESSING SKELGEN TABLES. 
  
  
 D.TBL1   BSS    0                 DECISION TABLE 1 - MAIN JUMP TABLE 
          KEYW   T.OVL,P=OVL       PROCESS OVERLAY TABLE
          KEYW   T.HELP,P=HELP     PROCESS HELP AND DIAGNOSTIC TEXT 
          KEYW   T.LPRFX,P=LPRFX   PROCESS THE L-DECK TABLES
          KEYW   T.FPRFX,P=FPRFX   PROCESS THE FAKE PREFIX TABLE
          KEYW   T.INCL,P=INCL     PROCESS THE INCLUDE TABLE
          KEYW   T.END,P=END       END OF TABLE PROCESSING
          KEYW   T.LFN,P=LFN PROCESS NEW OVERLAY LFN
          KEYW   T.WEOF,P=WEOF     PROCESS THE WRITING OF AN EOF
          KEYW   T.NULL,SKELGEN1   IGNORE A NULL TABLE
          DATA   0                 END OF DECISION TABLE 1
          TITLE  PROCESSING ROUTINES FOR SKELGEN INTERNAL TABLES. 
 P=END    SPACE  4,8
**        P=END - PROCESS END OF TABLES.
* 
*         ENTRY  NONE 
* 
*         EXIT   PROGRAM TERMINATED NORMALLY. 
*         EXIT   IMAGE REWOUND
* 
*         CALLS  SYS= 
  
  
 P=END    REWIND IMAGE,RECALL 
          MESSAGE INFM2,,RECALL 
          ENDRUN
 P=FPRFX  SPACE  4,8
**        P=FPRFX - PROCESS FAKE PRFX TABLE.
* 
*              THIS ROUTINE WILL WRITE A FAKE PREFIX TABLE FOR THE
*         NAMED ROUTINE.  IF PRESENT, AN INCLUDE TABLE IN THIS OVERLAY
*         FOR THE SAME ROUTINE WILL BE CHANGED TO TYPE T.NULL.
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  CIO= 
  
  
 P=FPRFX  =A5    A1+1        (X5) = NAME FROM THE FPRFX TABLE 
          MX0    BYTE 
          SA2    A1          (A2) = FWA OF THIS TABLE 
  
*         NULLIFY AN *INCL* TABLE OF SAME NAME AS THE OVERLAY.
  
 P=FPRFX1 SB2    X2          (B2) = LENGTH OF THE TABLE 
          ZR     B2,ERR01    IF NO LENGTH, TABLE ERROR
          SA2    A2+B2       (X2) = HEADER OF NEXT TABLE
          BX4    X0*X2       (X4) = TYPE CODE OF THIS TABLE 
          LX4    BYTE        (X4) = RIGHT JUSTIFIED TYPE CODE 
          SX3    X4-T.INCL
          ZR     X3,P=FPRFX2 IF TYPE INCL 
          SX3    X4-T.OVL 
          ZR     X3,P=FPRFX3 IF TYPE OVL
          SX3    X4-T.FPRFX 
          ZR     X3,P=FPRFX3 IF TYPE FPRFX, DONE SEARCH 
          SX3    X4-T.END 
          NZ     X3,P=FPRFX1 IF NOT TYPE END
          EQ     P=FPRFX3    PROCESS THE FPRFX TABLE
  
*         NULLIFY AN *INCL* TABLE FOR DUPLICATE ENTRIES.
  
 P=FPRFX2 SA3    A2+1        (X3) = NAME FROM FOUND INCL TABLE
          BX3    X5-X3
          NZ     X3,P=FPRFX1 IF NAMES DONT MATCH
          SB6    A2          (B6) = FWA OF INCL TABLE TO NULL 
          RJ     NULLT       NULL A TABLE 
 P=FPRFX3 BX6    X5 
          SA6    N1          SAVE NAME IN LOADER TABLES 
          SA6    N2 
          WRITEW IMAGE,LPRFX,LPRFXLG
          WRITER IMAGE,RCL
          EQ     SKELGEN1    BACK TO MAIN LOOP
 P=HELP   SPACE  4,10 
**        P=HELP - PROCESS HELP TEXT AND DIAGNOSTIC OVERLAYS. 
* 
*              THE DIAGNOSTIC OVER LAYS ARE WRITTEN TO THE IMAGE
*         SKELETON FILE BY FIRST WRITING ALL THE HELP TEXT OVERLAYS,
*         FOLLOWED BY THE DIAGNOSTIC OVERLAYS AND COMPLETED BY
*         WRITING AN INDEX OVERLAY FOR THE DIAGNOSTIC PROCESSOR.
* 
*         ENTRY  NONE 
* 
*         EXIT   TO MAIN LOOP (SKELGEN2). 
* 
*         CALLS  SDO, TXT, CIO= 
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6, 7 
*                B - 2, 3, 4, 5, 6, 7 
*                A - 1, 2, 3, 4, 5, 6, 7
  
  
 P=HELP   =X1    1
          =X2    0
          RJ     SDO         START DIAGNOSTIC OVERLAY 
 P=HELP1  SA4    CURTBL 
          SA1    X4 
          MX3    BYTE 
          BX2    X3*X1
          SB3    X1 
          LX2    12 
          SX7    X4+B3       NEW *CURTBL* POINTER 
          SX3    X2-T.HELP
          NZ     X3,P=HELP3  IF NOT A HELP TEXT ENTRY 
          SX0    X1-1        LENGTH OF TEXT TO BE PUT INTO OVERLAY
          =X5    A1+1        STARTING ADDRESS OF TEXT 
          SA2    CL          CURRENT OVERLAY LENGTH 
          IX6    X2+X0
          SX3    X6-OL
          PL     X3,P=HELP2  IF NOT ENOUGH ROOM IN THIS OVERLAY 
          SA6    A2          RESET NEW LWA+1 OF TEXT IN OVERLAY 
          SA7    A4          UPDATE *CURTBL*
          SA3    X5 
          MX7    -12
          BX7    -X7*X3 
          SA7    DN          SAVE DIAGNOSTIC NUMBER 
          RJ     TXT         ADD TEXT BLOCK TO PROGRAM
          EQ     P=HELP1
  
 P=HELP2  =X1    1
          =X2    1
          RJ     SDO         START DIAGNOSTIC OVERLAY 
          EQ     P=HELP1     START NEXT HELP OVERLAY
  
 P=HELP3  SX1    B0 
          =X2    1
          RJ     SDO         START DIAGNOSTIC OVERLAY 
 P=HELP4  SA4    CURTBL 
          SA1    X4 
          MX3    BYTE 
          BX2    X3*X1
          SB3    X1 
          LX2    12 
          SX7    X4+B3       NEW *CURTBL* POINTER 
          SX3    X2-T.DIAG
          NZ     X3,P=HELP5  IF NOT A DIAGNOSTIC OVERLAY
          SX0    X1-1        LENGTH OF TEXT TO BE PUT INTO OVERLAY
          =X5    A1+1        STARTING ADDRESS OF TEXT 
          SA2    CL          FWA OF TEXT IN OVERLAY 
          IX6    X0+X2
          SX3    X6-OL
          PL     X3,P=HELP3  IF NOT ENOUGH ROOM IN THE OVERLAY
          SA6    A2          SET NEW FWA OF TEXT IN OVERLAY 
          SA7    A4          UPDATE *CURTBL*
          SA3    X5 
          MX7    -12
          BX7    -X7*X3 
          SA7    DN          SAVE DIAGNOSTIC NUMBER 
          RJ     TXT         ADD TEXT BLOCK TO PROGRAM
          EQ     P=HELP4
  
 P=HELP5  SX6    IO 
          SA6    CO          SET CURRENT OVERLAY TO INDEX OVERLAY 
          =X2    1
          RJ     SDO         START DIAGNOSTIC OVERLAY 
          SX7    B0          ZERO THE INDEX ENTRY FOR THIS OVERLAY
          SA1    CI 
          SX5    IB          FWA OF TEXT TO BE WRITTEN OUT
          SA7    X1+IB-1     WRITE A ZERO WORD AT END OF OVERLAY
          SX2    B0          FWA OF TEXT IN OVERLAY 
          SX0    X1          LENGTH OF TEXT TO BE WRITTEN 
          RJ     TXT         WRITE TEXT BLOCK TO PROGRAM
          WRITER IMAGE,RECALL 
          SA1    CURTBL 
          SA1    X1          (X1) = NEXT TABLE HEADER WORD
          EQ     SKELGEN2    RETURN TO MAIN LOOP
 P=INCL   SPACE  4,8
**        P=INCL - PROCESS *INCL* ENTRY.
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  CIO=, MOVE 
  
  
 P=INCL   SA5    A1+1        (X5) = NAME OF ROUTINE TO INCLUDE
          BX6    X5 
          SA6    N1          SAVE NAME IN LOADER TABLES 
          SA6    N2 
          WRITEW IMAGE,LPRFX,LPRFXLG
          WRITER IMAGE,RCL
          EQ     SKELGEN1    BACK TO MAIN LOOP
 P=LFN    SPACE  4,10 
**        P=LFN - WARN OF NEW OVERLAY LFN 
* 
*              THIS SECTION ISSUES A MESSAGE TO THE DAYFILE TO RECORD 
*         THE NEW OVERLAY GENERATION LFN. THE NAME OF THE (0,0) 
*         OVERLAY IS THUS RESTRICTED TO A LEGAL LFN. SKELGEN PERFORMS NO
*         VALIDITY CHECK ON THE LFN.
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  MESSAGE
  
  
 P=LFN    SA5    A1+1        (X5) = NEW OVERLAY GENERATION LFN. 
          BX6    X5 
          SA6    INFM3+3     INSERT LFN IN INFORMATIVE MESSAGE 3
          MESSAGE INFM3,,RECALL 
          EQ     SKELGEN1    BACK TO MAIN LOOP
 P=LPRFX  SPACE  4,14 
**        P=LPRFX - PROCESS THE LABEL/LDSET PREFIX TABLE. 
* 
*              THIS SECTION HANDLES THE NON-TRIVIAL SKELGEN FUNCTIONS.
*         THE LDSET OPTIONS ARE ADDED ON TO A MODEL MINI-PRFX TABLE.
*         THE SKELGEN TABLES FOR THE CURRENT OVERLAY ARE SCANNED AND
*         THE OPTIONS FOR IT ARE CONSOLIDATED. THIS WILL BE THE ONLY
*         SET OF LDSET TABLES GENERATED BY SKELGEN FOR THIS OVERLAY.
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  CIO=, TRAP, MOV, ADDWRDS, NULLT
* 
*         USES   ALL
  
  
 P=LPRFX  SA5    A1+1        (X5) = NAME OF L-ROUTINE 
          MX7    42 
          BX7    X7*X5       SET LENGTH = 0 AND DELETE EXTRA CHARACTERS 
          SA7    N1          SAVE NAME IN LOADER TABLES 
          SA7    N2 
          SA2    IMAGE+1     (X2) = FWA OF IMAGE BUFFER 
          MOVE   LPRFX,LPRFXLG,X2 
          SX6    X2 
          SA6    IMAGE+3     RESET OUT POINTER
          SX6    X6+LPRFXLG+1      (X6) = LWA+1 OF LPRFX AND LDSET
          SA6    IMAGE+2     IN POINTER = LWA+1 OF TBLS IN BUFFER 
          SX7    T.LDSET
          LX7    4*BYTE      (X7) = ZERO LENGTH LDSET HEADER
          SA7    X6-1        (A7) = LWA+1 OF LPRFX IN BUFFER
          SX7    A7          (X7) = ADDR OF LDSET HEADER
          SA7    LDSETPTR    SAVE LOC OF LDSET TBL IN BUFFER
          SA1    CURTBL 
          BX6    X1 
          SA6    TBLPTR      (X6) = FWA OF TABLES AT START OF RTN 
          RJ     TSUBST      PROCESS TEMP SUBST TABLES
 P=LPRFX1 SA1    TBLPTR 
          SA1    X1          (A1) = FWA OF CURRENT SKELGEN TBL
          SB2    X1          (B2) = LENGTH OF THIS SKELGEN TBL
          SA1    A1+B2       (A1) = FWA OF NEXT SKELGEN TBL 
          SX6    A1 
          SA6    TBLPTR      UPDATE CURRENT TBL FOR LPRFX PROCESS.
          MX0    BYTE 
          BX2    X0*X1       (X2) = TABLE TYPE
          SA3    D.TBL2      (A3) = FWA OF DECISION TABLE 2 
 P=LPRFX2 SB3    X3          (B3) = TRANSFER ADDR FOR THIS TYPE 
          ZR     X3,ERR01    IF TABLE TYPE NOT IN LIST
          BX3    X0*X3
          BX4    X3-X2       (X4) = DIFF BETWEEN TYPES
          SA3    A3+1 
          NZ     X4,P=LPRFX2 IF NOT THE RIGHT TYPE
          JP     B3          TRANSFER TO PROCESS THIS TYPE TABLE
  
 P=LPRFX3 BX6    X2          (X6) = TABLE TYPE
          SA2    IMAGE+2
          SA6    X2          (X6) = ZERO LENGTH LOADER TABLE ENTRY
          SA5    A6          (A5) = ADDR OF  LOADER TABLE HEADER
          SA3    LDSETPTR    (X3) = ADDR OF LDSET TBL 
          SA3    X3          (X3) = LDSET TBL HEADER
          MX7    1
          LX7    1-2*BYTE    (X7) = WC POSITIONED 1 
          IX7    X3+X7       (X7) = LDSET TBL HEADER W/ INCR WC 
          SA7    A3 
          SX7    X2+1 
          SA7    A2          UPDATE IN POINTER
 P=LPRFX4 SA2    A1 
          SA1    A5          (A5) = ADDR OF  LOADER TABLE HEADER
          RJ     ADDWRDS     ADD WORDS TO LOADER TABLE
          SA2    A2 
          SB6    A2 
          BX2    X0*X2
          LX2    60-4*BYTE   (X2) = RIGHT JUSTIFIED TABLE TYPE
          RJ     NULLT       NULL A TABLE 
          RJ     FINDT       FIND NEXT TABLE OF GIVEN TYPE
          NZ     X3,P=LPRFX1 IF NO MORE TABLES OF THIS TYPE 
          EQ     P=LPRFX4 
  
*         HERE TO TRANSFER THE ONE LIB TABLE FOR THIS OVERLAY 
  
 P=LPRFX5 SA2    NOLIB       (X2) = 0 IF SHOULD NOT DO LIB TABLES 
          SA5    A1          (A5) = FWA OF LIB TABLE
          NZ     X2,P=LPRFX6 IF SHOULD NOT PROCESS LIB TABLE
          SX2    X1          (X2) = COUNT OF WORDS IN LIB TBLS
          SA3    IMAGE+2     (X3) = LWA+1 OF TBLS IN BUFFER 
          IX6    X3+X2       (X6) = LWA+1 OF TBLS AFTER MOVE
          SA6    A3          UPDATE IN PTR
          MOVE   A1,X2,X3    MOVE TABLE TO BUFFER 
          SA1    X3          (X1) = TBL HEADER OF EMPTY LIB TBL 
          MX0    BYTE 
          BX6    X0*X1       (X6) = EMPTY LIB TBL W/O SKELGEN TBL LG
          SA6    A1          REPLACE WITH TBL HEADER W/O TBL LG 
 P=LPRFX9 LX2    3*BYTE      WORD COUNT POSITIONED FOR WC FIELD 
          SA1    LDSETPTR    (X1) = ADDRESS OF LDSET TBL HEADER 
          SA1    X1          (X1) = LDSET TBL HEADER
          IX6    X1+X2       (X6) = LDSET TBL HDR W/ NEW WC 
          SA6    A1 
 P=LPRFX6 SB6    A5          (B6) = FWA OF LIB TABLE
          RJ     NULLT       NULL THE LIB TABLE 
          EQ     P=LPRFX1    GO PROCESS NEXT L-DECK TABLE 
  
 P=LPRFX7 WRITER IMAGE,RECALL      WRITE THE TABLE
          EQ     SKELGEN1    BACK TO MAIN LOOP
  
 P=LPRFX8 SA5    A1          SAVE ADDRESS OF LOADER TABLE HEADER
          SX2    X1-1        LENGTH OF ACTUAL LOADER TABLE
          SA3    IMAGE+2
          IX6    X2+X3
          SA6    A3          UPDATE LENGTH OF PROGRAM IN BUFFER 
          MOVE   A1+1,X2,X3  MOVE TABLES INTO BUFFER
          EQ     P=LPRFX9 
          SPACE  4,10 
**        DECISION TABLE FOR *LDSET* PROCESSING.
  
  
 D.TBL2   BSS    0                 DECISION TABLE 2 - LDSET PROCESSING
          KEYW   T.OVL,P=LPRFX7    OVERLAY TABLE CONCLUDES L-DECK PROCES
          KEYW   T.FPRFX,P=LPRFX7  FPRFX TABLE CONCLUDES L-DECK PROCESS 
          KEYW   T.HELP,P=LPRFX7   IF START OF DIAGNOSTIC AND HELP TEXT 
          KEYW   T.END,P=LPRFX7    END OF TABLES CONCLUDE L-DECK PROCESS
          KEYW   T.LFN,P=LPRFX7    LFN TABLE CONCLUDES L-DECK PROCESS 
          KEYW   T.EPT,P=LPRFX3    PROCESS AN ENTRY TABLE 
          KEYW   T.NULL,P=LPRFX1   IGNORE A NULL TABLE
          KEYW   T.INCL,P=LPRFX1   IGNORE AN INCLUDE TABLE
          KEYW   T.WEOF,P=LPRFX1   IGNORE A WEOF TABLE
          KEYW   T.SUBST,P=LPRFX3  PROCESS A SUBST TABLE
          KEYW   T.OMIT,P=LPRFX3   PROCESS AN OMIT TABLE
          KEYW   T.MAP,P=LPRFX8    PROCESS A MAP TABLE
          KEYW   T.NOEPT,P=LPRFX3  PROCESS A NO-ENTRY TABLE 
          KEYW   T.LIB,P=LPRFX5    SPECIAL PROCESSING FOR THE LIB TABLE 
          KEYW   T.PRST,P=LPRFX3   PROCESS A PRESET TABLE 
          KEYW   T.USE,P=LPRFX3    PROCESS A USE TABLE
          KEYW   T.USEP,P=LPRFX3   PROCESS A USEP TABLE 
          DATA   0                 END OF DECISION TABLE 2
 P=OVL    SPACE  4,8
**        P=OVL - PROCESS OVERLAY DIRECTIVE.
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  CIO= 
  
  
P=OVL     WRITEW IMAGE,A1+1,X1-1
          WRITER IMAGE,RCL
          EQ     SKELGEN1    BACK TO MAIN LOOP
 P=WEOF   SPACE  4,8
**        P=WEOF - PROCESS WEOF DIRECTIVE.
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
* 
*         CALLS  WRITEF 
  
  
 P=WEOF   WRITEF IMAGE,RCL   WRITE EOF ON SKELETON
          EQ     SKELGEN1    BACK TO MAIN LOOP
          TITLE  SUBROUTINES. 
          SPACE  4,10 
**        COMMON DECK ROUTINES USED.
  
  
*CALL COMCCIO 
  
*CALL COMCWTW 
 WTW=     ENDX
*CALL COMMOV
 ADDWRDS  SPACE  4,14 
**        ADDWRDS - ADD WORDS TO A LOADER TABLE.
* 
*         ENTRY  (A1) = FWA OF LOADER TABLE.
*                (A2) = FWA OF SKELGEN TABLE TO ADD.
* 
*         EXIT   NONE 
* 
*         CALLS  MOVE, INCRWC 
* 
*         USES   A - 1, 3, 6
*                X - 1, 2, 3, 6 
*                B - 2, 3, 4, 5, 6
  
  
 ADDWRDS  SUBR               ENTRY/EXIT 
          SA1    A1 
          SA2    A2 
          SX2    X2-1        (X2) = NO. WORDS TO MOVE 
          MX3    -BYTE
          LX1    60-3*BYTE
          BX1    -X3*X1      (X1) = WORD COUNT
          SB5    X1+1        (B3) = ORDINAL AT WHICH TO PLACE WRDS
          RJ     INCRWC      INCREMENT WORD COUNT OF LOADER TABLE 
          MOVE   A2+1,X2,A1+B5     MOVE WORDS TO LOADER TABLE 
          SA3    IMAGE+2     (X3) = IN POINTER
          IX6    X3+X2       (X6) = IN POINTER ADVANCED BY NO. WDS
          SA6    A3          REPLACE IN POINTER 
          SA1    LDSETPTR    (X1) = POINTER TO LDSET HEADER 
          SA1    X1          (X1) = LDSET HEADER
          LX2    3*BYTE      (X2) = NO. WORDS IN WC POSITION
          IX6    X1+X2       (X6) = LDSET HEADER WITH INCREASED WC
          SA6    A1          REPLACE LDSET HEADER 
          EQ     EXIT.
 ERR      SPACE  4,10 
**        ERR - PROCESS ERRORS. 
* 
*         ENTRY  NONE 
* 
*         EXIT   PROGRAM ABORTED. 
* 
*         CALLS  MSG=, SYS= 
  
  
 ERR01    SA5    A1          UNKNOWN TABLE
          MESSAGE ERRM1,,RECALL 
          EQ     ABORT
  
 ERR02    MESSAGE ERRM2,,RCL DIAGNOSE TRAP TABLE OVERFLOW 
          EQ     ABORT
  
 ERR03    BX6    X1          (X1) = ERRING PARAMETER
          SA6    ERRM3+3     STORE AT END OF MESSAGE
          MESSAGE ERRM3,,RCL BAD CONTROL CARD PARAMETER 
          EQ     ABORT
  
 ERR04    MESSAGE ERRM4,,RECALL 
          EQ     ABORT       *OL* IS TOO SMALL
  
 ABORT    MESSAGE ERRABT,,RCL  ISSUE SKELGEN ABORT MESSAGE
          ABORT 
 FINDT    SPACE  4,10 
**        FINDT - FIND NEXT TABLE OF GIVEN TYPE.
* 
*         ENTRY  (B6) = FWA OF SET OF TABLES. WE START WITH NEXT TABLE. 
*                (X2) = TYPE OF TABLE.
* 
*         EXIT   (X3) " 0 IF NO MORE TABLES OF THAT TYPE. 
*                (A1) = FWA OF FOUND TABLE. 
*                (X1) = HEADER WORD OF TABLE. 
* 
*         CALLS  NONE 
* 
*         USES   A - 1
*                X - 0, 1, 2, 3, 4
*                B - 2
  
  
 FINDT    SUBR               ENTRY/EXIT 
          LX2    4*BYTE 
          MX0    BYTE 
          SA1    B6 
 FINDT2   SB2    X1          (B2) = LENGTH OF THIS TABLE
          ZR     B2,ERR01    IF NO LENGTH, TABLE ERROR
          SA1    A1+B2
          BX3    X0*X1       (X3) = TYPE CODE 
          BX3    X2-X3
          ZR     X3,EXIT.    IF IT IS THE RIGHT TYPE
          BX3    X0*X1       (X3) = TYPE CODE 
          LX3    BYTE 
          SX4    X3-T.OVL 
          ZR     X4,EXIT.    IF FOUND NEXT OVERLAY TABLE
          SX4    X3-T.END 
          ZR     X4,EXIT.    IF END OF ALL TABLES 
          EQ     FINDT2      GO CHECK NEXT TABLE
 INCRWC   SPACE  4,14 
**        INCRWC - INCREMENT WORD COUNT FIELD OF LOADER TABLE.
* 
*         ENTRY  (A1) = FWA OF LOADER TABLE.
*                (X2) = NUMBER OF WORDS ADDED 
* 
*         EXIT   NONE 
* 
*         CALLS  NONE 
* 
*         USES   A - 6
*                X - 1, 6 
  
  
 INCRWC   SUBR               ENTRY/EXIT 
          SA1    A1          (X1) = HEADER WORD OF LOADER TABLE 
          LX2    3*BYTE      (X2) = NO. WORDS POSITIONED TO WC
          IX6    X1+X2       (X6) = HEADER TABLE WITH NEW WC
          LX2    60-3*BYTE   REPOSITION X2
          SA6    A1 
          EQ     EXIT.
 INIT     SPACE  4,14 
**        INIT - INITIALIZATION OF SKELGEN. 
* 
*              SKELGEN INITALIZATION CONSISTS OF CRACKING THE CONTROL 
*         CARD OPTIONS. 
* 
*         ENTRY  NONE 
* 
*         EXIT   (B1) = 1 
* 
*         CALLS  SYS=, MSG=, CIO= 
* 
*         USES   ALL
  
  
 INIT     SUBR               ENTRY/EXIT 
          SB1    1           (B1) = 1 THROUGH OUT SKELGEN 
          DATE   DATE 
          CLOCK  TIME 
          SB2    CHAR        (B2) = VALUE FOR A ONE CHAR SHIFT
          SA1    DATE        (X1) = DATE
          LX6    X1,B2       (X6) = DATE WITHOUT LEADING BLANK
          SA6    A1 
          SA1    TIME        (X1) = TIME
          LX6    X1,B2       (X6) = TIME WITHOUT LEADING BLANK
          SA6    A1 
          SA1    RA.ARG 
          MX0    7*CHAR 
          BX6    X0*X1       (X6) = NEW LFN FOR SKELETON
          ZR     X6,INIT1    IF NO LFN PARAMETER
          SA6    INFM1+3     INSERT INTO INFORM MSG 1 
          SA1    IMAGE       (X1) = WORD 0 OF IMAGE FET 
          BX1    -X0*X1      (X1) = STATUS BITS 
          BX6    X6+X1       (X6) = WORD 0 OF NEW IMAGE FET 
          SA6    A1          REPLACE WORD 0 OF FET
 INIT1    MESSAGE INFM1,,RECALL    INFORMATIVE MESSAGE 1
          REWIND IMAGE,RECALL 
          SA1    RA.ARG      GET FIRST PARAMETER
          ZR     X1,EXIT.    IF NO PARAMETERS AT ALL
          SA1    A1+1        (X1) = SECOND PARAMETER
          ZR     X1,EXIT.    IF NO MORE PARAMETERS
          MX0    7*CHAR 
          BX1    X0*X1       (X1) = PARAMETER WITHOUT SEPARATOR 
          SA2    =C*NOLIB*
          BX4    X1-X2       (X4) = DIFF BETW PARAM 3 AND *NOLIB* 
          NZ     X4,ERR03    IF NOT *NOLIB* THEN ILLEGAL PARAMETER
          BX7    X2 
          =X6    1
          BX7    X2 
          =X6    1
          SA6    NOLIB       (NOLIB) = 1 MEANS DONT MAKE LIB TABLES 
          SA7    LIB         PUT *NOLIB* INTO PREFIX TABLES 
          EQ     EXIT.
 NULLT    SPACE  4,14 
**        NULLT - NULLIFY A TABLE.
* 
*         ENTRY  (B6) = FWA OF TABLE TO BE CHANGED TO TYPE T.NULL.
* 
*         EXIT   NONE 
* 
*         CALLS  NONE 
* 
*         USES   A - 1, 6 
*                X - 1, 6 
  
  
 NULLT    SUBR               ENTRY/EXIT 
          SA1    B6 
          MX6    BYTE 
          BX6    -X6*X1      (X6) = HEADER WITHOUT TYPE 
          SX1    T.NULL 
          LX1    4*BYTE 
          BX6    X6+X1       (X6) = HEADER WITH NULL TYPE 
          SA6    A1 
          EQ     EXIT.
 SDO      SPACE  4,10 
**        SDO - START DIAGNOSTIC OVERLAY. 
* 
*         ENTRY  (X1) = HELP FLAG (1=HELP OVERLAY AND 0=DIAGNOSTIC).
*                (X2) = 0 IF WE ARE NOT TO COMPLETE LAST OVERLAY. 
* 
*         CALLS  TXT, CIO=, WTW=
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6, 7 
*                B - 2, 3, 4, 5, 6, 7 
*                A - 1, 2, 3, 4, 5, 6, 7
  
  
 SDO      SUBR               ENTRY/EXIT 
          SA5    CO          (X5) = CURRENT OVERLAY 
          SA4    CL 
          MX6    0
          SA6    A4          SET CURRENT LENGTH TO ZERO 
          SX6    OL 
          LX1    59 
          LX6    24 
          BX6    X1+X6
          LX5    12 
          BX6    X5+X6       1/H,23/0,12/OL,12/CO,12/** 
          LX5    -12
          SA3    CI 
          SA6    X3+IB       WRITE INDEX ENTRY INTO BUFFER
          =X7    X3+1 
          SA7    A3          INCREMENT CURRENT INDEX IN BUFFER
          SX3    X3-ND       - NUMBER OF DIANOSTIC OVERLAYS ALLOWED 
          ZR     X3,ERR04    IF TOO MANY DIAGNOSTIC OVERLAYS
          ZR     X2,SDO1     IF FIRST CALL TO SDO 
          SA3    DN          LAST DIAGNOSTIC NUMBER 
          BX2    X4 
          =A4    A6-1        GET PREVIOUS ENTRY 
          =X0    1
          BX6    X4+X3
          SA6    A4          ADD LAST DIAGNOSTIC NUMBER TO INDEX
          SX5    SDOB 
          RJ     TXT         WRITE ZERO WORD AT END OF OVERLAY
          SA5    CO          RESTORE X5 
          WRITER IMAGE,RECALL  FLUSH LAST OVERLAY 
 SDO1     MX7    -3 
          =X6    X5+1 
          SX1    1R0
          BX2    -X7*X5 
          SA6    A5          INCREMENT CURRENT OVERLAY NUMBER 
          AX5    3
          IX6    X1+X2       CONVERT 4 OCTAL DIGITS TO Z4 FORMAT
          BX2    -X7*X5 
          LX6    -6 
          AX5    3
          IX2    X1+X2
          BX6    X2+X6
          BX2    -X7*X5 
          LX6    -6 
          AX5    3
          IX2    X1+X2
          BX6    X2+X6
          IX2    X1+X5
          LX6    -6 
          BX6    X2+X6
          LX6    18          Z4 FORMAT OF OVERLAY NUMBER
          SA2    SDOA        ADD OVERLAY NUMBER TO FORM NAME *QUNNNN* 
          SX4    2RQU 
          =A3    A2+1 
          LX4    24 
          BX7    X4+X6
          LX7    24 
          SA7    N1          ADD NAME TO ALL LOADER TABLES
          SA7    N2 
          SA7    N3 
          SA7    N4 
          MX1    -12
          MX4    12 
          LX4    -6 
          BX2    X1*X2       ADD PRIMARY AND SECONARY OVERLAY NUMBERS 
          BX3    -X4*X3 
          BX7    -X1*X6 
          BX6    X1*X6
          LX6    -12
          BX6    X2+X6       ADD PRIMARY OVERLAY NUMBER TO OVERLAY CARD 
          LX7    -18
          SA6    A2 
          BX7    X3+X7       ADD SECONARY OVERLAY NUMBER
          SA7    A3 
          WRITEW IMAGE,SDOA,2  WRITE OVERLAY CARD 
          WRITER IMAGE,RECALL 
          WRITEW IMAGE,LPRFX,LPRG  WRITE DUMMY PROGRAM TO IMAGE 
          EQ     EXIT.
  
 SDOA     DATA   C*OVERLAY(..,..)*
 SDOB     CON    0           ZERO WORD TO BE WRITTEN AT END OF OVERLAY
 TSUBST   SPACE  4,10 
**        TSUBST - PROCESS A TEMPORARY SUBSTITUTE TABLE.
* 
*              THIS ROUTINE BUILDS AND USES A TABLE OF TEMPORARY
*         SUBSTITUTES IN THE CURRENT OVERLAY.  FIRST THE TABLE IS 
*         EMPTIED AND A *SUBST A,A* IS GENERATED FOR EACH TSUBST FROM 
*         THE PREVIOUS OVERLAY.  THIS IS HOW THE SUBSTITUTE IS MADE 
*         TEMPORARY FOR THE CURRENT OVERLAY ONLY.  WE NEXT SCAN THE 
*         TABLES FOR THIS OVERLAY AND ACCUMULATE THE NAMES OF ALL THE 
*         TSUBST ENTRIES, NULLING EACH TSUBST TABLE AS WE GO.  THIS 
*         LIST WILL BE USED TO UNDO THE SUBST DURING THE NEXT OVERLAY.
* 
*         ENTRY  NONE 
* 
*         EXIT   NONE 
* 
*         CALLS  INCRWC, FINDT, NULLT 
  
  
 TSUBST   SUBR               ENTRY/EXIT 
          SB1    1
          SA1    TRAPTBL     (X1) = FIRST ENTRY OF TRAP TABLE 
          SX1    X1+B1
          SB4    A1          IN CASE NO ENTRIES IN TRAP TABLE 
          ZR     X1,TSUBST3  IF NO ENTRIES IN THE TRAP TABLE
          SA2    IMAGE+2     (X2) = IN PTR...LWA+1 TBLS IN BUFFER 
          SX7    X2+B1       (X7) = NEW LWA+1 OF TBLS IN BUFFER 
          SA7    A2 
          SX6    T.SUBST
          LX6    4*BYTE      (X6) = HEADER FOR SUBST TBL
          SA6    X2 
          SA1    X2-1        (X1) = LDSET TABLE HEADER
          SB3    A1          (B3) = ADDR OF LDSET TABLE 
          SX2    1           (X2) = ONE WORD ADDED TO LDSETS
          RJ     INCRWC      INCREMENT WORD COUNT OF LDSET HEADER 
          SA5    TRAPTBL     (X5) = FIRST ENTRY OF TRAP TABLE 
          SA1    IMAGE+2     (X1) = LWA+1 OF TABLES IN IMAGE BUFFR
          SB2    X1          (B2) = LWA+1 OF TABLES IN BUFFER 
 TSUBST1  BX6    X5          TRAP NAME
          SA6    B2          STORE AS NAME 1 IN SUBST TABLE 
          SA6    B2+B1       STORE AS NAME 2 IN SUBST TABLE 
          SB2    A6+B1       (B2) = LWA+1 OF TABLES IN BUFFER 
          SX2    B1+B1       (X2) = 2 WORDS ADDED TO TABLES 
          SA1    B3          (A1) = ADDR OF LDSET TABLE 
          RJ     INCRWC      INCREMENT WORD COUNT OF LDSET TABLE
          SA1    B3+B1       (A1) = ADDR OF SUBST TABLE 
          RJ     INCRWC      INCREMENT WORD COUNT OF SUBST TABLE
          SX6    -B1         (X6) = INDICATOR FOR EMPTY ENTRY 
          SA6    A5          MARK THIS ENTRY AS EMPTY 
          SA5    A5+B1       GET NEXT ENTRY FROM TABLE
          BX6    X6-X5       (X6) = DIFF BETWEEN ENTRY AND -1 
          ZR     X6,TSUBST2  IF NO MORE ENTRIES 
          NZ     X5,TSUBST1  IF NOT AT END OF TABLE 
 TSUBST2  SX6    B2          LWA+1 OF TABLES IN BUFFER
          SA6    IMAGE+2     IN PTR = LWA+1 OF TABLES IN BUFFER 
          SB4    TRAPTBL     (B4) = FWA OF TRAPTBL
 TSUBST3  SA1    TBLPTR 
          SB6    X1          (B6) = ADDR OF CURRENT SKELGEN TABLE 
          SX2    T.TSUBST    TSUBST TABLE TYPE
          RJ     FINDT       FINDT TABLE OF SPECIFIED TYPE
          NZ     X3,EXIT.    IF NO MORE TRAP TABLES TO PROCESS
          SA2    A1+B1       (X2) = TRAP NAME 
          SA4    B4          (X4) = NEXT AVAILABLE WORD IN TRAPTBL
          ZR     X4,ERR02    IF TRAPTBL OVERFLOWED...FATAL ERROR
          BX6    X2          (X6) = TRAP NAME 
          SA6    B4 
          SB4    B4+B1       (B4) = LWA+1 OF TRAP TBL ENTRIES 
          SB6    A1          (B6) = ADDR OF SKELGEN TRAP TABLE
          RJ     NULLT       NULL A SKELGEN TRAP TABLE
          EQ     TSUBST3
 TXT      SPACE  4,10 
**        TXT - ADD TEXT BLOCK TO DIAGNOSTIC OVERLAY. 
* 
*         ENTRY  (X0) = LENGTH OF TEXT. 
*                (X2) = STARTING ADDRESS OF TEXT IN OVERLAY.
*                (X5) = START OF TEXT.
* 
*         CALLS  WTW= 
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6, 7 
*                B - 2, 3, 4, 5, 6, 7 
*                A - 1, 2, 3, 4, 6, 7 
  
  
 TXT      SUBR               ENTRY/EXIT 
          SA3    TXTA 
          MX7    -18
          BX7    X7*X3       REMOVE OLD STARTING ADDRESS
          BX7    X7+X2       ADD NEW STARTING ADDRESS 
          SX2    X0+14
          SX3    15 
          MX4    12 
          IX3    X2/X3
          LX4    -12
          IX3    X0+X3       LEN + (LEN+14)/15 = LENGTH OF TEXT BLOCK 
          BX7    -X4*X7      REMOVE OLD LENGTH
          LX3    36 
          BX6    X3+X7       ADD NEW LENGTH 
          SA6    A3 
          WRITEW IMAGE,TXTA,1 
 TXT1     ZR     X0,EXIT.    RETURN IF END OF TEXT
          SX0    X0-15
          WRITEW IMAGE,TXTB,1  WRITE RELOCATION WORD
          MI     X0,TXT2     IF NOT ENOUGH FOR A FULL TEXT GROUP
          WRITEW IMAGE,X5,15 WRITE TEXT GROUP 
          SX5    X5+15
          EQ     TXT1 
  
 TXT2     SX0    X0+15
          WRITEW IMAGE,X5,X0 WRITE REMAINING TEXT GROUP 
          EQ     EXIT.
  
 TXTA     VFD    12/4000B,12/**,18/1,18/**
 TXTB     CON    0           RELOCATION WORD
          TITLE  SKELGEN INTERNAL TABLE MACROS. 
          SPACE  4,10 
**        SKELGEN INTERNAL TABLE MACROS.
* 
* 
*              INTERNAL TABLES FOR SKELGEN ARE GENERATED AFTER THE LABEL
*         *TBLBEGIN*.  EACH MACRO (EXCEPT *HELPT*) GENERATES A TABLE
*         HEADER WHICH IS FOLLOWED BY THE TABLE INFORMATION.  THE 
*         HEADER HAS THE FORMAT.
* 
*         VFD    12/T.XXX,30/0,18/LEN 
* 
*         T.XXX = TABLE TYPE. 
*         LEN = LENGTH OF THE TABLE INCLUDING THE HEADER WORD.
* 
* 
*         THE AVAILABLE MACROS ARE: 
* 
* YOURS   BECOMES MINE
*         BEGTBLS 
* NAME    CAPSULE 
*         DIAG   N,TEXT 
*         ENDTBLS 
*         EPT    NAME 
* NAME    GROUP 
*         HELP   NAME,LEXID 
*         HELPT  TEXT 
*         IGNORE EP 
*         INCL   ROUTINE-NAME 
*         LIB    (LIB1,LIB2,LIB3,...) 
*         MAP    P,LFN
*         NOEPT  NAME 
*         OMIT   EP 
* NAME    OVCAP 
* OVLNAME OVLAY  L1,L2,OVN
*         PRESET VALUE
*         SUBST  MINE,YOURS 
*         TRAP   EP 
*         UNIGNORE NAME 
*         USE    EP 
*         USEP   ROUTINE-NAME 
*         WEOF
* 
* 
*         CONSTRAINTS.
* 
*           1.   THERE MUST BE AN OVLAY MACRO ACTIVE FOR ANY LDECK MACRO
*                TO BE USED.
* 
*           2.   THERE MAY BE AT MOST ONE PRESET MACRO PER OVERLAY. 
* 
*           3.   THERE MAY BE AT MOST ONE LIB MACRO PER OVERLAY 
* 
*           4.   ANY NUMBER OF THE LDECK MACROS MAY OCCUR IN EACH 
*                OVERLAY. THEIR OCCURENCES WILL BE CLUSTERED TOGETHER IN
*                IN A DECK WHOSE NAME IS -L- CONCATENATED WITH THE NAME 
*                OF THE OVERLAY (E.G.  LQU0100).  THIS DECK WILL BE 
*                AUTOMATICALLY GENERATED BY SKELGEN, SO USE OF THESE
*                NAMES MUST BE AVOIDED. 
* 
*           5.   BECOMES AND TRAP MACROS AFFECT THE CURRENT OVERLAY 
*                ONLY. BECOMES (WITH *FOREVER* OPTION), IGNORE, AND 
*                SUBST REMAIN IN EFFECT UNTIL END-OF-LOAD, OR UNTIL 
*                CANCELLED BY ANOTHER FORM OF SUBST OR AN UNIGNORE
*                MACRO. 
* 
*           6.   THE *USEP* MACRO SHOULD BE USED WITH CAUTION.  WITH
*                *USEP* EXTERNALS FROM A PROGRAM CALLED IN BY *USEP*
*                WOULD NOT GET ITS EXTERNALS SATISFIED FROM THE SAME
*                LIBRARY UNLESS SOME OTHER ROUTINE WAS SUBSEQUENTLY 
*                LOADED FROM ANOTHER LIBRARY, THUS CAUSING THE ORIGINAL 
*                LIBRARY TO BE SEARCHED AGAIN.  UNTIL THE LOADER FIXES
*                THIS DEFICIENCY PLEASE USE THE *USE* MACRO.
          SPACE  4,10 
**        BECOMES - MACRO TO MAKE A READABLE SUBSTITUTION.
* 
* YOURS   BECOMES MINE,F
* 
*         MINE = ENTRY POINT NAME TO BE USED IN PLACE OF *YOURS*. 
*         YOURS = ENTRY POINT NAME TO BE REPLACED.
*         F = NIL FOR A TEMPORARY SUBSTITUTE OR *FOREVER* IF THE
*         SUBSTITUTE WILL STAY IN EFFECT ACROSS OVERLAY LOADS.
* 
*              IF THE *FOREVER* OPTION IS USED THEN THIS MACRO
*         TRANSLATES INTO A SUBST MACRO.  IF THE *F* OPTION IS OMITTED
*         THEN A TEMPORARY SUBST IS DEFINED FOR THE CURRENT OVERLAY.
  
          PURGMAC BECOMES 
  
          MACRO  BECOMES,YOURS,MINE,F 
          IFC       EQ, F  ,6 
          IFGE   NUM.TRAP,MAXTRAP,1 
          ERR    TOO MANY TSUBSTS IN THIS OVERLAY.
 NUM.TRAP SET    NUM.TRAP+1 
          VFD    12/T.TSUBST,30/0,18/2
          VFD       42/0L_YOURS,18/0
          SKIP   1
          IFC       EQ, F FOREVER ,2
          SUBST  MINE,YOURS  SUBSTITUTE MINE FOR YOURS
          SKIP   1
          ERR    UNRECOGNIZABLE PARAMETER - F.
          ENDM
          SPACE  4,10 
**        BEGTBLS - MACRO TO BEGIN THE LIST OF SKELGEN TABLES.
* 
*         BEGTBLS 
* 
*              THIS MACRO PRODUCES THE CORRECT LABEL WITH THE 
*         CORRECT COMPASS USE BLOCKS. 
  
          PURGMAC BEGTBLS 
  
 BEGTBLS  MACRO 
          .USE   TABLES      AVOID LITERAL BLOCK
 TBLBEGIN BSS    0
          ENDM
          SPACE  4,10 
**        CAPSULE - MACRO FOR DEFINING A CAPSULE
* 
* NAME    CAPSULE 
* 
*         NAME = NAME OF CAPSULE TO BE GENERATED. 
* 
*              THIS MACRO GENERATES AN OVERLAY CAPSULE WITH THE GIVEN 
*         NAME.  DUE TO A LOADER REQUIREMENT THE CAPSULE DIRECTIVES WILL
*         BE ACCUMULATED AT THE BEGINNING OF THE LOAD FILE.  AT THE 
*         CURRENT PLACE IN THE LOAD FILE EFFECTIVELY AN (INCL NAME) WILL
*         BE DONE AND A SUBSEQUENT (LINCL NAME) FOR THIS CAPSULE WILL BE
*         IGNORED.  A DUMMY DECK NAMED L<NAME> WILL ALSO BE PRODUCED
*         WHICH WILL CONTAIN ONLY LOADER TABLES SUCH AS GENERATED BY
*         THE EPT MACRO.
  
          PURGMAC CAPSULE 
  
          MACRO  CAPSULE,NAME 
          LOCAL  ENDCAP,ENDFPRFX,ENDLPRFX 
          .USE   "USECAP" 
          SKIP   3           LOADER DOES NOT OBEY REF. MAN. 
          VFD    12/T.OVL,30/0,18/ENDCAP-*
          DATA   C*CAPSULE(NAME)* 
 ENDCAP   BSS    0
          .USE   "USEREST"
          VFD    12/T.FPRFX,30/0,18/ENDFPRFX-*
          DATA   C*NAME*
 ENDFPRFX BSS    0
          VFD    12/T.LPRFX,30/0,18/ENDLPRFX-*
          DATA   C*L_NAME*
 ENDLPRFX BSS    0
 OVL.ACT  SET    1           NOTE ACTIVE OVERLAY/OVCAP/CAPSULE
          ENDM
          ENDM
 DIAG     SPACE  4,10 
**        DIAG - MACRO FOR DEFINING DIAGNOSTIC TEXT.
* 
*         DIAG   N,TEXT 
* 
*         N    = DIAGNOSTIC NUMBER (FROM 1 TO 4095).
*         TEXT = TEXT WHICH WILL BE GIVEN WHEN THIS ERROR OCCURS. 
* 
*              THIS MACRO GENERATES THE APPROPRIATE HEADER WORDS FOR
*         THE DIAGNOSTIC AND HELP TEXT THAT WILL FOLLOW.  EACH
*         DIAGNOSTIC MUST BE INSERTED IN NUMERICAL ORDER. 
*         OCCURENCES OF THE SUBSTRING <X> IN THE TEXT WILL CAUSE THE
*         CHARACTER SUBSTRING TO BE REPLACED DEPENDING ON THE 
*         VALUE OF X.  THE ROUTINE *DIAG* PROCESSES THESE CHARACTERS
*         AS FOLLOWS.  CHARACTERS NOT SHOWN CAUSE NO SUBSTITUTION.
* 
*         N    = NEXT TOKEN FROM DIRECTIVE SCAN.
*         C    = CURRENT TOKEN FROM DIRECTIVE SCAN. 
*         A    = NEXT PARAMETER TO *DIAG* IS ALPHANUMERIC.
*         O    = NEXT PARAMETER TO *DIAG* IS OCTAL. 
*         D    = NEXT PARAMETER TO *DIAG* IS DECIMAL. 
  
          PURGMAC DIAG
  
 DIAG     MACRO  N,TEXT 
          LOCAL  ENDDIAG
          NOREF  L."DN" 
 L."DN"   BSS    0
          IFGE   "DN",N,1 
          ERR    DIAGNOSTIC NUMBER OUT OF SEQUENCE. 
 DN       DECMIC N,4
          VFD    12/T.DIAG,30/0,18/L."DN"-* 
          VFD    1/0,35/0,12/ENDDIAG-*-1,12/N 
          DATA   C*_TEXT_*
 ENDDIAG  VFD    1/1,35/0,12/L."DN"-*-1,12/N
          ENDM
          SPACE  4,10 
**        ENDTBLS - MACRO TO TERMINATE THE LIST OF SKELGEN TABLES.
* 
*         ENDTBLS 
* 
*              THIS MACRO PRODUCES A TABLE WHICH MARKS THE END OF TABLES
*         TO BE PROCESSED BY SKELGEN. 
  
          PURGMAC ENDTBLS 
  
 ENDTBLS  MACRO              END SKELGENS INTERNAL TABLES 
          VFD    12/T.END,48/0
          ENDM
 EPT      SPACE  4,10 
**        EPT - MACRO FOR DEFINING ENTRY POINTS TO CAPSULES.
* 
*         EPT    NAME 
* 
*         NAME = ENTRY POINT NAME IN THE CAPSULE WHICH WILL BE USED 
*         FOR A TRANSFER POINT. 
* 
*              THIS MACRO DEFINES A TABLE WHICH WILL FORCE THE LOADER TO
*         MAKE THE NAMED ENTRY POINT A TRANSFER POINT INTO THE CURRENT
*         CAPSULE.
  
          PURGMAC EPT 
  
 EPT      MACRO  NAME 
          IFNE   OVL.ACT,1,1
          ERR    NO OVLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.EPT,30/0,18/2 
          VFD    42/0L_NAME,18/0
          ENDM
          SPACE  4,10 
**        GROUP -  MACRO FOR DECLARING A GROUP OF CAPSULES. 
* 
* NAME    GROUP 
* 
*              THIS MACRO GENERATES A *GROUP* LOADER DIRECTIVE. 
  
          PURGMAC GROUP 
  
          MACRO  GROUP,NAME 
          LOCAL  ENDGRP 
          LOCAL  UC,UR
 USECAP   MICRO  1,, UC 
 USEREST  MICRO  1,, UR 
*  ESTABLISH ORDER OF USE BLOCKS
          .USE   "USECAP" 
          SKIP   3          LOADER DOES NOT OBEY REF. MAN.
          VFD    12/T.OVL,30/0,18/ENDGRP-*
          DATA   C*GROUP(NAME)* 
 ENDGRP   BSS    0
          .USE   "USEREST"
          ENDM
          SPACE  4,10 
**        HELP - MACRO FOR DEFINING HELP TEXT.
* 
*         HELP   A,ID 
* 
*         A    = NAME OF QU DIRECTIVE FOR FOLLOWING TEXT. 
*         ID   = LEXICAL ID FOR THIS DIRECTIVE.  THIS IS ACTUALLY 
*                THE DIRECTIVE TYPE (1 OCTAL DIGIT) FOLLOWED BY THE 
*                THREE DIGIT LEXICAL ID (FROM 0 TO 777B).  ONLY THE 
*                LEXICAL ID IS USED.
* 
*              THIS MACRO DEFINES A HEADER GIVING THE LENGTH OF THE 
*         TEXT THAT FOLLOWS.  EACH HELP TEXT ENTRY MUST BE IN 
*         INCREASING NUMERICAL ORDER BY THE THREE LEAST SIGNIFICANT 
*         DIGITS OF THE LEXICAL ID. 
  
          PURGMAC HELP
  
 HELP     MACRO  A,ID 
          NOREF  L."DN" 
 L."DN"   BSS    0
 DN1      MICRO  1,3,*"DN"* 
 DN       OCTMIC ID,3 
 C        IFC    NE,*"DN1"**,2
          IFGE   "DN1","DN",1 
          ERR    LEXICAL ID OUT OF SEQUENCE.
          VFD    12/T.HELP,30/0,18/L."DN"-* 
          VFD    1/1,35/0,12/L."DN"-*-1,12/"DN"B
          ENDM
 HELPT    SPACE  4,10 
**        HELPT - MACRO FOR DEFINING HELP TEXT LINES. 
* 
*         HELPT  TEXT 
* 
*         TEXT = TEXT WHICH WILL DESCRIBE THE PRECEDING DIAGNOSTIC OR 
*                QU DIRECTIVE.
* 
*              THIS MACRO SIMPLY DEFINES THE TEXT AS A ZERO BYTE
*         TERMINATED LINE TO GO WITH THE *HELP* OR *DIAG* HEADERS 
*         THAT WERE PREVIOUSLY DEFINED. 
  
          PURGMAC HELPT 
  
 HELPT    MACRO  TEXT 
          DATA   C*_TEXT_*
          ENDM
          SPACE  4,10 
**        IGNORE - MACRO TO IGNORE REFERENCE TO A GIVEN ENTRY POINT.
* 
*         IGNORE NAME 
* 
*         NAME = ENTRY POINT NAME TO BE REPLACED BY *DB$IGNR*.
* 
*              THIS MACRO SUBSTITUTES *DB$IGNR* FOR THE NAMED ENTRY PT. 
*         DB$IGNR IS A ROUTINE IN CDCS THAT IS A DO-NOTHING EXCEPT FOR
*         CLEARING X6 (FALSE FOR FUNCTION). THIS IS USED TO ALLOW REFER-
*         ENCES TO BE MADE BUT HAVE NO EFFECT.
*         THE EFFECT OF AN IGNORE IS UNTIL END-OF-LOAD OR UNTIL AN
*         *UNIGNORE* MACRO IS ENCOUNTERED.
  
          PURGMAC IGNORE
  
 IGNORE   MACRO  NAME 
 NAME     BECOMES DB$IGNR,FOREVER 
          ENDM
          SPACE  4,10 
**        INCL - MACRO TO INCLUDE A DECK IN THE OVERLAY.
* 
*         INCL   NAME 
* 
*         NAME = PROGRAM NAME TO BE INCLUDED IN THIS OVERLAY. 
* 
*              THIS MACRO RESULTS IN A ZERO-LENGTH RELOCATABLE ROUTINE
*         WITH THE SPECIFIED NAME BEING INSERTED IN THE IMAGE FILE. THIS
*         CAN THEN BE REPLACED BY THE RELOCATABLE OF THE ROUTINE USING
*         *COPYLM*. 
  
          PURGMAC INCL
  
 INCL     MACRO  NAME 
          LOCAL  ENDINCL
          VFD    12/T.INCL,30/0,18/ENDINCL-*
          DATA   C*_NAME* 
 ENDINCL  BSS    0           MARKS END OF THE INCL TABLE
          ENDM
          SPACE  4,10 
**        LIB - MACRO TO ESTABLISH LIBRARIES TO SEARCH. 
* 
*         LIB    (LIB1,...,LIBN)
* 
*              THIS MACRO CLEARS THE LOCAL LIBRARY SET AND ESTABLISHES
*         THE GIVEN LIST OF LIBRARIES AS THE CURRENT LOCAL SET. THERE 
*         CAN BE ONLY ONE LIB MACRO PER OVERLAY.  THE LIST
*         LIBRARY NAMES MUST BE ENCLOSED IN PARENTHESES.
  
          PURGMAC LIB 
  
 LIB      MACRO  NAME 
          LOCAL  ENDLIB 
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          IFEQ   LIB.ACT,1,1 IF ALREADY ONE LIB MACRO THIS OVERLAY
          ERR    MORE THAN ONE LIB MACRO IN THIS OVERLAY
 LIB.ACT  SET    1
          VFD    12/T.LIB,30/0,18/ENDLIB-*       LENGTH ZEROED LATER
          VFD    12/T.LIB,12/ENDLIB-*-1,36/0    ACTUAL LIB TABLE WITH WC
          IRP    NAME 
 LIB.1    IFC    NE,*_NAME**
          DATA   C*_NAME* 
 LIB.1    ENDIF 
          IRP 
 ENDLIB   BSS    0           MARKS THE END OF LIB TABLE FOR LENGTH
          ENDM
 MAP      SPACE  4,10 
**        MAP - MACRO FOR SETTING THE MAP TYPE. 
* 
*         MAP    P1,P2
* 
*         P1   = N FOR NO MAP OR ANY COMBINATION OF THE FOLLOWING.
*                S - STATISTICS.
*                B - BLOCK MAP. 
*                E - ENTRY POINT LIST.
*                X - CROSS REFERENCE MAP. 
*         P2   = OPTIONAL OUTPUT FILE FOR MAP.
  
          PURGMAC MAP 
  
 MAP      MACRO  P1,P2
          LOCAL  L
          IFNE   OVL.ACT,1,1
          ERR    NO OVLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.MAP,30/0,18/L-* 
'?LDR#OP  SET    0
1         IFC    NE, P1 
'?LDR#OP  SET    1
1         IFC    NE, P1 N 
'?LDR#MS  SET    2
'?LDR#MB  SET    4
'?LDR#ME  SET    10B
'?LDR#MX  SET    20B
'?LDR#CN  SET    0
2         DUP    -1 
'?LDR#CN  SET    '?LDR#CN+1 
'?LDR#CH  MICRO  '?LDR#CN,1, P1 
          IFC    EQ, "'?LDR#CH"  ,2 
2         STOPDUP 
          SKIP   4
          IF     -DEF,'?LDR#M"'?LDR#CH",2 
          ERR    INVALID MAP OPTION - "'?LDR#CH". 
          SKIP   1
'?LDR#M"'?LDR#CH" SET 0 
2         ENDD
'?LDR#OP  SET    37B-'?LDR#MS-'?LDR#MB-'?LDR#ME-'?LDR#MX
1         ENDIF 
          VFD    12D/11B,12D/L-*-1,36D/'?LDR#OP 
          IFC    NE, P2  ,1 
          VFD    42/0L_P2,18D/
 L        EQU    *
          ENDM
 NOEPT    SPACE  4,10 
**        NOEPT - MACRO FOR SUPRESSING ENTRY POINTS TO A CAPSULE. 
* 
*         NOEPT  NAME 
* 
*         NAME = ENTRY POINT NAME IN CAPSULE WHICH WILL NOT BE A
*         TRANSFER POINT TO THIS CAPSULE. 
* 
*              THIS MACRO ALLOWS ONE TO BUILD A CAPSULE AND SUPRESS A 
*         GIVEN ENTRY POINT SO THAT DUPLICATE ENTRY POINTS AMONG
*         CAPSULES CAN BE ELIMINATED.  IF NO NAME IS GIVEN THEN THIS
*         CAUSES THE  LOADER TO USE ONLY THOSE ENTRY POINTS GIVEN BY
*         *LDSET(EPT=...)* AS TRANSFER POINTS TO A CAPSULE.  THIS WILL
*         ELIMINATE ALL LIBRARY ROUTINE ENTRY POINTS WHICH MAY BE 
*         USED WITHIN A CAPSULE.
  
          PURGMAC NOEPT 
  
 NOEPT    MACRO  NAME 
          IFNE   OVL.ACT,1,1
          ERR    NO OVLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          IFC    EQ,*NAME**,2 
          VFD    12/T.NOEPT,30/0,18/1 
          SKIP   2
          VFD    12/T.NOEPT,30/0,18/2 
          VFD    42/0L_NAME,18/0
          ENDM
          SPACE  4,10 
**        OMIT - MACRO TO OMIT AN ENTRY POINT FROM THE LOAD.
* 
*         OMIT   NAME 
* 
*         NAME = ENTRY POINT NAME TO BE OMITTED FROM THIS OVERLAY.
* 
*              THIS MACRO TELLS LOADER TO OMIT THE NAMED ENTRY POINT
*         FROM NOW UNTIL END-OF-LOAD OR UNTIL A *USE* MACRO OVERRIDES 
*         IT. THE OMIT RESULTS IN ANY REFERENCE TO THE ENTRY POINT BEING
*         LEFT AS UNSATISFIED (ADDR = *+400000B) WITH NO LOADER 
*         DIAGNOSTICS. USE WITH CARE. 
  
          PURGMAC OMIT
  
 OMIT     MACRO  NAME 
          LOCAL  ENDOMIT
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.OMIT,30/0,18/ENDOMIT-*
          DATA   C*_NAME* 
 ENDOMIT  BSS    0           MARKS END OF OMIT TABLE
          ENDM
 OVCAP    SPACE  4,10 
**        OVCAP - MACRO FOR DEFINING AN OVERLAY CAPSULE.
* 
* NAME    OVCAP 
* 
*         NAME = NAME OF CAPSULE TO BE GENERATED. 
* 
*              THIS MACRO GENERATES AN OVERLAY CAPSULE WITH THE GIVEN 
*         NAME.  SKELGEN PROCESSES THE OVCAP MACRO IN THE SAME WAY IT 
*         PROCESSES THE OVLAY MACRO.  ALL OVCAPS MUST BE DEFINED
*         AFTER ALL THE OVERLAYS (LOADER RESTRICTION).
  
          PURGMAC OVCAP 
  
          MACRO  OVCAP,NAME 
 NAME     OVLAY 
          ENDM
          SPACE  4,10 
**        OVLAY - MACRO TO DEFINE START OF NEW OVERLAY. 
* 
*NAME     OVLAY  L1,L2,OVN
* 
*         L1  = PRIMARY OVERLAY LEVEL NUMBER. 
*         L2  = SECONDARY OVERLAY LEVEL NUMBER. 
*         OVN = NUMBER OF OVERLAYS (FOR FOL. VALID FOR (0,0) ONLY)
* 
*              THIS MACRO BUILDS TABLES TO DECLARE THE NEW LEVEL OVERLAY
*         AND GENERATES TWO DUMMY DECKS TO ACCOMPANY IT. THE FIRST SUCH 
*         DECK IS OF THE SAME NAME AS THE OVERLAY - THIS ENSURES THAT 
*         THE OVERLAY WILL GET THIS NAME. THE DECK ALSO CONTAINS THE
*         ENTRY POINT FOR THE OVERLAY AND A DUMMY ROUTINE TO ALLOW
*         LOADING TO COMPLETE SHOULD THIS NOT BE REPLACED VIA COPYLM. 
*         THE SECOND DUMMY DECK IS AN L-DECK, THE NAME IS DERIVED FROM
*         THE OVERLAY NAME BY PREFIXING AN *L* TO IT.  THIS DECK
*         CONTAINS ANY/ALL LDSET INFORMATION FOR LOADER SPECIFIED IN
*         OTHER SKELGEN MACROS (E.G. USEP, OMIT, SUBST, ETC.).
* 
*              IF A (0,0) OVERLAY IS BEGUN, THE NAME OF THE OVERLAY IS
*         SELECTED AS THE LFN ONTO WHICH LOADER SHOULD WRITE THE
*         OVERLAYS. AN LFN TABLE IS GENERATED SO SKELGEN CAN ECHO 
*         WHICH LFNS ARE TO RECEIVE OVERLAYS. 
  
          PURGMAC OVLAY 
  
          MACRO  OVLAY,NAME,L1,L2,OVN 
          LOCAL  ENDLFN 
          LOCAL  ENDOVL 
          LOCAL  ENDFPRFX 
          LOCAL  ENDLPRFX 
 OVL.ACT  SET    1           SET INDICATOR FOR -SOME OVLAY ACTIVE-
 NUM.TRAP SET    0
 LIB.ACT  SET    0
 PRST.ACT SET    0           NO PRESET ACTIVE THIS OVERLAY...YET
 OVL00    IFC    NE, L1 
 OVL00    IFEQ   L1,0 
 OVL00    IFEQ   L2,0 
 OVN1     IFC    NE, OVN
 NOL      SET    OVN
 OVN1     ELSE
 NOL      SET    0+1
 OVN1     ENDIF 
 LFN      MICRO  1,, NAME 
          VFD    12/T.LFN,30/0,18/ENDLFN-*
          DATA   C*"LFN"* 
 ENDLFN   BSS    0
 OVL00    ENDIF 
  
 NOL      SET    NOL-1
          IFLT   NOL,0,1
          ERR    TOO MANY OVERLAYS DEFINED. 
          VFD    12/T.OVL,30/0,18/ENDOVL-*
 CAP      IFC    EQ, L1 
          DATA   C*OVCAP.*
 CAP      ELSE
 OVL00    IFEQ   L1,0 
 OVL00    IFEQ   L2,0 
 NO       DECMIC NOL,3
          DATA   C*OVERLAY("LFN",_L1,_L2,OV="NO")*
 OVL00    ELSE
          DATA   C*OVERLAY("LFN",_L1,_L2)*
 OVL00    ENDIF 
 CAP      ENDIF 
 ENDOVL   BSS    0           MARKS END OF OVL TABLE 
          VFD    12/T.FPRFX,30/0,18/ENDFPRFX-*
          DATA   C*_NAME* 
 ENDFPRFX BSS    0           MARKS END OF FPRFX TABLE 
          VFD    12/T.LPRFX,30/0,18/ENDLPRFX-*
          DATA   C*L_NAME*
 ENDLPRFX BSS    0           MARKS END OF LPRFX TABLE 
          ENDM
          SPACE  4,10 
**        PRESET - MACRO TO PRESET UNUSED WORDS OF CORE.
* 
*         PRESET VALUE
* 
*         VALUE = 60 BIT INTEGER VALUE TO BE USED FOR PRESETING.
* 
*              THIS MACRO GIVES A VALUE TO THE LOADER WHICH LOADER WILL 
*         USE TO PRESET UNUSED WORDS IN THE OVERLAY.  THERE CAN BE AT 
*         MOST ONE PRESET MACRO FOR EACH OVERLAY. 
  
          PURGMAC PRESET
  
 PRESET   MACRO  VALUE
          LOCAL  ENDPRST
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          IFNE   PRST.ACT,0,1 
          ERR    MORE THAN ONE PRESET MACRO ACTIVE THIS OVERLAY 
 PRST.ACT SET    1
          VFD    12/T.PRST,30/0,18/ENDPRST-*
          CON    VALUE
 ENDPRST  BSS    0           MARKS END OF PRESET TABLE
          ENDM
          SPACE  4,10 
**        SUBST - MACRO TO SUBSTITUTE ONE ENTRY POINT FOR ANOTHER.
* 
*         SUBST  MINE,YOURS 
* 
*         MINE = ENTRY POINT NAME TO BE USED. 
*         YOURS = ENTRY POINT NAME TO BE REPLACED.
* 
*              THIS MACRO TELLS LOADER THAT ALL REFERENCES TO *YOURS* 
*         ENTRY POINT SHOULD BE MAPPED TO *MINE*.  THE SUBSTITUTION IS
*         IN EFFECT UNTIL END-OF-LOAD.  THE ENTRY POINT CAN BE
*         REACTIVATED BY USING THE *UNIGNORE* MACRO OR ANOTHER *SUBST*
*         (SUBST YOURS,YOURS).
  
          PURGMAC SUBST 
  
 SUBST    MACRO  MINE,YOURS  SUBSTITUTE MY EP FOR YOURS 
          LOCAL  ENDSUBST 
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.SUBST,30/0,18/ENDSUBST-*
          DATA   C*_YOURS*
          DATA   C*_MINE* 
 ENDSUBST BSS    0           MARKS END OF SUBST TABLE 
          ENDM
          SPACE  4,10 
**        TRAP - MACRO TO TRAP REFERENCES TO A GIVEN ENTRY POINT. 
* 
*         TRAP   NAME 
* 
*         NAME = ENTRY POINT NAME TO BE TRAPPED.
* 
*              THIS MACRO SUBSTITUTES *DB$TRAP* FOR A NAMED ENTRY POINT.
*         DB$TRAP IS A ROUTINE IN CDCS THAT IS A DO-NOTHING EXCEPT FOR
*         ISSUING A DIAGNOSTIC. 
*         THE EFFECT OF A TRAP IS FOR THE CURRENT OVERLAY ONLY. SKELGEN 
*         BUILDS A TABLE OF WHICH NAMES WERE TRAPPED AND UN-DOES THE
*         SUBST  AT THE BEGINNING OF THE NEXT OVERLAY. THE TABLE TO 
*         HOLD THESE NAMES IS OF FIXED LENGTH *MAXTRAP*. IF THE TABLE 
*         WOULD OVERFLOW, AN ASSEMBLY ERROR IS PRODUCED.
  
          PURGMAC TRAP
  
 TRAP     MACRO  NAME 
 NAME     BECOMES  DB$TRAP
          ENDM
          SPACE  4,10 
**        UNIGNORE - MACRO TO REMOVE THE EFFECT OF SUBST/IGNORE.
* 
*         UNIGNORE NAME 
* 
*         NAME = ENTRY POINT NAME TO BE REINSTATED. 
* 
*              THIS MACRO SUBSTITUTES A NAME FOR ITSELF TO REMOVE THE 
*         EFFECT OF ANY PREVIOUS SUBST/IGNORE OF THAT NAME. IT DOES 
*         NOT CAUSE THE ENTRY POINT TO BE LOADED. 
  
          PURGMAC UNIGNORE
  
 UNIGNORE MACRO  NAME        REMOVE EFFECT OF PREVIOUS IGNORE 
 NAME     BECOMES  NAME      AGAIN
          ENDM
          SPACE  4,10 
**        USE - MACRO TO FORCE LOADING OF AN ENTRY POINT. 
* 
*         USE    NAME 
* 
*         NAME = ENTRY POINT TO BE LOADED INTO THIS OVERLAY.
* 
*              THIS MACRO TELLS LOADER TO UNDO THE EFFECT OF ANY
*         PREVIOUS *OMIT* OF THIS ENTRY POINT AND FORCE THIS ENTRY
*         POINT TO BE LOADED. 
* 
*         NOTE ******** THIS MACRO REDEFINES THE COMPASS PSEUDO-OP. ****
  
 .USE     OPSYN  USE
          PURGMAC USE 
  
 USE      MACRO  EP 
          LOCAL  ENDUSE 
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.USE,30/0,18/ENDUSE-*
          DATA   C*_EP* 
 ENDUSE   BSS    0           MARKS END OF THE USE TABLE 
          ENDM
          SPACE  4,10 
**        USEP - MACRO TO FORCE THE LOADING OF THE NAMED ROUTINE. 
* 
*         USEP   NAME 
* 
*         NAME = PROGRAN NAME TO BE LOADED INTO THIS OVERLAY. 
* 
*              THIS MACRO FORCES THE NAMED ROUTINE (NOT NECESSARILY 
*         THE SAME AS THE ENTRY POINT) TO BE SEARCHED AND LOADED FROM 
*         THE CURRENT LIBRARIES.
  
          PURGMAC USEP
  
 USEP     MACRO  NAME        UNCONDITIONALLY LOAD -NAME- FROM LIB 
          LOCAL  ENDUSEP
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO PRESENT BEFORE THIS TABLE MACRO 
          VFD    12/T.USEP,30/0,18/ENDUSEP-*
          DATA   C*_NAME* 
 ENDUSEP  BSS    0           MARKS END OF USEP TABLE
          ENDM
          SPACE  4
**        WEOF - WRITE EOF ON SKELETON FILE.
* 
*         WEOF
* 
*              THIS MACRO FORCES AN EOF (END-OF-FILE) ON THE SKELETON 
*         FILE AT THE POINT OF OCCURRENCE. NOTE THAT THE COLLECTION OF
*         LOADER DIRECTIVES IGNORES A WEOF MACRO. THUS, THERE WILL STILL
*         BE ONLY ONE L-DECK CONTAINING LOADER DIRECTIVES FOR AN OVCAP
*         OR OVERLAY. 
  
          PURGMAC WEOF
  
 WEOF     MACRO              WRITE EOF ON SKELETON
          LOCAL  ENDWEOF
          VFD    12/T.WEOF,30/0,18/ENDWEOF-*
 ENDWEOF  BSS    0           MARKS END OF WEOF TABLE
          ENDM
 SKELGEN  TITLE  USER DEFINED SKELTON 
**             THE NEXT SECTION DOES A *CALL OF COMDECK *SKELETON*, 
*         WHICH DEFINES THE STRUCTURE OF THE SKELETON TO
*         BE BUILT BY SKELGEN. THIS COMDECK MUST PROVIDE THE LABEL OF 
*         *TBLBEGIN* WHICH MARKS THE BEGINNING OF THE SKELGEN TABLES FOR
*         THIS STRUCTURE. 
  
*CALL SKELETON
  
          END    SKELGEN
