Está en la página 1de 12

$CHAREQU

*--------------------------------------------------------------------------
SUBROUTINE CPUSH
$SEGMENT CALCUL
CHARACTER*8 HSTACK(0:63)
REAL*4 DSTACK(0:63)*8,DBLMEM(0:63)*8,RMEM(0:63),DBLSAV(0:63)*8,RSAV(0:63)
INTEGER*4 STACK(0:63),IMEM(0:63),DMEM(0:1,0:63),MEM(0:63,0:2)
INTEGER*4 ISAV(0:63),DSAV(0:1,0:63),SAV(0:63,0:2),LEVEL,OLEVEL
LOGICAL*2 DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING
EQUIVALENCE (MEM(0,0),IMEM(0),RMEM(0)),(MEM(0,1),DMEM(0,0),DBLMEM(0))
EQUIVALENCE (SAV(0,0),ISAV(0),RSAV(0)),(SAV(0,1),DSAV(0,0),DBLSAV(0))
COMMON /ST/STACK,DSTACK,/HS/HSTACK,/MEMORY/MEM,/SAVE/SAV
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
SAVE /INDICS/,/ST/,/HS/,/MEMORY/,/SAVE/
SAVE
DO 1 I = 63,1,-1
STACK(I) = STACK(I-1)
DSTACK(I) = DSTACK(I-1)
HSTACK(I) = HSTACK(I-1)
1 CONTINUE
LEVEL = LEVEL + 1
IF (LEVEL.GE.8) LEVEL = 7
DOSTAK = .TRUE.
RETURN
*-------------
ENTRY CPOP
DO 2 I = 0,62
STACK(I) = STACK(I+1)
DSTACK(I) = DSTACK(I+1)
HSTACK(I) = HSTACK(I+1)
2 CONTINUE
DOSTAK = .TRUE.
LEVEL = LEVEL - 1
IF (LEVEL.LT.0) LEVEL = 0
STACK(63) = 0
HSTACK(63) = '00000000'
DSTACK(63) = 0.0D0
RETURN
*-------------
ENTRY MCLEAR
DO 3 I = 0,63
MEM(I,0) = 0
MEM(I,1) = 0
MEM(I,2) = 0
3 CONTINUE
DOMEM = .TRUE.
RETURN
*-------------
ENTRY SCLEAR
CALL DOSAVE
DO 4 I = 0,63
STACK(I) = 0
DSTACK(I) = 0.0D0
HSTACK(I) = '00000000'
4 CONTINUE
DOSTAK = .TRUE.
DOALL = .TRUE.
LEVEL = 0
RETURN
END
*--------------------------------------------------------------------------
SUBROUTINE CLCINT
CHARACTER PROGNM*18,MAINLN*54,CRKEY*12,CRLINE*72
CHARACTER DEFINS(98)*5,PGM(1000)*20,TC*1,TCALGN(2)*1
CHARACTER*20 CMDSTR,LSTCMD
REAL PINF,MINF,DPINF*8,DMINF*8,E*8,PI*8,DGAMMA*8
INTEGER*4 LEVEL,OLEVEL,DIDIT,WH3RIS,WHRCLC,DONT
INTEGER*2 PC,RETRNS(100),RLEVEL,GUDBUF,DEFBUF
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR,IASC,ISCAN,IKBF1,IKBF2,IERR
LOGICAL*4 DOCR
LOGICAL*2 PAUSES,CONFRM,DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING
LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS
LOGICAL*2 BUFGUD(32),BUFUSE(32)
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC),(GUDBUF,BUFGUD(1))
COMMON /INTCLC/DIDIT,/NTRVN/ABORT,ESCAPE,INTRPT
COMMON /NAMEPR/ PROGNM,MAINLN,/GNORF9/CRKEY,CRLINE,DOCR
COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,/BUFDEF/DEFBUF
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR,/OMABFL/BUFGUD,BUFUSE
COMMON /PAWS/PAUSES,/INFIN/PINF,MINF,DPINF,DMINF,E,PI,DGAMMA
COMMON /CDEFNS/DEFINS,/PGMS/PGM,/PRGDAT/PC,RETRNS,RLEVEL
COMMON /CNFRM/ CONFRM,/COMMND/CMDSTR,LSTCMD,/LOCALC/WHRCLC,DONT
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
SAVE /KEYGET/,/SHFSTA/,/NTRVN/,/INTCLC/,/OMABLF/,/LOCALC/,/BUFDEF/
SAVE /NAMEPR/,/PAWS/,/PGMS/,/CNFRM/,/CDEFNS/,/INDICS/,/GNORF9/
EXTERNAL SCLEAR,DOSAVE,MCLEAR,CALCQT,WH3RIS
SAVE
*
* WHRCLC = WH3RIS(CALCQT)
DEFBUF = 1
WHRCLC = 0
DOCR = .TRUE.
CRKEY = 'cOPYrIGHT@@@'
PAUSES = .FALSE.
RUNING = .FALSE.
CONFRM = .TRUE.
* DUMPIT = .FALSE.
CMDSTR = ' '
LSTCMD = ' '
CALL CNINIT
LEVEL = 0
OLEVEL = 0
CALL SCLEAR
CALL DOSAVE
CALL MCLEAR
CALL TSTKEY
CALL TSTSCR
* IF (GUDBUF.NE.1) CALL DOBUFS
DOCR = .TRUE.
CRKEY = 'cOPYrIGHT@@@'
CRLINE = 'COPYRIGHT 1983,84,85 Kevin G. Rhoads .'
PROGNM = 'CALC'
MAINLN = 'RPN PROGRAMMING CALCULATOR WRITTEN IN FORTRAN'
DO 1 I = 1,98
DEFINS(I) = ' '
1 CONTINUE
DEFINS(1) = '+ '
DEFINS(2) = '- '
DEFINS(3) = '* '
DEFINS(4) = '/'
DEFINS(5) = '**'
DEFINS(6) = '\'
DEFINS(7) = 'AND'
DEFINS(8) = 'OR'
DEFINS(9) = 'XOR'
DEFINS(10) = 'EQV'
DEFINS(11) = 'SIN'
DEFINS(12) = 'ASIN'
DEFINS(13) = 'COS'
DEFINS(14) = 'ACOS'
DEFINS(15) = 'TAN'
DEFINS(16) = 'ATAN'
DEFINS(17) = 'EXP'
DEFINS(18) = 'LN'
DEFINS(19) = 'POW'
DEFINS(20) = 'LOG'
DEFINS(21) = 'SINH'
DEFINS(22) = 'ASINH'
DEFINS(23) = 'COSH'
DEFINS(24) = 'ACOSH'
DEFINS(25) = 'TANH'
DEFINS(26) = 'ATANH'
DEFINS(27) = 'EXP'
DEFINS(28) = 'LN'
DEFINS(29) = 'POW'
DEFINS(30) = 'LOG'
DEFINS(31) = 'RUN'
DEFINS(32) = ' '
DEFINS(33) = ' '
DEFINS(34) = 'UNDO'
DEFINS(35) = 'AINT'
DEFINS(36) = 'FRACT'
DEFINS(37) = 'ROUND'
DEFINS(38) = 'NEGAT'
DEFINS(39) = 'POP'
DEFINS(40) = 'PUSH'
DEFINS(41) = 'CLEAR'
DEFINS(42) = 'UNDO'
DO 4 I = 43,98
DEFINS(I) = 'CLS'
4 CONTINUE
DEFINS(58) = 'UNDO'
DEFINS(59) = 'POP'
DEFINS(60) = 'MCLEA'
DEFINS(61) = 'UNDO'
DEFINS(70) = 'UNDO'
DEFINS(77) = 'UNDO'
DEFINS(78) = 'PUSH'
DEFINS(79) = 'NULL'
DEFINS(80) = 'UNDO'
DEFINS(96) = 'NULL'
DO 2 I = 1,1000
PGM(I) = 'STOP'
2 CONTINUE
PC = 1
DO 3 I = 1,100
RETRNS(I) = -1
3 CONTINUE
RLEVEL = 1
HELP = .TRUE.
ABORT = .FALSE.
ESCAPE = .FALSE.
INTRPT = .FALSE.
DIDIT = $ABCDEF
RETURN
END
*----------------------------------------------------------------------
SUBROUTINE DSPLAY
CHARACTER HSTACK(0:63)*8,CHR*1
CHARACTER*20 CMDSTR,LSTCMD,TMPSTR,DATTIM*32
REAL*4 RSTACK(0:63),RMEM(0:63),RSAV(0:63)
REAL*8 DSTACK(0:63),DBLMEM(0:63),DBLSAV(0:63)
INTEGER*4 STACK(0:63),IMEM(0:63),DMEM(0:1,0:63),MEM(0:63,0:2)
INTEGER*4 ISAV(0:63),DSAV(0:1,0:63),SAV(0:63,0:2),LEVEL
INTEGER*4 GTYR,GTMO,GTDA,GTHR,GTMIN,GTSEC,GTFR,OLEVEL
LOGICAL*2 DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING,FOO,RUNNGP,DOPRNT
EQUIVALENCE (STACK(0),RSTACK(0))
EQUIVALENCE (MEM(0,0),IMEM(0),RMEM(0)),(MEM(0,1),DMEM(0,0),DBLMEM(0))
EQUIVALENCE (SAV(0,0),ISAV(0),RSAV(0)),(SAV(0,1),DSAV(0,0),DBLSAV(0))
COMMON /ST/STACK,DSTACK,/HS/HSTACK,/MEMORY/MEM,/SAVE/SAV
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
COMMON /COMMND/CMDSTR,LSTCMD,/SCNPR/RUNNGP,DOPRNT
COMMON /TIMES/ GTYR,GTMO,GTDA,GTHR,GTMIN,GTSEC,GTFR
SAVE /TIMES/,/COMMND/,/SCNPR/,/ST/,/HS/,/MEMORY/,/SAVE/
EXTERNAL GETTIM,GOTOXY
SAVE
*
CALL SETPG0
IF (RUNNGP) THEN
OPEN (UNIT=7,FILE='#PR',ERR=22)
CALL RSTPRF
CALL AUTOLF
CHR = LSTCMD(1:1)
IF (CHR.EQ.'+'.OR.CHR.EQ.'-'.OR.CHR.EQ.'$'.OR.(CHR.GE.'0'.AND.CHR.LE.'9')) THEN
IF (.NOT.IFLOAT) WRITE (7,9002) STACK(0),HSTACK(0),DSTACK(0)
IF (IFLOAT) WRITE (7,9005) RSTACK(0),HSTACK(0),DSTACK(0)
ELSE
WRITE (7,'(A,A)') 'COMMAND: ',LSTCMD
IF (IFLOAT) THEN
WRITE (7,9004) RSTACK(0),HSTACK(0),DSTACK(0)
WRITE (7,9004) RSTACK(1),HSTACK(1),DSTACK(1)
ELSE
WRITE (7,9003) STACK(0),HSTACK(0),DSTACK(0)
WRITE (7,9003) STACK(1),HSTACK(1),DSTACK(1)
ENDIF
ENDIF
IF (DOMEM.AND.DOPRNT) THEN
DO 192 I = 0,7
WRITE (7,9001) I,IMEM(I),RMEM(I),DBLMEM(I)
192 CONTINUE
ENDIF
IF (DOSTAK.AND.LEVEL.GT.2.AND.DOPRNT) THEN
WRITE (7,'(A)') 'THE STACK IS ...'
JKL = LEVEL
DO 191 I = 0,JKL
WRITE (7,9000) STACK(I),HSTACK(I),RSTACK(I),DSTACK(I)
191 CONTINUE
ENDIF
WRITE (7,*) ' '
CALL SAVEPR
CLOSE(7,ERR=23)
ENDIF
GOTO 23
22 CONTINUE
WRITE (11,*) 'PRINTER WILL NOT OPEN PROPERLY'
RUNNGP = .FALSE.
CALL PAUSE('PRINTER NOT AVAILABLE')
HELP = .TRUE.
23 CONTINUE
IF (HELP) THEN
CALL CRCLS
DOALL = .TRUE.
DOSTAK = .TRUE.
DOMEM = .TRUE.
ENDIF
FOO = HELP .OR. DOALL
CALL GOTOXY(0,5)
WRITE (*,9000) STACK(0),HSTACK(0),RSTACK(0),DSTACK(0)
CALL GOTOXY(0,7)
WRITE (*,9000) STACK(1),HSTACK(1),RSTACK(1),DSTACK(1)
IF (DOSTAK) THEN
CALL CLLINE(4,12)
CALL GOTOXY(0,9)
J = MIN(7,LEVEL)
IF (HELP.OR.DOALL) THEN
J = 7
HELP = .FALSE.
DOALL = .FALSE.
ENDIF
DO 1 I = 2,J
WRITE (*,9000) STACK(I),HSTACK(I),RSTACK(I),DSTACK(I)
1 CONTINUE
ENDIF
CALL GOTOXY(0,15)
IF (DOMEM) THEN
DO 2 I = 0,7
WRITE (*,9001) I,IMEM(I),RMEM(I),DBLMEM(I)
2 CONTINUE
ELSE
CALL GOTOXY(0,23)
ENDIF
CALL GOTOXY(0,23)
DOMEM = .FALSE.
DOSTAK = .FALSE.
IF (.NOT.FOO) THEN
IF (IFLOAT) THEN
CALL WSAYAT(12,2,60,'Floating point')
ELSE
CALL WSAYAT(12,2,60,'Fixed point')
ENDIF
CALL GOTOXY(0,2)
PRINT *,DATTIM
ELSE
GOTO 3141
ENDIF
RETURN
9000 FORMAT(1X,I12,' $',A8,1X,G17.9,2X,G25.17)
9001 FORMAT(' MEM:',I3,3X,I12,3X,G17.9,3X,G25.17)
9002 FORMAT(1X,'ENTER ->',I12,' $',A8,2X,G25.17)
9003 FORMAT(1X,'RESULT: ',I12,' $',A8,2X,G25.17)
9004 FORMAT(1X,'RESULT: ',G17.9,' $',A8,2X,G25.17)
9005 FORMAT(1X,'ENTER ->',G17.9,' $',A8,2X,G25.17)
*-----------------
ENTRY ECHOCM
3141 CONTINUE
IF (IFLOAT) THEN
CALL WSAYAT(12,2,60,'Floating point')
ELSE
CALL WSAYAT(12,2,60,'Fixed point')
ENDIF
CALL GETTIM(GTYR,GTMO,GTDA,GTHR,GTMIN,GTSEC,GTFR)
WRITE (DATTIM,9987) GTMO,GTDA,GTYR,GTHR,GTMIN,GTSEC
9987 FORMAT (I2,'/',I2.2,'/19',I2,5X,'Time: ',I2,':',I2.2,':',I2.2)
CALL GOTOXY(0,2)
PRINT *,DATTIM
CALL GOTOXY(0,3)
PRINT *,'CMD: ',CMDSTR,' LAST CMD: ',LSTCMD,' ? = HELP'
* LSTCMD = CMDSTR
CALL GOTOXY(0,23)
RETURN
END
*--------------------------------------------------------------------------
SUBROUTINE DOSAVE
CHARACTER*8 HSTACK(0:63),GRONK
REAL*4 RSTACK(0:63),RMEM(0:63),RSAV(0:63)
REAL*8 DBLMEM(0:63),DSTACK(0:63),DBLSAV(0:63)
INTEGER*4 IMEM(0:63),DMEM(0:1,0:63),MEM(0:63,0:2),LEVEL,OLEVEL,REGNO
INTEGER*4 ISAV(0:63),DSAV(0:1,0:63),SAV(0:63,0:2),STACK(0:63)
LOGICAL*2 DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING
EQUIVALENCE (MEM(0,0),IMEM(0),RMEM(0)),(MEM(0,1),DMEM(0,0),DBLMEM(0))
EQUIVALENCE (SAV(0,0),ISAV(0),RSAV(0)),(SAV(0,1),DSAV(0,0),DBLSAV(0))
EQUIVALENCE (STACK(0),RSTACK(0))
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
COMMON /ST/STACK,DSTACK,/HS/HSTACK,/MEMORY/MEM,/SAVE/SAV
SAVE /ST/,/HS/,/MEMORY/,/SAVE/,/INDICS/
SAVE
DO 121 REGNO = 0,63
ISAV(REGNO) = STACK(REGNO)
DBLSAV(REGNO) = DSTACK(REGNO)
121 CONTINUE
OLEVEL = LEVEL
RETURN
END
*--------------------------------------------------------------------------
SUBROUTINE HLPSUB
$SEGMENT MORECALC
CHARACTER*1 TC,TCALGN(2)
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR
INTEGER*2 IASC,ISCAN,IKBF1,IKBF2,IERR
LOGICAL*2 ABORT,ESCAPE,INTRPT,PAUSES
LOGICAL*2 RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC)
COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS
COMMON /NTRVN/ ABORT,ESCAPE,INTRPT,/PAWS/PAUSES
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR
SAVE /KEYGET/,/SHFSTA/,/NTRVN/
CALL CRCLS
PRINT *,'---> ---> --->HELP SUMMARY PAGE (PrtSc for hardcopy) <--- '
PRINT *,'|\ Meaning:| plain | SHIFTED | CONTROL | ALTernate |'
PRINT *,'|Key: |-------------|-------------|------------|-------------|'
PRINT *,'| F1 | + (ADD) | SINe | SINH | RUN |'
PRINT *,'| F2 | - (SUB) | ARCSIN | ARCSINH | null |'
PRINT *,'| F3 | * (MUL) | COSine | COSH | null |'
PRINT *,'| F4 | / (DIV) | ARCCOS | ARCCOSH | UNDO |'
PRINT *,'| F5 | ** (POWER) | TANgent | TANH | TRUNCATE |'
PRINT *,'| F6 | \ (MOD) | ARCTAN | ARCTANH | FRACTional |'
PRINT *,'| F7 | & (AND) | EXP | EXP | ROUND |'
PRINT *,'| F8 | # (OR) | LN | LN | NEGATe |'
PRINT *,'| F9 | XOR | POWER (**)| POWER (**)| POP |'
PRINT *,'| F10 | EQV | LOG common| LOG common| PUSH |'
PRINT *,'|==========|=============|=============|============|=============|'
PRINT *,' '
PRINT *,'|<-LEFTMOST-->| auxilliary keypad |<--RIGHTMOST->|'
PRINT *,'|------|------|---------------------------------|-------|------|'
PRINT *,'|CLEAR | UNDO | ... ALL PRESET TO CLS ... | UNDO | POP | '
PRINT *,'|MCLEA | UNDO | ... ALL PRESET TO CLS ... | UNDO | PUSH | '
PRINT *,'|null | UNDO | ... ALL PRESET TO CLS ... | UNDO | CLS | '
PRINT *,'|======|======|=================================|=======|======|'
WRITE (11,*) 'THERE IS MORE - HIT RETURN WHEN READY. Esc (escape) return to skip it.'
PAUSES = .TRUE.
CALL ISNTRP
IF (ASC.NE.27.AND..NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) THEN
CALL CRCLS
PRINT *,'This is a REVERSE POLISH calculator. STACK depth is 63, and there are'
PRINT *,'63 MEMORIES. Each STACK level has a 32 bit(4 byte) storage, which is'
PRINT *,'interpreted either as an integer or a real. In both cases, it is also'
PRINT *,'displayed as a hexadecimal number. Further, each level has a seperate'
PRINT *,'64 bit(8 byte) storage location, which is a double precision real num-'
PRINT *,'ber. COMMANDS are terminated by a carriage-return (enter). COMMANDS'
PRINT *,'can be upper or lower case. NUMBERS can be entered as INTEGER, REAL'
PRINT *,'or HEXADECIMAL INTEGER (prefix with $)'
PRINT *,'This was intended as a PROGRAMMING calculator, so operations include'
PRINT *,'AND(&), OR(#), XOR, EQV(=); as well as standard arithmetic operations:'
PRINT *,'ADD(+), SUBtract(-), MULtiply(*), DIVide(/), MODulus(\), FACtorial(!).'
PRINT *,'POWer (**), which raises stack1 to the stack0 power.'
PRINT *,'COMMANDS include FIX(integer mode), FLOAT(real mode), CLS(clear and'
PRINT *,'redisplay screen, CLEAR(clear stack), MCLEAr(clear memory), STORE(copy'
PRINT *,'stack to memories), RECAL/ RESTOre(copy memories to stack), and memory'
PRINT *,'commands: STOre/RCL/EXChange/CLR (which are followed by a number'
PRINT *,'indicating which memory; store, recall, & exchange work with'
PRINT *,'top of stack). Stack manipulation commands include: PUSH, POP, SWAP,'
PRINT *,'ROTate (S0->S2, S2->S1, S1->S0) & TOR (opposite of ROT). '
WRITE (11,*) 'THERE IS MORE - HIT RETURN WHEN READY. Esc (escape) return to skip it.'
PAUSES = .TRUE.
CALL ISNTRP
ELSE
GOTO 3001
ENDIF
IF (ASC.NE.27.AND..NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) THEN
CALL CRCLS
PRINT *,'Standard mathematical functions are available: E, PI, GAMMA push the'
PRINT *,'appropriate constants onto the stack, natural logarithm(LN), common'
PRINT *,'log(LOG), EXPonentiation, SINe, COSine, TANgent, arcsin(ASIN),'
PRINT *,'arccos (ACOS), arctan (ATAN and ATAN2), and hyperbolics SINH, COSH,'
PRINT *,'TANH, ASINH, ACOSH, ATANH. In addition, ABSolute value (|), '
PRINT *,'truncation (AINT), FRACTion, and ROUND are available.'
PRINT *,' '
PRINT *,'THERE IS AN UNDO FUNCTION - WHICH WILL UNDO THE LAST OPERATION.'
PRINT *,' '
PRINT *,'Function keys and auxilliary keypad keys can be given definitions.'
PRINT *,'These are IMMEDIATE ACTION keys, in that they cause their function'
PRINT *,'to occur immediately upon being pressed. Certain definitions are'
PRINT *,'already provided. These are shown below & on the LAST help page.'
PRINT *,' '
PRINT *,'|<-LEFTMOST-->| auxilliary keypad |<--RIGHTMOST->|'
PRINT *,'|------|------|---------------------------------|-------|------|'
PRINT *,'|CLEAR | UNDO | ... ALL PRESET TO CLS ... | UNDO | POP | '
PRINT *,'|MCLEA | UNDO | ... ALL PRESET TO CLS ... | UNDO | PUSH | '
PRINT *,'|null | UNDO | ... ALL PRESET TO CLS ... | UNDO | CLS | '
PRINT *,'|======|======|=================================|=======|======|'
WRITE (11,*) 'THERE IS MORE - HIT RETURN WHEN READY. Esc (escape) return to skip it.'
PAUSES = .TRUE.
CALL ISNTRP
ELSE
GOTO 3001
ENDIF
IF (ASC.NE.27.AND..NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) THEN
CALL CRCLS
PRINT *,' THERE are a variety of functions available which are of limited '
PRINT *,'interest or utility; as well as a variety of less common functions.'
PRINT *,'It is possible to inspect the contents of any 4-byte memory location'
PRINT *,'which is located on an even word boundary using @. If @ is '
PRINT *,'followed by an address, the value at that address is pushed onto'
PRINT *,'the stack. Otherwise, the top stack value is used as the address.'
PRINT *,'THERE IS NO ADDRESS VALIDITY CHECKING DONE, address is forced even.'
PRINT *,' '
PRINT *,' A variety of Bessel functions are available: HANKELnnn will compute'
PRINT *,'the complex Hankel fn of the first kind of the complex argument'
PRINT *,'formed using the top of stack as the real part and one down as the'
PRINT *,'imaginary part; results replace the arguments in the same manner.'
PRINT *,'Jnnn, Ynnn compute the 1st and 2nd kind of Bessel fn of order nnn'
PRINT *,'Innn, Knnn compute the corresponding modified Bessel fn. Functions'
PRINT *,'are defined as in Abramowitz & Stegun.'
PRINT *,' '
PRINT *,' LENGFI filename determines the length of the file, extension'
PRINT *,'is assumed .BIN if not explicitly given. CHAIN filename will'
PRINT *,'exit CALC by calling up the executable program specified.'
PRINT *,' '
WRITE (11,*) 'THERE IS MORE - HIT RETURN WHEN READY. Esc (escape) return to skip it.'
PAUSES = .TRUE.
CALL ISNTRP
ELSE
GOTO 3001
ENDIF
IF (ASC.NE.27.AND..NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) THEN
CALL CRCLS
PRINT *,'|\ Meaning:| PLAIN | SHIFTED | CONTROL | ALTernate |'
PRINT *,'|Key: |-------------|-------------|------------|-------------|'
PRINT *,'| F1 | + (ADD) | SINe | SINH | RUN |'
PRINT *,'| F2 | - (SUB) | ARCSIN | ARCSINH | null |'
PRINT *,'| F3 | * (MUL) | COSine | COSH | null |'
PRINT *,'| F4 | / (DIV) | ARCCOS | ARCCOSH | UNDO |'
PRINT *,'| F5 | ** (POWER) | TANgent | TANH | TRUNCATE |'
PRINT *,'| F6 | \ (MOD) | ARCTAN | ARCTANH | FRACTional |'
PRINT *,'| F7 | & (AND) | EXP | EXP | ROUND |'
PRINT *,'| F8 | # (OR) | LN | LN | NEGATe |'
PRINT *,'| F9 | XOR | POWER (**)| POWER (**)| POP |'
PRINT *,'| F10 | EQV | LOG common| LOG common| PUSH |'
PRINT *,'|==========|=============|=============|============|=============|'
PRINT *,' '
PRINT *,'|<-LEFTMOST-->| auxilliary keypad |<--RIGHTMOST->|'
PRINT *,'|------|------|---------------------------------|-------|------|'
PRINT *,'|CLEAR | UNDO | ... ALL PRESET TO CLS ... | UNDO | POP | '
PRINT *,'|MCLEA | UNDO | ... ALL PRESET TO CLS ... | UNDO | PUSH | '
PRINT *,'|null | UNDO | ... ALL PRESET TO CLS ... | UNDO | CLS | '
PRINT *,'|======|======|=================================|=======|======|'
WRITE (11,*) 'THERE IS NO MORE - HIT RETURN WHEN READY.'
ENDIF
PAUSES = .TRUE.
CALL ISNTRP
PAUSES = .FALSE.
ABORT = .FALSE.
INTRPT = .FALSE.
ESCAPE = .FALSE.
3001 CONTINUE
RETURN
END
*--------------------------------------------------------------------------
SUBROUTINE EDPGM
CHARACTER*1 SEPSTR*4,DEFINS(98)*5,PGM(1000)*20,ACHAR,CR,CRLC,CHR
CHARACTER*20 CMDSTR,LSTCMD,CCMD*5,C4CMD*4,C3CMD*3,OTHERS,TSTRNG,LCMD*16
CHARACTER*8 HEXSTR,FSTRIP*20,NULLS*2
INTEGER*4 LEVEL,OLEVEL,LINE,BLINE,IND,END,MID
INTEGER*4 IAND,IOR,NAND,NOR,IXOR,IEQV,NOT
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR,IASC,ISCAN,IKBF1,IKBF2,IERR
INTEGER*2 OLDPC,PC,RETRNS(100),RLEVEL
LOGICAL*2 DSPON,DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING,SNGLST,UPDATE
LOGICAL*2 ABORT,ESCAPE,INTRPT
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR,/NTRVN/ABORT,ESCAPE,INTRPT
COMMON /COMMND/CMDSTR,LSTCMD,/CDEFNS/DEFINS,/PGMS/PGM
COMMON /PRGDAT/PC,RETRNS,RLEVEL
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
SAVE /NTRVN/,/KEYGET/,/COMMND/,/PRGDAT/,/CDEFNS/,/PGMS/,/INDICS/
EXTERNAL IAND,IOR,NAND,NOR,IXOR,IEQV,NOT,REALOF
SAVE
*
1 CONTINUE
CALL CRCLS
UPDATE = .FALSE.
CALL GOTOXY(0,4)
PRINT *,'ESCAPE or Control C to EXIT programming mode'
IF (PC.LT.1.OR.PC.GT.1000) PC = 1
OLDPC = PC
JINST = MAX(1,(PC-8))
KINST = MIN(1000,MAX((PC+8),(JINST+16)))
JINST = MAX(1,MIN((KINST-16),(PC-8)))
2224 CONTINUE
END = KINST - JINST + 1
MID = (KINST + JINST) / 2
IF (UPDATE) THEN
JKL = IABS((PC-MID))
IF ((JKL.GT.5).AND.(PC.GE.6.AND.PC.LE.994)) THEN
UPDATE = .FALSE.
GOTO 2224
ENDIF
BLINE = 6
IF (PC.NE.OLDPC) THEN
DO 200 IND = 0,END
INST = JINST + IND
LINE = BLINE + IND
IF (INST.EQ.OLDPC) THEN
CALL GOTOXY(0,LINE)
SEPSTR = ' : '
PRINT '(I4.4,A,A,A50)',INST,SEPSTR,PGM(INST),' '
ELSEIF (INST.EQ.PC) THEN
CALL GOTOXY(0,LINE)
SEPSTR = '*: '
PRINT '(I4.4,A,A,A50)',INST,SEPSTR,PGM(INST),' '
ENDIF
200 CONTINUE
ENDIF
CALL GOTOXY(0,23)
ELSE
CALL XYGOTO(0,6)
JINST = MAX(1,(PC-8))
KINST = MIN(1000,MAX((PC+8),(JINST+16)))
JINST = MAX(1,MIN((KINST-16),(PC-8)))
DO 2225 INST = JINST,KINST
SEPSTR = ' : '
IF (INST.EQ.PC) SEPSTR = '*: '
PRINT '(I4.4,A,A)',INST,SEPSTR,PGM(INST)
2225 CONTINUE
ENDIF
END = KINST - JINST + 1
MID = (KINST + JINST) / 2
OLDPC = PC
OTHERS = ' '
CALL GTSTR(OTHERS)
CALL STRIP(OTHERS)
IF (SCAN.GE.133.AND.SCAN.LE.189) THEN
I = SCAN - 92
OTHERS = DEFINS(I)
IF (SCAN.EQ.189) INTRPT = .FALSE.
ELSEIF (ASC.EQ.0) THEN
IF (SCAN.GE.$3B.AND.SCAN.LE.$44) THEN
I = SCAN - $3A
OTHERS = DEFINS(I)
ELSEIF (SCAN.GE.84.AND.SCAN.LE.113) THEN
I = SCAN - 73
OTHERS = DEFINS(I)
ELSEIF(SCAN.EQ.77.OR.SCAN.EQ.80) THEN
PC = PC + 1
UPDATE = .TRUE.
IF (PC.GT.1000) THEN
PC = 1
UPDATE = .FALSE.
ENDIF
GOTO 2224
ELSEIF(SCAN.EQ.116) THEN
IF (PC.EQ.1000) PC = -9
PC = PC + 10
IF (PC.GT.1000) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.81) THEN
IF (PC.EQ.1000) PC = -19
PC = PC + 20
IF (PC.GT.1000) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.118) THEN
IF (PC.EQ.1000) PC = -99
PC = PC + 100
IF (PC.GT.1000) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.72.OR.SCAN.EQ.75) THEN
PC = PC - 1
UPDATE = .TRUE.
IF (PC.LT.1) THEN
PC = 1000
UPDATE = .FALSE.
ENDIF
GOTO 2224
ELSEIF(SCAN.EQ.115) THEN
IF (PC.EQ.1) PC = 1010
PC = PC - 10
IF (PC.LT.1) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.73) THEN
IF (PC.EQ.1) PC = 1020
PC = PC - 20
IF (PC.LT.1) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.132) THEN
IF (PC.EQ.1) PC = 1100
PC = PC - 100
IF (PC.LT.1) PC = 1000
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.71) THEN
PC = 1
UPDATE = .FALSE.
GOTO 2224
ELSEIF(SCAN.EQ.119.OR.SCAN.EQ.117) THEN
PC = 1
DO 3000 JKL = 1,1000
PGM(JKL) = 'STOP'
3000 CONTINUE
UPDATE = .FALSE.
IF (SCAN.EQ.117) PC = 1000
GOTO 2224
ELSEIF(SCAN.EQ.79) THEN
PC = 1000
UPDATE = .FALSE.
GOTO 2224
ENDIF
ENDIF
IF (ABORT.OR.ESCAPE.OR.INTRPT) THEN
DOALL = .TRUE.
DOMEM = .TRUE.
DOSTAK = .TRUE.
CALL CRCLS
RETURN
ENDIF
UPDATE = .TRUE.
IF (OTHERS(1:1).EQ.CHAR(0)) GOTO 2224
PGM(PC) = OTHERS
PC = PC + 1
GOTO 2224
END
*--------------------------------------------------------------------
SUBROUTINE SAVEC(WHAT)
CHARACTER*8 HSTACK(0:63),DEFINS(98)*5,PGM(1000)*20
CHARACTER*20 CMDSTR,LSTCMD,WHICH*6,EXT*4,TMPSTR*16
CHARACTER*14 INFILE,OUTFIL,FILEN
REAL*4 RSTACK(0:63),RSAV(0:63),RMEM(0:63)
REAL*8 DBLMEM(0:63),DSTACK(0:63),DBLSAV(0:63)
INTEGER*4 IMEM(0:63),DMEM(0:1,0:63),MEM(0:63,0:2),WHAT,STACK(0:63)
INTEGER*4 ISAV(0:63),DSAV(0:1,0:63),SAV(0:63,0:2),LEVEL,OLEVEL
INTEGER*2 PC,RETRNS(100),RLEVEL
LOGICAL*2 DOSTAK,DOMEM,IFLOAT,HELP,DOALL,RUNING
LOGICAL*2 LOADIT,ABORT,ESCAPE,INTRPT
EQUIVALENCE (STACK(0),RSTACK(0))
EQUIVALENCE (MEM(0,0),IMEM(0),RMEM(0)),(MEM(0,1),DMEM(0,0),DBLMEM(0))
EQUIVALENCE (SAV(0,0),ISAV(0),RSAV(0)),(SAV(0,1),DSAV(0,0),DBLSAV(0))
COMMON /INDICS/DOSTAK,DOMEM,IFLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
COMMON /ST/STACK,DSTACK,/HS/HSTACK,/MEMORY/MEM,/SAVE/SAV
COMMON /FILNAM/INFILE,OUTFIL,/COMMND/CMDSTR,LSTCMD
COMMON /PRGDAT/PC,RETRNS,RLEVEL,/CDEFNS/DEFINS,/PGMS/PGM
COMMON /NTRVN/ ABORT,ESCAPE,INTRPT
SAVE /FILNAM/,/COMMND/,/PGMS/,/PRGDAT/,/CDEFNS/,/INDICS/,/ST/,/HS/
SAVE /NTRVN/,/MEMORY/,/SAVE/
SAVE
DATA EXT/'CLC '/
*
LOADIT = .FALSE.
1 CONTINUE
INTRPT = .FALSE.
TMPSTR = CMDSTR(5:20)
* FILEN = FNAME(TMPSTR,EXT)
CALL FNCHCK(TMPSTR,EXT,FILEN)
IF (INTRPT) THEN
WRITE (11,*) 'FILENAME = ',FILEN,' ABORTING ...'
INTRPT = .FALSE.
RETURN
ENDIF
IF (LOADIT) GOTO 2
OUTFIL = FILEN
OPEN (UNIT=20,FILE=OUTFIL,STATUS='NEW',ERR=9001)
IF (WHAT.EQ.1.OR.WHAT.EQ.2) THEN
WRITE (UNIT=20,FMT=8000,ERR=9002) 'PROG '
PRINT *,'SAVING PROGRAM ...'
WRITE (UNIT=20,FMT=8002) (RETRNS(I),I=1,100),PC,RLEVEL
DO 2001 I = 1,1000,5
WRITE (UNIT=20,FMT=8003,ERR=9002) PGM(I),PGM(I+1),PGM(I+2),PGM(I+3),PGM(I+4)
2001 CONTINUE
ENDIF
IF (WHAT.EQ.1.OR.WHAT.EQ.3) THEN
WRITE (UNIT=20,FMT=8000,ERR=9002) 'DEFINS'
PRINT *,'SAVING DEFINITIONS ...'
DO 2000 I = 1,98,14
WRITE (UNIT=20,FMT=8001,ERR=9002) DEFINS(I),DEFINS(I+1),
1 DEFINS(I+2),DEFINS(I+3),DEFINS(I+4),DEFINS(I+5),DEFINS(I+6),DEFINS(I+7),
2 DEFINS(I+8),DEFINS(I+9),DEFINS(I+10),DEFINS(I+11),DEFINS(I+12),DEFINS(I+13)
2000 CONTINUE
ENDIF
IF (WHAT.EQ.1.OR.WHAT.EQ.4) THEN
WRITE (UNIT=20,FMT=8000,ERR=9002) 'STACK '
PRINT *,'SAVING STACK, MEMORIES &c ...'
PRINT *,'SAVING STACK ...'
DO 2002 I = 0,63
WRITE (UNIT=20,FMT=8010,ERR=9002) STACK(I),HSTACK(I),DSTACK(I)
2002 CONTINUE
PRINT *,'SAVING MEMORIES ...'
DO 2003 I = 0,63
WRITE (UNIT=20,FMT=8011,ERR=9002) I,IMEM(I),RMEM(I),DBLMEM(I)
2003 CONTINUE
PRINT *,'SAVING SAVEREGS ...'
DO 2004 I = 0,63
WRITE (UNIT=20,FMT=8014,ERR=9002) I,ISAV(I),RSAV(I),DBLSAV(I)
2004 CONTINUE
ENDIF
WRITE (UNIT=20,FMT=8013,ERR=9002) 0,0.0,0.0D0
9000 CONTINUE
HELP = .TRUE.
CLOSE (20,ERR=7000)
7000 CLOSE (21,ERR=7001)
7001 RETURN
9001 CONTINUE
CALL CRCLS
PRINT *,'ERROR IN SAVE ATTEMPT - CAN''T OPEN FILE: ',OUTFIL
9002 CONTINUE
CALL CRCLS
PRINT *,'ERROR IN SAVE ATTEMPT - ERROR IN WRITING FILE: ',OUTFIL
GOTO 9000
*
ENTRY LOADC(WHAT)
LOADIT = .TRUE.
GOTO 1
2 CONTINUE
INFILE = FILEN
OPEN (UNIT=21,FILE=INFILE,STATUS='OLD',ERR=9011)
IF (WHAT.EQ.1.OR.WHAT.EQ.2.OR.WHAT.EQ.5) THEN
READ (UNIT=21,FMT=8000,ERR=9012,END=9013) WHICH
IF (WHICH.NE.'PROG ') THEN
BACKSPACE 21
PRINT *,'NO STORED PROGRAM IN FILE'
GOTO 1001
ELSE
PRINT *,'LOADING PROGRAM ...'
ENDIF
READ (UNIT=21,FMT=8002,ERR=9012,END=9013) (RETRNS(I),I=1,100),PC,RLEVEL
DO 3001 I = 1,1000,5
READ (UNIT=21,FMT=8003) PGM(I),PGM(I+1),PGM(I+2),PGM(I+3),PGM(I+4)
3001 CONTINUE
ENDIF
1001 CONTINUE
IF (WHAT.EQ.1.OR.WHAT.EQ.3.OR.WHAT.EQ.5) THEN
READ (UNIT=21,FMT=8000) WHICH
IF (WHICH.NE.'DEFINS') THEN
BACKSPACE 21
PRINT *,'NO STORED DEFINITIONS IN FILE'
GOTO 1002
ELSE
PRINT *,'LOADING DEFINITIONS ...'
ENDIF
DO 3000 I = 1,98,14
READ (UNIT=21,FMT=8001,ERR=9012,END=9013) DEFINS(I),DEFINS(I+1),
1 DEFINS(I+2),DEFINS(I+3),DEFINS(I+4),DEFINS(I+5),DEFINS(I+6),DEFINS(I+7),
2 DEFINS(I+8),DEFINS(I+9),DEFINS(I+10),DEFINS(I+11),DEFINS(I+12),DEFINS(I+13)
3000 CONTINUE
ENDIF
1002 CONTINUE
IF (WHAT.EQ.1.OR.WHAT.EQ.4.OR.WHAT.EQ.5) THEN
READ (UNIT=21,FMT=8000,ERR=9012,END=9013) WHICH
IF (WHICH.NE.'STACK ') THEN
BACKSPACE 21
PRINT *,'NO STORED DATA IN FILE'
GOTO 1003
ELSE
PRINT *,'LOADING STACK, MEMORIES &c ...'
ENDIF
PRINT *,'LOADING STACK ...'
DO 9022 I = 0,63
READ (UNIT=21,FMT=8010,ERR=9012,END=9013) STACK(I),HSTACK(I),DSTACK(I)
9022 CONTINUE
PRINT *,'LOADING MEMORIES ...'
DO 9023 I = 0,63
READ (UNIT=21,FMT=8012,ERR=9012,END=9013) IMEM(I),DBLMEM(I)
9023 CONTINUE
PRINT *,'LOADING SAVEREGS ...'
DO 9024 I = 0,63
READ (UNIT=21,FMT=8013,ERR=9012) ISAV(I),RSAV(I),DBLSAV(I)
9024 CONTINUE
ENDIF
1003 CONTINUE
GOTO 9000
9011 CONTINUE
CALL CRCLS
PRINT *,'ERROR IN LOAD ATTEMPT - CAN''T OPEN FILE: ',INFILE
9012 CONTINUE
CALL CRCLS
PRINT *,'ERROR IN LOAD ATTEMPT - ERROR IN READING FILE: ',INFILE
GOTO 9000
9013 CONTINUE
CALL CRCLS
PRINT *,'ERROR IN LOAD ATTEMPT - UNEXPECTED END OF FILE: ',INFILE
GOTO 9000
8000 FORMAT (A6)
8001 FORMAT (14(1X,A5))
8002 FORMAT (SP,10(1X,I7.6))
8003 FORMAT (10(1X,A20))
8010 FORMAT(SP,1X,I12.11,1X,A16,20X,G25.17)
8011 FORMAT(SP,' MEM:',I3.2,3X,I12.11,3X,G17.9,3X,G25.17)
8012 FORMAT(SP,11X,I12.11,23X,G25.17)
8013 FORMAT(SP,11X,I12.11,3X,G17.9,3X,G25.17)
8014 FORMAT(SP,' SAV:',I3.2,3X,I12.11,3X,G17.9,3X,G25.17)
END

También podría gustarte