SUBROUTINE DOIT4 C C PURPOSE: EXECUTES MISCELLANEOUS PROGRAM CONTROL FUNCTIONS FOR C INTERNAL CODE #'S -4 TO 5. CODE #'S -4,3-4 CURRENTLY UNASSIGNED C EXECUTE AS "NOP". CODE #'S 1,2 "LBL" COMMANDS ALSO EXECUTE AS C "NOP". C C SPECIAL NOTE ON SUBROUTINE LINKING: SUBROUTINE RETURN POINTS ARE C STORED AS A FIRST-IN LAST-OUT STACK USING GENERAL STORAGE REGISTERS C "R" IN TOP-DOWN FASHION. EACH RETURN POINT IS STORED AS THE C RESULT OF A "GSB" COMMAND WITH THE RETURN POINT BEING LOADED C INTO FIRST FREE SPACE STARTING WITH R(256) AND WORKING DOWN. EACH C RETURN POINT IS AN INTEGER PROGRAM COUNTER, THUS, 4 RETURN POINTS C CAN BE STORED IN ONE DOUBLE PRECISION REGISTER R, AND IS REFERENCED C BY INTEGER ARRAY "IRTN" EQUIVALENCED TO ARRAY "R". "NEST" IN /FLAGS/ C COMMON KEEPS TRACK OF THE SUBROUTINE NESTING LEVEL. IF NEST IS C NEGATIVE, NO RETURN POINTS ARE PENDING AND CONTROL REVERTS TO KEYBOARD. C IF NEST IS >/= 0, NEST + 1 RETURN POINTS ARE PENDING. SINCE NEST IS C A BYTE VARIABLE, THIS MEANS THAT UP TO 128 RETURN POINTS MAY BE C PENDING. ONCE THIS IS EXCEEDED, HOWEVER, NEST GOES NEGATIVE AND C CONTROL WILL RETURN TO KEYBOARD AT NEXT "RTN" INSTRUCTION. C SINCE THE GENERAL STORAGE REGISTERS ARE USED, USER'S SHOULD C AT LEAST AVOID USING R(256) WHICH WILL ALWAYS ALLOW 4 RETURN POINTS C TO BE CORRECTLY STORED (MAXIMUM NESTING LEVEL SUPPORTED BY HP C CALCULATORS). TO ALLOW MAXIMUM # RETURN POINTS PENDING AND AVOID C ALL POSSIBLE PROBLEMS OF ADULTERATING DATA/PROGRAM COUNTERS, DO C NOT USE REGISTER'S 224 TO 255 ( EQUIVALENT TO R(225)-R(256)). C C THIS ROUTINE HANDLES RETURN FROM SUBROUTINE "RTN", WHICH SHOULD C PLACE IRTN(1024-NEST) INTO PC AND DECREMENT NEST. C C C SUBROUTINES REQUIRED: C SHOWX -DISPLAYS CURRENT VALUE IN STACK REGISTER X UNDER DIRECTION C OF "DIGITS" FLAG. 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/MEMORY/PC,P(1000) INTEGER PC BYTE P COMMON/STACK/X,Y,Z,T,XLST DOUBLE PRECISION X,Y,Z,T,XLST COMMON/REGS/R(256) DOUBLE PRECISION R EQUIVALENCE (IRTN,R) DIMENSION IRTN(1024) I=CMND(1)+5 IF(I.LE.0.OR.I.GT.10)GO TO 8 GOTO(9,10,9,20,30,9,9,9,45,40),I C C CALLER MADE MISTAKE, COMMAND NOT HANDLED BY THIS ROUTINE. RETURN C ERROR -2 UNRECOGNIZED COMMAND C 8 ERROR=-2 C C COMMON ENTRY POINT FOR ALL COMMANDS THAT EXECUTE AS A "NOP" C 9 RETURN C C PAUSE -- DISPLAY X. SINCE WAIT REQUEST IS VERY SYSTEM DEPENDENT, AND C REQUIRES SOME SORT OF CLOCK SUPPORT, DON'T ACTUALLY PERFORM C A WAIT FUNCTION. C 10 CALL SHOWX GO TO 100 C C RTN -- IF EXECUTED FROM KEYBOARD (STATE = 0) RESET PROGRAM COUNTER TO 1. C IF EXECUTED FROM PROGRAM (STATE < 0) AND NO PENDING RETURNS C (NEST < 0) RETURN TO KEYBOARD STATE. C IF EXECUTED FROM PROGRAM AND PENDING RETURNS, POP LAST RETURN C POINT FROM STACK AND RESUME EXECUTION. C 20 IF(STATE.LT.0)GO TO 23 PC=1 GO TO 100 23 IF(NEST.LT.0)GO TO 28 I=1024-NEST NEST=NEST-1 PC=IRTN(I) GO TO 100 28 STATE=0 29 GO TO 100 C C R/S -- RUN/STOP. IF EXECUTED FROM KEYBOARD (STATE=0), EXECUTION C RESUMED AT CURRENT PROGRAM COUNTER. C IF EXECUTED FROM PROGRAM (STATE < 0), EXECUTION STOPPED. C 30 IF(STATE.LT.0)GO TO 33 STATE=-1 GO TO 100 33 STATE=0 GO TO 100 C C DSPn, DSP(n) -- SELECT n DIGIT DISPLAY C REMEMBER THAT ALL 'n' BYTE NUMERIC SPECIFIERS ARE IN C OFFSET BINARY FORM...ADD 129 TO RECOVER # IN RANGE 1-256, 128 FOR 0-255 C C DSP(n) -- USE ABSOLUTE VALUE OF INTEGER IN REGISTER n (R(1)-R(256)) C 40 I=CMND(2)+129 I=IABS(INT(SNGL(R(I)))) GO TO 46 45 I=CMND(2)+128 46 IF(I.GE.0.AND.I.LT.16)GO TO 48 C C FLAG ERROR IF REQUESTED ILLEGAL # DIGITS ( <0 OR >15) C ERROR=-3 GO TO 110 48 DIGITS=I GO TO 110 C C 2 POTENTIAL RETURNS; STACK LIFT ENABLED (>0), OR STACK LIFT UNCHANGED C 100 STKLFT=1 110 RETURN END