.
.         PATCH INPUT BLOCK
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
.         LA,U      A1,<BLOCK BUFFER>
.         LMJ       X11,PATCH
.         <RETURN>                      A1 = PATCHED BLOCK
.
PATCH*    LA        A0,IBLEN,A1         LOAD LENGTH OF BLOCK READ
          LR        R2,X11              SAVE RETURN POINT
          AA,U      A0,IBDATA           ADD LENGTH OF BLOCK HEADER
          LA        A3,CDPATCH,X8       LOAD ADDRESS OF PATCH BUFFER
          AA        A0,PBVAL,A3         COMPUTE MAX LENGTH OF PATCHED BLOCK
          BGET      .                   ALLOCATE A BUFFER LONG ENOUGH
          LX,U      X5,,A0              SAVE X5 AS NEW BLOCK POINTER
          LA        A4,IBLEN,A1         LOAD LENGTH OF INPUT BLOCK
          LA,U      A5                  LOAD LENGTH ACCUMULATOR OF OUTPUT BLOCK
          LA,U      A2,IBDATA,X5        A2 = NEW BLOCK POINTER
          LX,U      X6,IBDATA,A1        X6 = OLD BLOCK POINTER
          LXI,U     X6,1                LOAD INCREMENT ON INPUT
          LXI,U     A2,1                LOAD OUTPUT INCREMENT
          AA,U      A3,PBSS             A3 POINTS TO START OF PATCH COMMANDS
          LXI,U     A3,1                SET UP INCREMENT
.
.         PATCH APPLICATION ROUTINE
.
.         EACH TIME THROUGH THIS LOOP APPLIES ONE PATCH COMMAND
.
.         A PATCH COMMAND CONSISTS OF:
.
.         *         <# WORDS TO COPY>,<# WORDS TO DELETE>
.         *         <# WORDS TO ADD>
.                   <WORDS TO BE ADDED>
.
PSP       LA,H1     A0,,A3              LOAD NUMBER TO COPY
          JN        A4,CLORK            SKIP IF OFF THE END
          JZ        A0,NOCOPY           SKIP IF NONE TO COPY
          TG        A0,A4               MORE THAN LEFT IN BLOCK ?
          LA        A0,A4               YES.  COPY REST
          ANA,H1    A4,,A3              SUBTRACT NUMBER REQUESTED
          AA,U      A5,,A0              INCREMENT NUMBER IN NEW BLOCK
          LR,U      R1,,A0              LOAD NUMBER TO COPY
          BT        A2,,*X6             COPY FROM OLD BLOCK TO NEW BLOCK
          TP,XH2    0,A3                END OF CORRECTION STREAM ?
          J         CLORK               YES.  WIND UP
NOCOPY    LA,H2     A0,,A3              LOAD NUMBER TO DELETE
          JN        A4,CLORK            SKIP IF OFF END OF BLOCK
          JZ        A0,NODEL            SKIP IF NONE TO DELETE
          TG        A0,A4               REQUEST TO DELETE MORE THAN REMAIN ?
          LA        A0,A4               YES.  DELETE ALL REMAINING WORDS
          AX,U      X6,,A0              SKIP THE WORDS TO BE DELETED
NODEL     ANA,H2    A4,,*A3             DECREMENT WORDS TO DELETE
          LA        A0,,*A3             LOAD NUMBER OF WORDS TO ADD
          JN        A4,CLORK            STOP IF OFF THE END
          JZ        A0,NOADD            SKIP IF NONE TO ADD
          AA,U      A5,,A0              INCREMENT LENGTH OF NEW BLOCK
          LR,U      R1,,A0              LOAD LENGTH OF BLOCK TO ADD
          BT        A2,,*A3             COPY FROM PATCH BUFFER TO OUTPUT
NOADD     J         PSP                 LOOP UNTIL END
CLORK     LXM,U     A2,,X5              RESET OUTPUT TO START
          LXM,U     X6,,A1              RESET INPUT TO START
          LR,U      R1,IBDATA           LOAD THE BLOCK HEADER LENGTH
          BT        A2,,*X6             COPY BLOCK HEADER
          SA        A5,IBLEN,X5         PUT PATCHED LENGTH IN BUFFER
          BRELP     A1                  RELEASE ORIGINAL BLOCK BUFFER
          LA,U      A1,,X5              REPLACE POINTER WITH PATCHED BUFFER
          LX        X11,R2              RESTORE RETURN POINT
          J         0,X11               RETURN
          END