.
. 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