.
.         EDITING COMMANDS
.
.         GET, PUT, LOAD, STORE, COR, LST, REP, BLK
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
.
          PURE      CODE
.
.
.         THE GET COMMAND
.
GETX*     LX        X5,CDBPC,X8         GET POINTER TO FIRST PARAMETER
          LX        X5,PBLINK,X5        LINK TO FILE NAME PARAMETER
          LA        A1,PBVAL,X5         LOAD FDT POINTER
          LMJ       A2,IOGET            BUILD AN I/O FCT FOR THE FILE
          LX,U      X10,,A0             PUT INPUT FCT ADDRESS IN X10
          LA,U      A0,1                LOAD BLOCK COUNT TO READ
          SA        A0,IOCOUNT,X10      SET TO READ BUT ONE BLOCK
          LA        A0,PBLINK,X5        LOAD LINK TO ADDRESS PARAMETER
          JZ        A0,GETY             SKIP ADDRESS SETUP IF NOT SPECIFIED
          LA        A0,PBVAL,A0         LOAD ADDRESS FROM USER
          SA        A0,IODRAD,X10       PUT ADDRESS IN PACKET
          LA        A0,CDOPTS,X8        LOAD COMMAND OPTIONS
          OR,U      A0,OPTION('S')      TELL INPUT NOT TO FUDGE ADDRESS
          SA        A1,CDOPTS,X8        UPDATE COMMAND OPTIONS
GETY      LMJ       A2,INPUT            CREATE AN INPUT ACTIVITY
          GET       IOBB,X10            GET A BLOCK FROM THE READER
          SA        A1,R7               SAVE THE BLOCK ADDRESS
          ON        DEBUG
          TNZ       IBLAST,A1           TRAP FOR READER LEFT HANGING
          IERR      .                   STOP IF THIS ISN'T LAST BLOCK FROM READ
          OFF       DEBUG
          LA        A0,IOFDT,X10        LOAD FDT ADDRESS
          SA        A0,IBFDT,A1         SAVE FDT OF SOURCE FILE IN BLOCK
          LA        A0,IBSTAT,A1        LOAD READ STATUS OF BLOCK
          JZ        A0,GOTB             GOT A BLOCK OF O.K.
          JE        A0,5,GOTB           ALSO IF PARTIAL MASS STORAGE BLOCK
          JE        A0,4,GOTB           OR TAPE ABNORMAL FRAME COUNT
          JNE       A0,1,NGOTB          OTHERWISE, STATUS ERROR PRECLUDES STORE
.
.         INFORM USER EOF WAS ENCOUNTERED AND NO BLOCK STORED
.
          LA,U      A0,IOPKT,X10        LOAD I/O PACKET (STATUS WILL STILL
          LMJ       X11,IOSEDT          BE HERE FROM INPUT)
NGOTB     BRELP     R7                  RELEASE THE BLOCK BUFFER
          BRELP     X10                 RELEASE THE I/O FCT
          COMPLETE  .                   COMPLETE THE COMMAND
.
.         STORE THE BLOCK ON THE INTERNAL BLOCK FDT
.
GOTB      LX        X5,CDBPC,X8         LOAD FIRST PARAMETER ADDRESS
          LX        X5,PBVAL,X5         LOAD POINTER TO BLOCK FDT
          LMJ       A2,BLSTORE          UPDATE BLOCK ATTACHMENT
          J         NGOTB               FINISH UP COMMAND
/.
.
.         THE PUT COMMAND
.
PUTX*     LX        X5,CDBPC,X8         LOAD PARAMETER POINTER
          LA        A14,CDOPTS,X8       LOAD COMMAND OPTIONS
          LX        X5,PBLINK,X5        LINK TO FILE PARAMETER
          LA        A1,PBVAL,X5         GET FDT ADDRESS
          LMJ       A2,IOGET            BUILD AN I/O FCT FOR WRITING
          LX,U      X9,,A0              GET OUTPUT FCT ADDRESS IN X9
          LMJ       A2,IOGNF            BUILD A FAKE FCT
          LX,U      X10,,A0             USE AS INPUT FCT
          LX        X5,CDBPC,X8         LOAD PARAMETER CHAIN ADDRESS
          LX        X5,PBVAL,X5         LOAD ADDRESS OF BLOCK FDT FOR SOURCE
          LMJ       A2,BLLOAD           GET A BLOCK BUFFER
          JZ        A1,PUTXER           ERROR IF NO BLOCK STORED
          TZ        IOMASS,X9           IS OUTPUT FILE MASS STORAGE ?
          TEP,U     A14,OPTION('Q')     YES.  IS 'Q' OPTION ON ?
          J         NOSOD               YES.  WRITE AT NEXT SEQUENTIAL BLOCK
          LA,U      A0,'D'              LOAD DUPLICATE ADDRESS MODE
          SA        A0,IOOPT,X9         SET DUPLICATE ADDRESS OPTION
NOSOD     LX        X5,CDBPC,X8         LOAD FIRST PARAMETER ADDRESS
          LX        X5,PBLINK,X5        LINK TO SECOND PARAMETER
          LA        A0,PBLINK,X5        LOAD LINK TO THIRD PARAMETER
          JZ        A0,NOADS            ANY ADDRESS SPECIFIED ?
          LA        A0,PBVAL,A0         YES.  LOAD ADDRESS FROM PARAMETER
          SA        A0,IBMSAD,A1        SET BLOCK SOURCE ADDRESS
          LA        A3,CDOPTS,X8        LOAD COMMAND OPTIONS
          OR,U      A3,OPTION('S')      SET IMPLIED 'S' OPTION
          SA        A4,CDOPTS,X8        UPDATE OPTIONS IN PACKET
          LA,U      A3,'D'              LOAD THE DUPLICATE ADDRESS OPTION
          TZ        IOMASS,X9           IS OUTPUT MASS STORAGE ?
          SA        A3,IOOPT,X9         YES.  SET DUPLICATE ADDRESS
NOADS     SNONZ     IBLAST,A1           SET THIS AS LAST BLOCK
          PUT       IOBB,X10            FIRE UP WRITER
          LMJ       A2,OUTPUT           CREATE A WRITER ACTIVITY
          P         IOBB+QL,X9          WAIT FOR WRITE TO FINISH
PUXON     BRELP     X9                  RELEASE OUTPUT FCT
          BRELP     X10                 RELEASE INPUT FCT
          COMPLETE  .                   DONE WITH THIS COMMAND
.
PUTXER    R$DIT     .                   START UP EDITOR
          E$MSG     NOBAL               EDIT MESSAGE FOR NO BLOCK STORED
          LA        A0,IOFDT,X9         LOAD OUTPUT FDT ADDRESS
          LMJ       X11,FIST            EDIT FILE AND STATEMENT
          ZAP       .                   ROADBLOCK THE FILE
          J         PUXON               RELEASE BUFFERS, RETURN
/.
.
.         THE LST COMMAND
.
LSTX*     LA,U      A8                  CLEAR START WORD
          LA,U      A9,0377777          LOAD ASSUMED WORD COUNT
          LX        X5,CDBPC,X8         LOAD POINTER TO FIRST PARAMETER
          LA        A0,PBTYPE,X5        LOAD TYPE OF THE PARAMETER
          JNE       A0,NUMBER,GETXFL    HANDLE MISSING START, END
          LA        A8,PBVAL,X5         LOAD STARTING WORD
          LA,U      A9,1                LOAD ASSUMED COUNT FOR START SPECIFIED
          LX        X5,PBLINK,X5        LINK TO NEXT PARAMETER
          LA        A0,PBTYPE,X5        LOAD TYPE OF SECOND PARAMETER
          JNE       A0,NUMBER,GETXFL    SKIP IF THIS IS THE BLOCK
          LA        A9,PBVAL,X5         LOAD LAST WORD PARAMETER
          LX        X5,PBLINK,X5        LINK TO BLOCK PARAMETER
GETXFL    LX        X5,PBVAL,X5         LOAD POINTER TO FDT
          AA        A9,A8               COMPUTE LAST WORD + 1
          ANA,U     A9,1                COMPUTE LAST WORD TO DUMP
          LMJ       A2,BLLOAD           GET A BLOCK COPY
          JZ        A1,NBS              SKIP IF NO BLOCK STORED
          LA        A0,IBLEN,A1         LOAD LENGTH OF BLOCK
          ANA,U     A0,1                COMPUTE LAST WORD NUMBER
          TLE       A0,A9               DOES LAST WORD RUN OFF END ?
          LA,U      A9,,A0              LOAD ACTUAL LAST WORD
          TLE       A0,A8               IS IT POSSIBLE TO DUMP ANYTHING
          J         TOOSHRT             YES.  GIVE A MESSAGE
          LA        A0,A9               LOAD LAST WORD
          ANA       A0,A8               COMPUTE LENGTH TO DUMP
          AA,U      A0,1                GET ACTUAL WORD COUNT
          SA        A0,IBLEN,A1         PUT LENGTH IN BLOCK
          JZ        A8,NUGATORY         SKIP MOVE IF NOT NEEDED
          LA        A2,A8               LOAD START WORD
          AA,U      A2,IBDATA,A1        COMPUTE START ADDRESS
          LXI,U     A2,1                SET UP INCREMENT
          LR        R1,IBLEN,A1         LOAD LENGTH TO MOVE
          LA,U      A3,IBDATA,A1        LOAD ADDRESS OF BUFFER START
          LXI,U     A3,1                SET UP INCREMENT
          BT        A3,,*A2             SHIFT BLOCK TO START
NUGATORY  SA        A1,A8               SAVE BLOCK ADDRESS
          LMJ       A2,IOGNF            BUILD A FCT
          LX,U      X10,,A0             GET FCT ADDRESS IN X10
          P         PRINTER             ACQUIRE THE PRINTER
          LX,U      X9,PRINTX           GET COMPLETION QUEUE
          LMJ       A2,PRINT            CREATE A PRINT ACTIVITY
          LA        A1,A8               GET THE BUFFER ADDRESS
          LA        A2,IBFDT,A1         LOAD THE FDT SOURCE ADDRESS
          SA        A2,IOFDT,X10        SET FDT ADDRESS IN I/O FCT
          LA        A3,FDEQT,A2         LOAD EQUIPMENT TYPE
          SSL       A3,3                GET JUST CLASS
          TNE,U     A3,2                WORD-ADDRESSABLE MASS STORAGE ?
          SNONZ     IOWAD,X10           YES.  SET WAD INDICATOR
          TG,U      A3,2                IS IT TAPE ?
          SNONZ     IOMASS,X10          NO.  SET MASS STORAGE INDICATOR
          SX        X10,IBIOP,A1        PUT I/O FCT ADDRESS IN PACKET
          SNONZ     IBLAST,A1           MARK THIS AS THE LAST BLOCK
          PUT       IOBB,X10            SEND THE BLOCK
          P         PRINTX              WAIT FOR THE PRINTER
          V         PRINTER             RELEASE THE PRINTER
          BRELP     X10                 RELEASE THE FCT
          COMPLETE  .                   COMPLETE THE OPERATION
.
TOOSHRT   LA        A5,IBLEN,A1         LOAD THE LENGTH
          BRELP     A1                  RELEASE THE BLOCK
          R$DIT     .                   START EDITING
          E$MSG     TOOSM               EDIT THE HEADER
          E$DECV    A5                  EDIT LENGTH
          E$MSGR    .                   COPY REST OF MESSAGE
          LMJ       X11,IST             FILL IN REST OF MESSAGE
          COMPLETE  .                   COMPLETE THE OPERATION
.
NBS       R$DIT     .                   START EDITING
          E$MSG     NODAS               GET THE MESSAGE
          LA        A0,FDIN,X5          LOAD NAME OF BLOCK
          TNE       A0,(' ?INTE')       IS IT THE INTERNAL BLOCK ?
          J         NBS1                SKIP EDITING INTERNAL NAME
          E$SKIP    1                   SKIP A SPACE
          E$FD2     FDIN,X5             EDIT THE NAME
NBS1      E$MSGR    .                   COPY REST OF MESSAGE
          LMJ       X11,IST             COPY STATEMENT NUMBER
          COMPLETE  .                   COMPLETE THE OPERATION
/.
.
.         THE STORE COMMAND
.
STOREX*   LX        X6,CDBPC,X8         LOAD FIRST PARAMETER LINK
          LX        X5,PBVAL,X6         LOAD FDT POINTER FOR INTERNAL BLOCK
          LA        A1,FDBLOCK,X5       LOAD BLOCK ADDRESS
          JZ        A1,NBS              ERROR IF NO BLOCK STORED
          LX        X5,PBLINK,X6        LOAD LINK TO NEXT PARAMETER
          LX        X5,PBVAL,X5         LOAD LINK TO BLOCK FDT
          LMJ       A2,BLSTORE          STORE THE BLOCK COPY
          COMPLETE  .                   ALL DONE
/.
.
.         THE LOAD COMMAND
.
LOADX*    LX        X6,CDBPC,X8         LOAD INTERNAL BLOCK LINK
          LX        X5,PBVAL,X6         LOAD FDT POINTER FOR INTERNAL BLOCK
          LX        X6,PBLINK,X6        LOAD LINK TO SECOND BLOCK
          LA        A1,PBVAL,X6         LOAD FDT ADDRESS
          LA        A1,FDBLOCK,A1       LOAD BLOCK BUFFER ADDRESS
          JZ        A1,NBSR             ERROR IF NO BLOCK STORED
          LMJ       A2,BLSTORE          STORE A COPY OF THE BLOCK
          COMPLETE  .                   COMPLETE THE OPERATION
.
NBSR      LX        X5,PBVAL,X6         LOAD ERROR FDT ADDRESS
          J         NBS                 PROCESS NO BLOCK STORED ERROR
/.
.
.         THE COR COMMAND
.
CORX*     LX        X5,CDBPC,X8         LOAD LINK TO FIRST PARAMETER
          LX        X5,PBVAL,X5         LOAD LINK TO BLOCK FDT
          LA        A1,FDBLOCK,X5       LOAD BLOCK BUFFER ADDRESS
          JZ        A1,NBS              ERROR IF NO BLOCK STORED
          SZ        FDBLOCK,X5          MARK BLOCK RELEASED
          LMJ       X11,PATCH           GENERATE A PATCHED BLOCK
          LX        X5,CDBPC,X8         LOAD PARAMETER ADDRESS
          LX        X5,PBVAL,X5         LINK TO BLOCK FDT
          LMJ       A2,BLSTORE          STORE THE BLOCK
          BRELP     A1                  RELEASE THE PATCHED BUFFER
          COMPLETE  .                   COMPLETE THE COMMAND
/.
.
.         THE REP COMMAND
.
REPX*     LX        X5,CDBPC,X8         LOAD LINK TO FIRST PARAMETER
          LA        A8,PBVAL,X5         LOAD STARTING WORD
          LX        X5,PBLINK,X5        LOAD LINK TO BLOCK DESIGNATOR
          LX        X6,PBLINK,X5        LOAD LINK TO THE DATA BUFFER
          LX        X5,PBVAL,X5         GET ADDRESS OF BLOCK FDT
          LA        A1,FDBLOCK,X5       LOAD BLOCK BUFFER ADDRESS
          JZ        A1,NBS              ERROR IF NO BLOCK STORED
          LA        A0,PBVAL,X6         LOAD LENGTH OF DATA
          AA        A0,A8               ADD STARTING ADDRESS IN BLOCK
          ANA,U     A0,1                SUBTRACT ONE FOR TEST
          TG        A0,IBLEN,A1         WILL IT FIT IN CURRENT BLOCK ?
          J         REPXPND             NO.  WE'LL HAVE TO EXPAND THE BLOCK
.
XPANDN    LA,U      A0,PBSS,X6          LOAD START OF DATA BUFFER
          LXI,U     A0,1                SET UP INCREMENT
          AA,U      A1,IBDATA           COMPUTE DATA BUFFER START
          AA        A1,A8               ADD OFFSET INTO THE BLOCK
          LXI,U     A1,1                GET INCREMENT
          LR        R1,PBVAL,X6         LOAD LENGTH TO MOVE
          BT        A1,,*A0             MOVE DATA TO BUFFER
          COMPLETE  .                   ALL DONE
.
.         EXPAND BUFFER IF NECESSARY
.
REPXPND   LA,U      A4,1,A0             LOAD LENGTH OF DATA SEGMENT
          ANU       A4,IBLEN,A1         A5 = # EXTRA WORDS IN NEW BUFFER
          AA,U      A0,IBDATA+1         ADD LENGTH OF HEADER, WORD SUBTRACTED
          BGET      .                   ALLOCATE A NEW LONGER BUFFER
          LXI,U     A0,1                SET UP INCREMENT
          LA        A3,IBLEN,A1         LOAD DATA LENGTH OF OLD BUFFER
          LR,U      R1,IBDATA,A3        MOVE DATA + HEADER
          SA        A0,FDBLOCK,X5       REPLACE BUFFER IN FDT
          LXI,U     A1,1                SET UP INCREMENT
          SA        A1,A3               SAVE ADDRESS OF OLD BUFFER
          BT        A0,,*A1             MOVE DATA TO NEW BUFFER
          LA,U      A1,(0)              LOAD ADDRESS OF ZERO WORD
          LR        R1,A5               LOAD COUNT OF EXTRA WORDS
          BT        A0,,*A1             MOVE ZEROES TO NEW BUFFER PORTION
          BRELP     A3                  RELEASE THE OLD ONE
          LA        A1,FDBLOCK,X5       RELOAD BLOCK ADDRESS
          SA        A4,IBLEN,A1         PUT CORRECTED LENGTH IN BLOCK BUFFER
          J         XPANDN              PROCESS NORMALLY FROM HERE
/.
.
.         THE BLK COMMAND
.
BLKP*     R$DIT     .                   SET UP THE EDITOR
          REMOVE    PARQUE              GET THE PARAMETER
          LX        X10,PBVAL,A1        GET ADDRESS OF BLOCK FDT
          BRELP     A1                  RELEASE THE PARAMETER
          LA        A0,FDIN,X10         GET NAME OF BLOCK
          TNE       A0,(' ?INTE')       IS IT THE INTERNAL BLOCK ?
          J         BLKALL              YES.  LIST ALL BLOCKS
          LMJ       X9,BLPRT            NO.  LIST INFO FOR THIS ONE
          R$DITX    .                   RELEASE EDITING BUFFER
          J         ICOUT               RETURN TO COMMAND PROCESSING
.
BLKALL    LX,H2     X10,BKLWD           GET BKLIST HEAD
          TNZ       X10                 ANY BLOCKS ON LIST ?
          J         NOBATL              NO.  EDIT SPECIAL MESSAGE
BLALN     LMJ       X9,BLPRT            EDIT MESSAGE FOR THIS BLOCK
          LX        X10,FDLINK,X10      CHAIN TO NEXT BLOCK
          TZ        X10                 LAST ONE ?
          J         BLALN               NO.  EDIT NEXT ONE
          R$DITX    .                   TERMINATE EDITOR
          J         ICOUT               END OF COMMAND
.
NOBATL    E$MSG     NOBATM              EDIT MESSAGE 'NO BLOCKS DECLARED'
          R$PRTX    .                   PRINT AND TERMINATE
          J         ICOUT               END OF COMMAND
.
BLPRT     DL        A0,FDIN,X10         LOAD BLOCK NAME
          TNE       A0,(' ?INTE')       INTERNAL BLOCK ?
          DL        A0,('(CURRENT)')    YES.  FUDGE INTERNAL NAME
          E$FD2     .                   EDIT THE BLOCK'S NAME
          E$SKIP    1                   SKIP AFTER IT
          LX        X8,FDBLOCK,X10      GET POINTER TO DATA BLOCK
          TNZ       X8                  ANY DATA STORED ?
          J         NDSBL               NO.  EDIT SPECIAL MESSAGE
          E$MSG     CONBM               YES.  START EDITING CONTENTS MESSAGE
          E$DECV    IBLEN,X8            EDIT LENGTH OF BLOCK
          E$MSGR    .                   COPY 'WORD'
          LA        A1,IBLEN,X8         LOAD BLOCK LENGTH
          LA,U      A0,'S'              LOAD AN 'S'
          TG,U      A1,2                NEED TO PLURALISE ?
          E$CHAR    .                   YES.  APPEND THE 'S'
          E$MSGR    .                   COPY ' FROM '
          LX        X5,IBFDT,X8         GET ADDRESS OF SOURCE FDT
          LA        A4,FDEQT,X5         LOAD EQUIPMENT TYPE
          SSL       A4,3                RIGHT JUSTIFY IT
          LA        A0,('BLOCK')        GET TEXT FOR TAPE
          TNE,U     A4,3                FASTRAND FORMAT ?
          LA        A0,('SECTOR')       YES.  CALL 'EM SECTORS
          TNE,U     A4,2                ...OR IS IT WORD-ADDRESSABLE ?
          LA        A0,('WORD')         THEN THEY'RE WORDS
          E$FD1     .                   CALL IT AS YOU SEE IT
          LA,U      A5                  CLEAR MULTIPLE PART FLAG
          TLE,U     A4,2                TAPE ?
          J         TAPBE               YES.  CAN'T M-PART TAPE
          LA        A0,IBLEN,X8         LOAD BLOCK LENGTH
          TE,U      A4,3                FASTRAND FORMAT ?
          J         WADBE               NO.  DON'T NEED TO CONVERT SECTORS
          AA,U      A0,27               ROUND FOR COVERED DIVIDE
          DSA       A0,36               RIGHT JUSTIFY IN A0, A1
          DI,U      A0,28               DIVIDE BY UNIVERSAL CONSTANT
WADBE     TG,U      A0,2                M-PART REQUEST ?
          LA        A5,A0               YES.  SAVE NUMBER OF PARTS
          JZ        A5,TAPBE            SKIP PLURALISATION IF SINGULAR
          E$CHAR    'S'                 EDIT A TRAILING 'S'
TAPBE     E$SKIP    1                   SKIP A SPACE AFTER GRANULE DESIGNATION
          E$DECV    IBMSAD,X8           EDIT ADDRESS / BLOCK NUMBER
          JZ        A5,NOTDE            SKIP UPPER BOUND IF SINGLE PART
          E$FD3     (' TO ')            EDIT TO
          LA        A0,IBMSAD,X8        LOAD SOURCE ADDRESS
          AA        A0,A5               COMPUTE UPPER GRANULE
          ANA,U     A0,1                BACK UP BY ONE
          E$DECV    .                   EDIT UPPER GRANULE NAME
NOTDE     E$MSGR    .                   COPY TO FILE NAME
          LMJ       X6,EFILE            EDIT FILE NAME FROM FDT
          E$CHAR    '.'                 TERMINATE THE SENTENCE
          R$PRT     1                   PRINT THE LINE
          J         0,X9                RETURN
.
NDSBL     E$MSG     NDSBM               COPY NO DATA STORED MESSAGE
          R$PRT     1                   PRINT THE MESSAGE
          J         0,X9                RETURN
/.
.
.         BLOCK MANIPULATION ROUTINES
.
.
.         ATTACH BLOCK TO BLOCK FDT
.
.         LX,U      X5,<BLOCK FDT ADDRESS>
.         LA,U      A1,<BLOCK BUFFER>
.         LMJ       A2,BLSTORE
.         <RETURN>
.
BLSTORE   LA        A0,FDBLOCK,X5       LOAD CURRENT BLOCK ADDRESS
          JZ        A0,NORBY            ANY BLOCK TO RELEASE ?
          BRELP     A0                  YES.  RELEASE ANY CURRENT DATA BLOCK
NORBY     LA        A0,IBLEN,A1         LOAD CURRENT BLOCK LENGTH
          AA,U      A0,IBDATA           ADD LENGTH OF BLOCK HEADER
          LR,U      R1,,A0              SAVE LENGTH FOR MOVE LATER
          BGET      .                   ALLOCATE A BUFFER FOR THE BLOCK COPY
          SA        A0,FDBLOCK,X5       ATTACH BUFFER TO FDT
          LXI,U     A0,1                SET UP INCREMENT
          LX,U      X11,,A1             LOAD ADDRESS OF SOURCE BLOCK
          LXI,U     X11,1               GET SOURCE INCREMENT
          BT        A0,,*X11            COPY BLOCK INTO STORED BUFFER
          J         0,A2                RETURN TO CALLING SEQUENCE
.
.
.         LOAD BLOCK FROM BLOCK FDT
.
.         LX,U      X5,<BLOCK FDT ADDRESS>
.         LMJ       A2,BLLOAD
.         <RETURN>                      A1 = <BLOCK BUFFER>
.                                       RETURNS ZERO IF NO BLOCK STORED
.
BLLOAD    LA        A1,FDBLOCK,X5       LOAD STORED BLOCK ADDRESS
          JZ        A1,,A2              RETURN ZERO IF NO BLOCK STORED
          LA        A0,IBLEN,A1         LOAD LENGTH OF STORED BLOCK
          AA,U      A0,IBDATA           ADD LENGTH OF HEADER
          LR,U      R1,,A0              SAVE LENGTH FOR MOVE LATER
          BGET      .                   ALLOCATE A BLOCK
          LA,U      A3,,A0              SAVE BLOCK ADDRESS
          LXI,U     A0,1                SET UP INCREMENT
          LXI,U     A1,1                SET UP SOURCE INCREMENT
          BT        A0,,*A1             COPY BLOCK
          LA,U      A1,,A3              LOAD COPIED BLOCK ADDRESS
          J         0,A2                RETURN TO CALL
.
          PURE      DATA
NOBAL     'NO BLOCK STORED.  PUT IGNORED FOR !'
TOOSM     'BLOCK ONLY CONTAINS ! WORDS !'
NODAS     'BLOCK! HAS NO DATA STORED !'
NDSBM     'HAS NO DATA STORED.!'
CONBM     'CONTAINS ! WORD! FROM ! OF !'
NOBATM    'NO BLOCKS ARE CURRENTLY DEFINED.!'
          END