*DECK SKELGEN 
          IDENT  SKELGEN
 SKELGEN  TITLE  SKELGEN - RELOCATABLE SKELETON GENERATOR.
          COMMENT  RELOCATABLE SKELETON GENERATOR.
          ENTRY  SKELGEN
          B1=1
          SST 
          SPACE  4,10 
***       SKELGEN - RELOCATABLE SKELETON GENERATOR. 
* 
*         C. F. RICHARDS     76/09/18 
*         G. E. LOGG         77/02/29    OVCAP PROCESSING.
*         C. F. RICHARDS     78/11/14    WEOF AND MULTIPLE (0,0). 
*         R. L. MCALLESTER   82/12/12    XFER AND AUTOMATIC OV=N. 
*         C. F. RICHARDS     85/02/07    CAPSULES AND LOAD MAP HEADINGS.
* 
*         CONTROL DATA PROPRIETARY PRODUCT. 
*         COPYRIGHT CONTROL DATA CORP. 1977,1978,1979,1980,1981,1985. 
*         COPYRIGHT CONTROL DATA SYSTEMS, INC. 1992.
          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,
*         CAPSULES, AND STRINGS OF RELOCATABLES.
          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 
*         THE FOLLOWING LIST STATEMENT TURNS OFF 36 PAGES OF COMPASS
*         WITH COMPLEX MACRO DEFINITIONS AND DOCUMENTATION. 
*         IF YOU WANT TO SEE IT, DELETE THE LINE. 
          LIST   -L 
 MACROS   TITLE  MACRO DEFINITIONS
**        MACRO DEFINITIONS.
 KEYW     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
 LITNAME  SPACE  4,10 
**        LITNAME - MACRO TO TRANSLATE A GENERAL NAME INTO A LITERAL
* 
* NEW     LITNAME OLD 
* 
*         NEW = NAME FOR THE MICRO WHICH WILL CONTAIN THE LITERAL 
*         OLD = NAME WHICH THE LITERAL WILL REPRESENT 
* 
*              THIS MACRO IS INTENDED TO BRIDGE THE GAP BETWEEN 
*         A USER-DEFINED NAME WHICH CONTAINS SPECIAL CHARACTERS 
*         AND THE LITERAL FORMAT USED TO REPRESENT NAMES IN WHICH 
*         SPECIAL CHARACTERS OCCUR. 
* 
*         E.G., 
* 
* XYZ     LITNAME DB$FARR 
* ABC     LITNAME SYS.RM
* AAA     LITNAME CDCS2 
* 
*         IS EQUIVALENT TO
* 
* XYZ     MICRO  1,, $DB$$FARR$ 
* ABC     MICRO  1,, $SYS.RM$ 
* AAA     MICRO  1,, CDCS2
* 
  
          PURGMAC LITNAME 
  
          MACRO  LITNAME,NEW,OLD
          LOCAL  CH 
          LOCAL  SPCH 
          LOCAL  TNAMELG
* 
 TNAME    MICRO  1,, OLD
 TNAMELG  MICCNT TNAME
 TNAME    MICRO  1,,
* 
 CH       SET    1
 SPCH     SET    0
* 
 DUP1     DUP    TNAMELG
 TCH      MICRO  CH,1, OLD
* 
          IFC    GE, "TCH" A ,2    IF NOT LESS THAN AN *A*
          IFC    LE, "TCH" 9 ,1    IF NOT GREATER THAN HIGHEST ALPHANUM 
          SKIP   1           NOT A SPECIAL CHARACTER
 SPCH     SET    1           SPECIAL CHAR - DOLLAR SIGNS REQUIRED 
* 
          IFC    EQ, "TCH" $ ,2 
 TNAME    MICRO  1,, "TNAME"_$$ 
          SKIP   1
 TNAME    MICRO  1,, "TNAME"_"TCH"
* 
 CH       SET    CH+1 
 DUP1     ENDD
* 
          IFEQ   SPCH,1,2    IF SPECIAL CHARS IN OLD
 NEW      MICRO  1,, $"TNAME"$
          SKIP   1
 NEW      MICRO  1,, OLD
* 
          ENDM
 MOVE     SPACE  4,10 
**        MOVE - MOVE WHOLE WORDS.
* 
*         MOVE   FA,N,TA
* 
*         ENTRY  *FA* = FROM ADDRESS. 
*                *N*  = NUMBER OF WORDS TO MOVE.
*                *TA* = TO ADDRESS. 
* 
*         CALLS  MOV
* 
*         USES   A - 1, 6 
*                B - 2, 3, 4, 5, 6
*                X - 1, 6 
*                (INCLUDING CALL TO MOV)
  
          PURGMAC MOVE
  
 MOVE     MACRO  FA,N,TA
          R=     B3,FA
          R=     B4,N 
          R=     B5,TA
          RJ     =XMOV
          ENDM
          TITLE  GLOBAL SYMBOL DEFINITIONS. 
          SPACE  4,10 
**        THE FOLLOWING ARE THE TABLE TYPES USED FOR INTERNAL TABLES. 
  
  
 T.CAP    EQU    1112B       CAPSULE TABLE - NAME OF THE CAPSULE
 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.GRP    EQU    1113B       GROUP TABLE - NAME OF THE GROUP
 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 
 T.XFER   EQU    4600B       XFER TABLE - DEFINE TRANSFER ADDRESS 
          SPACE  4,10 
**        OTHER GLOBAL FLAGS AND SYMBOLS. 
  
  
  
 BYTE     EQU    12D         12 BIT BYTE
 CAP.ACT  SET    0           INITIALLY NO CAPSULE MACRO ACTIVE
 CHAR     EQU    6           6 BIT CHAR 
 EOF.ACT  SET    1           INITIALLY AT BEGINNING OF FILE OF SKELETON 
 GRP.ACT  SET    0           INITIALLY NO GROUP MACRO ACTIVE
 IMBUFFLG EQU    1001B       LENGTH OF BUFFER FOR FET *IMAGE* 
 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
 NUM.TRAP SET    0           INITIALLY NO TRAPPED ENTRY POINTS
 OVL.ACT  SET    0           INITIALLY NO OVLAY MACROS ACTIVE 
 PRST.ACT SET    0           INITIALLY NO PRESET MACRO ACTIVE 
 XFER.ACT SET    0           INITIALLY NO XFER MACRO ACTIVE 
          NOREF  CAP.ACT
          NOREF  EOF.ACT
          NOREF  GRP.ACT
          NOREF  LIB.ACT
          NOREF  NOL
          NOREF  NUM.TRAP 
          NOREF  OVL.ACT
          NOREF  PRST.ACT 
          NOREF  XFER.ACT 
          SPACE  4,10 
**        FETS AND BUFFERS. 
  
  
 IMAGE    FILEB  IMBUFF,IMBUFFLG  FET FOR SKELETON FILE 
  
  
          USE    // 
 IMBUFF   BSS    IMBUFFLG    IMAGE FILE BUFFER
          USE    *
          SPACE  4,10 
**        GLOBAL DEFINITIONS. 
  
  
 CURTBL   VFD    60/TBLBEGIN CURRENT SKELGEN TABLE FOR MAIN LOOP
 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 -.......* 
 LPRFX    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. 
*         IT MAY ALSO HAVE AN *XFER* OR *ENTR* TABLE. 
* 
*         THE SECOND TYPE OF PROGRAM IS A DUMMY WHOSE NAME IS CREATED 
*         BY PREFIXING AN L TO THE OVERLAY/OVCAP/CAPSULE NAME.
*         THIS CREATES A BINARY THAT WE HOPE WILL NOT BE REPLACED BY
*         COPYLM. IT IS USED TO HOLD THE LDSET AND XFER TABLES FOR THE
*         THE OVERLAY/OVCAP/CAPSULE.
  
  
 LPRFX    VFD    12/7700B,12/16B,36/0            PRFX 
 N1       DATA   L*NAME*
 DATE     DATA   L*DATE*
 TIME     DATA   L*TIME*
          DATA   10H
          DATA   30HSKELGEN2.2
 LIB      DATA   10HLIB 
          BSSZ   6
          VFD    12/3400B,12/1,36/0              PIDL 
 N2       DATA   L*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 
 D.TBL1   SPACE  4,10 
**        DECISION TABLE FOR PROCESSING SKELGEN TABLES. 
  
  
 D.TBL1   BSS    0                 DECISION TABLE 1 - MAIN JUMP TABLE 
  
          KEYW   T.END,P=END       END OF TABLE PROCESSING
          KEYW   T.FPRFX,P=FPRFX   PROCESS THE FAKE PREFIX TABLE
          KEYW   T.GRP,P=GRP       PROCESS GROUP AND CAPSULE TABLES 
          KEYW   T.INCL,P=INCL     PROCESS THE INCLUDE TABLE
          KEYW   T.LFN,P=LFN       PROCESS NEW OVERLAY LFN
          KEYW   T.LPRFX,P=LPRFX   PROCESS THE L-DECK TABLES
          KEYW   T.NULL,SKELGEN1   IGNORE A NULL TABLE
          KEYW   T.OVL,P=OVL       PROCESS OVERLAY TABLE
          KEYW   T.WEOF,P=WEOF     PROCESS THE WRITING OF AN EOF
          DATA   0                 END OF DECISION TABLE 1
          TITLE  PROCESSING ROUTINES FOR SKELGEN INTERNAL TABLES. 
 P=END    SPACE  4,10 
**        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,10 
**        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 FPRFX NAME. 
  
 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.GRP 
          ZR     X3,P=FPRFX3 IF TYPE GRP
          SX3    X4-T.END 
          ZR     X3,P=FPRFX3 IF TYPE END
          EQ     P=FPRFX1    CHECK THE NEXT 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 DUMMY RELOCATABLE 
          SA6    N2 
          WRITEW IMAGE,LPRFX,LPRFXLG
          WRITER IMAGE,RCL
          EQ     SKELGEN1    BACK TO MAIN LOOP
 P=GRP    SPACE  4,10 
**        P=GRP - PROCESS GROUP AND CAPSULE ENTRIES 
* 
*              THIS SECTION SCANS FROM CURRENT POSITION TO THE NEXT 
*         *WEOF* OR *ENDTBLS*, ACCUMULATING ALL *GROUP* AND *CAPSULE* 
*         DIRECTIVES AND WRITING THEM OUT AT THE FRONT OF THIS FILE OF
*         THE SKELETON. NOTE THIS ASSUMES A GROUP MACRO OCCURS AS THE 
*         FIRST MACRO OF ANY FILE OF THE SKELETON IN WHICH CAPSULES ARE 
*         DEFINED (ENFORCED BY THE GROUP MACRO).
* 
*         ENTRY  (A1) = ADDRESS OF HEADER WORD. 
*                (X1) = CONTENTS OF SKELGEN INTERNAL TABLE HEADER WORD. 
* 
*         EXIT   TO MAIN LOOP (SKELGEN1). 
  
  
 P=GRP    SA5    A1          (A5,X5) = A+C OF CURRENT TABLE HEADER WORD 
          MX0    BYTE 
  
*         COPY GROUP AND CAPSULE DIRECTIVES UNTIL END OR WEOF TBL ENTRY 
  
 P=GRP2   BX4    X0*X5
          LX4    BYTE        (X4) = 60/TYPE 
          SX3    X4-T.END 
          ZR     X3,SKELGEN1 IF AT END OF ALL TABLES (EXIT) 
          SX3    X4-T.WEOF
          ZR     X3,SKELGEN1 IF AT END OF THIS FILE OF SKELETON (EXIT)
          SX3    X4-T.GRP 
          ZR     X3,P=GRP3   IF A GROUP TABLE 
          SX3    X4-T.CAP 
          NZ     X3,P=GRP4   IF NOT A CAPSULE TABLE 
 P=GRP3   SB6    A5          (B6) = FWA OF TABLE TO NULL
          RJ     NULLT       NULL A TABLE 
          WRITEW IMAGE,A5+1,X5-1
          WRITER IMAGE,RCL
 P=GRP4   SB2    X5          (B2) = LENGTH OF CURRENT TABLE 
          ZR     B2,ERR01    IF NO LENGTH, TABLE ERROR
          SA5    A5+B2       (A5,X5) = A+C OF NEXT TABLE HEADER WORD
          EQ     P=GRP2      CHECK NEXT TABLE 
 P=INCL   SPACE  4,10 
**        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 DUMMY RELOCATABLE 
          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,10 
**        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/OVCAP/CAPSULE ARE
*         SCANNED AND THE OPTIONS FOR IT ARE CONSOLIDATED. THIS WILL BE 
*         THE ONLY SET OF LDSET TABLES GENERATED BY SKELGEN FOR THIS
*         OVERLAY/OVCAP/CAPSULE.
* 
*         IF THERE IS AN XFER TABLE FOR THIS OVERLAY, IT IS INCLUDED
*         AT THE END OF THE DUMMY RELOCATABLE.
* 
*         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 DUMMY RELOCATABLE 
          SA7    N2 
          SX7    0
          SA7    N4          ZERO THE NAME FOR TRANSFER POINT TABLE.
          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=LPRF02 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=LPRF03 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=LPRF03 IF NOT THE RIGHT TYPE
          JP     B3          TRANSFER TO PROCESS THIS TYPE TABLE
  
 P=LPRF04 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=LPRF05 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=LPRF02 IF NO MORE TABLES OF THIS TYPE 
          EQ     P=LPRF05 
  
*         HERE TO TRANSFER THE ONE LIB TABLE FOR THIS OVERLAY 
  
 P=LPRF06 SA2    NOLIB       (X2) = 0 IF SHOULD NOT DO LIB TABLES 
          SA5    A1          (A5) = FWA OF LIB TABLE
          NZ     X2,P=LPRF08 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=LPRF07 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=LPRF08 SB6    A5          (B6) = FWA OF LIB TABLE
          RJ     NULLT       NULL THE LIB TABLE 
          EQ     P=LPRF02    GO PROCESS NEXT L-DECK TABLE 
  
 P=LPRF09 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=LPRF07 
  
 P=LPRF10 SA2    N4 
          ZR     X2,P=LPRF11 NO XFER TABLE WAS SPECIFIED FOR OVERLAY. 
  
          SA4    IMAGE+2     GET -IN- POINTER 
          SA3    N4-1        XFER TABLE HEADER
          BX6    X2 
          BX7    X3 
          SA6    X4+1        WRITE XFER POINT NAME
          SA7    X4          WRITE XFER TABLE HEADER
          SX6    X4+2 
          SA6    A4          NEW -IN- POINTER 
  
 P=LPRF11 WRITER IMAGE,RECALL  WRITE THE TABLE
          EQ     SKELGEN1 
  
  
 P=LPRF12 SA2    A1+1        TRANSFER POINT NAME
          SB6    A1          TABLE ADDRESS FOR NULLT
          BX6    X2 
          SA6    N4          SAVE THE TRANSFER POINT NAME 
          RJ     NULLT       NULL THE XFER TABLE
          EQ     P=LPRF02 
 D.TBL2   SPACE  4,10 
**        DECISION TABLE FOR *LDSET* PROCESSING.
  
  
 D.TBL2   BSS    0                 DECISION TABLE 2 - LDSET PROCESSING
  
          KEYW   T.END,P=LPRF10    END OF TABLES CONCLUDE L-DECK PROCESS
          KEYW   T.EPT,P=LPRF04    PROCESS AN ENTRY TABLE 
          KEYW   T.FPRFX,P=LPRF10  FPRFX TABLE CONCLUDES L-DECK PROCESS 
          KEYW   T.GRP,P=LPRF10    GRP TABLE CONCLUDES L-DECK PROCESS 
          KEYW   T.INCL,P=LPRF02   IGNORE AN INCLUDE TABLE
          KEYW   T.LFN,P=LPRF10    LFN TABLE CONCLUDES L-DECK PROCESS 
          KEYW   T.LIB,P=LPRF06    SPECIAL PROCESSING FOR THE LIB TABLE 
          KEYW   T.MAP,P=LPRF09    PROCESS A MAP TABLE
          KEYW   T.NOEPT,P=LPRF04  PROCESS A NO-ENTRY TABLE 
          KEYW   T.NULL,P=LPRF02   IGNORE A NULL TABLE
          KEYW   T.OMIT,P=LPRF04   PROCESS AN OMIT TABLE
          KEYW   T.OVL,P=LPRF10    OVERLAY TABLE CONCLUDES L-DECK PROCES
          KEYW   T.PRST,P=LPRF04   PROCESS A PRESET TABLE 
          KEYW   T.SUBST,P=LPRF04  PROCESS A SUBST TABLE
          KEYW   T.USE,P=LPRF04    PROCESS A USE TABLE
          KEYW   T.USEP,P=LPRF04   PROCESS A USEP TABLE 
          KEYW   T.WEOF,P=LPRF02   IGNORE A WEOF TABLE
          KEYW   T.XFER,P=LPRF12   PROCESS A TRANSFER POINT TABLE 
          DATA   0                 END OF DECISION TABLE 2
 P=OVL    SPACE  4,10 
**        P=OVL - PROCESS OVERLAY/OVCAP 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,10 
**        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. 
 ADDWRDS  SPACE  4,10 
**        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
  
 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) .EQ. 0 IF FOUND A TABLE OF THAT TYPE. 
*                     .NE. 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,10 
**        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,10 
**        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
          SA2    =H*NOLIB*
          BX7    X2 
          =X6    1
          SA6    NOLIB       (NOLIB) = 1 MEANS DONT MAKE LIB TABLES 
          SA7    LIB         PUT *NOLIB* INTO PREFIX TABLES 
          EQ     EXIT.
 MOV      SPACE  4,10 
**        MOV - ROUTINE TO MOVE WHOLE WORDS.
* 
*         ENTRY  (B3) = FROM ADDRESS. 
*                (B4) = WORD COUNT TO BE MOVED. 
*                (B5) = TO ADDRESS. 
* 
*         EXIT   WORDS MOVED. 
* 
*         USES   X - 1, 6 
*                B - 2, 4, 6
*                A - 1, 6 
  
  
 MOV1     SB4    B4+B2       UPDATE TO NEXT INDEX TO MOVE 
          SA1    B3+B4       FETCH NEXT WORD FROM FROMADDR + INDEX
          BX6    X1 
          SA6    B5+B4       STORE THIS WORD AT TOADDR + INDEX
          NE     B4,B6,MOV1  IF NOT REACHED LAST INDEX TO MOVE
  
 MOV      SUBR               ENTRY/EXIT 
          EQ     B3,B5,EXIT. IF FROMADDR = TOADDR 
          LE     B4,EXIT.    IF WORD COUNT LE 0 
          GT     B3,B5,MOV2  IF FROMADDR < TOADDR, FORWARD MOVE 
          =B2    -1          INDEX CHANGES BY -1 FOR REVERSE MOVE 
          SB6    B0          LAST INDEX TO MOVE IS 0 FOR REVERSE MOVE 
          EQ     MOV1        GO MOVE THE WORDS
  
 MOV2     =B2    1           INDEX CHANGES BY 1 FOR FORWARD MOVE
          =B6    B4-1        LIMIT FOR FORWARD MOVE IS COUNT - 1
          =B4    -1          INDEX WILL START AT 0 AND RISE TO LIMIT
          EQ     MOV1        GO MOVE THE WORDS
 NULLT    SPACE  4,10 
**        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.
 TSUBST   SPACE  4,10 
**        TSUBST - PROCESS A TEMPORARY SUBSTITUTE TABLE.
* 
*              THIS ROUTINE BUILDS AND USES A TABLE OF TEMPORARY
*         SUBSTITUTES IN THE CURRENT OVERLAY/OVCAP/CAPSULE.  FIRST THE T
*         EMPTIED AND A *SUBST A,A* IS GENERATED FOR EACH TSUBST FROM 
*         THE PREVIOUS OVERLAY/OVCAP/CAPSULE.  THIS IS HOW THE
*         SUBSTITUTE IS MADE TEMPORARY FOR THE CURRENT
*         OVERLAY/OVCAP/CAPSULE ONLY. WE NEXT SCAN THE
*         TABLES FOR THIS OVERLAY/OVCAP/CAPSULE 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 IN THE
*         NEXT OVERLAY/OVCAP/CAPSULE. 
* 
*         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
          TITLE  SKELGEN INTERNAL TABLE MACROS. 
          SPACE  4,10 
**        SKELGEN INTERNAL TABLE MACROS.
* 
* 
*              INTERNAL TABLES FOR SKELGEN ARE GENERATED AFTER THE LABEL
*         *TBLBEGIN*.  EACH MACRO GENERATES A TABLE HEADER WHICH
*         IS FOLLOWED BY THE TABLE INFORMATION.  THE HEADER HAS 
*         THE FOLLOWING 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
* NAME    CAPSULE 
*         ENDTBLS 
*         EPT    NAME 
* NAME    GROUP 
*         IGNORE EP 
*         INCL   ROUTINE-NAME 
*         LIB    (LIB1,LIB2,LIB3,...) 
*         MAP    P,LFN
*         NOEPT  NAME 
*         OMIT   EP 
* NAME    OVCAP  (TEXT) 
* OVLNAME OVLAY  L1,L2,ORG,(TEXT) 
*         PRESET VALUE
*         SUBST  MINE,YOURS 
*         TRAP   EP 
*         UNIGNORE NAME 
*         USE    EP 
*         USEP   ROUTINE-NAME 
*         WEOF
*         XFER   EP 
* 
* 
*         CONSTRAINTS.
* 
*           1.   THERE MUST BE AN OVLAY, OVCAP, OR CAPSULE MACRO ACTIVE 
*                FOR ANY LDECK MACRO TO BE USED.
* 
*           2.   THERE MAY BE AT MOST ONE PRESET MACRO PER OVLAY, 
*                OVCAP, OR CAPSULE. 
* 
*           3.   THERE MAY BE AT MOST ONE LIB MACRO PER OVLAY, OVCAP, 
*                OR CAPSULE.
* 
*           4.   THERE MAY BE AT MOST ONE XFER MACRO PER OVLAY. 
*                NOTE THE USE OF XFER WITH AN OVCAP IS NOT DIAGNOSED. 
* 
*           5.   OVLAY AND OVCAP MACROS CANNOT BE IN THE SAME FILE
*                OF THE SKELETON AS GROUP AND CAPSULE MACROS. 
* 
*           6.   IF GROUP IS USED, IT MUST EITHER BE THE FIRST
*                MACRO IN THAT FILE OF THE SKELETON, OR BE
*                PRECEDED BY ANOTHER GROUP MACRO. 
* 
*           7.   USE OF THE CAPSULE MACRO REQUIRES THAT A GROUP MACRO 
*                PRECEDES IT (NOT NECESSARILY IMMEDIATELY). 
* 
*           8.   OVLAYS AND OVCAPS CAN SPAN FILES OF THE SKELETON.
*                GROUPS AND CAPSULES CANNOT SPAN FILES OF THE SKELETON. 
* 
*           9.   A GROUP MACRO MUST BE FOLLOWED BY A CAPSULE MACRO
*                ENDTBLS, WEOF, OR GROUP.  USE OF INCL OR ANY OF THE
*                LDECK MACROS (MAP, PRESET, ETC.) WILL CAUSE AN ERROR.
* 
*          10.   ANY NUMBER OF LDECK MACROS MAY OCCUR IN EACH OVERLAY,
*                OVCAP, OR CAPSULE.  THEIR OCCURENCES WILL BE CLUSTERED 
*                IN A DECK WHOSE NAME IS *L* CONCATENATED WITH THE
*                FPRFX NAME (E.G., LCDCS2).  IF THE FPRFX NAME IS SEVEN 
*                CHARACTERS LONG, IS *L* CONCATENATED WITH THE LAST SIX 
*                CHARACTERS OF THE FPRFX NAME.  THIS DECK WILL BE 
*                AUTOMATICALLY GENERATED BY SKELGEN, SO USE OF THESE
*                NAMES MUST BE AVOIDED.  ALSO AVOID NAMES OF OVERLAYS,
*                OVCAPS, AND CAPSULES WHICH ARE NOT UNIQUE IN THE 
*                FIRST SIX CHARACTERS.
* 
*          11.   BECOMES AND TRAP MACROS AFFECT ONLY THE CURRENT
*                OVERLAY, OVCAP, OR CAPSULE.  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.  THERE IS A LIMIT (MAXTRAP)
*                TO THE NUMBER OF BECOMES AND TRAP MACROS THAT CAN BE IN
*                EFFECT FOR EACH OVERLAY, OVCAP, AND CAPSULE. 
* 
*           12.  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.
 BECOMES  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 
* 
          IFNE   OVL.ACT,1,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          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
 CAPSULE  SPACE  4,10 
**        CAPSULE - MACRO FOR DEFINING A CAPSULE
* 
* NAME    CAPSULE  (TEXT) 
* 
*         NAME = NAME OF THE CAPSULE. ALSO THE NAME OF THE FIRST PROGRAM
*                OF THE CAPSULE. IT IS PERMISSIBLE THAT THIS NAME DOES
*                NOT MATCH ANY PROGRAM OF THE RELOCATABLES - IN THIS
*                CASE THE DUMMY RELOCATABLE GENERATED BY SKELGEN WILL 
*                SERVE ONLY TO NAME THE CAPSULE.
* 
*         TEXT = CAPSULE DESCRIPTION TO GO IN THE LOAD MAP
* 
* 
*              THIS MACRO GENERATES AN FDL CAPSULE OF THE GIVEN NAME IN 
*         THE CURRENT FDL GROUP. DUE TO A LOADER REQUIREMENT, ALL 
*         GROUP AND CAPSULE DIRECTIVES WILL BE ACCUMULATED AT THE 
*         BEGINNING OF THE LOAD FILE. THIS MACRO RESULTS IN AN
*         (INCL NAME) AND (INCL L_NAME) AT THE CURRENT POSITION IN THE
*         SKEKETON. THIS MACRO IS ONLY ALLOWED IF PRECEDED BY A *GROUP* 
*         MACRO IN THE CURRENT LOAD FILE. 
  
          PURGMAC CAPSULE 
  
          MACRO  CAPSULE,NAME 
          LOCAL  ENDCAP 
          LOCAL  ENDFPRFX 
          LOCAL  ENDLPRFX 
* 
          IFNE   GRP.ACT,1,1 IF NO GROUP MACRO ACTIVE 
          ERR    NO GROUP MACRO ACTIVE FOR THIS CAPSULE 
* 
 CAP.ACT  SET    1
 EOF.ACT  SET    0
 LIB.ACT  SET    0
 PRST.ACT SET    0
* 
 LNAM     LITNAME NAME       CONVERT NAME TO LITERAL IF NECESSARY 
* 
          VFD    12/T.CAP,30/0,18/ENDCAP-*
          DATA   C*CAPSULE("LNAM")* 
 ENDCAP   BSS    0           MARKS END OF CAP TABLE 
* 
          VFD    12/T.FPRFX,30/0,18/ENDFPRFX-*
          DATA   C*NAME*
 ENDFPRFX BSS    0           MARKS END OF FPRFX TABLE 
* 
 LNAME    MICRO  1,6, NAME
* 
          VFD    12/T.LPRFX,30/0,18/ENDLPRFX-*
          DATA   C*L_"LNAME"* 
 ENDLPRFX BSS    0           MARKS END OF LPRFX TABLE 
* 
          ENDM
 ENDTBLS  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 
 .NOL.    IF     DEF,NOL
 NO       DECMIC NOL,3
"LFN"=    EQU    3R"NO" 
 .NOL.    ENDIF 
          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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          VFD    12/T.EPT,30/0,18/2 
          VFD    42/0L_NAME,18/0
* 
          ENDM
 GROUP    SPACE  4,10 
**        GROUP - MACRO FOR DEFINING AN FDL CAPSULE GROUP 
* 
* NAME    GROUP 
* 
*         NAME = GROUP NAME FOR THE FDL CAPSULE DEFINITIONS WHICH FOLLOW
* 
*              THIS MACRO GENERATES A GROUP DIRECTIVE FOR LOADER TO USE 
*         FOR ALL THE CAPSULE DEFINITIONS WHICH FOLLOW (UNTIL *WEOF* OR 
*         THE NEXT GROUP MACRO). A *GROUP* MACRO CALL MUST OCCUR AS THE 
*         FIRST MACRO IN A FILE OF THE SKELETON THAT DEFINES CAPSULES.
*         THIS MACRO MAY NOT BE USED IN A FILE OF THE SKELETON THAT 
*         USES THE OVLAY OR OVCAP MACROS. 
  
          PURGMAC GROUP 
  
          MACRO  GROUP,NAME 
          LOCAL  ENDGRP 
* 
          IFNE   GRP.ACT,1,2 IF NO GROUP ACTIVE 
          IFNE   EOF.ACT,1,1 IF NOT FIRST MACRO IN FILE OF SKELETON 
          ERR    FIRST GROUP IN FILE OF SKELETON MUST BE FIRST MACRO
* 
 GRP.ACT  SET    1
 OVL.ACT  SET    0
 CAP.ACT  SET    0
 EOF.ACT  SET    0
 LIB.ACT  SET    0
 PRST.ACT SET    0
* 
 LNAM     LITNAME NAME       CONVERT NAME TO LITERAL IF NECESSARY 
* 
          VFD    12/T.GRP,30/0,18/ENDGRP-*
          DATA   C*GROUP("LNAM")* 
 ENDGRP   BSS    0           MARKS END OF GRP TABLE 
* 
          ENDM
 IGNORE   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
 INCL     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
* 
          IFNE   OVL.ACT,1,3 IF NO OVERLAY ACTIVE (INCL VALID IN OVL) 
          IFNE   CAP.ACT,1,2 IF NO CAPSULE ACTIVE (INCL VALID IN CAP) 
          IFEQ   GRP.ACT,1,1 IF GROUP ACTIVE (INCL VALID IF NO GRP/OVL) 
          ERR    INCL MUST OCCUR AFTER FIRST CAPSULE MACRO FOR GROUP
* 
 EOF.ACT  SET    0
* 
          VFD    12/T.INCL,30/0,18/ENDINCL-*
          DATA   C*NAME*
 ENDINCL  BSS    0           MARKS END OF THE INCL TABLE
* 
          ENDM
 LIB      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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
          IFEQ   LIB.ACT,1,1 IF ALREADY ONE LIB MACRO THIS OVERLAY
          ERR    MORE THAN ONE LIB MACRO IN THIS OVERLAY
* 
 EOF.ACT  SET    0
 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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          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
 OMIT     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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          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  (TEXT) 
* 
*         NAME = NAME OF CAPSULE TO BE GENERATED. 
* 
*         TEXT = DESCRIPTION OF OVCAP FOR LOAD MAP. 
* 
*              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,TEXT
 NAME     OVLAY  ,,,(TEXT)
          ENDM
 OVLAY    SPACE  4,10 
**        OVLAY - MACRO TO DEFINE START OF NEW OVERLAY/OVCAP. 
* 
* NAME    OVLAY  L1,L2,ORG,(TEXT) 
* 
*         L1  = PRIMARY OVERLAY LEVEL NUMBER. 
*         L2  = SECONDARY OVERLAY LEVEL NUMBER. 
*                NOTE IF L1 AND L2 ARE OMITTED, THIS DEFINES AN OVCAP.
* 
*         ORG = ORIGIN -- AN ENTRY POINT NAME IN A LOWER LEVEL OVERLAY
*                            AT WHICH THIS OVERLAY WILL BE LOADED.
* 
*         TEXT = OVERLAY/OVCAP DESCRIPTION TO GO IN LOAD MAP. 
* 
*              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 OR, IF THE NAME
*         ALREADY HAS SEVEN CHARACTERS, BY PREFIXING AN *L* TO THE
*         THE FIRST SIX CHARACTERS OF THE OVERLAY NAME. 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,ORG,TEXT
          LOCAL  ENDLFN 
          LOCAL  ENDOVL 
          LOCAL  ENDFPRFX 
          LOCAL  ENDLPRFX 
* 
          IFEQ   GRP.ACT,1,1
          ERR    OVLAY/OVCAP ILLEGAL WITHIN A CAPSULE GROUP 
* 
 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
 XFER.ACT SET    0
* 
 OVL00    IFC    NE, L1 
 OVL00    IFEQ   L1,0 
 OVL00    IFEQ   L2,0 
 .NOL.    IF     DEF,NOL
 NO       DECMIC NOL,3
"LFN"=    EQU    3R"NO" 
 .NOL.    ENDIF 
 NOL      SET    -1 
 LFN      MICRO  1,, NAME 
          VFD    12/T.LFN,30/0,18/ENDLFN-*
          DATA   C*"LFN"* 
 ENDLFN   BSS    0
 OVL00    ENDIF 
* 
          IFC    EQ,^_TEXT_^^,2 
 HDRTXT   MICRO  1,,
          SKIP   1
 HDRTXT   MICRO  1,,^ - _TEXT_.^
* 
 NOL      SET    NOL+1
          VFD    12/T.OVL,30/0,18/ENDOVL-*
 CAP      IFC    EQ, L1 
          DATA   C^OVCAP. (NAME)_"HDRTXT"^
 CAP      ELSE
 OVL00    IFEQ   L1,0 
 OVL00    IFEQ   L2,0 
 LFNC     MICCNT LFN
 LFNB     SET    LFNC*6 
 LFNCM    DECMIC LFNC 
          VFD    48/8HOVERLAY(
          VFD    LFNB/"LFNCM"H"LFN" 
          VFD    48/8H,0,0,OV=
          VFD    18/"LFN"=
          VFD    6/1H)
 PC       SET    *P/6 
 PCM      DECMIC PC 
 PCMP1    DECMIC PC+1 
 TXT1     MICRO  1,"PCM",^"HDRTXT"^ 
 TXT2     MICRO  "PCMP1",,^"HDRTXT"^
          VFD    *P/"PCM"H"TXT1"
          DATA   C^"TXT2"^
 OVL00    ELSE
 ORIGIN   IFC    NE, ORG
 LNAM     LITNAME ORG        CONVERT EP NAME TO LITERAL IF NECESSARY
          DATA   C^OVERLAY("LFN",L1,L2,O="LNAM")_"HDRTXT"^
 ORIGIN   ELSE
          DATA   C^OVERLAY("LFN",L1,L2)_"HDRTXT"^ 
 ORIGIN   ENDIF 
 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 
* 
 LNAME    MICRO  1,6, NAME
* 
          VFD    12/T.LPRFX,30/0,18/ENDLPRFX-*
          DATA   C*L_"LNAME"* 
 ENDLPRFX BSS    0           MARKS END OF LPRFX TABLE 
          ENDM
 PRESET   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/OVCAP/CAPSULE.
*         THERE CAN BE AT MOST ONE PRESET MACRO FOR EACH
*         OVERLAY/OVCAP/CAPSULE.
  
          PURGMAC PRESET
  
 PRESET   MACRO  VALUE
          LOCAL  ENDPRST
* 
          IFNE   OVL.ACT,1,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
          IFNE   PRST.ACT,0,1 
          ERR    MORE THAN ONE PRESET MACRO IN THIS OVLAY/OVCAP/CAPSULE 
* 
 PRST.ACT SET    1
 EOF.ACT  SET    0
* 
          VFD    12/T.PRST,30/0,18/ENDPRST-*
          CON    VALUE
 ENDPRST  BSS    0           MARKS END OF PRESET TABLE
* 
          ENDM
 SUBST    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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          VFD    12/T.SUBST,30/0,18/ENDSUBST-*
          DATA   C*YOURS* 
          DATA   C*MINE*
 ENDSUBST BSS    0           MARKS END OF SUBST TABLE 
* 
          ENDM
 TRAP     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 OVLAY/OVCAP/CAPSULE.
*         SKELGEN BUILDS A TABLE OF WHICH NAMES WERE TRAPPED AND UN-DOES
*         EACH SUBST AT THE BEGINNING OF THE NEXT OVLAY/OVCAP/CAPSULE.
*         THE TABLE TO HOLD THESE NAMES IS OF FIXED LENGTH *MAXTRAP*. 
*         IF THE TABLE OVERFLOWS, AN ASSEMBLY ERROR IS PRODUCED.
  
          PURGMAC TRAP
  
 TRAP     MACRO  NAME 
 NAME     BECOMES  DB$TRAP
          ENDM
 UNIGNORE 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
 USE      SPACE  4,10 
**        USE - MACRO TO FORCE LOADING OF AN ENTRY POINT. 
* 
*         USE    NAME 
* 
*         NAME = ENTRY POINT TO BE LOADED INTO THIS OVLAY/OVCAP/CAPSULE 
* 
*              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. ****
  
          PURGMAC USE 
  
 USE      MACRO  EP 
          LOCAL  ENDUSE 
* 
          IFNE   OVL.ACT,1,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          VFD    12/T.USE,30/0,18/ENDUSE-*
          DATA   C*EP*
 ENDUSE   BSS    0           MARKS END OF THE USE TABLE 
* 
          ENDM
 USEP     SPACE  4,10 
**        USEP - MACRO TO FORCE THE LOADING OF THE NAMED ROUTINE. 
* 
*         USEP   NAME 
* 
*         NAME = PROGRAM TO BE LOADED INTO THIS OVLAY/OVCAP/CAPSULE.
* 
*              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,2 IF NO OVERLAY MACRO ACTIVE 
          IFNE   CAP.ACT,1,1 IF NO CAPSULE MACRO ACTIVE 
          ERR    NO OVLAY/OVCAP/CAPSULE PRIOR TO THIS MACRO 
* 
 EOF.ACT  SET    0
* 
          VFD    12/T.USEP,30/0,18/ENDUSEP-*
          DATA   C*NAME*
 ENDUSEP  BSS    0           MARKS END OF USEP TABLE
* 
          ENDM
 WEOF     SPACE  4,10 
**        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
* 
 EOF.ACT  SET    1
 CAP.ACT  SET    0
 GRP.ACT  SET    0
* 
          VFD    12/T.WEOF,30/0,18/ENDWEOF-*
 ENDWEOF  BSS    0           MARKS END OF WEOF TABLE
* 
          ENDM
 XFER     SPACE  4,10 
**        XFER - DEFINE AN OVERLAY TRANSFER ADDRESS 
* 
*         XFER   NAME 
* 
*         NAME = ENTRY POINT NAME TO BE USED AS A TRANSFER ADDRESS
* 
*              THIS MACRO DIRECTS LOADER TO USE THE ENTRY POINT AS
*         THE TRANSFER ADDRESS FOR THE OVERLAY. 
  
  
          PURGMAC XFER
  
 XFER     MACRO  NAME 
          LOCAL  ENDXFER
* 
          IFNE   OVL.ACT,1,1
          ERR    NO OVERLAY MACRO ACTIVE BEFORE THIS TABLE MACRO
* 
          IFEQ   XFER.ACT,1,1 
          ERR    MULTIPLE XFER MACROS IN THIS OVERLAY 
* 
 XFER.ACT SET    1
* 
          VFD    12/T.XFER,30/0,18/ENDXFER-*
          DATA   C*NAME*
 ENDXFER  BSS    0           MARKS END OF XFER TABLE
* 
          ENDM
          SPACE  4,10 
**             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. 
  
          LIST   L
  
*CALL SKELETON
  
          END    SKELGEN
