SUBROUTINE REPLCE C C PURPOSE: REPLACES THE COMMAND CURRENTLY POINTED TO BY PROGRAM COUNTER C WITH A NEW COMMAND PLACED IN /COMAND/ COMMON. C C VARIABLES: C P -COMMON BYTE ARRAY CONTAINING PROGRAM STEPS C PC -COMMON INTEGER VARIABLE POINTING TO CURRENT PROGRAM STEP C CMND -COMMON BYTE ARRAY CONTAINING NEW COMMAND C LENGTH -COMMON INTEGER VARIABLE SET TO # BYTES IN CMND COMMAND C ERROR -COMMON BYTE FLAG FOR ERROR REPORTING C RS -LOCAL BYTE VARIABLE DEFINING CODE # FOR R/S INSTRUCTION (0) C NSTEPS -LOCAL VARIABLE DEFINING CURRENT MAX. # PROGRAM STEPS C LASTPC -LOCAL VARIABLE SET TO CURRENT VALUE OF PC C NEWPC -LOCAL VARIABLE SET TO VALUE OF PC FOR NEXT SEQUENTIAL C PROGRAM STEP AFTER REPLACEMENT HAS BEEN DONE C INC -LOCAL VARIABLE SET TO DIFFERENCE BETWEEN # PROGRAM STEPS C USED BY COMMAND AT PC AND # PROGRAM STEPS REQUIRED TO C HOLD CMND COMMAND C C SUBROUTINES REQUIRED: C STEPPC -INCREMENTS PC TO POINT TO NEXT SEQUENTIAL INSTRUCTION IN C PROGRAM MEMORY C C NOTE: BYTE COUNT OF COMMAND IS ABSOLUTE VALUE OF COMMAND "LENGTH". C IF LENGTH IS POSITIVE, COMMAND IS STILL IN EXTERNAL, TEXT STRING, C FORMAT. IF LENGTH IS NEGATIVE, COMMAND IS IN INTERNAL, CODED, FORMAT. C C SORENSON, 1/81 C COMMON/COMAND/LENGTH,CMND(40) BYTE CMND COMMON/MEMORY/PC,P(1000) INTEGER PC BYTE P COMMON/FLAGS/STATE,ERROR,STKLFT,NEST,ANGLES,RADIX,DIGITS,FLAG(4) BYTE STATE,ERROR,STKLFT,NEST,ANGLES,RADIX,DIGITS,FLAG BYTE RS DATA NSTEPS/1000/,RS/0/ C C CHECK TO MAKE SURE THERE IS SOMETHING IN COMMAND TO WORK WITH, AND THAT C COMMAND HAS BEEN CODED INTO ITS INTERNAL FORMAT. ALL REFERENCES C TO "LENGTH" MUST BE PRECEEDED BY MINUS SIGN TO REFLECT FACT THAT C LENGTH IS NEGATIVE WHILE NORMALLY NEED TO USE POSITIVE BYTE COUNT C OF COMMAND. C IF(LENGTH.GE.0)RETURN C C CURRENTLY REQUIRE LAST STEP TO BE A R/S INSTRUCTION (0), DON'T ALLOW C IT TO BE REPLACED. C IF(PC.EQ.1000)GO TO 26 C C SAVE CURRENT PC, FIND # STEPS IN INSTRUCTION @ PC, DETERMINE # STEPS C THAT MUST BE INSERTED OR DELETED TO REPLACE INSTRUCTION C LASTPC=PC CALL STEPPC INC=(-LENGTH)-(PC-LASTPC) C C SET NEWPC TO POINT AT MEMORY LOCATION FOR NEXT SEQUENTIAL STEP AFTER THE C REPLACEMENT, THEN TAKE CARE OF MANIPULATING MEMORY PRIOR TO REPLACEMENT C NEWPC=LASTPC+(-LENGTH) IF(NEWPC.GT.NSTEPS)GO TO 25 IF(INC)10,30,20 C C FEWER BYTES IN NEW COMMAND, TAKE UP SLACK AND MOVE R/S=0 INTO C END OF MEMORY C 10 DO 15 I=NEWPC,NSTEPS IF(PC.GT.1000)GO TO 14 P(I)=P(PC) PC=PC+1 GO TO 15 14 P(I)=RS 15 CONTINUE GO TO 30 C C MORE BYTES IN NEW COMMAND, MAKE ROOM PROVIDED ALL INSTRUCTIONS THAT C ARE GOING TO BE SHIFTED OUT OF END OF MEMORY ARE R/S COMMANDS. ALSO, C MUST CURRENTLY KEEP R/S INSTRUCTION AT LAST PROGRAM STEP (P(NSTEPS)) C 20 PC=NSTEPS-INC 21 DO 23 I=PC,NSTEPS IF(P(I).NE.RS)GO TO 25 23 CONTINUE 24 GO TO 27 25 PC=LASTPC 26 ERROR=-1 GO TO 40 27 DO 29 I=NEWPC,NSTEPS P(PC+INC)=P(PC) PC=PC-1 29 CONTINUE C C ENOUGH SPACE EXISTS IN PROGRAM MEMORY TO OVERWRITE MEMORY WITH C THE NEW COMMAND C 30 PC=LASTPC DO 35 I=1,-LENGTH P(PC)=CMND(I) 35 PC=PC+1 C C WHEN DONE, PC HAD BETTER EQUAL NEWPC PREVIOUSLY CALCULATED OR ELSE C SOMETHING HAS GONE WRONG C D IF(PC.EQ.NEWPC)GO TO 40 D WRITE(5,100)PC,NEWPC D100 FORMAT(' ERROR IN REPLACEMENT; PC = ',I5,5X,'SHOULD BE = ',I5) 40 RETURN END