.
.         PREPARE COMMAND PROCESS
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
.
PRBSZ     EQU       40*28               PREAMBLE BUFFER SIZE
EPTSZ     EQU       3000                ENTRY POINT TABLE SIZE
.
          PURE      CODE
.
PREPARE*  LA,U      A15                 CLEAR BUFFER POINTERS
          LA,U      A11                 FOR ALL BUFFERS
          LX        X9,CDBPC,X8         GET ELEMENT POINTER
          LA        A1,ELFDT,X9         GET FDT ADDRESS
          LMJ       A2,IOGET            BUILD AN I/O FCT
          LX,U      X10,,A0             SAVE FCT ADDRESS IN X10
          LMJ       X6,GELT1            READ IN FILE TABLE INDEX, ELT TABLE
          J         PRBSP               ERROR FROM BSP
          LA,U      A10                 CLEAR ELEMENT SEQUENCE
          LA        A0,A14              GET FCT ADDRESS
          SZ        21,A0               MARK NO ENTRY POINT TABLE
          BGET      EPTSZ               ALLOCATE AN ENTRY POINT BUFFER
          SA        A0,A15              REMEMBER LOCATION
          DSL       A0,18               MOVE TO H1 OF A1
          LXM,U     A1,EPTSZ            LOAD UP LENGTH
          LA        A0,A14              GET FCT POINTER
          rpfept    .                   READ IN ENTRY POINT TABLE
          J         PRBSP               ERROR FROM BSP
          BGET      PRBSZ               ALLOCATE A PREAMBLE I/O BUFFER
          SA        A0,A11              REMEMBER BUFFER LOCATION
          SA,H2     A0,IOACW,X10        PUT BUFFER IN ACCESS WORD
          LA,U      A0,R$               LOAD READ FUNCTION
          SA        A0,IOFUNC,X10       STORE OUT FUNCTION
.
.         SCAN ELEMENTS FOR SELECTED RELOCATABLES
.
PISCAN    AA,U      A10,1               INCREMENT SEQUENCE NUMBER
          SA,H1     A10,IOBB+2,X10      PUT SEQUENCE IN ADD PACKET
          SZ        IOBB+3,X10          CLEAR LAST WORD
          LA        A1,A10              LOAD ELEMENT SEQUENCE
          LA        A0,A14              LOAD FTI POINTER
          etnl      .                   LOOKUP ELEMENT
          J         PITE                ERROR.  PROBABLY END OF ELEMENT TABLE
          TP        EIFLG,A0            DELETED ELEMENT ?
          J         PISCAN              YES.  DELETED ELEMENTS NEED NOT APPLY
          LA        A1,EITYP,A0         LOAD ELEMENT TYPE
          LX,U      X5,,X9              LOAD ELEMENT CLASS ADDRESS
          LX,U      X6,,A0              SAVE FIND ITEM ADDRESS
          TNE,U     A1,TY$REL           IS IT RELOCATABLE ?
          LMJ       X11,SELECT          YES.  IT IS SELECTED ?
          J         PISCAN              NO.  GET ANOTHER ELEMENT
.
.         SET UP PREAMBLE OF THIS ELEMENT
.
          LA        A9,EIPREL,X6        LOAD PREAMBLE LENGTH
          JZ        A9,PISCAN           PUNT IF NO PREAMBLE
          DSL       A6,72               CLEAR FIRST ADDRESS, LAST ADDRESS + 1
          LA        A0,EIPREA,X6        LOAD PREAMBLE FILE ADDRESS
          SA        A0,IODRAD,X10       STORE INTO I/O PACKET
          LMJ       X11,PIREAD          READ IN PREAMBLE (OR PART)
          LX,H2     X2,IOACW,X10        GET BUFFER POINTER
          LR,H2     R4,2,X2             GET NUMBER OF ENTRIES IN E.P. TABLE
          LX,H1     X2,2,X2             LOAD RELATIVE OFFSET OF FIRST
          LXI,U     X2,1                PUT INCREMENT IN X2
          J         PIPROE              PROCESS ENTRIES
.
.         ENTER AN ENTRY POINT IN THE TABLE
.
PIPROS    LMJ       X7,PILOAD           LOAD AN ENTRY POINT
          SA        A0,IOBB,X10         STORE IT OUT
          LMJ       X7,PILOAD           LOAD ANOTHER ENTRY
          SA        A0,IOBB+1,X10       STORE LAST WORD OF NAME
          LA,U      A1,IOBB,X10         LOAD ADD PACKET ADDRESS
          LA        A0,A14              GET TABLE ADDRESS
          eptia     .                   ADD ITEM TO ENTRY POINT TABLE
          J         PRBSP               ERROR FROM BSP
          AX,U      X2,2                POINT TO NEXT ENTRY
PIPROE    JGD       R4,PIPROS           LOOP FOR ALL ENTRIES
          J         PISCAN              PROCESS NEXT ELEMENT
.
.         END PROCESSING:  REWRITE TABLES
.
PITE      TE,U      A0,014              END OF TABLE STATUS ?
          J         PRBSP               NO.  SOME OTHER BSP ERROR
          LA        A0,A14              LOAD FTI ADDRESS
          SZ,H1     9,A0                MARK NO ELEMENT TABLE IN CORE...
          SZ,H2     10,A0               ...EVEN THOUGH THERE REALLY IS ONE...
          SZ,H2     11,A0               ...SO WE DON'T HAVE TO WRITE IT OUT
          wpfept    .                   WRITE UPDATED ENTRY POINT TABLE
          J         PRBSP               BSP ERROR
          LA        A0,A14              RELOAD FTI ADDRESS
          wfti      .                   REWRITE FILE TABLE INDEX
          J         PRBSP               BSP ERROR AT 11'TH HOUR
.
.         COMPLETION.  RELEASE BUFFERS AND BE OFF
.
praway    brelp     x10                 release the I/O FCT
          JZ        A15,PA1             CHECK A15 BUFFER ALLOCATION
          BRELP     A15                 ALLOCATED.  RELEASE IT
PA1       JZ        A11,PA2             A11 BUFFER ALLOCATED ?
          BRELP     A11                 YES.  RELEASE IT ALSO
PA2       LMJ       A1,EBUFRL           RELEASE REST OF BUFFERS
          COMPLETE  .                   COMPLETE THIS COMMAND
.
.         ERROR ROUTINES
.
PIOER     LMJ       X11,IOSEDT          EDIT I/O STATUS
          ZAP       .                   ERROR THE COMMAND
          J         PRAWAY              RELEASE BUFFERS
.
prbsp     la        a2,a14              load BSP FCT addres
          LMJ       X11,BSPERP          EDIT BSP ERROR MESSAGE
          ZAP       .                   ERROR THE COMMAND
          J         PRAWAY              END THE COMMAND
.
.         I/O PAGING ROUTINES
.
PILOAD    LA,U      A0,,X2              GET ADDRESS WE ARE TO LOAD
          TG        A0,A7               WITHIN BUFFER ?
          LMJ       X11,PIREAD          NO.  READ MORE PREAMBLE
          LA,U      A0,,*X2             GET RELATIVE WORD INDEX
          ANA       A0,A6               MAKE RELATIVE TO BUFFER START
          AA,H2     A0,IOACW,X10        ADD START ADDRESS IN CORE
          LA        A0,,A0              LOAD THE REQUESTED WORD
          J         0,X7                RETURN
.
.
PIREAD    LA,U      A0,PRBSZ/28         LOAD BLOCK SIZE
          TG        A0,A9               IS PREAMBLE ACTUALLY SHORTER ?
          LA        A0,A9               YES.  READ IN ONLY REQUIRED LENGTH
          ANA,U     A9,,A0              SUBTRACT LENGTH BEING READ IN
          MSI,U     A0,28               CHANGE LENGTH TO WORDS
          LA        A6,A7               'THE LAST WILL COME FIRST'...
          AA        A7,A0               ...'AND THE FIRST WILL COME LAST'
          SA,H1     A0,IOACW,X10        SET LENGTH IN ACCESS WORD
          IOW$      IOPKT,X10           READ IN THE PREAMBLE
          TZ        IOSTATUS,X10        NORMAL COMPLETION ?
          J         PIOER               OOPS!!  ERROR READING PREAMBLE
          LA        A0,IODRAD,X10       LOAD DRUM ADDRESS
          AA,U      A0,PRBSZ/28         ADD LENGTH IN CASE WE NEED IT AGAIN
          SA        A0,IODRAD,X10       STORE NEW ADDRESS
          J         0,X11               RETURN
.
          END