SUBROUTINE DOIT6 C C PURPOSE: EXECUTES ALL REGISTER MANIPULATION COMMANDS, INTERNAL C CODE #'S 20 TO 37 (REGn TO STO/(n)) C C NOTE: ALL REGISTERS REFERENCED AS # FROM 0-255, HOWEVER ARRAY SUBSCRIPT C POINTING TO CORRECT ARRAY ELEMENT IN R IS REGISTER # +1. TO FURTHER C CONFUSE THIS POINT, REGISTER # ENCODED AS PART OF COMMAND IS PASSED C AS AN OFFSET BINARY NUMBER IN CMND(2) MEANING THAT REGISTER 0 C INTERNALLY CODED AS -128 AND SHOULD REFERENCE R(1). C C SORENSON, 2/81 C COMMON/UNIT/LUNCMD,LUNOUT,LUNTI,LUNFIL COMMON/FLAGS/STATE,ERROR,STKLFT,NEST,ANGLES,DIGITS,RADIX,FLAG(4) BYTE FLAG,STATE,ERROR,STKLFT,ANGLES,DIGITS,RADIX,NEST COMMON/COMAND/LENGTH,CMND(40) BYTE CMND COMMON/STACK/X,Y,Z,T,XLST DOUBLE PRECISION X,Y,Z,T,XLST COMMON/REGS/R(256) DOUBLE PRECISION R DOUBLE PRECISION DTEMP DATA NREGS/256/ C C CHECK FOR VALID CODE # AND REGISTER REFERENCE C I=CMND(1)-19 IF(I.LE.0.OR.I.GT.18)GO TO 8 J=CMND(2)+129 IF(J.GT.NREGS)GO TO 6 GOTO(10,4,20,4,30,4,40,4,50,4,60,4,70,4,80,4,90,4),I C C INDIRECT REGISTER REFERENCE; USE ABSOLUTE VALUE OF INTEGER PART OF C REGISTER CONTENTS AS POINTER. NOTE: J=ARRAY SUBSCRIPT FOR R C AND SHOULD BE 1+ REGISTER # DESIRED, I.E. REFERENCE REGISTER 6, SET J=7. C 4 J=IABS(INT(SNGL(R(J))))+1 IF(J.GT.NREGS)GO TO 5 I=I/2 GOTO(10,20,30,40,50,60,70,80,90),I C C ILLEGAL INDIRECT REGISTER REFERENCE C 5 ERROR=-4 GO TO 9 C C ILLEGAL REGISTER REFERENCE C 6 ERROR=-3 GO TO 9 C C CALLER MADE A MISTAKE; COMMAND NOT HANDLED BY THIS ROUTINE, C RETURN ERROR -2 UNRECOGNIZED COMMAND. C 8 ERROR=-2 9 RETURN C C DISPLAY REGISTER CONTENTS C 10 I=J-1 WRITE(LUNOUT,11)I,R(J) 11 FORMAT('0 R'I3,' = ',G22.15) RETURN C C CLEAR REGISTER C 20 R(J)=0.D0 GO TO 100 C C INTERCHANGE X WITH REGISTER C 30 DTEMP=X X=R(J) R(J)=DTEMP GO TO 100 C C RECALL REGISTER C 40 CALL PUSH X=R(J) GO TO 100 C C STORE X IN REGISTER C 50 R(J)=X GO TO 100 C C STORE X + REGISTER IN REGISTER C 60 R(J)=R(J)+X GO TO 100 C C STORE REGISTER - X IN REGISTER C 70 R(J)=R(J)-X GO TO 100 C C STORE REGISTER * X IN REGISTER C 80 R(J)=R(J)*X GO TO 100 C C STORE REGISTER / X IN REGISTER C 90 R(J)=R(J)/X C C ENABLE STACK LIFT FOR ALL FUNCTIONS EXCEPT DISPLAY REGISTER C 100 STKLFT=1 END