SUBROUTINE DOIT3 C C PURPOSE: PERFORMS RELATIONAL TESTS AND SKIPS PROGRAM STEP IF FALSE C (OR REGISTER = 0). IF NOT EXECUTING PROGRAM (STATE = 0), PROGRAM C COUNTER IS NOT ALTERED. EXECUTES INTERNAL COMMAND CODE #'S -81 TO -70 C AND 6 TO 12. C C C SUBROUTINES REQUIRED: C STEPPC -INCREMENTS PROGRAM COUNTER TO POINT AT NEXT SEQUENTIAL PROGRAM C STEP IN MEMORY. C C SORENSON 2/81 C COMMON/FLAGS/STATE,ERROR,STKLFT,NEST,ANGLES,DIGITS,RADIX,FLAG(4) BYTE FLAG,STATE,ERROR,STKLFT,NEST,ANGLES,DIGITS,RADIX COMMON/COMAND/LENGTH,CMND(40) BYTE CMND COMMON/STACK/X,Y,Z,T,XLST DOUBLE PRECISION X,Y,Z,T,XLST COMMON/MEMORY/PC,P(1000) INTEGER PC BYTE P COMMON/REGS/R(256) DOUBLE PRECISION R INTEGER FLSEPC DOUBLE PRECISION DTEMP DATA NREGS/256/,NFLAGS/4/ C C FIRST, DETERMINE 2 POTENTIAL PC'S; NEXT STEP (CURRENT PC) OR SKIP C STEP (INCREMENT PC). IF EXECUTED FROM KEYBOARD, LEAVE PC UNCHANGED C REGARDLESS OF TEST OUTCOME. C I=PC IF(STATE.GE.0)GO TO 3 CALL STEPPC 3 FLSEPC=PC PC=I C C ALL FUNCTIONS ENABLE STACK LIFT C NOW, SEPARATE OUT X/Y RELATIONAL TESTS; CODE #'S -81 TO -70 C STKLFT=1 I=CMND(1)+82 IF(I.LE.0)GO TO 8 IF(I.GT.12)GO TO 6 GOTO(10,12,10,12,10,12,10,12,10,12,10,12),I C C SEPARATE INCREMENT/DECREMENT AND FLAG CHECK COMMANDS; CODE #'S 6 TO 12 C 6 I=CMND(1)-5 IF(I.LE.0.OR.I.GT.7)GO TO 8 C C CMND(2)=FLAG OR REGISTER # IN OFFSET BINARY, SET J TO REFERENCE C #'S FROM 1-256 RATHER THAN -128 TO 127. C J=CMND(2)+129 GOTO(130,130,130,162,160,162,160),I C C CALLER MADE A MISTAKE; COMMAND NOT HANDLED HERE, RETURN ERROR -2 C UNRECOGNIZED COMMAND. C 8 ERROR=-2 RETURN C C SET DTEMP TO COMPARE X TO Y OR TO 0 C 10 DTEMP=Y GO TO 13 12 DTEMP=0.D0 13 GOTO(20,20,30,30,40,40,50,50,60,60,70,70),I C C IF .NE. EXECUTE NEXT STEP C 20 IF(X.EQ.DTEMP)PC=FLSEPC RETURN C C IF .EQ. EXECUTE NEXT STEP C 30 IF(X.NE.DTEMP)PC=FLSEPC RETURN C C IF .GT. EXECUTE NEXT STEP C 40 IF(X.LE.DTEMP)PC=FLSEPC RETURN C C IF .GE. EXECUTE NEXT STEP C 50 IF(X.LT.DTEMP)PC=FLSEPC RETURN C C IF .LT. EXECUTE NEXT STEP C 60 IF(X.GE.DTEMP)PC=FLSEPC RETURN C C IF .LE. EXECUTE NEXT STEP C 70 IF(X.GT.DTEMP)PC=FLSEPC RETURN C C FLAG REFERENCES, MAKE SURE WITHIN BOUNDS (1-NFLAGS; CURRENTLY 1-4) C ELSE SET ERROR -6 ILLEGAL FLAG REFERENCE. C 130 IF(J.LE.NFLAGS)GO TO 133 ERROR=-6 RETURN 133 GOTO(135,140,150),I 135 FLAG(J)=0 RETURN C C SET FLAG C 140 FLAG(J)=1 RETURN C C TEST FLAG-AUTOMATICALLY CLEARS FLAGS 3 AND 4- EXECUTE NEXT STEP IF SET C 150 IF(FLAG(J).EQ.0)PC=FLSEPC IF(J.GT.2)FLAG(J)=0 RETURN C C REGISTER REFERENCES, MAKE SURE WITHIN BOUNDS (1 TO NREGS; CURRENTLY 1 C 1-256), ELSE SET ERROR -3 ILLEGAL REGISTER REFERENCE. FOR INDIRECT C REFERENCES (ENTRY AT STATEMENT 160) USE ONLY ABSOLUTE VALUE OF C INTEGER PORTION OF REGISTER CONTENTS AS POINTER TO CORRECT REGISTER. C NOTE: INDIRECT REGISTER REFERENCE TO REGISTER 0 MEANS ACCESS R(1), C THEREFORE INCREMENT CONTENTS BY 1 TO GET CORRECT ARRAY SUBSCRIPT. C 160 IF(J.GT.NREGS)GO TO 166 J=IABS(INT(SNGL(R(J))))+1 IF(J.GT.NREGS)GO TO 168 GO TO 164 162 IF(J.GT.NREGS)GO TO 166 164 I=I-3 GOTO(170,170,180,180),I 166 ERROR=-3 GO TO 169 168 ERROR=-4 169 RETURN C C DECREMENT AND SKIP IF ZERO C 170 R(J)=R(J)-1.D0 GO TO 181 C C INCREMENT AND SKIP IF ZERO C 180 R(J)=R(J)+1.D0 181 IF(R(J).EQ.0.D0)PC=FLSEPC RETURN END