SUBROUTINE DOIT7 C C PURPOSE: CURRENTLY HANDLES 5 COMMANDS FOR: RESTORING CONSTANT C FROM PROGRAM MEMORY (CODE # 120), PROMPTING USER WITH A C VARIABLE LENGTH MESSAGE (CODE # 123), OPENING A FILE FOR LOADING C PROGRAM MEMORY (CODE # 124), LOADING REGISTERS FROM FILE C (CODE # 126), OR WRITING REGISTERS TO FILE (CODE # 127). C C SUBROUTINES REQUIRED: C PUSH -PUSHES HP STYLE REGISTER STACK UP. 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 (DBLEX,X) BYTE DBLEX(8) C C ALL FUNCTIONS PERFORMED HERE ENABLE STACK LIFT C STKLFT=1 I=CMND(1)-119 GOTO(10,8,8,20,30,8,30,30),I C C CALLER MADE MISTAKE, COMMAND NOT HANDLED BY THIS ROUTINE. RETURN C ERROR -2 UNRECOGNIZED COMMAND C 8 ERROR=-2 9 RETURN C C RESTORE INTERNALLY CODED CONSTANT; ONLY EXECUTED UNDER PROGRAM C CONTROL. PUSH STACK UP BEFORE OVERWRITING CURRENT X REGISTER. C 10 IF(STATE.GE.0)GO TO 19 CALL PUSH DO 12 I=1,8 12 DBLEX(I)=CMND(I+1) 19 RETURN C C PROMPT USER AT LUNTI WITH MESSAGE IN CMND(3)-CMND(3+I) WHERE I= BYTE C COUNT = CMND(2) C 20 WRITE(LUNTI,22)(CMND(I),I=3,CMND(2)+2) 22 FORMAT('0',40A1) RETURN C C OPEN FILE ON UNIT # LUNFIL FOR LOADING PROGRAM MEMORY, WRITING REGISTERS C TO FILE, OR READING REGISTERS FROM FILE. FILE SPECIFICATION C ENCODED IN CMND(3)-CMND(3+I) WHERE I=BYTE COUNT=CMND(2). MUST C FORCE FILE SPEC TO ASCIZ FORMAT FOR OPEN STATEMENT. C 30 I=CMND(2) CMND(3+I)=0 C C TO WRITE FILE NEED DIFFERENT OPEN STATEMENT C IF(CMND(1).EQ.127)GO TO 50 OPEN(UNIT=LUNFIL,NAME=CMND(3),TYPE='OLD',CARRIAGECONTROL='LIST') C C SPLIT OFF HERE IF GOING TO READ REGISTERS C IF(CMND(1).EQ.126)GO TO 40 PC=1 C C IF LOAD EXECUTED FROM KEYBOARD (STATE = 0) SET STATE = 2 C IF LOAD EXECUTED FROM PROGRAM (STATE < 0) SET STATE = 3 C IF(STATE.LT.0)GO TO 38 STATE=2 GO TO 39 38 STATE=3 39 RETURN C C READ REGISTERS FROM FILE USING LIST DIRECTED READ. C NOTE: SUBROUTINE RETURN POINTS MAY BE STORED IN REGISTERS 224-255 C (STORED AT R(225)-R(256)), DO NOT LOAD THESE REGISTERS FROM FILE. C 40 READ(LUNFIL,*,END=59,ERR=42)(R(I),I=1,224) GO TO 59 42 ERROR=-3 GO TO 59 C C WRITE REGISTERS TO FILE. PUT ENTRIES 3 PER LINE SEPARATED BY COMMAS. C NOTE: SUBROUTINE RETURN POINTS MAY BE STORED IN REGISTERS 224-255, C DO NOT SAVE THESE REGISTERS TO A FILE (STORED AT R(225)-R(256)). C 50 OPEN(UNIT=LUNFIL,NAME=CMND(3),TYPE='NEW',CARRIAGECONTROL='LIST') WRITE(LUNFIL,52)(R(I),I=1,224) 52 FORMAT(3(E24.17,:',')) C C COMMON EXIT FOR REGISTER I/O -- CLOSE FILE C 59 CLOSE(UNIT=LUNFIL) RETURN END