Vous êtes sur la page 1sur 19

$CHAREQU

$SEGMENT CALCUL
*--------------------------------------------------------------------------
SUBROUTINE CALCQQ
CHARACTER*22 FRMTYP(-2:20)
CHARACTER PROGNM*18,MAINLN*54,CRKEY*12,CRLINE*72,OCTOF*11,THEOCT*11
CHARACTER*8 HAPS(32),HSTACK(0:63),GRONK,SEPSTR*4,HTEMP,STRCMD*100
CHARACTER DEFINS(98)*5,PGM(1000)*20,BINOF*32,THEBIN*32,CMDST*40
CHARACTER*20 CMDSTR,LSTCMD,CHR*1,CTRLC*1,CCMD*5,C4CMD*4,OTHERS,TSTSTR,TSTRNG
CHARACTER*1 TC,TCALGN(2),LINE1*76,C3CMD*3,ACHAR,CR,LCMD*16,CHR2
CHARACTER*1 NULL,CHRNO2,EXT*3,TMPSTR*14,FILNAM*24
CHARACTER*8 HEXOF,HEXSTR,CSTRIP*20,NULLS*2,FSTRIP*20
COMPLEX HANKEL,Z,W
REAL*4 RSTACK(0:63),RMEM(0:63),RSAV(0:63),ZR,ZI,WR,WI,ZS(2),WS(2)
REAL*4 RTEMP,RTEMP2,PINF,MINF,ASINH,ACOSH,ATANH
REAL*8 REALOF,DTEMP,DTEMP2,PI,E,DBLSAV(0:63),DATANH,DPINF,DMINF,DASINH,DGAMMA
REAL*8 DBLMEM(0:63),DSTACK(0:63),DFOO,DDFOO,DDTMP,DDTMP1,DDTMP2,DACOSH
INTEGER*4 ZLEN,ZMARK,ZPOINT,ALEN,AMARK,APOINT,APSCR1,APSCR2,APSCR3
INTEGER*4 APMAIN,AP1,AP2,AP3,AP4,AP5,APZR,APMX,AFMTYP,SCRMRK,APS(0:7)
INTEGER*4 LNMAIN,LN1,LN2,LN3,LN4,LN5,LNZR,LNMX,LNS(0:7),IAPS(32),LENS(32)
INTEGER*4 STACK(0:63),INDSTK,IDTMP(2),IDTMP1(2),IDTMP2(2),MODE,HOWMCH
INTEGER*4 IAND,IOR,NAND,NOR,IXOR,IEQV,NOT,DIDIT,SPEC,CUMUL(0:16383)
INTEGER*4 ISAV(0:63),DSAV(0:1,0:63),SAV(0:63,0:2),IGNORE,IGNOR,WHRCLC
INTEGER*4 IMEM(0:63),DMEM(0:1,0:63),MEM(0:63,0:2),FLPEEK,FREE,DONT
INTEGER*4 LEVEL,OLEVEL,TEMP,TEMP2,C(5),UCMASK,REGNO,TYPFRM
INTEGER*2 BIG,SMALL,RANGE,BIG2,SMALL2,I16384,PROFIL(0:16383),FWPEEK
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR,IASC,ISCAN,IKBF1,IKBF2,IERR
INTEGER*2 PC,RETRNS(100),RLEVEL,IC,IC2,IST2(2),INT2S(10)
INTEGER*2 TYPS(32),LENXS(32),LENYS(32),DEFBUF
INTEGER*1 IIC(2),IIC2(2),IST1(4),INT1S(10)
LOGICAL*4 DOCR
LOGICAL*2 BUFGUD(32),BUFUSE(32),DOPRNT
LOGICAL*2 DSPON,DOSTAK,DOMEM,FLOAT,HELP,DOALL,RUNING,SNGLST
LOGICAL*2 QREAD,BLANK,FIRST,ISNULL,DOD,ISNLL,ABORT,ESCAPE,INTRPT
LOGICAL*2 RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,PAUSES,IPRTSC,CONFRM
EQUIVALENCE (Z,ZR,ZS(1)),(ZI,ZS(2)),(W,WR,WS(1)),(WI,WS(2))
EQUIVALENCE (CHR,IC,IIC(2)),(CHR2,IC2,IIC2(2)),(STRCMD,CMDSTR)
EQUIVALENCE (SAV(0,0),ISAV(0),RSAV(0)),(SAV(0,1),DSAV(0,0),DBLSAV(0))
EQUIVALENCE (DDTMP,IDTMP(1)),(DDTMP1,IDTMP1(1)),(DDTMP2,IDTMP2(1))
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
EQUIVALENCE (STACK(0),RSTACK(0),IST2(1),IST1(1))
EQUIVALENCE (MEM(0,0),IMEM(0),RMEM(0)),(MEM(0,1),DMEM(0,0),DBLMEM(0))
EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC)
EQUIVALENCE (APS(0),APMAIN),(APS(1),AP1),(APS(2),AP2),(APS(3),AP3)
EQUIVALENCE (APS(4),AP4),(APS(5),AP5),(APS(6),APZR),(APS(7),APMX)
EQUIVALENCE (LNS(0),LNMAIN),(LNS(1),LN1),(LNS(2),LN2),(LNS(3),LN3)
EQUIVALENCE (LNS(4),LN4),(LNS(5),LN5),(LNS(6),LNZR),(LNS(7),LNMX)
EQUIVALENCE (IA,IAPS(1)),(IA2,IAPS(2)),(IA4,IAPS(3)),(IZ,IZR,IAPS(4))
EQUIVALENCE (IMX,IAPS(5)),(IT,IAPS(6)),(IA1,IAPS(7)),(IA3,IAPS(8))
EQUIVALENCE (IA5,IAPS(9)),(ISC1,IAPS(10)),(ISC2,IAPS(11)),(ISC3,IAPS(12))
COMMON /OMABFR/APS,LNS,/OMACNT/IAPS,HAPS,LENS,/OMATYP/TYPS,LENXS,LENYS
COMMON /ZEROS/ZVALID,ZLEN,ZMARK,ZPOINT,ZZCORR,/LOCALC/WHRCLC,DONT
COMMON /OMASCR/SCRMRK,APSCR1,APSCR2,APSCR3,/OMABFL/BUFGUD,BUFUSE
COMMON /AMPLS/AVALID,ALEN,AMARK,APOINT,AACORR,AFMTYP
COMMON /GNORF9/CRKEY,CRLINE,DOCR,/PAWS/PAUSES,/SCNPR/IPRTSC,DOPRNT/CNFRM/CONFRM
COMMON /INDICS/DOSTAK,DOMEM,FLOAT,LEVEL,OLEVEL,HELP,DOALL,RUNING
COMMON /CDEFNS/DEFINS,/PGMS/PGM,/PRGDAT/PC,RETRNS,RLEVEL
COMMON /COMMND/CMDSTR,LSTCMD,/NAMEPR/PROGNM,MAINLN
COMMON /ST/STACK,DSTACK,/HS/HSTACK,/MEMORY/MEM,/SAVE/SAV
COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS
COMMON /INFIN/PINF,MINF,DPINF,DMINF,E,PI,DGAMMA,/NTRVN/ABORT,ESCAPE,INTRPT
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR,/BUFDEF/DEFBUF
COMMON /PARNML/BIG,SMALL,RANGE,/PARNM2/BIG2,SMALL2,MODE,I16384
COMMON /PARCUM/IGNOR,PROFIL,CUMUL,/INTCLC/DIDIT,/SPECI/SPEC
COMMON /XFRAME/TYPFRM,FRMTYP
SAVE /OMABFR/,/OMACNT/,/OMATYP/,/ZEROS/,/OMASCR/,/AMPLS/,/SHFSTA/,/INTCLC/
SAVE /NAMEPR/,/PAWS/,/PGMS/,/CNFRM/,/CDEFNS/,/INDICS/,/GNORF9/,/SCNPR/,/SPECI/
SAVE /NTRVN/,/KEYGET/,/ST/,/HS/,/MEMORY/,/SAVE/,/PRGDAT/,/COMMND/,/INFIN/
SAVE /PARNML/,/PARNM2/,/PARCUM/,/LOCALC/,/BUFDEF/,/XFRAME/
EXTERNAL ASINH,DASINH,ACOSH,DACOSH,ATANH,DATANH,FORCLC,HANKEL,FSTRIP
EXTERNAL IAND,IOR,NAND,NOR,IXOR,IEQV,NOT,REALOF,HEXSTR,CSTRIP,HEXOF
EXTERNAL FLPEEK,STRIP,FREE,HOWMCH,FWPEEK
SAVE
*
IF (DIDIT.NE.$ABCDEF) CALL CLCINT
CALL CNINIT
9000 CONTINUE
RUNING = .FALSE.
IPRTSC = .FALSE.
SNGLST = .TRUE.
FIRST = .TRUE.
9001 CONTINUE
CTRLC = CHAR(3)
NULL = CHAR(0)
CR = CHAR(13)
UCMASK = NOT($20)
QREAD = .TRUE.
FLOAT = .FALSE.
STRCMD = ' '
DSPON = .TRUE.
1234 CONTINUE
DONT = 3141
1 CONTINUE
LSTCMD = CMDSTR
IF ((.NOT.RUNING).OR.DSPON) CALL DSPLAY
4321 CONTINUE
INTRPT = .FALSE.
ABORT = .FALSE.
ESCAPE = .FALSE.
CMDSTR = ' '
IF (RUNING) THEN
IF (PC.GE.1.AND.PC.LE.1000) THEN
CMDSTR = PGM(PC)
CMDST = CMDSTR
PC = PC + 1
IF (CMDSTR(1:1).EQ.CHAR(3)) GOTO 6666
ELSE
CMDSTR = 'RETURN'
ENDIF
ELSE
IC = -1
4444 CALL ISNTRP
IF (ERR.NE.0) GOTO 4444
CALL DISPG0
IF (ABORT.OR.ESCAPE.OR.INTRPT) GOTO 6666
IF (SCRL.AND.((SCAN.GE.$38.AND.SCAN.LE.$44).OR.(SCAN.GE.84.AND.
& SCAN.LE.113))) THEN
CALL DISPG1
GOTO 4444
ENDIF
IF (SCAN.GE.133.AND.SCAN.LE.189) THEN
I = SCAN - 92
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
GOTO 9998
ELSEIF (ASC.EQ.0) THEN
ITEMPQ = SCAN
IF (SCAN.GE.$3B.AND.SCAN.LE.$44) THEN
I = SCAN - $3A
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
GOTO 9998
ELSEIF (SCAN.GE.84.AND.SCAN.LE.113) THEN
I = SCAN - 73
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
GOTO 9998
ELSEIF (SCAN.EQ.$48.OR.SCAN.EQ.$4B.OR.SCAN.EQ.115) THEN
CMDSTR = 'POP'
GOTO 9998
ELSEIF (SCAN.EQ.$4D.OR.SCAN.EQ.$50.OR.SCAN.EQ.116) THEN
CMDSTR = 'PUSH'
GOTO 9998
ELSEIF (SCAN.EQ.114) THEN
CMDSTR = 'PRTSC'
GOTO 9998
ENDIF
ELSEIF (TC.EQ.'?') THEN
CMDSTR = 'HELP'
GOTO 9998
ELSEIF (ASC.EQ.13.OR.ASC.EQ.10) THEN
LSTCMD = 'NO OPERATION'
GOTO 4321
ELSE
SPEC = 3141592
CMDST = TC
CHR = TC
CALL GTSTR(CMDST)
CMDSTR = CMDST
TSTRNG = CMDSTR
IF (CHR.EQ.'$'.OR.((CHR.GE.'0').AND.(CHR.LE.'9'))) THEN
CALL DOSAVE
TEMP = INTOF(TSTRNG)
DTEMP = REALOF(CMDSTR)
CALL CPUSH
DSTACK(0) = DTEMP
HSTACK(0) = HEXSTR(TEMP)
IF (FLOAT) THEN
RSTACK(0) = DTEMP
WRITE (CMDSTR,'(G19.12)',ERR=1) DTEMP
ELSE
STACK(0) = TEMP
WRITE (CMDSTR,'(I11)',ERR=1) TEMP
ENDIF
HSTACK(0) = HEXSTR(STACK(0))
CALL DSPLAY
CALL ECHOCM
GOTO 4321
ENDIF
ENDIF
ENDIF
CHR = TC
IF (SCAN.GE.133.AND.SCAN.LE.189) THEN
I = SCAN - 92
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
ELSEIF (ASC.EQ.0) THEN
IF (SCAN.GE.$3B.AND.SCAN.LE.$44) THEN
I = SCAN - $3A
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
ELSEIF (SCAN.GE.84.AND.SCAN.LE.113) THEN
I = SCAN - 73
CMDSTR = DEFINS(I)
ASC = ICHAR(CMDSTR(1:1))
ELSEIF (SCAN.EQ.114) THEN
CMDSTR = 'PRTSC'
ENDIF
ENDIF
9998 CONTINUE
TSTRNG = CMDSTR
CHRNO2 = ' '
DO 2332 IJ = 1,19
ISNULL = CMDSTR(IJ:IJ) .EQ. NULL
IF (ISNULL) THEN
IK = IJ + 1
CHRNO2 = CMDSTR(IK:IK)
GOTO 2333
ENDIF
2332 CONTINUE
2333 CONTINUE
CMDSTR = CSTRIP(TSTRNG)
ISNLL = CMDSTR(1:1) .EQ. NULL
IF (ISNLL.AND.(.NOT.ISNULL)) THEN
ISNULL = .TRUE.
CHRNO2 = CMDSTR(2:2)
ENDIF
BLANK = .FALSE.
DO 10 I = 1,5
CHR = CMDSTR(I:I)
C(I) = ICHAR(CHR)
IF (C(I).GE.$61.AND.C(I).LE.$7A) C(I) = IAND(C(I),UCMASK)
ACHAR = CHAR(C(I))
BLANK = (CHR.EQ.CHAR(13))
IF (BLANK) ACHAR = ' '
CCMD(I:I) = ACHAR
IF (I.LE.3) C3CMD(I:I) = ACHAR
IF (I.LE.4) C4CMD(I:I) = ACHAR
10 CONTINUE
CHR = CMDSTR(1:1)
CALL CCNSL0
* IF (DEBUG) THEN
* NULLS = 'FF'
* IF (ISNULL) NULLS = 'TT'
* WRITE (11,9009) '@','@@@','@@@@','@@@@@','??','!',' '
* WRITE (11,9009) CHR,C3CMD,C4CMD,CCMD,NULLS,CHRN02,CMDSTR
* 9009 FORMAT (A1,'|',A3,'|',A4,'|',A5,'|',A2,'|',A1,'|',A20)
* IF (RUNING) THEN
* CALL ECHOCM
* PRINT *,'PC = ',PC
* IF (SNGLST) THEN
* PAUSES = .TRUE.
* CALL ISNTRP
* PAUSES = .FALSE.
* ENDIF
* RUNING = .NOT. (INTRPT.OR.ESCAPE)
* ENDIF
* ENDIF
9999 CONTINUE
IF (.NOT.RUNING) CALL ECHOCM
TEMP = STACK(0)
RTEMP = RSTACK(0)
DTEMP = DSTACK(0)
HTEMP = HSTACK(0)
IF (INTRPT.OR.(C4CMD.EQ.'QUIT').OR.(CHR.EQ.CTRLC)) THEN
IF (SCAN.EQ.$BD) THEN
INTRPT = .FALSE.
HELP = .TRUE.
GOTO 2222
ENDIF
GOTO 6666
ELSEIF (C4CMD.EQ.'UNDO') THEN
CMDSTR = 'UNDO LAST OPERATION'
DO 122 REGNO = 0,63
TEMP = STACK(REGNO)
STACK(REGNO) = ISAV(REGNO)
ISAV(REGNO) = TEMP
DTEMP = DBLSAV(REGNO)
DBLSAV(REGNO) = DSTACK(REGNO)
DSTACK(REGNO) = DTEMP
HSTACK(REGNO) = HEXSTR(STACK(REGNO))
122 CONTINUE
TEMP = LEVEL
LEVEL = OLEVEL
OLEVEL = TEMP
DOALL = .TRUE.
GOTO 2222
ELSEIF (CCMD.EQ.'CHAIN') THEN
TMPSTR = FSTRIP(CMDSTR(6:20))
IF (TMPSTR.EQ.' ') THEN
PRINT *,'File Name?'
CALL GTSTR(TMPSTR)
ENDIF
CALL CHAIN(TMPSTR)
ELSEIF (CCMD.EQ.'STORE') THEN
CMDSTR = 'STORE STAK TO MEM'
DOMEM = .TRUE.
DO 101 REGNO = 0,63
IMEM(REGNO) = STACK(REGNO)
DBLMEM(REGNO) = DSTACK(REGNO)
101 CONTINUE
GOTO 2222
ELSEIF (CCMD.EQ.'FINIT'.OR.CCMD.EQ.'INITF') THEN
CALL FIINIT
CMDSTR = 'FILE DATA INIT'
GOTO 2222
ELSEIF (CHR.EQ.CR.OR.C4CMD.EQ.'NULL'.OR.C3CMD.EQ.'NOP'.OR.CMDSTR.EQ.' ') THEN
CMDSTR = 'NO OPERATION'
GOTO 2222
ELSEIF (C4CMD.EQ.'INIT'.AND.(.NOT.RUNING)) THEN
CMDSTR = 'INITIALIZE CALCULATOR'
CALL CLS
CALL GOTOXY(0,0)
PRINT *,'ARE YOU SURE YOU WANT TO INITIALIZE CALCULATOR?'
I = MENU(0,0,1)
IF (I.EQ.1) THEN
CALL CLCINT
CMDSTR = 'INITIALIZE CALCULATOR'
ELSE
CMDSTR = 'INITIALIZE ABORTED'
ENDIF
HELP = .TRUE.
DSPON = .TRUE.
GOTO 2222
ELSEIF (CCMD.EQ.'MCLEA') THEN
CMDSTR = 'CLEAR MEMORIES'
CALL MCLEAR
GOTO 2222
ELSEIF (CCMD.EQ.'REHEX') THEN
CMDSTR = 'REWRITE HEX '
DO 2334 I = 0,63
HSTACK(I) = HEXOF(STACK(I))
2334 CONTINUE
DOSTAK = .TRUE.
GOTO 2222
ELSEIF (C3CMD.EQ.'CLS'.OR.(ISNULL.AND.(CHRNO2.EQ.'G'.OR.CHRNO2.EQ.'w'))) THEN
CMDSTR = 'CLS: CLEAR SCREEN'
HELP = .TRUE.
GOTO 2222
ELSEIF (C4CMD.EQ.'STOP'.OR.C4CMD.EQ.'HALT') THEN
CMDSTR = 'HALT PROGRAM'
RUNING = .FALSE.
IPRTSC = .FALSE.
GOTO 2222
ELSEIF (CHR.EQ.'?'.OR.C4CMD.EQ.'HELP') THEN
CMDSTR = 'DISPLAY HELP DATA'
CALL HLPSUB
DOSTAK = .TRUE.
DOMEM = .TRUE.
HELP = .TRUE.
GOTO 2222
* ELSEIF (CCMD.EQ.'DEFIN') THEN
* CMDSTR = 'DEFINe aux. key(s)'
* CALL GOTOXY(0,4)
* PRINT *,'ESCAPE or Control C to EXIT definintion mode'
* 2223 WRITE (LINE1,'(\A\)') '(RE)DEFINE WHICH KEY?'
* CALL SAYAT(12,23,0,LINE1)
* CALL GTSTR(OTHERS)
* IF (ABORT.OR.ESCAPE.OR.INTRPT.OR.(SCAN.EQ.1)) GOTO 2222
* I = -1
* IF (SCAN.GE.133.AND.SCAN.LE.189) THEN
* I = SCAN - 92
* ELSEIF (ASC.EQ.0) THEN
* IF (SCAN.GE.$3B.AND.SCAN.LE.$44) THEN
* I = SCAN - $3A
* ELSEIF (SCAN.GE.84.AND.SCAN.LE.113) THEN
* I = SCAN - 73
* ENDIF
* ENDIF
* IF (I.EQ.-1) THEN
* WRITE (LINE1,'(\A\)') 'THAT KEY CANNOT BE REDEFINED'
* CALL SAYAT(12,23,0,LINE1)
* CALL BEEP
* GOTO 2222
* ELSEIF (I.GE.1.AND.I.LE.96) THEN
* WRITE (LINE1,'(\A,A,A\)') 'THE CURRENT DEFINITION IS ',DEFINS(I),' ENTER NEW
DEFN'
* CALL SAYAT(12,23,0,LINE1)
* CALL GTSTR(OTHERS)
* OTHERS = CSTRIP(OTHERS)
* IF (.NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) DEFINS(I) = OTHERS
* ENDIF
* IF (.NOT.(ABORT.OR.ESCAPE.OR.INTRPT)) GOTO 2223
* GOTO 2222
ELSEIF (C4CMD.EQ.'LOAD'.AND.(.NOT.RUNING)) THEN
CALL CRCLS
PRINT *,'LOAD WHAT? 1 = ALL'
PRINT *,' 2 = PROGRAM'
PRINT *,' 3 = DEFINITIONS'
PRINT *,' 4 = STACK/MEMORIES'
PRINT *,' 5 = CONTENTS OF FILE (DEFAULT)'
ICMD = MENU(5,0,5)
CALL LOADC(ICMD)
HELP = .TRUE.
GOTO 2222
ELSEIF ((C4CMD.EQ.'SAVE'.OR.CCMD.EQ.'SAVEC').AND.(.NOT.RUNING)) THEN
CALL CRCLS
PRINT *,'SAVE WHAT? 1 = ALL (DEFAULT)'
PRINT *,' 2 = PROGRAM'
PRINT *,' 3 = DEFINITIONS'
PRINT *,' 4 = STACK/MEMORIES'
ICMD = MENU(1,0,4)
CALL SAVEC(ICMD)
HELP = .TRUE.
GOTO 2222
ELSEIF (C3CMD.EQ.'PGM'.AND.(.NOT.RUNING)) THEN
CALL EDPGM
GOTO 2222
ELSEIF (CCMD.EQ.'RETUR'.OR.C3CMD.EQ.'RTS') THEN
CMDSTR = 'RETURN FROM SUBR'
PC = RETRNS(RLEVEL)
RLEVEL = RLEVEL - 1
IF (RLEVEL.LE.0) RLEVEL = 1
IF (PC.EQ.-1) THEN
RUNING = .FALSE.
ENDIF
GOTO 2222
ELSEIF (C4CMD.EQ.'CONT'.OR.C3CMD.EQ.'RUN') THEN
CMDSTR = CMDSTR
RUNING = .TRUE.
IF ((CHR.EQ.'C'.AND.RLEVEL.EQ.1).OR.PC.EQ.-1) THEN
PC = 1
RETRNS(1) = -1
ENDIF
GOTO 2222
ELSEIF (C4CMD.EQ.'GOTO'.OR.C4CMD.EQ.'JUMP'.OR.CCMD.EQ.'START') THEN
OTHERS = CMDSTR(5:20)
IF (CHR.EQ.'S') OTHERS = CMDSTR(6:20)
PC = INTOF(OTHERS)
IF (RLEVEL.LE.0) RLEVEL = 1
IF (PC.LE.0.OR.PC.GE.1000) THEN
WRITE (LINE1,'(A,I4\)') 'INVALID START ADDRESS: ',PC
CALL SAYAT(12,23,0,LINE1)
PC = 1
GOTO 2222
ENDIF
WRITE (LSTCMD,'(A,I4)') 'GOTO PGM LOC: ',PC
IF (CHR.EQ.'S') RUNING = .TRUE.
GOTO 2222
ELSEIF (C4CMD.EQ.'CALL') THEN
CMDSTR = 'SUBROUTINE CALL'
OTHERS = CMDSTR(5:20)
IF (RLEVEL.LE.0) RLEVEL = 1
RETRNS(RLEVEL) = PC
PC = INTOF(OTHERS)
IF (PC.LE.0.OR.PC.GE.1000) THEN
WRITE (12,'(\,A,I4,\)') 'INVALID START ADDRESS: ',PC
PC = RETRNS(RLEVEL)
GOTO 2222
ENDIF
RUNING = .TRUE.
GOTO 2222
ELSEIF (CCMD.EQ.'DSPON') THEN
CMDSTR = 'DISPLAY WHILE RUNNING'
DSPON = .TRUE.
GOTO 2222
ELSEIF (CCMD.EQ.'DSPOF') THEN
CMDSTR = 'NO DISPLAY WHILE RUN'
DSPON = .FALSE.
GOTO 2222
ELSEIF (CCMD.EQ.'PRINT') THEN
CMDSTR = 'TOGGLE PRINT'
IPRTSC = .NOT. IPRTSC
DOPRNT = IPRTSC
GOTO 2222
ELSEIF (CCMD.EQ.'PROFF') THEN
CMDSTR = 'PRINT OFF'
IPRTSC = .FALSE.
DOPRNT = IPRTSC
GOTO 2222
ELSEIF (CCMD.EQ.'PRTSC') THEN
CMDSTR = 'DO PrtSc'
CALL PRTSC
GOTO 2222
ELSEIF (C4CMD.EQ.'PRON') THEN
CMDSTR = 'PRINT ON'
IPRTSC = .TRUE.
DOPRNT = IPRTSC
GOTO 2222
ELSEIF (CCMD.EQ.'PRQON') THEN
CMDSTR = 'PRINT ON, quiet'
IPRTSC = .TRUE.
DOPRNT = .FALSE.
GOTO 2222
ELSEIF (C3CMD.EQ.'OCT') THEN
THEOCT = OCTOF(TEMP)
CALL CLLINE(4,12)
CALL GOTOXY(0,4)
PRINT *,' The octal is ',THEOCT
GOTO 2222
ELSEIF (C3CMD.EQ.'BIN') THEN
THEBIN = BINOF(TEMP)
CALL CLLINE(4,12)
CALL GOTOXY(0,4)
PRINT *,' The binary is ',THEBIN
GOTO 2222
* Code below commented out for CALC version for inclusion into TST (KIAS)
* ELSEIF (C4CMD.EQ.'PICA') THEN
* CALL PICA
* GOTO 2222
* ELSEIF (CCMD.EQ.'ELITE') THEN
* CALL ELITE
* GOTO 2222
* ELSEIF (CCMD.EQ.'SMALC') THEN
* CALL SMALLC
* GOTO 2222
* ELSEIF (CCMD.EQ.'DELIT') THEN
* CALL DELITE
* GOTO 2222
* ELSEIF (CCMD.EQ.'DSMAL') THEN
* CALL DSMALL
* GOTO 2222
* ELSEIF (CCMD.EQ.'BLACK') THEN
* CALL BLACK
* GOTO 2222
* ELSEIF (CCMD.EQ.'GREEN') THEN
* CALL GREEN
* GOTO 2222
* ELSEIF (C4CMD.EQ.'BLUE') THEN
* CALL BLUE
* GOTO 2222
* ELSEIF (C3CMD.EQ.'RED') THEN
* CALL RED
* GOTO 2222
* ELSEIF (C3CMD.EQ.'LPI') THEN
* TC = C4CMD(4:4)
* IF (TC.EQ.'3') THEN
* CALL LPI3
* ELSEIF (TC.EQ.'4') THEN
* CALL LPI4
* ELSEIF (TC.EQ.'5') THEN
* CALL LPI5
* ELSEIF (TC.EQ.'6') THEN
* CALL LPI6
* ELSEIF (TC.EQ.'7') THEN
* CALL LPI7
* ELSEIF (TC.EQ.'8') THEN
* CALL LPI8
* ELSEIF (TC.EQ.'9') THEN
* CALL LPI9
* ELSEIF (TC.EQ.'A') THEN
* CALL LPI10
* ELSE
* CALL LPI7
* ENDIF
* GOTO 2222
ELSEIF (CCMD.EQ.'BUFFE') THEN
CALL CLLINE(4,12)
CALL GOTOXY(0,4)
CMDSTR(1:5) = ' '
IF (CMDSTR(6:6).EQ.'R'.OR.CMDSTR(6:6).EQ.'r') CMDSTR(6:6) = ' '
CALL STRIP(CMDSTR)
I = INTOF(CMDSTR)
IF (.NOT.(CMDSTR.EQ.' '.OR.I.LT.0.OR.I.GT.32)) DEFBUF = I
PRINT *,'Current default buffer is ',DEFBUF,' ',FRMTYP(TYPS(DEFBUF))
GOTO 2222
ENDIF
CALL DOSAVE
IF (CCMD.EQ.'HOWMC') THEN
CALL CPUSH
TEMP = HOWMCH()
GOTO 2221
ELSEIF (C4CMD.EQ.'FREE') THEN
CALL CPUSH
TMPSTR = CMDSTR(5:20)
CALL STRIP(TMPSTR)
CHR = TMPSTR(1:1)
I = ICHAR(CHR) - $30
IF (I.LT.0.OR.I.GT.7) I = -1
TEMP = FREE(I)
GOTO 2221
ELSEIF (CCMD.EQ.'LENGF'.OR.CCMD.EQ.'FILEN'.OR.CHR.EQ.';') THEN
CALL CPUSH
JS = 7
IF (CHR.EQ.';') THEN
JS = 3
CHR = CMDST(2:2)
IF (CHR.NE.' '.AND.CHR.NE.';') JS = 2
ENDIF
TMPSTR = FSTRIP(CMDST(JS:40))
IF (TMPSTR.EQ.' ') THEN
PRINT *,'File Name?'
CALL GTSTR(CMDST)
TMPSTR = FSTRIP(CMDST)
ENDIF
CALL FNCHCK(TMPSTR,'BIN',FILNAM)
CMDSTR = 'LEN OF '//FILNAM
TEMP = LENGFI(FILNAM)
IF (TEMP.LT.0) THEN
CALL CPOP
LSTCMD = CMDSTR
CMDSTR = 'LEN OF FILE NEGATIVE'
CALL ECHOCM
ELSE
IF (CHR.EQ.';') THEN
DSTACK(0) = TEMP + $E000
IF (.NOT.FLOAT) STACK(0) = DSTACK(0)
IF (FLOAT) RSTACK(0) = DSTACK(0)
HSTACK(0) = HEXOF(STACK(0))
CALL CPUSH
ENDIF
GOTO 2221
ENDIF
ELSEIF (CCMD.EQ.'CLEAR') THEN
CMDSTR = 'CLEAR STACK'
CALL SCLEAR
* ELSEIF (CCMD.EQ.'DEBUG') THEN
* DEBUG = .NOT.DEBUG
* SNGLST = DEBUG
ELSEIF ((C3CMD.EQ.'ADD').OR.(C3CMD.EQ.'+ ')) THEN
CMDSTR = 'ADD'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = STACK(0) + TEMP
IF (FLOAT) RSTACK(0) = RSTACK(0) + RTEMP
DSTACK(0) = DSTACK(0) + DTEMP
ELSEIF ((C3CMD.EQ.'SUB').OR.(C3CMD.EQ.'- ')) THEN
CMDSTR = 'SUBTRACT'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = STACK(0) - TEMP
IF (FLOAT) RSTACK(0) = RSTACK(0) - RTEMP
DSTACK(0) = DSTACK(0) - DTEMP
ELSEIF (CCMD.EQ.'NEGAT') THEN
CMDSTR = 'NEGATE TOP OF STACK'
IF (.NOT.FLOAT) STACK(0) = - STACK(0)
IF (FLOAT) RSTACK(0) = - RSTACK(0)
DSTACK(0) = - DSTACK(0)
ELSEIF ((C3CMD.EQ.'MUL').OR.(C3CMD.EQ.'* ')) THEN
CMDSTR = 'MULTIPLY'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = STACK(0) * TEMP
IF (FLOAT) RSTACK(0) = RSTACK(0) * RTEMP
DSTACK(0) = DSTACK(0) * DTEMP
ELSEIF ((C3CMD.EQ.'POW').OR.(C3CMD.EQ.'** ')) THEN
CMDSTR = 'STACK(0) ** STACK(1)'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = TEMP ** STACK(0)
IF (FLOAT) RSTACK(0) = RTEMP ** RSTACK(0)
DSTACK(0) = DTEMP ** DSTACK(0)
ELSEIF ((C3CMD.EQ.'^ ').OR.(C3CMD.EQ.'**~')) THEN
CMDSTR = 'STACK(1) ** STACK(0)'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = STACK(0) ** TEMP
IF (FLOAT) RSTACK(0) = RSTACK(0) ** RTEMP
DSTACK(0) = DSTACK(0) ** DTEMP
ELSEIF ((C3CMD.EQ.'DIV').OR.(C3CMD.EQ.'/ ')) THEN
CMDSTR = 'STACK(1) / STACK(0)'
CALL CPOP
IF ((TEMP.NE.0).AND.(.NOT.FLOAT)) STACK(0) = STACK(0) / TEMP
IF ((RTEMP.NE.0).AND.FLOAT) RSTACK(0) = RSTACK(0) / RTEMP
DSTACK(0) = DSTACK(0) / DTEMP
ELSEIF (C3CMD.EQ.'/~ ') THEN
CMDSTR = 'STACK(0) / STACK(1)'
CALL CPOP
IF ((STACK(0).NE.0).AND.(.NOT.FLOAT)) STACK(0) = TEMP / STACK(0)
IF ((RSTACK(0).NE.0).AND.FLOAT) RSTACK(0) = RTEMP / RSTACK(0)
DSTACK(0) = DTEMP / DSTACK(0)
ELSEIF ((C3CMD.EQ.'ABS').OR.(CHR.EQ.'|')) THEN
CMDSTR = 'ABSOLUTE VALUE'
IF (.NOT.FLOAT) STACK(0) = IABS(STACK(0))
IF (FLOAT) RSTACK(0) = ABS(RSTACK(0))
DSTACK(0) = DABS(DSTACK(0))
* Code below commented out for CALC version for inclusion into TST (KIAS)
* ELSEIF ((C3CMD.EQ.'FAC').OR.(CHR.EQ.'!')) THEN
* CMDSTR = 'FACTORIAL'
* IF (.NOT.FLOAT) THEN
* IF (TEMP.EQ.0.OR.TEMP.EQ.1) THEN
* STACK(0) = 1
* ELSEIF (TEMP.EQ.2) THEN
* STACK(0) = 2
* ELSEIF (TEMP.GT.0) THEN
* DO 110 I = (TEMP-1),2,-1
* STACK(0) = STACK(0) * I
* 110 CONTINUE
* ENDIF
* ELSE
* TEMP = IFIX(RTEMP)
* IF (TEMP.EQ.0.OR.TEMP.EQ.1) THEN
* RSTACK(0) = 1.0
* ELSEIF (TEMP.EQ.2) THEN
* RSTACK(0) = 2.0
* ELSEIF (TEMP.GT.0) THEN
* DO 111 I = (TEMP-1),2,-1
* RSTACK(0) = RSTACK(0) * REAL(I)
* 111 CONTINUE
* ENDIF
* ENDIF
* DTEMP = DINT(DSTACK(0))
* TEMP = IDNINT(DSTACK(0))
* IF (TEMP.EQ.0.OR.TEMP.EQ.1) THEN
* DSTACK(0) = 1.0D0
* ELSEIF (TEMP.EQ.2) THEN
* DSTACK(0) = 2.0D0
* ELSEIF (TEMP.GT.0) THEN
* DSTACK(0) = DTEMP
* DO 112 I = (TEMP-1),2,-1
* DSTACK(0) = DSTACK(0) * DBLE(I)
* 112 CONTINUE
* ENDIF
ELSEIF (C3CMD.EQ.'EXP'.OR.C3CMD.EQ.'E**') THEN
CMDSTR = 'e TO THE STACK(0)'
IF (.NOT.FLOAT) RTEMP = STACK(0)
DSTACK(0) = DEXP(DSTACK(0))
RTEMP = EXP(RTEMP)
GOTO 2220
ELSEIF (C3CMD.EQ.'LN ') THEN
CMDSTR = 'NATURAL LOGARITHM'
IF (.NOT.FLOAT) RTEMP = STACK(0)
DSTACK(0) = DLOG(DSTACK(0))
RTEMP = LOG(RTEMP)
GOTO 2220
ELSEIF (C4CMD.EQ.'LOG2'.OR.C3CMD.EQ.'LN2') THEN
CMDSTR = 'BINARY LOGARITHM'
IF (.NOT.FLOAT) RTEMP = STACK(0)
DSTACK(0) = DLOG(DSTACK(0))/DLOG(2.0D0)
RTEMP = LOG(RTEMP)/LOG(2.0)
GOTO 2220
ELSEIF (C3CMD.EQ.'LOG') THEN
CMDSTR = 'COMMON LOGARITHM'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = LOG10(RTEMP)
DSTACK(0) = DLOG10(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'SINH') THEN
CMDSTR = 'HYPERBOLIC SINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = SINH(RTEMP)
DSTACK(0) = DSINH(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'COSH') THEN
CMDSTR = 'HYPERBOLIC COSINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = COSH(RTEMP)
DSTACK(0) = DCOSH(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'TANH') THEN
CMDSTR = 'HYPERBOL. TANGENT'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = TANH(RTEMP)
DSTACK(0) = DTANH(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'ASINH') THEN
CMDSTR = 'HYPERBOLIC ARCSIN'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ASINH(RTEMP)
DSTACK(0) = DASINH(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'ACOSH') THEN
CMDSTR = 'HYPER ARC COSINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ACOSH(RTEMP)
DSTACK(0) = DACOSH(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'ATANH') THEN
CMDSTR = 'HYPER ARC TANGENT'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ATANH(RTEMP)
DSTACK(0) = DATANH(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'SQRT') THEN
CMDSTR = 'SQUARE ROOT'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = SQRT(RTEMP)
DSTACK(0) = DSQRT(DSTACK(0))
GOTO 2220
ELSEIF (C3CMD.EQ.'SQR') THEN
CMDSTR = 'SQUARE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = RTEMP * RTEMP
DSTACK(0) = DSTACK(0) * DSTACK(0)
GOTO 2220
ELSEIF (C3CMD.EQ.'SIN') THEN
CMDSTR = 'SINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = SIN(RTEMP)
DSTACK(0) = DSIN(DSTACK(0))
GOTO 2220
ELSEIF (C3CMD.EQ.'COS') THEN
CMDSTR = 'COSINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = COS(RTEMP)
DSTACK(0) = DCOS(DSTACK(0))
GOTO 2220
ELSEIF (C3CMD.EQ.'TAN') THEN
CMDSTR = 'TANGENT'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = TAN(RTEMP)
DSTACK(0) = DTAN(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'ASIN') THEN
CMDSTR = 'ARC SINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ASIN(RTEMP)
DSTACK(0) = DASIN(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'ACOS') THEN
CMDSTR = 'ARC COSINE'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ACOS(RTEMP)
DSTACK(0) = DACOS(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'ATAN2') THEN
CMDSTR = 'ARC TANGENT(S1/S2)'
IF (.NOT.FLOAT) RTEMP = STACK(0)
DTEMP = DSTACK(0)
CALL CPOP
RTEMP2 = STACK(0)
IF (FLOAT) RTEMP2 = RSTACK(0)
DTEMP2 = DSTACK(0)
RTEMP = ATAN2(RTEMP,RTEMP2)
DSTACK(0) = DATAN2(DTEMP,DTEMP2)
GOTO 2220
ELSEIF (C4CMD.EQ.'ATAN') THEN
CMDSTR = 'ARC TANGENT'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ATAN(RTEMP)
DSTACK(0) = DATAN(DSTACK(0))
GOTO 2220
ELSEIF (C4CMD.EQ.'AINT') THEN
CMDSTR = 'AINT (TRUNCATE)'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = AINT(RTEMP)
DSTACK(0) = DINT(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'ROUND') THEN
CMDSTR = 'ROUND'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = ANINT(RTEMP)
DSTACK(0) = DNINT(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'FRACT') THEN
CMDSTR = 'FRACTional part'
IF (.NOT.FLOAT) RTEMP = STACK(0)
RTEMP = RTEMP - AINT(RTEMP)
DSTACK(0) = DSTACK(0) - DINT(DSTACK(0))
GOTO 2220
ELSEIF (CCMD.EQ.'GAMMA') THEN
CMDSTR = 'push GAMMA on stack'
CALL CPUSH
DSTACK(0) = DGAMMA
IF (.NOT.FLOAT) STACK(0) = 0
IF (FLOAT) RSTACK(0) = DGAMMA
ELSEIF (C3CMD.EQ.'PI ') THEN
CMDSTR = 'push PI on stack'
CALL CPUSH
DSTACK(0) = PI
IF (.NOT.FLOAT) STACK(0) = 3
IF (FLOAT) RSTACK(0) = PI
ELSEIF (C3CMD.EQ.'E ') THEN
CMDSTR = 'push E on stack'
CALL CPUSH
DSTACK(0) = E
IF (.NOT.FLOAT) STACK(0) = 2
IF (FLOAT) RSTACK(0) = E
ELSEIF (CCMD.EQ.'MODEV') THEN
CALL CPUSH
TEMP = I16384
GOTO 2221
ELSEIF (CCMD.EQ.'MODEN') THEN
CALL CPUSH
TEMP = MODE
GOTO 2221
ELSEIF (CCMD.EQ.'CNVRT') THEN
IF (DTEMP.GE.0.0.AND.DTEMP.LE.1.0) THEN
TEMP = DTEMP*RANGE + SMALL
GOTO 2221
ELSE
DSTACK(0) = (DTEMP-SMALL)/RANGE
IF (FLOAT) THEN
RSTACK(0) = DSTACK(0)
ELSE
STACK(0) = DSTACK(0)
ENDIF
ENDIF
ELSEIF (CCMD.EQ.'PROFI') THEN
CALL CPUSH
CMDSTR(1:5) = ' '
IF (CMDSTR(6:6).EQ.'L'.OR.CMDSTR(6:6).EQ.'l') CMDSTR(6:6) = ' '
CALL STRIP(CMDSTR)
I = INTOF(CMDSTR)
IF (CMDSTR.EQ.' '.OR.I.LT.0.OR.I.GT.16383) I = DTEMP
IF (I.LT.0) I = 0
IF (I.GT.16383) I = 16383
TEMP = PROFIL(I)
WRITE (CMDSTR,'(A,I5.5)') 'W/intensity= ',I
GOTO 2221
ELSEIF ((C3CMD.EQ.'\ ').OR.(C3CMD.EQ.'MOD')) THEN
CMDSTR = 'STAK(0) MOD STAK(1)'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = MOD(TEMP,STACK(0))
IF (FLOAT) RSTACK(0) = MOD(RTEMP,RSTACK(0))
DSTACK(0) = DMOD(DTEMP,DSTACK(0))
ELSEIF (C3CMD.EQ.'\~ ') THEN
CMDSTR = 'STAK(1) MOD STAK(0)'
CALL CPOP
IF (.NOT.FLOAT) STACK(0) = MOD(STACK(0),TEMP)
IF (FLOAT) RSTACK(0) = MOD(RSTACK(0),RTEMP)
DSTACK(0) = DMOD(DSTACK(0),DTEMP)
ELSEIF ((CHR.EQ.'=').OR.(C3CMD.EQ.'EQV')) THEN
CMDSTR = 'LOGICAL EQUIVALENCE'
TEMP2 = STACK(1)
DDTMP1 = DSTACK(0)
DDTMP2 = DSTACK(1)
CALL CPOP
STACK(0) = IEQV(TEMP,TEMP2)
IDTMP(1) = IEQV(IDTMP1(1),IDTMP2(1))
IDTMP(2) = IEQV(IDTMP1(2),IDTMP2(2))
DSTACK(0) = DDTMP
ELSEIF ((C3CMD.EQ.'NOT').OR.(CHR.EQ.'_')) THEN
CMDSTR = 'LOGICAL INVERSION'
STACK(0) = NOT(STACK(0))
DDTMP1 = DSTACK(0)
IDTMP(1) = NOT(IDTMP1(1))
IDTMP(2) = NOT(IDTMP1(2))
DSTACK(0) = DDTMP
ELSEIF ((CHR.EQ.'&').OR.(C3CMD.EQ.'AND')) THEN
CMDSTR = 'LOGICAL AND'
TEMP2 = STACK(1)
DDTMP1 = DSTACK(0)
DDTMP2 = DSTACK(1)
CALL CPOP
STACK(0) = IAND(TEMP,TEMP2)
IDTMP(1) = IAND(IDTMP1(1),IDTMP2(1))
IDTMP(2) = IAND(IDTMP1(2),IDTMP2(2))
DSTACK(0) = DDTMP
ELSEIF ((CHR.EQ.'#').OR.(C3CMD.EQ.'OR')) THEN
CMDSTR = 'LOGICAL OR'
TEMP2 = STACK(1)
DDTMP1 = DSTACK(0)
DDTMP2 = DSTACK(1)
CALL CPOP
STACK(0) = IOR(TEMP,TEMP2)
IDTMP(1) = IOR(IDTMP1(1),IDTMP2(1))
IDTMP(2) = IOR(IDTMP1(2),IDTMP2(2))
DSTACK(0) = DDTMP
ELSEIF (C3CMD.EQ.'NOR') THEN
CMDSTR = 'LOGICAL NOR'
TEMP2 = STACK(1)
DDTMP1 = DSTACK(0)
DDTMP2 = DSTACK(1)
CALL CPOP
STACK(0) = NOR(TEMP,TEMP2)
IDTMP(1) = NOR(IDTMP1(1),IDTMP2(1))
IDTMP(2) = NOR(IDTMP1(2),IDTMP2(2))
DSTACK(0) = DDTMP
ELSEIF (C3CMD.EQ.'XOR') THEN
CMDSTR = 'EXCLUSIVE OR'
TEMP2 = STACK(1)
DDTMP1 = DSTACK(0)
DDTMP2 = DSTACK(1)
CALL CPOP
STACK(0) = IXOR(TEMP,TEMP2)
IDTMP(1) = IXOR(IDTMP1(1),IDTMP2(1))
IDTMP(2) = IXOR(IDTMP1(2),IDTMP2(2))
DSTACK(0) = DDTMP
ELSEIF (CCMD.EQ.'SMALL'.OR.CCMD.EQ.'LEAST') THEN
CALL CPUSH
TEMP = SMALL
GOTO 2221
ELSEIF (CCMD.EQ.'RANGE') THEN
CALL CPUSH
TEMP = RANGE
GOTO 2221
ELSEIF (CCMD.EQ.'ASMAL') THEN
CALL CPUSH
TEMP = SMALL2
GOTO 2221
ELSEIF (C4CMD.EQ.'ABIG') THEN
CALL CPUSH
TEMP = BIG2
GOTO 2221
ELSEIF (C3CMD.EQ.'BIG') THEN
CALL CPUSH
TEMP = BIG
GOTO 2221
ELSEIF (C3CMD.EQ.'SHR'.OR.C3CMD.EQ.'SHL'.OR.C3CMD.EQ.'SAR'.OR.C3CMD.EQ.'SAL'
1 .OR.C3CMD.EQ.'ROR'.OR.C3CMD.EQ.'ROL') THEN
OTHERS = CMDSTR(4:20) // ' '
REGNO = INTOF(OTHERS)
DDTMP1 = DSTACK(0)
IF (C3CMD.EQ.'SHR') THEN
WRITE (LSTCMD,'(A,I2)') 'LOG. RGT SHIFT: ',REGNO
STACK(0) = ISHR(TEMP,REGNO)
IDTMP(1) = ISHR(IDTMP1(1),REGNO)
IDTMP(2) = ISHR(IDTMP1(2),REGNO)
ELSEIF (C3CMD.EQ.'SHL') THEN
WRITE (LSTCMD,'(A,I2)') 'LOG. LFT SHIFT: ',REGNO
STACK(0) = ISHL(TEMP,REGNO)
IDTMP(1) = ISHL(IDTMP1(1),REGNO)
IDTMP(2) = ISHL(IDTMP1(2),REGNO)
ELSEIF (C3CMD.EQ.'SAR') THEN
WRITE (LSTCMD,'(A,I2)') 'ARIT RGT SHIFT: ',REGNO
STACK(0) = ISAR(TEMP,REGNO)
IDTMP(1) = ISAR(IDTMP1(1),REGNO)
IDTMP(2) = ISAR(IDTMP1(2),REGNO)
ELSEIF (C3CMD.EQ.'SAL') THEN
WRITE (LSTCMD,'(A,I2)') 'ARIT LFT SHIFT: ',REGNO
STACK(0) = ISAL(TEMP,REGNO)
IDTMP(1) = ISAL(IDTMP1(1),REGNO)
IDTMP(2) = ISAL(IDTMP1(2),REGNO)
ELSEIF (C3CMD.EQ.'ROR') THEN
WRITE (LSTCMD,'(A,I2)') 'ROTATE RIGHT: ',REGNO
STACK(0) = IROR(TEMP,REGNO)
IDTMP(1) = IROR(IDTMP1(1),REGNO)
IDTMP(2) = IROR(IDTMP1(2),REGNO)
ELSEIF (C3CMD.EQ.'ROL') THEN
WRITE (LSTCMD,'(A,I2)') 'ROTATE LEFT BY: ',REGNO
STACK(0) = IROL(TEMP,REGNO)
IDTMP(1) = IROL(IDTMP1(1),REGNO)
IDTMP(2) = IROL(IDTMP1(2),REGNO)
ENDIF
DSTACK(0) = DDTMP
ELSEIF (C3CMD.EQ.'FIX'.OR.C3CMD.EQ.'INT'.OR.CCMD.EQ.'IDINT'.OR.C4CMD.EQ.'DFIX') THEN
DOD = CCMD.EQ.'IDINT' .OR. C4CMD.EQ.'DFIX'
CMDSTR = 'GO TO INTEGER MODE'
IF (FLOAT) THEN
DO 24 I = 0,63
IF (DOD) THEN
STACK(I) = IDINT(DSTACK(I))
ELSE
STACK(I) = IFIX(RSTACK(I))
ENDIF
HSTACK(I) = HEXSTR(STACK(I))
24 CONTINUE
ENDIF
FLOAT = .FALSE.
HELP = .TRUE.
ELSEIF (C4CMD.EQ.'REAL'.OR.CCMD.EQ.'FLOAT'.OR.CCMD.EQ.'DFLOA'.OR.CCMD.EQ.'DREAL') THEN
DOD = CHR .EQ.'D'
CMDSTR = 'SWITCH TO REAL MODE'
IF (.NOT.FLOAT) THEN
DO 23 I = 0,63
IF (DOD) THEN
RSTACK(I) = SNGL(DSTACK(I))
ELSE
RSTACK(I) = REAL(STACK(I))
ENDIF
HSTACK(I) = HEXSTR(STACK(I))
23 CONTINUE
ENDIF
FLOAT = .TRUE.
HELP = .TRUE.
ELSEIF (C3CMD.EQ.'ROT'.OR.C3CMD.EQ.'T0R') THEN
STACK(0) = STACK(1)
STACK(1) = STACK(2)
STACK(2) = TEMP
DSTACK(0) = DSTACK(1)
DSTACK(1) = DSTACK(2)
DSTACK(2) = DTEMP
HSTACK(0) = HSTACK(1)
HSTACK(1) = HSTACK(2)
HSTACK(2) = HTEMP
DOSTAK = .TRUE.
ELSEIF (C3CMD.EQ.'R0T'.OR.C3CMD.EQ.'TOR') THEN
TEMP = STACK(2)
STACK(2) = STACK(1)
STACK(1) = STACK(0)
STACK(0) = TEMP
DTEMP = DSTACK(2)
DSTACK(2) = DSTACK(1)
DSTACK(1) = DSTACK(0)
DSTACK(0) = DTEMP
HTEMP = HSTACK(2)
HSTACK(2) = HSTACK(1)
HSTACK(1) = HSTACK(0)
HSTACK(0) = HTEMP
DOSTAK = .TRUE.
ELSEIF (C4CMD.EQ.'PUSH'.OR.(ISNULL.AND.(CHRNO2.EQ.'M'.OR.CHRNO2.EQ.'t'.OR.CHRNO2.EQ.'P')))
THEN
CMDSTR = 'PUSH'
CALL CPUSH
ELSEIF (C3CMD.EQ.'POP'.OR.(ISNULL.AND.(CHRNO2.EQ.'K'.OR.CHRNO2.EQ.'s'.OR.CHRNO2.EQ.'H')))
THEN
CMDSTR = 'POP'
CALL CPOP
ELSEIF (CCMD.EQ.'SWPLB') THEN
CMDSTR = 'SWAP LOWER BYTES'
INT1S(1) = IST1(3)
IST1(3) = IST1(4)
IST1(4) = INT1S(1)
ELSEIF (CCMD.EQ.'SWPUB') THEN
CMDSTR = 'SWAP UPPER BYTES'
INT1S(1) = IST1(1)
IST1(1) = IST1(2)
IST1(2) = INT1S(1)
ELSEIF (CCMD.EQ.'SWAPB') THEN
CMDSTR = 'SWAP BYTES'
INT1S(1) = IST1(1)
INT1S(2) = IST1(2)
INT1S(3) = IST1(3)
INT1S(4) = IST1(4)
IST1(4) = INT1S(3)
IST1(3) = INT1S(4)
IST1(2) = INT1S(1)
IST1(1) = INT1S(2)
ELSEIF (CCMD.EQ.'SWAPW') THEN
CMDSTR = 'SWAP WORDS'
INT2S(1) = IST2(1)
INT2S(2) = IST2(2)
IST2(2) = INT2S(1)
IST2(1) = INT2S(2)
ELSEIF (C4CMD.EQ.'SWAP') THEN
CMDSTR = 'INTERCHANGE'
STACK(0) = STACK(1)
STACK(1) = TEMP
DSTACK(0) = DSTACK(1)
DSTACK(1) = DTEMP
HSTACK(0) = HSTACK(1)
HSTACK(1) = HTEMP
ELSEIF (CCMD.EQ.'RESTO'.OR.CCMD.EQ.'RECAL'.OR.CCMD.EQ.'SAVES') THEN
CMDSTR = 'COPY MEM TO STAK'
DOSTAK = .TRUE.
DOALL = .TRUE.
DO 102 REGNO = 0,63
STACK(REGNO) = IMEM(REGNO)
DSTACK(REGNO) = DBLMEM(REGNO)
HSTACK(REGNO) = HEXSTR(STACK(REGNO))
102 CONTINUE
ELSEIF ((C3CMD.EQ.'STO').OR.(C3CMD.EQ.'RCL').OR.(C3CMD.EQ.'CLR').OR.(C3CMD.EQ.'EXC')) THEN
OTHERS = CMDSTR(4:20) // ' '
REGNO = INTOF(OTHERS)
DFOO = REALOF(OTHERS) + 1.0D-6
DDFOO = ( DFOO - DINT(DFOO) ) * 1.0D1
INDSTK = DDFOO
IF (INDSTK.GT.15.OR.INDSTK.LT.0) INDSTK = 0
DOMEM = .TRUE.
IF (C3CMD.EQ.'STO') THEN
WRITE (LSTCMD,'(A,I2,A,I2)') 'MOVE STK',INDSTK,' TO MEM',REGNO
IMEM(REGNO) = STACK(INDSTK)
DBLMEM(REGNO) = DSTACK(INDSTK)
ELSEIF (C3CMD.EQ.'CLR') THEN
WRITE (LSTCMD,'(A,I2)') 'CLEAR MEMORY ',REGNO
IMEM(REGNO) = 0
DBLMEM(REGNO) = 0.0D0
ELSEIF (C3CMD.EQ.'RCL') THEN
WRITE (LSTCMD,'(A,I2,A,I2)') 'GET STK',INDSTK,' FROM MEM',REGNO
LEVEL = MAX(LEVEL,INDSTK)
STACK(INDSTK) = IMEM(REGNO)
DSTACK(INDSTK) = DBLMEM(REGNO)
HSTACK(REGNO) = HEXSTR(STACK(REGNO))
ELSEIF (C3CMD.EQ.'EXC') THEN
WRITE (LSTCMD,'(A,I2,A,I2)') 'SWAP STK',INDSTK,' & MEM',REGNO
LEVEL = MAX(LEVEL,INDSTK)
DTEMP = DSTACK(INDSTK)
TEMP = STACK(INDSTK)
STACK(INDSTK) = IMEM(REGNO)
DSTACK(INDSTK) = DBLMEM(REGNO)
IMEM(REGNO) = TEMP
DBLMEM(REGNO) = DTEMP
HSTACK(REGNO) = HEXSTR(STACK(REGNO))
ENDIF
* Code below commented out for CALC version for inclusion into TST (KIAS)
* ELSEIF (CHR.EQ.'J'.OR.CHR.EQ.'Y') THEN
* OTHERS = '0' // CMDSTR(2:20) // ' '
* IORDER = INTOF(OTHERS)
* IF (FLOAT) THEN
* Z = CMPLX(RSTACK(0),0.0)
* ELSE
* Z = CMPLX(STACK(0),0)
* ENDIF
* W = HANKEL(Z,IORDER)
* WRITE (OTHERS,'(I17)') IORDER
* CALL STRIP(OTHERS)
* IF (CHR.EQ.'J') THEN
* CMDSTR = 'BESSEL FN ORDER '//OTHERS
* RTEMP = WR
* ELSEIF (CHR.EQ.'Y') THEN
* CMDSTR = 'NEUMANN FN ORDER '//OTHERS
* RTEMP = WI
* ENDIF
* GOTO 2219
* ELSEIF (CHR.EQ.'I'.OR.CHR.EQ.'K') THEN
* OTHERS = '0' // CMDSTR(2:20) // ' '
* IORDER = INTOF(OTHERS)
* IM4 = MOD(IORDER,4)
* IF (FLOAT) THEN
* Z = CMPLX(0.0,RSTACK(0))
* ELSE
* Z = CMPLX(0,STACK(0))
* ENDIF
* W = HANKEL(Z,IORDER)
* WRITE (OTHERS,'(I17)') IORDER
* CALL STRIP(OTHERS)
* IF (CHR.EQ.'I') THEN
* CMDSTR = 'MOD. BESSEL FN ORDER '//OTHERS
* IF (IM4.EQ.1) THEN
* RTEMP = -WI
* ELSEIF (IM4.EQ.2) THEN
* RTEMP = -WR
* ELSEIF (IM4.EQ.3) THEN
* RTEMP = WI
* ELSE
* RTEMP = WR
* ENDIF
* ELSEIF (CHR.EQ.'K') THEN
* CMDSTR = 'MOD. NEUMANN FN ORDER '//OTHERS
* IF (IM4.EQ.1) THEN
* RTEMP = WR
* ELSEIF (IM4.EQ.2) THEN
* RTEMP = -WI
* ELSEIF (IM4.EQ.3) THEN
* RTEMP = -WR
* ELSE
* RTEMP = WI
* ENDIF
* RTEMP = RTEMP*(PI/2.0)
* ENDIF
* GOTO 2219
* ELSEIF (C4CMD.EQ.'HANK') THEN
* CMDSTR = 'CMPLX HANKEL OF STACK 0,1'
* OTHERS = CMDSTR(4:20) // ' '
* IF (OTHERS(1:1).EQ.'E') OTHERS(1:1) = ' '
* IF (OTHERS(2:2).EQ.'L') OTHERS(2:2) = ' '
* IORDER = INTOF(OTHERS)
* IF (FLOAT) THEN
* Z = CMPLX(RSTACK(0),RSTACK(1))
* ELSE
* Z = CMPLX(STACK(0),STACK(1))
* ENDIF
* W = HANKEL(Z,IORDER)
* IF (FLOAT) THEN
* RSTACK(0) = WR
* RSTACK(1) = WI
* ELSE
* STACK(0) = WR
* STACK(1) = WI
* ENDIF
* DSTACK(0) = WR
* DSTACK(1) = WI
ELSEIF (C3CMD.EQ.'@ ') THEN
OTHERS = CMDSTR(2:20) // ' '
CALL STRIP(OTHERS)
IORDER = INTOF(OTHERS)
IF (OTHERS.EQ.' ') THEN
IF (FLOAT) THEN
IORDER = RTEMP
ELSE
IORDER = TEMP
ENDIF
ELSE
CALL CPUSH
ENDIF
GRONK = HEXOF(TEMP)
CMDSTR = 'PEEK @ $'//GRONK(3:8)
STACK(0) = FLPEEK(TEMP)
IF (FLOAT) THEN
DSTACK(0) = RSTACK(0)
ELSE
DSTACK(0) = STACK(0)
ENDIF
ELSEIF ((CHR.EQ.'O'.OR.CHR.EQ.'@').AND.C3CMD(2:3).NE.' ') THEN
TSTSTR = CMDSTR
TSTSTR(1:1) = '@'
TEMP = INTOF(TSTSTR)
CALL CPUSH
GOTO 2221
ELSEIF (CHR.EQ.'%') THEN
TSTSTR = CMDSTR
TEMP = INTOF(TSTSTR)
CALL CPUSH
GOTO 2221
ELSEIF ((CHR.EQ.'$').OR.(CHR.EQ.'+').OR.(CHR.EQ.'-').OR.((CHR.GE.'0').AND.(CHR.LE.'9'))
& .OR.CHR.EQ.'A'.OR.CHR.EQ.'B'.OR.CHR.EQ.'C'.OR.CHR.EQ.'D'.OR.CHR.EQ.'E'
& .OR.CHR.EQ.'F'.OR.CHR.EQ.'.') THEN
TSTSTR = '0'//CMDSTR
IF (.NOT.FLOAT) TEMP = INTOF(TSTSTR)
DTEMP = REALOF(TSTSTR)
CALL CPUSH
IF (.NOT.FLOAT) STACK(0) = TEMP
IF (FLOAT) RSTACK(0) = DTEMP
DSTACK(0) = DTEMP
ELSE
TMPSTR = CMDSTR
CALL STRIP(TMPSTR)
IF (TMPSTR.NE.' ') THEN
CALL FNCHCK(TMPSTR,'BIN',FILNAM)
TEMP = LENGFI(FILNAM)
ELSE
TEMP = -1
ENDIF
IF (TEMP.GE.0) THEN
CALL DOSAVE
CALL CPUSH
CMDSTR = 'LEN OF '//FILNAM
DSTACK(0) = TEMP
IF (FLOAT) THEN
RSTACK(0) = TEMP
ELSE
STACK(0) = TEMP
ENDIF
ELSE
IF (FIRST) THEN
FIRST = .FALSE.
CHR = '?'
GOTO 9999
ENDIF
CMDSTR = '?: '//CMDSTR
WRITE (LINE1,'(A)') 'UNKNOWN COMMAND: ',CMDSTR
CALL SAYAT(12,23,0,LINE1)
CALL BEEP
CALL WAIT(0.5)
ENDIF
ENDIF
GOTO 2222
2221 CONTINUE
DSTACK(0) = TEMP
IF (.NOT.FLOAT) STACK(0) = TEMP
IF (FLOAT) RSTACK(0) = TEMP
GOTO 2222
2219 CONTINUE
DSTACK(0) = RTEMP
2220 CONTINUE
IF (.NOT.FLOAT) STACK(0) = RTEMP
IF (FLOAT) RSTACK(0) = RTEMP
2222 CONTINUE
HSTACK(0) = HEXOF(STACK(0))
GOTO 1
6666 CONTINUE
CALL OPESYS
DONT = 5926
RETURN
ENTRY QQCALC
CALL GRCLS
HELP = .TRUE.
GOTO 9000
ENTRY CALCQT
DOALL = .TRUE.
HELP = .TRUE.
GOTO 9000
ENTRY QCALCQ
GOTO 9001
END
*--------------------------------------------------------------------------
BLOCK DATA FORCLC
INTEGER DIDIT
COMMON /INTCLC/DIDIT
DATA DIDIT/0/
END

Vous aimerez peut-être aussi