home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d594 / analyrimsrc.lha / AnalyRimSrc / AnaRimSrcDoc.Zoo / analyrimp1.for < prev    next >
Text File  |  1991-10-18  |  678KB  |  24,243 lines

  1. C ********** ANALYAC.FTN ##########################################
  2. C This version of AnalytiCalc uses the include file aparms.inc to
  3. C contain parameters. These specify the "prime area" of the
  4. C spreadsheet, and also the size of in-memory buffers that
  5. C are used for in-memory storage of spreadsheet data. Larger
  6. C spreadsheets may of course be stored using the software
  7. C paging built in, but at much reduced speed.
  8. C  Glenn Everhart 9/20/1989
  9. C This version of AnalytiCalc has RIM integrated and is descended
  10. C from the original via the following ports:
  11. C pdp11/RSX -> VAX/VMS ->VAX/VMS -> MSDOS/IBMPC ->Amiga ->Unix (Sun) ->VAX/VMS
  12. C and now VAX/VMS -> Amiga.
  13. C Much of the crockishness of less than the original set of PARAMETERS
  14. C derived from the MSDOS port; MS Fortran 3.2 did not support parameters
  15. C (or,I believe, block data, though that got introduced later). The
  16. C parameters were reinserted (partially anyway) for the Amiga version.
  17. C Glenn Everhart 1991
  18. C
  19. C parameter relationships implicit below:
  20. C mval, nominal 800, multiple of 100
  21. C mfrm, nominal 2048, multiple of 128
  22. C Mvlov2=mval/2
  23. C mfrmo2=mfrm/2
  24. C MVal/16=mvlo16
  25. C mfrm/64=mfro64
  26. c -h- analy.for    Fri Aug 22 12:54:45 1986    
  27.         PROGRAM ANALY
  28. C ANALYTICALC MAIN PROGRAM
  29. C SPREAD SHEET DRIVER PROGRAM
  30.     Include aparms.inc
  31. C COPYRIGHT (C) 1983-1990 GLENN AND MARY EVERHART
  32. C ALL RIGHTS RESERVED
  33. C MAX SHEET DIMS ARE MCOLS BY mrows-1 (MROWS SINCE ACCUMULATORS ARE A PSEUDO ROW)
  34. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  35. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  36. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  37. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  38. C FROM THE DISK BASED FILE HERE.
  39. C
  40. c    InTeGer*4 PRL(6)
  41. c        CHARACTER*1 NOWRAP ( 2 )
  42.     character*1 fvld
  43. c    CHARACTER*1 FORM,FVLD,CMDLIN(132)
  44. c    INTEGER*4 VNLT
  45. c    INTEGER IFCW
  46. C    EXTERNAL LCWRQQ
  47.     DIMENSION FVLD(1,1)
  48. c    DIMENSION FORM(128),FVLD(1,1)
  49. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  50. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  51. C SO INITIALLY IGNORE.
  52. C
  53. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  54. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  55. C
  56.     character*132 inmsg
  57.     integer inmsgf
  58.     common/rinmsg/inmsgf,inmsg
  59. C ***<<<< RDD COMMON START >>>***
  60.     InTeGer*4 RRWACT,RCLACT
  61. C    COMMON/RCLACT/RRWACT,RCLACT
  62.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  63.      1  IDOL7,IDOL8
  64. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  65. C     1  IDOL7,IDOL8
  66.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  67. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  68.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  69. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  70. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  71. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  72.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kpag
  73. C    COMMON/KLVL/KLVL
  74.     InTeGer*4 IOLVL,igold
  75. C    COMMON/IOLVL/IOLVL
  76. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  77. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  78.     Integer*4 Idsptp,Idol9
  79.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  80.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  81.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  82.      3  k3dfg,kcdelt,krdelt,kpag
  83. C ***<<< RDD COMMON END >>>***
  84.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  85.     COMMON/D2R/NRDSP,NCDSP
  86.     InTeGer*4 TYPE(1,2),VLEN(9)
  87.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  88.     Real*8 VAVBLS(3,27)
  89.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  90.     REAL*8 XXV(1,1)
  91.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  92.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  93. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  94.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  95.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  96.     CHARACTER*12 CDVFMT
  97.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  98.     COMMON/DEFVBX/DVFMT
  99.     CHARACTER*1 NMSH(80)
  100.     CHARACTER*80 NMSH80
  101.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  102.     COMMON/NMSH/NMSH
  103.     CHARACTER*1 FORM2(4)
  104. cc    integer*4 curszx,curszy,kbdin
  105. cc    common/curspr/curszx,curszy,kbdin
  106. C ***<<< XVXTCD COMMON START >>>***
  107.     CHARACTER*1 OARRY(100)
  108.     InTeGer*4 OSWIT,OCNTR
  109. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  110. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  111.     InTeGer*4 IPS1,IPS2,MODFLG
  112. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  113.        InTeGer*4 XTCFG,IPSET,XTNCNT
  114.        CHARACTER*1 XTNCMD(80)
  115. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  116. C VARY FLAG ITERATION COUNT
  117.     INTEGER KALKIT
  118. C    COMMON/VARYIT/KALKIT
  119.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  120.     InTeGer*4 RCMODE,IRCE1,IRCE2
  121. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  122. C     1  IRCE2
  123. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  124. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  125. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  126. C RCFGX ON.
  127. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  128. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  129. C  AND VM INHIBITS. (SETS TO 1).
  130.     INTEGER*4 FH
  131. C FILE HANDLE FOR CONSOLE I/O (RAW)
  132. C    COMMON/CONSFH/FH
  133.     CHARACTER*1 ARGSTR(52,4)
  134. C    COMMON/ARGSTR/ARGSTR
  135.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  136.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  137.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  138.      3  IRCE2,FH,ARGSTR
  139. C ***<<< XVXTCD COMMON END >>>***
  140. C
  141. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  142. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  143. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  144. C DISPLAY ACTUALLY USED FOR SCREEN.
  145.     Integer*4 CWids(JIDcl)
  146. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  147. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  148. C AS 20 NOT 75.
  149. c    INTEGER*4 I4TMP
  150.     REAL*8 DVS(JIDcl,JIDrw)
  151.     COMMON /FVLDC/FVLD
  152. C FOLLOWING SUPPORT VVARY OVERLAY:
  153.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  154.     InTeGer*4 QCAC(2),QCENT(8),ACV(8)
  155.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  156. C BITMAP
  157. C    CHARACTER*1 IBITMP
  158. C    DIMENSION IBITMP(2258)
  159. C    COMMON/INITD/IBITMP
  160. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  161. C 10 CHARACTERS PER ENTRY.
  162.     COMMON/DSPCMN/DVS,CWIDS
  163. C    character*35 fwt
  164. C COMMONS FROM OTHER MISC. ROUTINES, ADDED TO ALLOW AMIGA FORTRAN TO
  165. C ALLOCATE COMMONS ON STACK...
  166.     CHARACTER*1 LBITS(8)
  167.     COMMON/BITS/LBITS
  168.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  169.     COMMON/CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  170.     CHARACTER*1 DTBL1(9,9,8)
  171.     COMMON/DECIDE/DTBL1
  172.     CHARACTER*1 DIGITS(16,3)
  173.     COMMON/DIGV/DIGITS
  174. C ***<<< KLSTO COMMON START >>>***
  175.     InTeGer*4 DLFG
  176. C    COMMON/DLFG/DLFG
  177.     InTeGer*4 KDRW,KDCL
  178. C    COMMON/DOT/KDRW,KDCL
  179.     InTeGer*4 DTRENA
  180. C    COMMON/DTRCMN/DTRENA
  181.     REAL*8 EP,PV,FV
  182.     DIMENSION EP(20)
  183.     INTEGER*4 KIRR
  184. C    COMMON/ERNPER/EP,PV,FV,KIRR
  185.     InTeGer*4 LASTOP
  186. C    COMMON/ERROR/LASTOP
  187.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  188. C    COMMON/FMTBFR/FMTDAT
  189.     CHARACTER*1 EDNAM(16)
  190. C    COMMON/EDNAM/EDNAM
  191.     InTeGer*4 MFID(2),MFMOD(2)
  192. C    COMMON/FRM/MFID,MFMOD
  193.     InTeGer*4 JMVFG,JMVOLD
  194. C    COMMON/FUBAR/JMVFG,JMVOLD
  195.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  196.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  197. C ***<<< KLSTO COMMON END >>>***
  198. C
  199. C
  200.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  201.     CHARACTER*1 FVXX(Imps3)
  202.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  203.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  204.         Common/FVLDM/FVXX
  205. c        COMMON/FVLDM/FV1,FV2,FV4
  206.     InTeGer*2 IFID(8,MFrm)
  207.     COMMON/IFIDC/IFID
  208.     InTeGer*4 ILNFG,ILNCT
  209.     CHARACTER*1 ILINE(106)
  210.     COMMON/ILN/ILNFG,ILNCT,ILINE
  211.     InTeGer*4 ITCNTV(6)
  212.     COMMON/ITERA/ITCNTV
  213.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  214.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  215.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  216.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  217.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  218. C ***<<< NULETC COMMON START >>>***
  219.     InTeGer*4 ICREF,IRREF
  220. C    COMMON/MIRROR/ICREF,IRREF
  221.     InTeGer*4 MODPUB,LIMODE
  222. C    COMMON/MODPUB/MODPUB,LIMODE
  223.     InTeGer*4 KLKC,KLKR
  224.     REAL*8 AACP,AACQ
  225. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  226.     InTeGer*4 NCEL,NXINI
  227. C    COMMON/NCEL/NCEL,NXINI
  228.     CHARACTER*1 NAMARY(20,MROWS)
  229. C    COMMON/NMNMNM/NAMARY
  230.     InTeGer*4 NULAST,LFVD
  231. C    COMMON/NULXXX/NULAST,LFVD
  232.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  233.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  234. C ***<<< NULETC COMMON END >>>***
  235.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  236.     InTeGer*4 ST1PT,ST2PT,ST1TYP(40),ST2TYP(40),ST1LIM,ST2LIM
  237.     COMMON/STACKx/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  238.      1  ST1LIM,ST2LIM
  239.     InTeGer*4 IATYP(27),LINTGR
  240.     CHARACTER*1 ITYP(Imp1s)
  241.     COMMON/TYP/IATYP,ITYP,LINTGR
  242.     InTeGer*4 MPAG(2),MPMOD(2)
  243.     InTeGer*2 LVALBF(5,Mval)
  244.     COMMON/VB/MPAG,LVALBF,MPMOD
  245.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  246.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  247.     InTeGer*4 LEVEL,NONBLK,LEND,VIEWSW,BASED
  248.     CHARACTER*1 LINE(80)
  249.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  250.     integer*4 isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  251.     common/isv/isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  252. C *** END COMMONS FROM OTHER PLACES.
  253.     Character*1 IYN
  254.     integer*4 ixxxx,ixxxy
  255.     FH=0
  256.     isvfg=0
  257.     NCEL=0
  258.     inmsg=" "
  259.     inmsgf=0
  260. c    IFCW=4927
  261. C DISABLE FLOATING EXCEPTIONS
  262. c    call lcwrqq(ifcw)
  263. C system-specific: disable exceptions`
  264. c    ixxxx=ieee_flags("clear","exception","all",ixxxy)
  265. c    ixxxx=ieee_handler("set","all",SIGFPE_IGNORE)
  266. C don't slow down for underflows etc...
  267. c    call nonstandard_arithmetic
  268. C INITIAL DEFAULT FORMAT FOR NUMERICS is set at runtime
  269. C INIT COMMON DATA FIRST OF ALL.
  270.     IDOL7=1
  271. C INITIALLY IN ANSI MODE. STILL USE ANSI DRIVER FOR INPUT CONTROLS.
  272. C NOW SET UP OTHER COMMON INFO (USED TO BE A BLOCK DATA...NOW CHANGED.)
  273.     CALL BLOCK
  274.     call block2
  275.     IKONS=0
  276.     write(*,6402)
  277. 6402    Format(' Amiga vers. compiled by Absoft Fortran 2.3')
  278.         IYN=char(27)
  279.         Write(*,6398)iyn,iyn
  280. 6398    Format(A,'[H',A,'[J')
  281.     Write(*,6403)
  282. 6403    Format(' Is workbench screen 640 by 400 or over? [Y/N]:')
  283.     IDSPTP=0
  284.     Read(*,6406)IYN
  285. 6406    Format(1A1)
  286.     If(IYN.eq.'Y'.or.IYN.eq.'y')IDSPTP=1
  287. c IDSPTP now is 0 for non interlace, 1 for interlace.
  288.     CALL INITA1(KMAP,KWID,ICODE)
  289. 3002    CONTINUE
  290.     CALL INITA2(KMAP,KWID,ICODE,IKONS)
  291.     IKONS=1
  292. 3000    CONTINUE
  293.     CALL INITB(KMAP,KWID,ICODE)
  294.     LINIZZ=0
  295. C    IF(IOLDFL.GT.1)GOTO 2000
  296. 2000    CONTINUE
  297. C DRAW OUR LABELS AND OTHERWISE INITIALIZE DISPLAY SHEET
  298.     KZPPD=0
  299.     IF(IPSET.NE.0)GOTO 1000
  300.     IF(PZAP.EQ.0)CALL UVT100(11,2,0)
  301.     CALL UVT100(1,1,1)
  302.     OSWIT=20
  303.     IPRSS=PROW
  304.     IPCSS=PCOL
  305.     IDRW=DROW
  306.     IDCL=DCOL
  307.     IF(LINIZZ.LE.1)CALL RECALC
  308.     IF(PZAP.EQ.0)CALL DSPSHT(2)
  309.     DCOL=IDCL
  310.     DROW=IDRW
  311.     PROW=IPRSS
  312.     PCOL=IPCSS
  313. 3006    FORMAT(80A1)
  314. C
  315. 1000    CONTINUE
  316.     IPSET=0
  317.     LINIZZ=LINIZZ+1
  318.     OSWIT=20
  319. C ISSUE A PROMPT FOR COMMAND AND DO A COMMAND
  320.     ICODE=0
  321.     CALL XQTCMD(ICODE)
  322.     IF(ICODE.LT.30)GOTO 1843
  323. C HELP COMMAND AND SIMILAR...
  324.     IF(ICODE.NE.400)GOTO 1847
  325.     CALL DSPSHT(10)
  326.     ICODE=1
  327. C CODE 10 IS PRINT SECRET CODE TO DSPSHT.
  328.     GOTO 1843
  329. 1847    CONTINUE
  330.     IF(ICODE.NE.420)GOTO 1849
  331. C CLOSE UNIT 1 JUST IN CASE...
  332.     CLOSE(1)
  333.     KLVL=1
  334.     IPRSSS=PROW
  335.     IPCSSS=PCOL
  336.     CALL CALC
  337.     PROW=IPRSSS
  338.     PCOL=IPCSSS
  339. C CLOSE CONSOLE LUN USED BY CALC.
  340.     CLOSE(1)
  341. C CLOSE ANY OTHER LUNS CALC MAY HAVE USED...
  342.     CLOSE(2)
  343.     CLOSE(3)
  344. C SET UP FOR REDRAW WHEN BACK...
  345.     ICODE=-1
  346.     GOTO 1843
  347. 1849    CONTINUE
  348.     IF(ICODE.NE.430)GOTO 1845
  349. C TEST FUNCTION, TESTING EXPRESSION.
  350. C INHIBIT RECALCULATION...
  351. C COMMAND IS IN "XTNCMD" STRING.
  352.     LLST=MIN0(80,XTNCNT+1)
  353.     LFST=1
  354.     CALL DOENTR(XTNCMD,LFST,LLST)
  355. C THIS SETS % VARIABLE AND WILL DO A CALC DIRECTLY. THEREFORE
  356. C WE MUST INHIBIT AUTO RECALCULATION.
  357. C NOTE WE HAVE TO CALL THIS FROM THE ROOT SINCE THE RECALC OVERLAY
  358. C TREE OVERWRITES THE XQTCMD ONE.
  359.     ICODE=1
  360.     GOTO 1843
  361. 1845    CONTINUE
  362.     IVVV=ICODE-30
  363. 9308    CALL HELP(IVVV)
  364.     IVVV=0
  365.     CALL VWRT('Type return to continue, Hn for other Help pages:',
  366.      1  49)
  367.     ILL=IOLVL
  368. C    IF(ILL.EQ.5)ILL=0
  369.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)(FORM2(K),K=1,4)
  370.     if(ill.eq.11)call vget(form2,4)
  371.     IVVVV=ichar(FORM2(2))
  372.     IF(IVVVV.GE.48.AND.IVVVV.LE.57)IVVV=IVVVV-48
  373.     IF(FORM2(1).EQ.'H'.OR.FORM2(1).EQ.'h')GOTO 9308
  374. C NOW CLEAR SCREEN AND TRY MORE COMMANDS AS BEFORE...
  375.     ICODE=6
  376. C
  377. 1843    CONTINUE
  378.     OSWIT=20
  379.     IPRSS=PROW
  380.     IPCSS=PCOL
  381.     IDRW=DROW
  382.     IDCL=DCOL
  383.     IF(LINIZZ.LE.1)CALL RECALC
  384.     IF(IPSET.NE.0)GOTO 4110
  385.     DCOL=IDCL
  386.     DROW=IDRW
  387.     PROW=IPRSS
  388.     PCOL=IPCSS
  389. 4110    CONTINUE
  390.     IPSET=0
  391.     IF(ICODE.EQ.-1)GOTO 2000
  392. C IN PORTACALC-VM, S COMMAND ALLOWS DEFAULT FORMAT CHANGE AND
  393. C TITLE CHANGE, BUT DOES NOT ALTER SHEET IN MEMORY... DON'T ALLOW
  394. C SCRATCH FILE SAVE STUFF...
  395. C    IF(ICODE.EQ.-2)CALL WRKFIL(1,FORM,3)
  396. C    IF (ICODE.EQ.-2)CALL CLOSE(7)
  397.     IF(ICODE.LE.-2)GOTO 3002
  398. C
  399. C RECALCULATE SHEET NOW AUTOMAGICALLY
  400. C IF ICODE=1, COMMAND JUST MOVES ON DISPLAY, SO NO NEED TO RECALCULATE
  401. C THE ENTIRE SHEET.
  402. C LIMIT NUMBER OF ITERATIONS AT ANY ONE TIME TO 20 HOWEVER
  403.     KKMAX=20
  404. 3670    CONTINUE
  405.     IF(ICODE.EQ.5.OR.ICODE.EQ.1
  406.      1  .OR.ICODE.EQ.6.OR.RCFGX.EQ.1)GOTO 3671
  407.     CALL RECALC
  408.     IPSET=0
  409.     KKMAX=KKMAX-1
  410. C IMPLEMENT VARY LOOP...
  411. C ASSUME USRFCT MUSTR CONTOL KALKIT VARIABLE THEN TO GET LOOP TO
  412. C TERMINATE SOMETIME.
  413.     KKMAX=MIN0(KKMAX,KALKIT)
  414.     IF(KKMAX.GT.0)GOTO 3670
  415. 3671    CONTINUE
  416. C    IF(ICODE.NE.1.AND.RCFGX.NE.1)CALL RECALC
  417. C
  418. C DISPLAY SHEET NOW. ONLY ALTERS ENTRIES INVALIDATED BY COMMAND.
  419.     IF(ICODE.NE.2.AND.ICODE.NE.6)GOTO 21
  420. C ICODE=2 = REFRESH DISPLAY. ZERO ALL NUMBERS AND CAUSE TOTAL REDISPLAY.
  421.     DO 22 N1=1,JIDcl
  422.     DO 22 N2=1,JIDrw
  423. C SET NUMBER DISPLAYED TO WEIRD VALUE.
  424. 22    DVS(N1,N2)=DVS(N1,N2)+.000000000034
  425.     IF(PZAP.EQ.0)CALL UVT100(11,2,0)
  426.     CALL UVT100(1,1,1)
  427. 21    CONTINUE
  428.     IF(ICODE.EQ.6)ICODE=2
  429.     IF(ICODE.NE.5.AND.PZAP.EQ.0)CALL DSPSHT(ICODE)
  430.     DCOL=IDCL
  431.     DROW=IDRW
  432.     PROW=IPRSS
  433.     PCOL=IPCSS
  434.     GOTO 1000
  435. 5600    CONTINUE
  436. C ERROR ON READ FROM IOLVL HANDLED HERE.
  437. c    REWIND 5
  438. c    CLOSE(11)
  439. c    OPEN(11,FILE='CON:50/150/300/40/Analy Command',STATUS='OLD',
  440. c     1  FORM='FORMATTED')
  441.     CLOSE(3)
  442.     IOLVL=11
  443.     GOTO 1000
  444.     END
  445. c -h- assign.for    Fri Aug 22 12:56:01 1986    
  446.     SUBROUTINE ASSIGN(IUNIT,NAME)
  447. C
  448. C
  449.     CHARACTER*1 NAME(50)
  450.     InTeGer*4 IUNIT
  451. C &&&& MS FTN 3.2
  452.     LOGICAL LEXIST
  453. C &&&&
  454.     CHARACTER*20 WK
  455.     CHARACTER*1 WK1(20)
  456.     EQUIVALENCE(WK(1:1),WK1(1))
  457. C JUST TRY AND NULL FILL A NAME TO USE.
  458.     DO 1 N=1,20
  459.     WK1(N)=' '
  460. 1    CONTINUE
  461.     DO 2 N=1,20
  462.     II=ICHAR(NAME(N))
  463.     IF(II.LT.32)GOTO 3
  464.     WK1(N)=CHAR(II)
  465. C1    CONTINUE
  466. 2    CONTINUE
  467. 3    CONTINUE
  468. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  469. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  470. C AVOID CRASHES IF THE FILE ISN'T THERE...
  471. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  472. C &&&&
  473. C
  474. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  475. C
  476.     INQUIRE(FILE=WK,EXIST=LEXIST)
  477.     IF(LEXIST)GOTO 100
  478. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  479. C IF CREATE FAILS WE LOSE TOO...
  480.     CALL UVT100(1,1,1)
  481.     CALL SWRT('File not found. Using window instead.',37)
  482. c    Open(IUNIT,file='tt:',status='unknown')
  483.     open(IUNIT,'con:200/100/300/80/Nonexistent file')
  484. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  485. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  486.     Return
  487. 100    CONTINUE
  488. C &&&&
  489. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  490.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  491.      1  FORM='FORMATTED',recl=512)
  492. 77    CONTINUE
  493. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  494. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  495.     RETURN
  496.     END
  497. c -h- at.for    Fri Aug 22 12:56:23 1986    
  498.     SUBROUTINE AT (RETCD)
  499. C COPYRIGHT (C) 1983 GLENN EVERHART
  500. C ALL RIGHTS RESERVED
  501. C 60=MAX REAL ROWS
  502. C 301=MAX REAL COLS
  503. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  504. C VBLS AND TYPE DIMENSIONED 60,301
  505. C *******************************************************
  506. C *                                                     *
  507. C *           SUBROUTINE  AT                            *
  508. C *                                                     *
  509. C *******************************************************
  510. C SUBROUTINE AT IS CALLED WHEN THE  *@  CALC COMMAND IS ENCOUNTERED.
  511. C IT CHANGES  THE  VALUE  OF LEVEL  WHICH  HOLDS THE  NUMBER OF THE
  512. C LOGICAL  I/O  UNIT WHERE INPUT COMMAND LINES ARE TO BE OBTAINED.
  513. C THE FILE ASSOCIATED WITH THAT I/O UNIT IS OPENED UNDER THE PROPER
  514. C CONDITIONS.
  515. C
  516. C MODIFICATION CLASSES: M1,M2,M9
  517. C
  518. C      MODIFIED 3-OCT-77 P.B.
  519. C      MODIFIED 10-JAN-78 P.B.  TO PUT SY: BEFORE FILENAMES
  520. C         WITH NO DEVICE SPECIFIED SO THAT DEFAULT IS USER'S SY:
  521. C         AND NOT THE SYSTEM SY:
  522. C
  523. C
  524. C    AT CALLS
  525. C
  526. C  ASSIGN  (TO ASSOCIATE A FILE NAME WITH A LOGICAL I/O UNIT)
  527. C  ERRMSG  (TO PRINT ERROR MESSAGES)
  528. C  GETNNB  (TO GET NEXT NON-BLANK FROM THE INPUT LINE)
  529. C  ZNEG    (TO TEST IF A VARIABLE IS POSITIVE)
  530. C
  531. C
  532. C
  533. C   AT IS CALLED BY ROUTINE CMND WHICH IS THE MODULE THAT DETERMINES
  534. C   WHAT CALC COMMAND WAS REQUESTED.
  535. C
  536. C
  537. C
  538. C         VARIABLE          USE
  539. C
  540. C   ALPHA(27)         HOLDS LEGAL VARIABLE NAMES.
  541. C   I,J               HOLD TEMPORARY VALUES.
  542. C   IPT               POINTS TO NEXT NON-BLANK CHARACTER IN LINE(80).
  543. C   ITCNTV(6)         INDEXED BY LEVEL. HOLDS 0 IF NO ITERATION ON THAT
  544. C                     LEVEL, OTHERWISE INDEX INTO VBLS FOR THE VARIABLE
  545. C                     THAT CONTROLS ITERATION.
  546. C   LEVEL             HOLDS NUMBER OF LOGICAL I/O UNIT WHERE NEXT INPUT
  547. C                     LINE IS EXPECTED.
  548. C   LINE(80)          HOLDS COMMAND INPUT LINE.
  549. C   NBLINE(78)        HOLDS THE INPUT FILE NAME WITHOUT BLANKS.
  550. C   NONBLK            POINTS TO THE LAST NON-BLANK CHARACTER IN LINE(80).
  551. C   RETCD             RETURN CODE: 1=O.K.  2=ERROR.
  552. C   SY                "SY:" USED TO OPEN FILES WITH A DEFAULT OF
  553. C                     USER'S SY: (OTHERWISE SYSTEM SY: IS USED) P.B.
  554. C                     10-JAN-78
  555. C
  556. C
  557. C
  558. C    SUBROUTINE AT (RETCD)
  559. C
  560.     InTeGer*4 IPT,J,I
  561.     InTeGer*4 LEVEL,NONBLK,LEND
  562.     InTeGer*4 RETCD,VIEWSW,BASED
  563.     InTeGer*4 ITCNTV(6),ZNEG
  564. C
  565.     CHARACTER*1  LINE(80),NBLINE(78)
  566.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  567. C    CHARACTER*1 SY(3)
  568. C
  569. C
  570.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  571.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  572.     COMMON/ITERA/ITCNTV
  573. C
  574. C    DATA SY/'S','Y',':'/
  575. C
  576. C
  577. C
  578. C UPON ENTRANCE, NONBLK POINTS TO THE CHARACTER @
  579. C
  580. C  MODIFICATION CLASSES:  M1,M2,M9
  581. C
  582. C PICK UP FIRST NON-BLANK AFTER THE @
  583.     CALL GETNNB(IPT,RETCD)
  584.     GO TO (10,1050),RETCD
  585.     STOP 10
  586. C
  587. C
  588. C START BUILDING FILE NAME AS A COMPRESSED VERSION (BLANKS REMOVED)
  589. C OF THE REST OF LINE(80)
  590. 10    J=0
  591. 15    NONBLK=IPT
  592.     J=J+1
  593.     NBLINE(J)=LINE(NONBLK)
  594.     CALL GETNNB(IPT,RETCD)
  595.     GO TO (15,50),RETCD
  596.     STOP 50
  597. C
  598. C
  599. C SET RETURN CODE AND INDICATE THAT WE WILL BE AT A NEW LEVEL.
  600. C J HOLDS THE COUNT OF THE NUMBER OF CHARACTERS IN NBLINE.
  601. C IF J=1 THEN NO ITERATION IS POSSIBLE BECAUSE FILENAME IS THE
  602. C SINGLE CHARACTER.
  603. 50    RETCD=1
  604.     LEVEL=LEVEL+1
  605.     IF (LEVEL.GT.6) GOTO 1000
  606. C
  607.     IF(J.EQ.1) GO TO 200
  608. C
  609. C NBLINE HOLDS THE COMPRESSED FILENAME. NOW WE CHECK TO SEE IF AN
  610. C ITERATION VARIABLE WAS SPECIFIED. THIS IS INDICATED BY A LEGAL
  611. C VARIABLE NAME PRECEEDED BY A BLANK (IN LINE(80))
  612. C NOTE THAT ONLY ONE OF THE ACCUMULATORS A-Z MAY BE USED FOR THIS.
  613.     DO 60 I=1,27
  614. C A-Z OR % LEGAL
  615.     IF(ALPHA(I).EQ.LINE(NONBLK))GO TO 100
  616. 60    CONTINUE
  617.     GO TO 200
  618. 100    IF(LINE(NONBLK-1).NE.BLANK)GO TO 200
  619. C
  620. C
  621. C ITERATION INDICATOR IS PRESENT
  622. C (ALPHABETIC CHARACTER OR % PRECEEDED BY A BLANK)
  623. C IF THE VALUE OF THE VARIABLE IS NOT POSITIVE, THE FILE IS IGNORED.
  624.     IF(ZNEG(I).EQ.1)GO TO 150
  625. C
  626. C
  627. C RETAIN INDEX INTO VBLS AND DECREASE J SO THAT THE FILENAME
  628. C DOES NOT INCLUDE THE ITERATION SPECIFICATION.
  629.     ITCNTV(LEVEL)=I
  630.     J=J-1
  631.     GO TO 300
  632. C
  633. C
  634. C FILE NOT ENTERED, ITERATION VARIABLE IS ZERO, NEGATIVE, OR UNDEFINED
  635. 150    LEVEL=LEVEL-1
  636.     GO TO 350
  637. C
  638. C
  639. C IF NO ITERATION, SET ITCNTV TO ZERO BECAUSE NOT ZEROED BY EXIT
  640. C ROUTINES
  641. 200    ITCNTV(LEVEL)=0
  642. 300    CONTINUE
  643.     NBLINE(J+1)=char(0)
  644. C    OPEN(UNIT=LEVEL,NAME=NBLINE)
  645. C    CALL RASSIG (LEVEL,NBLINE,J)
  646.     CALL RASSIG (LEVEL,NBLINE,I)
  647.     if(i.ne.0)goto 1000
  648. 350    RETURN
  649. C
  650. C *** ERROR PROCESSING ***
  651. C
  652. C  TOO MANY LEVELS
  653. 1000    I=2
  654. 1010    CALL ERRMSG(I)
  655. 1020    RETCD=2
  656.     RETURN
  657. C
  658. C
  659. C UNIDENTIFIED COMMAND (ARGUMENT)
  660. 1050    I=3
  661.     GO TO 1010
  662.     END
  663. c -h- bascng.for    Fri Aug 22 12:57:23 1986    
  664.     SUBROUTINE BASCNG(RETCD)
  665. C COPYRIGHT (C) 1983 GLENN EVERHART
  666. C ALL RIGHTS RESERVED
  667. C 60=MAX REAL ROWS
  668. C 301=MAX REAL COLS
  669. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  670. C VBLS AND TYPE DIMENSIONED 60,301
  671. C
  672. C SUBROUTINE BASCNG IS CALLED WHEN THE *B CALC COMMAND IS
  673. C ENCOUNTERED. THIS COMMAND INDICATES THAT THE DEFAULT BASE
  674. C FOR CONSTANTS IS TO BE CHANGED. THE ROUTINE READS IN ONE
  675. C OR TWO DIGITS AND CHANGES THE DEFAULT BASE SPECIFICATION
  676. C AS IS APPROPRIATE.
  677. C
  678. C MODIFICATION CLASS M2
  679. C
  680. C   BASCNG CALLS
  681. C
  682. C  ERRMSG  (PRINTS ERROR MESSAGES)
  683. C  GETNNB  (GETS THE NEXT NON-BLANK IN INPUT LINE LINE(80))
  684. C
  685. C
  686. C  BASCNG IS CALLED BY ROUTINE CMND WHICH IDENTIFIES THE COMMAND THAT
  687. C  THE USER WANTS TO EXECUTE.
  688. C
  689. C
  690. C    VARIABLE       USE
  691. C
  692. C    BASED       HOLDS THE DEFAULT BASE.
  693. C    IPT         POINTS TO THE NEXT NON-BLANK IN LINE(80).
  694. C    I1          BINARY VALUE OF FIRST DIGIT, VALUE OF NEW BASE.
  695. C    I2          BINARY VALUE OF SECOND DIGIT.
  696. C    NONBLK      POINTS TO THE LAST NON-BLANK IN LINE(80)
  697. C    RETCD       RETURN CODE: 1=O.K.  2=ERROR.
  698. C    RETCD2      HOLDS RETURN CODE FROM CALL TO GETNNB
  699. C
  700. C
  701. C
  702. C
  703. C    SUBROUTINE BASCNG(RETCD)
  704. C
  705. C
  706. C UPON ENTRANCE, NONBLK POINTS TO THE 'B' IN '*B' IN LINE
  707. C
  708.     InTeGer*4 IPT,I1,I2
  709.     InTeGer*4 LEVEL,NONBLK,LEND
  710.     InTeGer*4 RETCD,RETCD2,VIEWSW,BASED
  711. C
  712.     CHARACTER*1 DIGITS(16,3),LINE(80)
  713. C
  714.     COMMON /DIGV/ DIGITS
  715.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  716. C
  717. C
  718. C IF NO ARGUMENT, RETURN WITH NORMAL RETURN CODE. THIS ALLOWS THE
  719. C USER TO SEE WHAT THE PRESENT DEFAULT BASE IS.
  720.     RETCD=1
  721.     CALL GETNNB(IPT,RETCD2)
  722.     IF(RETCD2.GT.1)GO TO 1000
  723. C
  724. C
  725. C CHECK OUT FIRST DIGIT
  726.     DO 300 I1=1,10
  727.     IF(DIGITS(I1,1).EQ.LINE(IPT)) GO TO 400
  728. 300    CONTINUE
  729.     GO TO 999
  730. C
  731. C
  732. C SEE IF THERE IS A SECOND DIGIT
  733. 400    NONBLK=IPT
  734.     IF(I1.EQ.10)I1=0
  735.     CALL GETNNB(IPT,RETCD2)
  736.     IF(RETCD2.EQ.1)GO TO 500
  737. C
  738. C
  739. C IF NOT, CONVERT TO A TWO DIGIT NUMBER WITH A LEADING ZERO.
  740.     I2=I1
  741.     I1=0
  742.     GO TO 700
  743. C
  744. C A SECOND CHARACTER WAS FOUND; FIGURE OUT WHAT THE BINARY
  745. C VALUE IS (IF IT IS A DIGIT AT ALL).
  746. 500    DO 600 I2=1,10
  747.     IF(DIGITS(I2,1).EQ.LINE(IPT))GO TO 700
  748. 600    CONTINUE
  749.     GO TO 999
  750. C
  751. C CONVERT DIGITS TO A NUMBER IF IT IS LEGAL
  752. 700    IF(I2.EQ.10)I2=0
  753.     I1=I1*10+I2
  754.     IF(I1.NE.8.AND.I1.NE.10.AND.I1.NE.16) GO TO 999
  755.     BASED=I1
  756.     GO TO 1000
  757. C
  758. C
  759. C ILLEGAL BASE SPECIFICATION
  760. 999    RETCD=2
  761.     call vwrt(' Illegal Base. (Only 8,10, and 16 OK). Ignored.',
  762.      1  48)
  763. c    WRITE(11,998)
  764. c998    FORMAT(' Illegal Base. (Only 8,10,and 16 OK). Ignored.')
  765. C    CALL ERRMSG(19)
  766. C
  767. C RETURN
  768. 1000    RETURN
  769.     END
  770. c -h- blkdat.for    Fri Aug 22 12:57:49 1986    
  771.     subroutine BLOCK2
  772. C COPYRIGHT 1983 GLENN C.EVERHART
  773. C ALL RIGHTS RESERVED
  774.     Include aparms.inc
  775. C    InTeGer*4 MFID(2),MFMOD(2)
  776.     InTeGer*2 IFID(8,MFrm)
  777.     COMMON/IFIDC/IFID
  778.     CHARACTER*1 LFID(16,MFrm)
  779.     EQUIVALENCE(IFID(1,1),LFID(1,1))
  780. C    COMMON/FRM/MFID,MFMOD
  781.     CHARACTER*1 DTBL1(9,9,8)
  782. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  783.     InTeGer*2 BTBL(6,6,8)
  784. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  785. C NO NEED TO WASTE IT.
  786. c    INTEGER DTBLIN
  787. C DTBLIN FLAGS THAT DTBL1 WAS ALREADY INITED, SO ONLY DOES SO ONCE.
  788. c    EQUIVALENCE(LFID(1,1),BTBL(1,1,1))
  789.     InTeGer*2 BTBL1(6,6)
  790.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  791.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  792.     EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  793.     EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  794.     EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  795.     EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  796.     COMMON /DECIDE/ DTBL1
  797. cc    DATA DTBLIN/0/
  798.     DATA BTBL1 /4,2,3,4,8,9,
  799.      1  6*0,0,2,0,0,0,9,0,2,0,0,0,9,
  800.      2  0,2,3,0,0,9,0,2,4*0/
  801.     DATA BTBL2/
  802.      3  4,5*0,2,0,3*2,0,3,3*0,2*0,4,3*0,2*0,
  803.      4  8,5*0,9,0,3*9,0/
  804.     DATA BTBL3/4,2,3,4,8,9,
  805.      5  6*2,3,2,3,3,3,9,4,2,3,4,4,9,
  806.      6  8,2,3,4,8,9,9,2,4*9/
  807.     DATA BTBL4/
  808.      7  4,2,3,4,8,9,6*2,3,2,3,3,3,9,4,2,3,4,4,9,
  809.      8  8,2,3,4,8,9,
  810.      9  9,2,4*9/
  811.     DATA BTBL5/4,2,3,3*4,6*0,6*0,6*0,
  812.      1  6*0,6*0/
  813.     DATA BTBL6/4,3*0,4,0,4,3*0,0,0,4,3*0,2*0,4,3*0,2*0,
  814.      2  4,3*0,2*0,
  815.      3  4,3*0,2*0/
  816.         DATA BTBL7/4,2,3,3*4,6*2,6*3,6*4,
  817.      4  6*8,6*9/
  818.     DATA BTBL8/4,1,4,4,4,3,2,1,2,2,2,1,4,3,4,4,
  819.      5  4,3,4,3,4,4,4,3,4,3,4,4,
  820.      6  4,3,2,1,2,2,2,1/
  821. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  822. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  823.     do 135 n3=1,8
  824.     do 135 n2=1,9
  825.     do 135 n1=1,9
  826. 135    dtbl1(n1,n2,n3)=CHAR(0)
  827.     DO 35 NN2=1,6
  828.     N2=NN2
  829.     IF(NN2.GT.4)N2=NN2+3
  830.     DO 235 N1=1,4
  831.     DTBL1(N1,N2,1)=CHAR(BTBL1(N1,NN2))
  832.     DTBL1(N1,N2,2)=CHAR(BTBL2(N1,NN2))
  833.     DTBL1(N1,N2,3)=CHAR(BTBL3(N1,NN2))
  834.     DTBL1(N1,N2,4)=CHAR(BTBL4(N1,NN2))
  835.     DTBL1(N1,N2,5)=CHAR(BTBL5(N1,NN2))
  836.     DTBL1(N1,N2,6)=CHAR(BTBL6(N1,NN2))
  837.     DTBL1(N1,N2,7)=CHAR(BTBL7(N1,NN2))
  838. 235    DTBL1(N1,N2,8)=CHAR(BTBL8(N1,NN2))
  839.     do 335 n1=5,6
  840.     DTBL1(N1+3,N2,1)=CHAR(BTBL1(N1,NN2))
  841.     DTBL1(N1+3,N2,2)=CHAR(BTBL2(N1,NN2))
  842.     DTBL1(N1+3,N2,3)=CHAR(BTBL3(N1,NN2))
  843.     DTBL1(N1+3,N2,4)=CHAR(BTBL4(N1,NN2))
  844.     DTBL1(N1+3,N2,5)=CHAR(BTBL5(N1,NN2))
  845.     DTBL1(N1+3,N2,6)=CHAR(BTBL6(N1,NN2))
  846.     DTBL1(N1+3,N2,7)=CHAR(BTBL7(N1,NN2))
  847.     DTBL1(N1+3,N2,8)=CHAR(BTBL8(N1,NN2))
  848. 335    continue
  849. 35    CONTINUE
  850. C NOW CLEAR THE BUFFER OUT, HAVING SET UP DTBL1 FROM IT.
  851. C SET INITIAL -1 SO WE CAN RECOGNIZE WHEN TO STOP LOOKING
  852. C INITIALLY...
  853.     DO 36 NN=1,MFrm
  854.     DO 36 N=1,8
  855.     KKKKK=-1
  856. 36    IFID(N,NN)=KKKKK
  857.     return
  858.     END
  859. c -h- ca2e.for    Fri Aug 22 13:00:17 1986    
  860.     SUBROUTINE CA2E(LNIN,LNOUT)
  861. C CONVERT NORMAL ASCII FORM TO ENCODED
  862.     INCLUDE aparms.inc
  863.     character*1 number(6)
  864. c    CHARACTER*1 NAME(4),NUMBER(6)
  865.     CHARACTER*1 LNIN,LNOUT
  866.     CHARACTER*6 NUMBR6
  867.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  868.     DIMENSION LNIN(128),LNOUT(128)
  869.     InTeGer*4 RRWACT,RCLACT
  870. C    COMMON/RCLACT/RRWACT,RCLACT
  871.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  872.      1  IDOL7,IDOL8
  873. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  874. C     1  IDOL7,IDOL8
  875.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  876. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  877.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  878. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  879. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  880. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  881.     InTeGer*4 KLVL
  882. C    COMMON/KLVL/KLVL
  883.     InTeGer*4 IOLVL,IGOLD
  884. C    COMMON/IOLVL/IOLVL
  885. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  886. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  887.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  888.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  889.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  890.      3  k3dfg,kcdelt,krdelt,kpag
  891. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  892. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  893. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  894. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  895. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  896. C    LOGICAL*2 L63,L192,L255,L128
  897.     LOGICAL*4 L1,L2
  898. C    InTeGer*4 I63,I192,I255,I128
  899.     InTeGer*4 I63,I192,I127
  900.     InTeGer*4 I1,I2
  901. C    EQUIVALENCE(L128,I128)
  902. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  903.     EQUIVALENCE (I1,L1),(I2,L2)
  904. C    DATA I63/63/,I192/192/,I255/255/,I128/128/
  905.     save i63,i192,i127
  906.     DATA I63/63/,I192/192/,I127/127/
  907.     LI=1
  908.     LO=1
  909. C LI = INPUT LOCATION
  910. C LO=OUTPUT LOCATION
  911. 100    CONTINUE
  912.     LCC=ICHAR(LNIN(LI))
  913.     IF(LCC.EQ.255)GOTO 500
  914. C IF BINARY FORM, COPY 3 BYTES TO AVOID ERRORS.
  915. cD    If(K3dfg.gt.0)goto 200
  916.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  917. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  918.     IL1=LI
  919.     LE=110
  920.     LSTC=LE
  921.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  922. C AVOID MESSING UP FUNCTION NAMES
  923.     IF(ID2.EQ.1)IVLD=0
  924.     IF(IDOL1.NE.0.OR.IDOL2.NE.0)IVLD=0
  925. C ONLY REPACK NORMAL FORM NAMES
  926. C NOTE THAT SINCE THESE HAVE $ AFTER THE FIELDS, NO PARTIAL NAME
  927. C WILL EVER GET RECOGNIZED WITHOUT IDOL1 OR IDOL2 GETTING SET.
  928.     IF(IVLD.EQ.0)GOTO 200
  929. C ALIASED NAMES MIGHT GET SCANNED WITHIN PRIME AREA IF THE FIRST
  930. C ONE OR TWO CHARS GET STRIPPED OFF, SO TREAT LIKE P## OR D## FORMS
  931. C AND COPY THE WHOLE NAME HERE.
  932. C NOTE: WE LEAVE THE LIMITS HERE AT 60 AND 301 EVEN IF THE
  933. C SHEET DIMENSIONS CHANGE. THE ENCODING SCHEME BREAKS
  934. C DOWN OVER 63 BY 255 ANYWAY, SO JUST LEAVE LARGER NAMES
  935. C ALONE.
  936.     If(Kpag.gt.0)goto 250
  937.     If(K3DFG.GT.0)GOTO 250
  938. C Don't encode variables if using 3D addressing since this
  939. C could force the 3D addressing information to be lost.
  940.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 250
  941. C ALSO DON'T PACK ALIASED NAMES; THEY WON'T FIT IN CODED VALUES.
  942. C FOUND VARIABLE.
  943. C FIRST DON'T PACK P## AND D## FORMS.
  944.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  945. C REPACK NORMAL VARIABLE HERE.
  946.     LI=LSTC
  947.     LNOUT(LO)=CHAR(255)
  948.     I1=IMASK(ID1,I63)
  949. C    I1=ID1
  950. C    L1=L1.AND.L63
  951.     I2=ID2/2
  952.     I2=IMASK(I2,I192)
  953. C    L2=L2.AND.L192
  954. C    L1=L1.OR.L2
  955.     I1=I1+I2
  956.     LNOUT(LO+1)=CHAR(I1)
  957. C    I2=ID2
  958.     I2=IMASK(ID2,I127)+128
  959. C    L2=L2.AND.L255
  960. C    L2=L2.OR.L128
  961.     LNOUT(LO+2)=CHAR(I2)
  962.     LO=MIN0(109,LO+3)    
  963.     GOTO 300
  964. 250    CONTINUE
  965. C JUST COPY DISPLAY FORMS.
  966.     IL1=LSTC-1
  967.     DO 251 N=LI,IL1
  968.     LNOUT(LO)=LNIN(N)
  969.     LO=LO+1
  970.     IF(LO.GT.110)GOTO 300
  971. 251    CONTINUE
  972.     LI=LSTC
  973. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  974.     GOTO 300
  975. 200    CONTINUE
  976. C HERE CHECK FOR FORMULA...
  977. C NOTE THAT SOME NAMES (E.G. "AVG" COULD CONFLICT WITH VERY LARGE COLUMN
  978. C NAMES. HOWEVER, IGNORE THAT POSSIBILITY. THAT'S AWFULLY FAR OUT.
  979.     CALL FNAME(LNIN(LI),II,INDX)
  980.     IF(INDX.LE.0.OR.INDX.GT.25)GOTO 220
  981. C Ensure that functions with indices too large to encode are
  982. C just treated literally. 229+25=254, the largest index we can have
  983. C before colliding with the 255 used to encode variable names.
  984. C thus all function names past the 25th must just be literally
  985. C entered. This is not really a problem as logic to find them
  986. C will work in either encoded or unencoded cases.
  987. C BE SURE A [ CHAR FOLLOWS NAME FOR THIS TO BE ACCEPTED...
  988.     IF(LNIN(LI+3).NE.'[')GOTO 220
  989. C FOUND MULTI-INPUT FUNCT NAME
  990.     LNOUT(LO)=CHAR(229+INDX)
  991. C SIMPLE 1-BYTE ENCODE OF NEEDED FUNCT NAME. NOT IN ANY CRITICAL RANGES...
  992.     LO=LO+1
  993.     LI=LI+3
  994.     GOTO 300
  995. 220    CONTINUE
  996.     LNOUT(LO)=LNIN(LI)
  997. C JUST COPY MISC. CHARACTER.
  998.     LO=LO+1
  999.     LI=LI+1
  1000. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  1001. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  1002.     LO=MIN0(LO,110)
  1003.     DO 400 N=LO,110
  1004. 400    LNOUT(N)=char(0)
  1005. C COPY REST OF 128 BYTE ARRAY
  1006.     DO 1 N=111,128
  1007. 1    LNOUT(N)=LNIN(N)
  1008. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  1009.     RETURN
  1010. 500    CONTINUE
  1011. C SPECIAL COPY OF 3 BYTE PACKED FORMS FOR SPEED
  1012.     LNOUT(LO)=LNIN(LI)
  1013.     LNOUT(LO+1)=LNIN(LI+1)
  1014.     LNOUT(LO+2)=LNIN(LI+2)
  1015.     LO=LO+3
  1016.     LI=LI+3
  1017.     GOTO 300
  1018.     END
  1019. c -h- calbin.for    Fri Aug 22 13:00:17 1986    
  1020.     SUBROUTINE CALBIN(RETCD)
  1021. C COPYRIGHT (C) 1983,1984 GLENN EVERHART
  1022. C ALL RIGHTS RESERVED
  1023. C 60=MAX REAL ROWS
  1024. C 301=MAX REAL COLS
  1025. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1026. C VBLS AND TYPE DIMENSIONED 60,301
  1027. C
  1028. C *******************************************************
  1029. C *                                                     *
  1030. C *             SUBROUTINE  CALBIN                      *
  1031. C *                                                     *
  1032. C *******************************************************
  1033. C
  1034. C  SUBROUTINE CALBIN PERFORMS A BINARY OPERATION ON TWO CONSTANTS.
  1035. C
  1036. C special version with multiple precision diked out - gce (to save space
  1037. C on 256K PC)
  1038. C  UPON ENTRANCE TO ROUTINE:
  1039. C    OPERAND1 IS IN STACK1  (ST1PT-1)
  1040. C    OPERAND2 IS ON TOP OF STACK2  (ST2PT-1)
  1041. C    OPERATOR IS BELOW OPERAND2  (ST2PT-2)
  1042. C  UPON EXIT:
  1043. C    RESULT IS IN STACK1
  1044. C    STACK2 HAS BEEN CLEANED UP
  1045. C
  1046. C  RETURN CODE    MEANING
  1047. C    1    NORMAL RETURN
  1048. C    2    OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  1049. C    3    ERROR RETURN
  1050. C
  1051. C
  1052. C
  1053. C  MODIFICATION CLASSES: M3, M4, AND M8
  1054. C
  1055. C
  1056. C
  1057. C  CALBIN CALLS
  1058. C
  1059. C  CONTYP   CONVERTS CONSTANTS TO DIFFERENT DATA TYPES
  1060. C  ERRMSG   PRINTS OUT ERROR MESSAGES
  1061. C  MULADD   PERFORMS MULTIPLE PRECISION ADDITION
  1062. C  MULDIV   PERFORMS MULTIPLE PRECISION DIVISION
  1063. C  MULMUL   PERFORMS MULTIPLE PRECISION MULTIPLICATION
  1064. C
  1065. C
  1066. C
  1067. C CALBIN IS CALLED BY POSTVL WHICH EVALUATES A POSTFIX EXPRESSION
  1068. C
  1069. C
  1070. C
  1071. C
  1072. C   VARIABLE     USE
  1073. C
  1074. C  EIGHT(8)      PICKS OUT A REAL CONSTANT FROM STACK.
  1075. C  FOUR(4)       PICKS OUT AN INTEGER CONSTANT FROM STACK.
  1076. C  I,J           HOLD TEMPORARY VALUES.
  1077. C  IA            FIRST BYTE OF OPERAND 1. THIS HOLDS THE INDEX INTO
  1078. C                VBLS OF A VARIABLE IF THE OPERATOR IS AN = SIGN.
  1079. C  ID            USED TO CONVERT DECISION TABLE CHARACTER*1 VALUE TO
  1080. C                AN InTeGer*4 VALUE THAT CAN BE USED AS AN ARGUMENT
  1081. C                IN A CALL TO CONTYP.
  1082. C  INT,IHOLD     HOLD INTEGER*4 VALUES.
  1083. C  IOP           HOLDS THE BINARY OPERATOR.
  1084. C  IOP2          USED TO INDEX A COMPUTED GO.
  1085. C  ISW           HOLDS BASE FOR MULTIPLE PRECISION EXPONENTIATION
  1086. C  MINUS         VALUE IN THE 100TH BYTE OF A MULTIPLE PRECISION
  1087. C                NUMBER THAT IS USED TO INDICATE A NEGATIVE.
  1088. C  OP1TYP        TYPE OF OPERAND 1.
  1089. C  OP2TYP        TYPE OF OPERAND 2.
  1090. C  PLUS          VALUE IN THE 100TH BYTE OF A MULTIPLE PRECISION
  1091. C                NUMBER THAT IS USED TO INDICATE POSITIVE.
  1092. C  PT1,PT2       POINT TO ELEMENTS ON TOP OF STACKS 1 AND 2.
  1093. C  REAL,RHOLD    HOLD TEMPORARY REAL*8 VALUES.
  1094. C  RETCD         ERROR RETURN:  1 = O.K.   2 = RESULT WAS OUTPUT
  1095. C                3 = ERROR
  1096. C
  1097. C
  1098. C    SUBROUTINE CALBIN(RETCD)
  1099.     REAL*8 REAL,RHOLD,DFLOAT
  1100. C
  1101.     INTEGER*4 INT,IHOLD
  1102. C
  1103.     InTeGer*4 LEVEL,NONBLK,LEND
  1104.     InTeGer*4 VLEN(9)
  1105.     InTeGer*4 IOP,IA,ID,IOP2,ISW
  1106.     InTeGer*4 PLUS,MINUS
  1107.     InTeGer*4 VIEWSW,BASED
  1108. c    InTeGer*4 OLDTYP,VIEWSW,BASED
  1109.     InTeGer*4 TYPE(1,2)
  1110.     InTeGer*4 RETCD,RETCD2
  1111.     InTeGer*4 OP1TYP,OP2TYP
  1112.     InTeGer*4 ST1PT,ST2PT,ST1TYP(40),ST2TYP(40),ST1LIM,ST2LIM
  1113.     InTeGer*4 PT1,PT2
  1114. C
  1115.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  1116.     InTeGer*4 STK12(2,40)
  1117.     REAL*8 XVBLK
  1118.     EQUIVALENCE(STK12(1,1),STACK1(1,1))
  1119.     CHARACTER*1 AVBLS(24,27), DTBL1(9,9,8)
  1120.     Real*8 VAVBLS(3,27)
  1121.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  1122.     CHARACTER*1 VBLS(8,1,1)
  1123.     EQUIVALENCE (XVBLK,VBLS(1,1,1))
  1124.     CHARACTER*1 EIGHT(8),FOUR(4)
  1125.     CHARACTER*1 LINE(80)
  1126. C
  1127.     EQUIVALENCE (EIGHT,REAL), (FOUR,INT)
  1128. C
  1129.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1130.     COMMON/V/ TYPE,AVBLS,VBLS,VLEN
  1131.     COMMON /STACKx/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  1132.      ;         ST1LIM,ST2LIM
  1133.     COMMON /DECIDE/DTBL1
  1134. C
  1135. C
  1136.     save plus,minus
  1137.     DATA PLUS/0/,MINUS/1/
  1138. C
  1139. C
  1140.     RETCD=1
  1141.     PT1=ST1PT-1
  1142.     PT2=ST2PT-1
  1143. C
  1144.     IOP=ST2TYP(ST2PT-2)
  1145.     OP1TYP=ST1TYP(PT1)
  1146.     OP2TYP=ST2TYP(PT2)
  1147. C NOTE THAT IA IS UNUSED HERE... SAVE BIG DIMENSIONS
  1148.     IA=ICHAR(STACK1(1,PT1))
  1149.     ID1=STK12(1,PT1)
  1150.     ID2=STK12(2,PT1)
  1151. C    CALL GETDM(STACK1(1,PT1),ID1,ID2)
  1152. C ****&&&& ABOVE GETS LOCS IN 2 DIM ARRAY OF VARIABLES
  1153.     IF (IOP.NE.200) GOTO 100
  1154. C
  1155. C
  1156. C
  1157. C AN = SIGN IS THE OPERATOR. THIS IS A SPECIAL CASE.
  1158.     IF(OP1TYP.GE.0) GO TO 5
  1159. C
  1160. C
  1161. C
  1162. C VARIABLE TO THE LEFT OF = SIGN HAS A DATA TYPE BUT NO VALUE
  1163.     OP1TYP=-OP1TYP
  1164.     ST1TYP(PT1)=OP1TYP
  1165. C
  1166. C
  1167. C
  1168. C OPERAND 2 COPIED INTO OLD OPERAND'S POSITION IN CASE MORE
  1169. C THAN 1 = SIGN IS PRESENT FOR EXPRESSIONS LIKE  I=J=2
  1170. 5    J=VLEN(OP2TYP)
  1171. C    TYPE(IA)=OP1TYP
  1172.     CALL TYPSET(ID1,ID2,OP1TYP)
  1173. C    TYPE(ID1,ID2)=OP1TYP
  1174. C *&*****&&&&& NOTE TYPE ARRAY AND VBLS ARRAY NOW ARE HUGE
  1175. C  NOTE FURTHER THAT AVBLS IS OLD VBLS ARRAY. SWITCHED ON IF
  1176. C ID1 =< 27 AND ID2=1.
  1177.     DO 10 I=1,J
  1178. 10    STACK1(I,PT1)=STACK2(I,PT2)
  1179.     CALL CONTYP (STACK1,PT1,OP2TYP,OP1TYP,RETCD2)
  1180.     GOTO (20,9999), RETCD2
  1181.     STOP 20
  1182. C
  1183. C
  1184. C THE SPECIFIED VARIABLE GETS NEW VALUE.
  1185. C ***&&&& HERE'S WHERE WE STORE A VALUE INTO A VARIABLE...
  1186. 20    J=VLEN(OP1TYP)
  1187.     DO 30 I=1,J
  1188. C    VBLS(I,IA)=STACK1(I,PT1)
  1189.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 22
  1190. C REPLACE VBLSET CALL WITH XVBLST CALL ON LAST PASS TO AVOID
  1191. C MULTIPLE REPLACEMENT OF STORAGE FOR EVERY PASS.
  1192.     VBLS(I,1,1)=STACK1(I,PT1)
  1193.     IF(I.EQ.J)CALL XVBLST(ID1,ID2,XVBLK)
  1194. C    CALL VBLSET(I,ID1,ID2,STACK1(I,PT1))
  1195. C    VBLS(I,ID1,ID2)=STACK1(I,PT1)
  1196.     GOTO 30
  1197. 22    AVBLS(I,ID1)=STACK1(I,PT1)
  1198. C *****&&&&&
  1199. 30    CONTINUE
  1200.     GOTO 10000
  1201. C
  1202. C
  1203. C  IOP2 VALUES 1="**"  2="*"   3="/"   4="+"   5="-"
  1204. 100    IOP2=IOP-111
  1205.     GOTO (1000,2000,2000,2000,2000),IOP2
  1206. C
  1207. C
  1208. C    ********************************************
  1209. C    ***********  EXPONENTIATION  ***************
  1210. C    ********************************************
  1211. C
  1212. C
  1213. C  FIRST CONVERT TO PROPER TYPE
  1214. 1000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,5))
  1215.     CALL CONTYP(STACK1,PT1,OP1TYP,ID,RETCD2)
  1216.     IF (RETCD2.EQ.2) GOTO 9999
  1217.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,6))
  1218.     CALL CONTYP (STACK2,PT2,OP2TYP,ID,RETCD2)
  1219.     IF (RETCD2.EQ.2) GOTO 9999
  1220. C
  1221. C
  1222. C  GOTO APPROPRIATE PLACE TO PERFORM OPERATION
  1223.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,8))
  1224.     GOTO (1100,1200,1300,1400,1500,1600,1700),ID
  1225.     STOP 1000
  1226. C
  1227. C
  1228. C  REAL**REAL
  1229. 1100    DO 1104 I=1,8
  1230. 1104    EIGHT(I)=STACK1(I,PT1)
  1231.     RHOLD=REAL
  1232.     DO 1108 I=1,8
  1233. 1108    EIGHT(I)=STACK2(I,PT2)
  1234.     REAL=RHOLD**REAL
  1235. C
  1236. C
  1237. C  USED BY REAL**I
  1238. 1109    DO 1110 I=1,8
  1239. 1110    STACK1(I,PT1)=EIGHT(I)
  1240. C
  1241. C
  1242. C  USED BY I**REAL,I**I
  1243. 1114    ST1TYP(PT1)=ICHAR(DTBL1(OP2TYP,OP1TYP,7))
  1244.     GOTO 10000
  1245. C
  1246. C
  1247. C
  1248. C  REAL**I
  1249. 1200    DO 1204 I=1,8
  1250. 1204    EIGHT(I)=STACK1(I,PT1)
  1251.     DO 1208 I=1,4
  1252. 1208    FOUR(I)=STACK2(I,PT2)
  1253.     REAL=REAL**INT
  1254.     GOTO 1109
  1255. C
  1256. C
  1257. C
  1258. C  I**REAL (PARTS USED BY I**I)
  1259. 1300    DO 1304 I=1,4
  1260. 1304    FOUR(I)=STACK1(I,PT1)
  1261.     DO 1308 I=1,8
  1262. 1308    EIGHT(I)=STACK2(I,PT2)
  1263. C
  1264. C DIFFERENT VERSIONS OF FORTRAN TREAT THE RESULT IN DIFFERENT WAYS.
  1265. C IF YOU WANT THE RESULT TO BE REAL, YOU MUST ALSO CHANGE DTBL1.
  1266. C
  1267.     INT=DFLOAT(INT)**REAL
  1268. 1310    DO 1314 I=1,4
  1269. 1314    STACK1(I,PT1)=FOUR(I)
  1270.     GOTO 1114
  1271. C
  1272. C
  1273. C
  1274. C  I**I
  1275. 1400    DO 1404 I=1,4
  1276. 1404    FOUR(I)=STACK1(I,PT1)
  1277.     IHOLD=INT
  1278.     DO 1408 I=1,4
  1279. 1408    FOUR(I)=STACK2(I,PT2)
  1280.     INT=IHOLD**INT
  1281.     GOTO 1310
  1282. C
  1283. C
  1284. C
  1285. C  M8**I    (PARTS USED BY M10**I, M16**I)
  1286. 1500    ISW=8
  1287. 1501    IF(ST2PT.LE.ST2LIM)GO TO 1502
  1288. C
  1289. C
  1290. C STACK OVERFLOW
  1291.     CALL ERRMSG(9)
  1292.     GO TO 9999
  1293. C
  1294. C
  1295. C GET EXPONENT AS AN INTEGER
  1296. 1502    DO 1504 I=1,4
  1297. 1504    FOUR(I)=STACK2(I,PT2)
  1298.     IF (INT.GE.0) GOTO 1520
  1299. C
  1300. C
  1301. C EXPONENT NOT POSITIVE OR 0
  1302.     CALL ERRMSG (15)
  1303.     GOTO 9999
  1304. 1520    IF (INT.GT.0) GOTO 1530
  1305. C
  1306. C
  1307. C I**0 = 1
  1308.     STACK1(8,PT1)=char(PLUS)
  1309.     DO 1522 I=2,7
  1310. 1522    STACK1(I,PT1)=char(0)
  1311. C LEAVE AS INTEGER SETS HERE RATHER THAN EXPLICIT CHAR() CALLS
  1312.     STACK1(1,PT1)=char(1)
  1313.     GOTO 10000
  1314. C
  1315. C
  1316. C EXPONENT IS > 0
  1317. 1530    INT=INT-1
  1318. C
  1319. C
  1320. C IF EXPONENT = 1 WE ARE DONE
  1321.     IF(INT.EQ.0)GO TO 10000
  1322. C
  1323. C
  1324. C EXPONENT IS > 1. COPY TO STACK 2 WHERE MULMUL EXPECTS THE OTHER
  1325. C FACTOR.
  1326.     DO 1534 I=1,8
  1327. 1534    STACK2(I,ST2PT)=STACK1(I,PT1)
  1328.     ST2TYP(ST2PT)=ST1TYP(PT1)
  1329. C
  1330. C
  1331. C
  1332. C
  1333. 1549    continue
  1334. c1549    DO 1550 I=1,INT
  1335. c    CALL MULMUL(PT1,ST2PT,RETCD2,ISW)
  1336. c    IF(RETCD2.GE.2)GO TO 9999
  1337. c1550    CONTINUE
  1338.     GOTO 10000
  1339. C
  1340. C  M10**I
  1341. 1600    ISW=10
  1342.     GOTO 1501
  1343. C
  1344. C
  1345. C
  1346. C  M16**I
  1347. 1700    ISW=16
  1348.     GOTO 1501
  1349. C
  1350. C
  1351. C  *****************************************
  1352. C  * MAKE CONVERSIONS APPROPRIATE FOR */+- *
  1353. C  *****************************************
  1354. 2000    CONTINUE
  1355.     ID=ICHAR(DTBL1(OP2TYP,OP1TYP,1))
  1356.     CALL CONTYP (STACK1,PT1,OP1TYP,ID,RETCD2)
  1357.     IF (RETCD2.EQ.2) GOTO 9999
  1358.     IF(ID.EQ.0)GO TO 2010
  1359.     ST1TYP(PT1)=ID
  1360.     OP1TYP=ID
  1361. 2010    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,2))
  1362.     CALL CONTYP (STACK2,PT2,OP2TYP,ID,RETCD2)
  1363.     IF (RETCD2.EQ.2) GOTO 9999
  1364.     IF(ID.EQ.0)GOTO 2020
  1365.     ST2TYP(PT2)=ID
  1366.     OP2TYP=ID
  1367. C
  1368. 2020    CONTINUE
  1369. C
  1370. C
  1371. C  GOTO SECTION ACCORDING TO OPERATION *=3000, /=4000,+=5000,-=6000
  1372.     GOTO (2100,3000,4000,5000,6000),IOP2
  1373. 2100    STOP 2100
  1374. C
  1375. C
  1376. C
  1377. C
  1378. C
  1379. C
  1380. C  **********************************************
  1381. C  ***********  MULTIPLICATION  *****************
  1382. C  **********************************************
  1383. 3000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1384.     GOTO (3100,3200,3300,3300,3500,3600,3700,3300,3200),ID
  1385.     STOP 3000
  1386. C
  1387. C
  1388. C  ASCII (ALSO SUBTRACTION, MULTIPLICATION AND DIVISION)
  1389. 3100    CALL ERRMSG (12)
  1390.     GOTO 9999
  1391. C
  1392. C
  1393. C  DECIMAL, REAL
  1394. 3200    DO 3204 I=1,8
  1395. 3204    EIGHT(I)=STACK1(I,PT1)
  1396.     RHOLD=REAL
  1397.     DO 3208 I=1,8
  1398. 3208    EIGHT(I)=STACK2(I,PT2)
  1399.     REAL=RHOLD*REAL
  1400. 3209    DO 3210 I=1,8
  1401. 3210    STACK1(I,PT1)=EIGHT(I)
  1402. C
  1403. C
  1404. C  FOLLOWING USED BY OTHER SECTIONS
  1405. 3220    ST1TYP(PT1)=ICHAR(DTBL1(OP2TYP,OP1TYP,3))
  1406.     GOTO 10000
  1407. C
  1408. C
  1409. C
  1410. C  HEX,INTEGER,OCTAL
  1411. 3300    DO 3304 I=1,4
  1412. 3304    FOUR(I)=STACK1(I,PT1)
  1413.     IHOLD=INT
  1414.     DO 3308 I=1,4
  1415. 3308    FOUR(I)=STACK2(I,PT2)
  1416.     INT=IHOLD*INT
  1417. 3309    DO 3310 I=1,4
  1418. 3310    STACK1(I,PT1)=FOUR(I)
  1419.     GOTO 3220
  1420. C
  1421. C
  1422. C
  1423. C  M10
  1424. 3500    continue
  1425. c3500    CALL MULMUL (PT1,PT2,RETCD2,10)
  1426. C
  1427. C
  1428. C  FOLLOWING USED BY OTHER SECTIONS
  1429. 3510    IF (RETCD2.EQ.2) GOTO 9999
  1430.     GOTO 3220
  1431. C
  1432. C
  1433. C
  1434. C  M8
  1435. 3600    continue
  1436. c3600    CALL MULMUL (PT1,PT2,RETCD2,8)
  1437.     GOTO 3510
  1438. C
  1439. C
  1440. C
  1441. C  M16
  1442. 3700    continue
  1443. c3700    CALL MULMUL (PT1,PT2,RETCD2,16)
  1444.     GOTO 3510
  1445. C
  1446. C
  1447. C  **************************************************
  1448. C  ******************  DIVISION  ********************
  1449. C  **************************************************
  1450. 4000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1451.     GOTO (3100,4200,4300,4300,4500,4600,4700,4300,4200),ID
  1452.     STOP 4000
  1453. C
  1454. C
  1455. C  DECIMAL,REAL
  1456. 4200    DO 4204 I=1,8
  1457. 4204    EIGHT(I)=STACK1(I,PT1)
  1458.     RHOLD=REAL
  1459.     DO 4208 I=1,8
  1460. 4208    EIGHT(I)=STACK2(I,PT2)
  1461.     IF(REAL.NE.0.D0)GO TO 4210
  1462.     CALL ERRMSG(23)
  1463.     GO TO 9999
  1464. 4210    REAL=RHOLD/REAL
  1465.     GOTO 3209
  1466. C
  1467. C
  1468. C  HEX,INTEGER,OCTAL
  1469. 4300    DO 4304 I=1,4
  1470. 4304    FOUR(I)=STACK1(I,PT1)
  1471.     IHOLD=INT
  1472.     DO 4308 I=1,4
  1473. 4308    FOUR(I)=STACK2(I,PT2)
  1474.     IF(INT.NE.0)GO TO 4310
  1475.     CALL ERRMSG(23)
  1476.     GO TO 9999
  1477. 4310    INT=IHOLD/INT
  1478.     GOTO 3309
  1479. C
  1480. C
  1481. C  M10
  1482. 4500    continue
  1483. c4500    CALL MULDIV (PT1,PT2,RETCD2,10)
  1484.     GOTO 3510
  1485. C
  1486. C
  1487. C  M8
  1488. 4600    continue
  1489. c4600    CALL MULDIV (PT1,PT2,RETCD2,8)
  1490.     GOTO 3510
  1491. C
  1492. C
  1493. C  M16
  1494. 4700    continue
  1495. c4700    CALL MULDIV (PT1,PT2,RETCD2,16)
  1496.     GOTO 3510
  1497. C
  1498. C
  1499. C
  1500. C
  1501. C
  1502. C **************************************************
  1503. C *****************  ADDITION  *********************
  1504. C **************************************************
  1505. C
  1506. 5000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1507.     GOTO (3100,5200,5300,5300,5500,5600,5700,5300,5200),ID
  1508.     STOP 5000
  1509. C
  1510. C
  1511. C  DECIMAL, REAL
  1512. 5200    DO 5204 I=1,8
  1513. 5204    EIGHT(I)=STACK1(I,PT1)
  1514.     RHOLD=REAL
  1515.     DO 5208 I=1,8
  1516. 5208    EIGHT(I)=STACK2(I,PT2)
  1517.     REAL=RHOLD+REAL
  1518.     GOTO 3209
  1519. C
  1520. C
  1521. C  HEX,INTEGER,OCTAL
  1522. 5300    DO 5304 I=1,4
  1523. 5304    FOUR(I)=STACK1(I,PT1)
  1524.     IHOLD=INT
  1525.     DO 5308 I=1,4
  1526. 5308    FOUR(I)=STACK2(I,PT2)
  1527.     INT=IHOLD+INT
  1528.     GOTO 3309
  1529. C
  1530. C
  1531. C  M10
  1532. 5500    continue
  1533. c5500    CALL MULADD (PT1,PT2,RETCD2,1)
  1534.     GOTO 3510
  1535. C
  1536. C
  1537. C  M8
  1538. 5600    continue
  1539. c5600    CALL MULADD (PT1,PT2,RETCD2,2)
  1540.     GOTO 3510
  1541. C
  1542. C
  1543. C  M16
  1544. 5700    continue
  1545. c5700    CALL MULADD(PT1,PT2,RETCD2,3)
  1546.     GOTO 3510
  1547. C
  1548. C
  1549. C
  1550. C
  1551. C
  1552. C
  1553. C  ***************************************************
  1554. C  ******************  SUBTRACTION  ******************
  1555. C  ***************************************************
  1556. C
  1557. 6000    ID=ICHAR(DTBL1(OP2TYP,OP1TYP,4))
  1558.     GOTO (3100,6200,6300,6300,6500,6600,6700,6300,6200),ID
  1559.     STOP 6000
  1560. C
  1561. C
  1562. C  DECIMAL,REAL
  1563. 6200    DO 6204 I=1,8
  1564. 6204    EIGHT(I)=STACK1(I,PT1)
  1565.     RHOLD=REAL
  1566.     DO 6208 I=1,8
  1567. 6208    EIGHT(I)=STACK2(I,PT2)
  1568.     REAL=RHOLD-REAL
  1569.     GOTO 3209
  1570. C
  1571. C
  1572. C  HEX,INTEGER,OCTAL
  1573. 6300    DO 6304 I=1,4
  1574. 6304    FOUR(I)=STACK1(I,PT1)
  1575.     IHOLD=INT
  1576.     DO 6308 I=1,4
  1577. 6308    FOUR(I)=STACK2(I,PT2)
  1578.     INT=IHOLD-INT
  1579.     GOTO 3309
  1580. C
  1581. C
  1582. C  M10
  1583. 6500    continue
  1584. c6500    CALL MULADD (PT1,PT2,RETCD2,4)
  1585.     GOTO 3510
  1586. C
  1587. C
  1588. C  M8
  1589. 6600    continue
  1590. c6600    CALL MULADD (PT1,PT2,RETCD2,5)
  1591.     GOTO 3510
  1592. C
  1593. C
  1594. C  M16
  1595. 6700    continue
  1596. c6700    CALL MULADD (PT1,PT2,RETCD2,6)
  1597.     GOTO 3510
  1598. C
  1599. C
  1600. C
  1601. C
  1602. C
  1603. C    EXIT
  1604. 9999    RETCD=3
  1605. C
  1606. C
  1607. C
  1608. 10000    ST2PT=ST2PT-2
  1609.     RETURN
  1610.     END
  1611. c -h- calc.for    Fri Aug 22 13:00:17 1986    
  1612.     SUBROUTINE CALC
  1613. C COPYRIGHT (C) 1983 GLENN EVERHART
  1614. C ALL RIGHTS RESERVED
  1615. C 60=MAX REAL ROWS
  1616. C 301=MAX REAL COLS
  1617. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1618. C VBLS AND TYPE DIMENSIONED 60,301
  1619. C ***               CALC   MAINLINE                   ***
  1620. C
  1621. C THIS PROGRAM EVALUATES ARITHMETIC EXPRESSIONS INPUT TO IT
  1622. C AND ALLOWS VARIABLES TO BE ASSIGNED VALUES. IT FEATURES
  1623. C MULTIPLE PRECISION ARITHMETIC IN BASE 10, OCTAL, AND
  1624. C HEXADECIMAL. SEE CALC.MEM FOR A COMPLETE DESCRIPTION IN
  1625. C THE FORM OF A USERS GUIDE. TYPE ? TO OBTAIN A LIST OF
  1626. C POSSIBLE COMMANDS.
  1627. C
  1628. C    CALC CALLS
  1629. C
  1630. C  ASSIGN    OPENS A FILE AND ASSIGNS IT TO A LOGICAL I/O UNIT.
  1631. C  CLOSE     CLOSES A FILE ASSOCIATED WITH A LOGICAL I/O UNIT.
  1632. C  CMND      DETERMINES WHAT CALC COMMAND IS REQUIRED.
  1633. C  ERRCX     CHECKS THE EXPRESSION IN AN INPUT LINE FOR SYNTAX ERRORS.
  1634. C  ERRMSG    PRINTS OUT ERROR MESSAGES.
  1635. C  EXIT      RETURNS TO OPERATING SYSTEM.
  1636. C  GETMCR    GETS THE COMMAND LINE USED TO INVOKE CALC. IF AN ARGUMENT
  1637. C            IS PRESENT, CALC EXITS AFTER THAT ONE COMMAND IS EXECUTED.
  1638. C  INPOST    CONVERTS AN INFIX EXPRESSION TO POSTFIX FORM.
  1639. C  LIST      LISTS THE LEGAL CALC COMMANDS.
  1640. C  POSTVL    CONVERTS AN EXPRESSION IN POSTFIX NOTATION ON STACK 1 TO
  1641. C            A VALUE.
  1642. C  SLEND     FINDS THE LAST NON-BLANK IN LINE(80).
  1643. C  VAROUT    PRINTS OUT THE VALUE OF A VARIABLE.
  1644. C  ZNEG      DETERMINES IF A VARIABLE IS POSITIVE IN VALUE
  1645. C
  1646. C
  1647. C
  1648. C   VARIABLE      USE
  1649. C
  1650. C  BASED        DEFAULT BASE WHEN CONSTANTS ARE ENTERED.
  1651. C  BLANK        ' '
  1652. C  DIGITS(16,3) HOLDS DECIMAL, OCTAL, AND HEXADECIMAL DIGITS. THE
  1653. C               SECOND SUBSCRIPT IS
  1654. C                     1 FOR DECIMAL
  1655. C                     2 FOR OCTAL
  1656. C                     3 FOR HEXADECIMAL
  1657. C  I,J          HOLD TEMPORARY VALUES.
  1658. C  ITCNTV(6)    INDEXED BY LEVEL. 0 INDICATES THAT NO ITERATION ON THE
  1659. C               INDIRECT COMMAND FILE IS TO TAKE PLACE. IF POSITIVE, IT
  1660. C               HOLDS THE INDEX INTO VBLS AND REPRESENTS THE VARIABLE
  1661. C               USED TO CONTROL ITERATION.
  1662. C        THIS VARIABLE IS GUARANTEED TO BE 1-27.
  1663. C  LEND         POINTS TO LAST NON-BLANK CHARACTER IN LINE(80)
  1664. C  LEVEL        HOLDS THE LOGICAL I/O UNIT WHERE THE NEXT CALC COMMAND
  1665. C               LINES COME FROM.
  1666. C  LINE(80)     COMMAND INPUT LINE.
  1667. C  NONBLK       POINTS TO LAST NON-BLANK FOUND IN LINE(80).
  1668. C  ONCE         HOLDS 1 IF ONLY ONE COMMAND LINE IS TO BE EXECUTED,
  1669. C               0 OTHERWISE.
  1670. C  STAR         '*'
  1671. C  VIEWSW           VIEW SWITCH
  1672. C                    0 = OUTPUT ERROR MESSAGES
  1673. C                    1 = OUTPUT ERROR MESSAGES AND FILE COMMAND LINES
  1674. C                    2 = OUTPUT ERROR MESSAGES AND VALUE OF EXPRESSIONS
  1675. C                        EVALUATED.
  1676. C                    3 = OUTPUT EVERYTHING
  1677. C  WHAT         '?' SIGNIFIES THAT A LIST OF POSSIBLE COMMANDS
  1678. C               SHOULD BE OUTPUT.
  1679. C
  1680. C    MODIFIED    REASON
  1681. C
  1682. C    18-MAY-1981    DELETED LINE THAT CAUSED DEFAULT BASE TO BE RESET
  1683. C            WHEN AN ERROR OCCURS (PB)
  1684. C
  1685. C    18-MAY-1981    ADDED CODE AT LINES 106 TO 108 TO CONVERT FROM LOWER
  1686. C            TO UPPER CASE  (PB)
  1687. C
  1688. C CHANGED TO SUBROUTINE GCE TO ALLOW EXTERNAL CONTROL OF CALCULATOR.
  1689. C
  1690.     InTeGer*4 LEVEL,NONBLK,LEND
  1691.     InTeGer*4 RETCD,VIEWSW,BASED
  1692.     InTeGer*4 ONCE
  1693.     InTeGer*4 ZNEG,ITCNTV(6)
  1694. C
  1695.     CHARACTER*1  LINE(80),WHAT,STAR,QUOTE
  1696.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  1697.     CHARACTER*1 DIGITS(16,3)
  1698.     CHARACTER*1 OARRY(100)
  1699.     InTeGer*4 OSWIT,OCNTR
  1700. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1701. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1702.     InTeGer*4 IPS1,IPS2,MODFLG
  1703. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1704.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1705.        CHARACTER*1 XTNCMD(80)
  1706. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1707. C VARY FLAG ITERATION COUNT
  1708.     INTEGER KALKIT
  1709. C    COMMON/VARYIT/KALKIT
  1710.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1711.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1712. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1713. C     1  IRCE2
  1714. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1715. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1716. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1717. C RCFGX ON.
  1718. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1719. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1720. C  AND VM INHIBITS. (SETS TO 1).
  1721.     INTEGER*4 FH
  1722. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1723. C    COMMON/CONSFH/FH
  1724.     CHARACTER*1 ARGSTR(52,4)
  1725. C    COMMON/ARGSTR/ARGSTR
  1726.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1727.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1728.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1729.      3  IRCE2,FH,ARGSTR
  1730.     InTeGer*4 ILNFG,ILNCT
  1731.     CHARACTER*1 ILINE(106)
  1732.     COMMON/ILN/ILNFG,ILNCT,ILINE
  1733. C
  1734.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1735.     InTeGer*4 RRWACT,RCLACT
  1736. C    COMMON/RCLACT/RRWACT,RCLACT
  1737.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1738.      1  IDOL7,IDOL8
  1739. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1740. C     1  IDOL7,IDOL8
  1741.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1742. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1743.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1744. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1745. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1746. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1747.     InTeGer*4 KLVL
  1748. C    COMMON/KLVL/KLVL
  1749.     InTeGer*4 IOLVL,IGOLD
  1750. C    COMMON/IOLVL/IOLVL
  1751. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1752. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1753.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1754.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1755.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  1756.      3  k3dfg,kcdelt,krdelt,kpag
  1757. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1758. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1759. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1760. C    COMMON/KLVL/KLVL
  1761.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  1762.     COMMON /DIGV/ DIGITS
  1763.     COMMON/ITERA/ITCNTV
  1764.     Character*2 crlf
  1765.     character*127 cwrk
  1766. C
  1767.     save what,star,quote,once
  1768.     DATA  WHAT/'?'/, STAR/'*'/, QUOTE/''''/
  1769.     DATA ONCE/0/
  1770. C
  1771.     crlf(1:1)=char(13)
  1772.     crlf(2:2)=char(10)
  1773. C
  1774. C
  1775. C LOGICAL I/O UNIT 1 IS ASSIGNED TO THE INVOKING TERMINAL
  1776. C IF YOU DON'T WANT TO RISK THE BUILDER TASK BUILDING (LINKING)
  1777. C THE MODULES PROPERLY, PUT IN A
  1778.     IF(KLVL.EQ.1)LEVEL=KLVL
  1779.     ONCE=0
  1780. C    IF(ILNFG.NE.0) GOTO 6000
  1781. C    CALL ASSIGN (1,'TT:')
  1782. 6000    CONTINUE
  1783. C CHANGE TI: TO TT: FOR VMS.
  1784. C
  1785.     IF(ILNFG.EQ.0)GOTO 6010
  1786.     IF(ILNCT.GT.0)GOTO 6010
  1787. C INVALID INPUTS...NO LINE TO DO BUT FLAGGED TO DO. CLEAN UP.
  1788.     ILNFG=0
  1789.     RETURN
  1790. 6010    CONTINUE
  1791.     IF(ILNFG.NE.0.AND.ILNCT.GT.0)GOTO 6001
  1792. C ++++++
  1793. C FOR DEC FORTRAN:
  1794. C    CALL GETMCR(LINE,LEND)
  1795. C    IF(LEND)20,20,5
  1796. C FOR NON-DEC FORTRAN: (OR VAX VERSIONS)
  1797.     GOTO 20
  1798. C ++++++  END OF CHOICES...
  1799. 5    CONTINUE
  1800.     GOTO 6003
  1801. 6001    CONTINUE
  1802.     DO 6007 LENDX=1,80
  1803. 6007    LINE(LENDX)=CHAR(32)
  1804.     IF(ILNFG.EQ.1)ONCE=1
  1805.     I255X=0
  1806.     DO 6002 LENDX=1,ILNCT
  1807.     LINE(LENDX)=ILINE(LENDX)
  1808.     IF(ICHAR(LINE(LENDX)).EQ.255)I255X=3
  1809.     IF(I255X.LE.0)GOTO 4602
  1810.     I255X=I255X-1
  1811.     GOTO 6002
  1812. C SKIP ENTIRE 3-CHR PACKED CODES
  1813. 4602    CONTINUE
  1814.     IF(ICHAR(LINE(LENDX)).GT.0.AND.ICHAR(LINE(LENDX)).LT.32)
  1815.      1  LINE(LENDX)=CHAR(32)
  1816. C LEAVE ANY EXISTING NULLS IN.
  1817. 6002    CONTINUE
  1818.     LEND=ILNCT
  1819. CD    CALL FRMEDT(LINE,LEND)
  1820. C FRMEDT IMPLEMENTS EDITS OF {VAR INTO THAT VARIABLE'S FORMULA
  1821. CC NULL TERMINATE THE LINE TO ENSURE WE END SOMEWHERE.
  1822. C    ICCC=MIN0(80,(LEND+1))
  1823. C    LINE(ICCC)=0
  1824.     GOTO 103
  1825. 6003    CONTINUE
  1826.     DO 6 NONBLK=1,7
  1827.     IF(LINE(NONBLK).EQ.BLANK)GO TO 7
  1828.     IF(ICHAR(LINE(NONBLK)).EQ.13)GO TO 20
  1829. 6    CONTINUE
  1830.     STOP 6
  1831. 7    NONBLK=NONBLK+1
  1832.     ONCE=1
  1833.     GO TO 106
  1834. C
  1835. C  ERROR RESET
  1836.  
  1837. 10    IF(LEVEL.LE.1) GO TO 12
  1838.     CLOSE(LEVEL)
  1839.     LEVEL=LEVEL-1
  1840.     GO TO 10
  1841. 12    CONTINUE
  1842.     VIEWSW=3
  1843. C
  1844. C
  1845. C  GET NEXT INPUT LINE
  1846. 20    CONTINUE
  1847.     LINE(1)=char(0)
  1848.     LINE(2)=char(0)
  1849.     IF(ONCE.EQ.1.AND.LEVEL.LE.1) RETURN
  1850. C20    IF(ONCE.EQ.1.AND.LEVEL.EQ.1) CALL EXIT
  1851. C    IF (ILNFG.NE.0.AND.ILNCT.GT.0)GOTO 6004
  1852.     IF (LEVEL.LE.1.AND.ILNFG.NE.0.AND.ILNCT.GT.0)RETURN
  1853.     IF(LEVEL.LT.1)RETURN
  1854.     IF(ILNFG.EQ.0.AND.LEVEL.EQ.1)call vwrt(crlf,2)
  1855.     IF(ILNFG.EQ.0.AND.LEVEL.EQ.1)call vwrt('Calc>',5)
  1856. c22    FORMAT(' CALC>')
  1857. C
  1858. C
  1859.     LLLV=LEVEL
  1860.     IF(LLLV.EQ.1)LLLV=11
  1861. c    rewind 11
  1862.     if(lllv.ne.11)goto 6008
  1863.     call vget(line,80)
  1864.     do 6009 iii=1,80
  1865. C Force chars read in to spaces like Fortran system would.
  1866. C This includes controls like crlf.
  1867.     if(ichar(line(iii)).le.31)line(iii)=' '
  1868. 6009    Continue
  1869. 6008    Continue
  1870. c    if(lllv.eq.11)call vget(line,80)
  1871.     if(lllv.ne.11)READ (LLLV,24,END=900,ERR=1000) LINE
  1872. c    rewind 11
  1873. 24    FORMAT (80A1)
  1874. C    GOTO 6005
  1875. C SECTION BELOW COMMENTED OUT BECAUSE IT SHOULD NEVER BE CALLED (GCE).
  1876. C6004    CONTINUE
  1877. C    DO 6006 LENDX=1,80
  1878. C6006    LINE(LENDX)=CHAR(32)
  1879. CC ABOVE BLANKS OUT LINE ARRAY
  1880. C    DO 6007 LENDX=1,ILNCT
  1881. C6007    LINE(LENDX)=ILINE(LENDX)
  1882. CC ABOVE COPIES INPUT FROM OUR CALLER...
  1883. C6005    CONTINUE
  1884. C
  1885. C
  1886. C
  1887. C FIND LAST NONBLANK, SAVE POSITION WITH VARIABLE 'LEND'
  1888. CD    CALL FRMEDT(LINE,LEND)
  1889.     CALL SLEND(RETCD)
  1890.     GO TO(30,20),RETCD
  1891.     STOP 30
  1892. 30    CONTINUE
  1893. C
  1894. C
  1895.     IF(ILNFG.EQ.0.AND.ILNCT.GT.0)GOTO 103
  1896. C SHOW WHAT WAS READ FROM FILE
  1897. c    rewind 11
  1898.     cwrk=' '
  1899.     IF(LEVEL.NE.1.AND.(VIEWSW.EQ.1.OR.VIEWSW.EQ.3))
  1900.      1  write(cwrk,40)level,(line(i),i=1,lend)
  1901.     cwrk= crlf // cwrk
  1902.     iii=lend+10
  1903.     IF(LEVEL.NE.1.AND.(VIEWSW.EQ.1.OR.VIEWSW.EQ.3))
  1904.      1  call vwrt(cwrk,iii)
  1905. c     1 WRITE(11,40)LEVEL,(LINE(I),I=1,LEND)
  1906. c    rewind 11
  1907. 40    FORMAT (' CALC<',I1,'>',80A1)
  1908. 103    CONTINUE
  1909. C NULL TERMINATE THE LINE TO ENSURE WE END SOMEWHERE.
  1910.     ICCC=MIN0(80,(LEND+1))
  1911.     LINE(ICCC)=char(0)
  1912. C
  1913. C  IDENTIFY FIRST NON-BLANK
  1914.     DO 104 NONBLK=1,LEND
  1915.     IF (LINE(NONBLK).NE.BLANK) GOTO 106
  1916. 104    CONTINUE
  1917.     RETURN
  1918. C    STOP 104
  1919. C
  1920. C CONVERT LOWER CASE TO UPPER CASE
  1921. 106    CONTINUE
  1922.     I255X=0
  1923.     DO 108 I=NONBLK,LEND
  1924.     J=ICHAR(LINE(I))
  1925.     IF(J.EQ.255)I255X=3
  1926.     IF(I255X.LE.0)GOTO 3107
  1927. C SKIP ENCODED VARIABLE NAMES
  1928.     I255X=I255X-1
  1929.     GOTO 107
  1930. 3107    CONTINUE
  1931.     IF (I.EQ.NONBLK) GOTO 107
  1932.     IF (LINE(I-1).EQ.QUOTE) GOTO 108
  1933.     IF(J.GE.97.AND.J.LE.122) LINE(I)=CHAR(J-32)
  1934. 107    CONTINUE
  1935. 108    CONTINUE
  1936. C
  1937. C  SEE IF A LIST OF POSSIBLE COMMANDS SHOULD BE PRINTED
  1938.     IF (LINE(NONBLK).NE.WHAT) GOTO 110
  1939.     CALL LIST
  1940.     GOTO 20
  1941. C
  1942. C  SEE IF IT IS A COMMAND
  1943. 110    IF (LINE(NONBLK).NE.STAR) GOTO 120
  1944.     CALL CMND (RETCD)
  1945.     GOTO (20,115,10,6120), RETCD
  1946. 6120    RETURN
  1947. C    STOP 110
  1948. C
  1949. C
  1950. C A READ COMMAND WAS EXECUTED SO LINE HOLDS THE NEW COMMAND LINE.
  1951. 115    CALL SLEND(RETCD)
  1952.     GO TO (103,20),RETCD
  1953.     RETURN
  1954. C    STOP 115
  1955. C
  1956. C  SEE IF ONLY ONE ALPHA CHARACTER
  1957. 120    J=NONBLK+1
  1958.     IF (LEND.NE.NONBLK) GOTO 130
  1959.     DO 124 I=1,27
  1960.     IF (LINE(NONBLK).EQ.ALPHA(I)) GOTO 126
  1961. 124    CONTINUE
  1962. C
  1963. C ALLOW FOR A SINGLE DIGIT TO BE ASSIGNED TO %
  1964.     DO 125 I=1,10
  1965.     IF(LINE(NONBLK).EQ.DIGITS(I,1))GO TO 130
  1966. 125    CONTINUE
  1967. C
  1968. C
  1969. C ALLOW FOR ENTERING THE ASCII BLANK
  1970.     IF(LINE(NONBLK).EQ.QUOTE)GO TO 130
  1971.     I=1
  1972.     GOTO 1001
  1973. C
  1974. C  OUTPUT VALUE OF SINGLE VARIABLE
  1975. 126    CALL VAROUT(I,1)
  1976.     GOTO 20
  1977. C
  1978. C
  1979. C CHECK INPUT FOR SYNTAX ERRORS
  1980. 130    CALL ERRCX (RETCD)
  1981.     GOTO (140,10),RETCD
  1982.     RETURN
  1983. C    STOP 130
  1984. C
  1985. C  CHANGE FROM INFIX TO POSTFIX NOTATION
  1986. 140    CALL INPOST (RETCD)
  1987.     GOTO (150,10), RETCD
  1988. C
  1989. C
  1990. C EVALUATE EXPRESSION
  1991. 150    CONTINUE
  1992.     CALL POSTVL(RETCD)
  1993.     GOTO(20,10),RETCD
  1994.     RETURN
  1995. C    STOP 150
  1996. C
  1997. C
  1998. C  EXIT
  1999. 900    CONTINUE
  2000.     IF (LEVEL.EQ.1) RETURN
  2001. C    IF (LEVEL.EQ.1) CALL EXIT
  2002.     IF(ITCNTV(LEVEL).EQ.0)GOTO 910
  2003.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GO TO 910
  2004. C
  2005. C VALUE OF ITERATION VARIABLE IS POSITIVE SO REWIND FILE
  2006. C AND EXECUTE AGAIN.
  2007.     REWIND LEVEL
  2008.     GO TO 20
  2009. C
  2010. C
  2011. C EXIT FROM THIS LEVEL BY CLOSING THE FILE AND DECREASING VALUE
  2012. C OF LEVEL BY ONE.
  2013. 910    CLOSE(LEVEL)
  2014.     LEVEL=LEVEL-1
  2015.     GOTO 20
  2016. C
  2017. C
  2018. C
  2019. C *** ERROR PROCESSING ***
  2020. 1000    I=27
  2021. 1001    CALL ERRMSG(I)
  2022.     GO TO 10
  2023.     END
  2024. c -h- calun.for    Fri Aug 22 13:00:17 1986    
  2025.     SUBROUTINE CALUN(RETCD)
  2026. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  2027. C ALL RIGHTS RESERVED
  2028. C 60=MAX REAL ROWS
  2029. C 301=MAX REAL COLS
  2030. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2031.  
  2032. C VBLS AND TYPE DIMENSIONED 60,301
  2033. C  *****************************************************
  2034. C  *             SUBROUTINE   CALUN                    *
  2035. C  *****************************************************
  2036. C
  2037. C  SUBROUTINE CALUN PERFORMS A UNARY OPERATION.
  2038. C
  2039. C  UPON ENTRANCE:
  2040. C    OPERATOR IS ON STACK 2
  2041. C    OPERAND IS ON STACK 1
  2042. C  UPON EXIT:
  2043. C    OPERATOR HAS BEEN POPPED OFF STACK 2
  2044. C    RESULT IS ON STACK 1
  2045. C
  2046. C    RETCD    MEANING
  2047. C
  2048. C    1    O.K.
  2049. C    2    ERROR
  2050. C
  2051. C   MODIFICATION CLASSES: M3, M4, AND M8
  2052. C
  2053. C  CALUN CALLS
  2054. C
  2055. C  CONTYP   CONVERTS DATA TYPES
  2056. C  ERRMSG   PRINTS ERROR MESSAGES
  2057. C  $DATAN   ARC TANGENT
  2058. C  $DCOS    COSINE
  2059. C  $DEXP    E**X
  2060. C  $DLOG    NATURAL LOG
  2061. C  $DLOG10  LOG BASE 10
  2062. C  $DSIN    SINE
  2063. C  $DSQRT   SQUARE ROOT
  2064. C  $DTANH   HYPERBOLIC TANGENT
  2065. C
  2066. C  CALUN IS CALLED BY POSTVL WHICH CONVERTS FROM INFIX TO POSTFIX
  2067. C
  2068. C     VARIABLE    USE
  2069. C
  2070. C  RETCD      RETURN CODE:  1 = O.K.   2 = ERROR
  2071. C  J,K,K2,I   HOLD TEMPORARY VALUES
  2072. C  MINUS      VALUE IN LAST MULTIPLE PRECISION BYTE.
  2073. C             USED TO INDICATE A NEGATIVE NUMBER.
  2074. C  PLUS       VALUE IN LAST MULTIPLE PRCISION BYTE.
  2075. C             USED TO INDICATE A POSITIVE NUMBER.
  2076. C  REAL       TEMPORARY DOUBLE PRECISION VALUES.
  2077. C  INT        TEMPORARY INTEGER*4 VALUES.
  2078. C  ST1TYP(40) TYPE FOR EACH ELEMENT ON STACK 1
  2079. C  ST2TYP(40) TYPE FOR EACH ELEMENT OF STACK 2
  2080. C  ST1PT      POINTS TO TOP OF STACK 1
  2081. C  ST2PT      POINTS TO TOP OF STACK 2
  2082. C  STACK1     HOLDS OPERAND
  2083. C  STACK2     HOLDS UNARY OPERATOR
  2084. C
  2085. C    SUBROUTINE CALUN(RETCD)
  2086.     REAL*8 REAL
  2087.     REAL*8 DABS,DEXP,DLOG,DLOG10,DSQRT,DSIN,DCOS
  2088.     REAL*8 DASIN,DACOS,DTAN
  2089.     REAL*8 DTANH,DATAN
  2090. C
  2091.     REAL*4 FLOAT
  2092. C
  2093.     INTEGER*4 INT
  2094. C
  2095.     InTeGer*4 RETCD,RETCD2
  2096.     InTeGer*4 ST1TYP(40),ST2TYP(40),ST1PT,ST2PT,ST1LIM,ST2LIM
  2097.     InTeGer*4 K,K2
  2098. C
  2099.     CHARACTER*1 STACK1(8,40),STACK2(8,40),FOUR(4),EIGHT(8)
  2100.     CHARACTER*1 PLUS,MINUS
  2101. C
  2102.     EQUIVALENCE (FOUR,INT),(EIGHT,REAL)
  2103. C
  2104.     COMMON /STACKx/STACK1,STACK2,ST1PT,ST2PT,
  2105.      ;          ST1TYP,ST2TYP,ST1LIM,ST2LIM
  2106. C
  2107. C    DATA PLUS/0/,MINUS/1/
  2108. C
  2109.     PLUS=char(0)
  2110.     MINUS=char(1)
  2111.     RETCD=(1)
  2112.     K=ST2TYP(ST2PT-1)
  2113.     K2=ST1TYP(ST1PT-1)
  2114. C
  2115. C
  2116. C MAKE SURE VARIABLE IS DEFINED
  2117.     IF(K2.GT.0)GOTO 50
  2118. C IF NOT, PRINT MESSAGE AND RETURN
  2119.     CALL ERRMSG(16)
  2120.     GOTO 89999
  2121. C
  2122. 50    J=K
  2123. C
  2124. C
  2125. C SEE IF IT IS A UNARY MINUS
  2126.     IF (J.EQ.111) GOTO 100
  2127. C
  2128. C
  2129. C  FUNCTIONS START AT 31
  2130.     K=K-30
  2131.     GOTO (100,100,300,400,500,400,10000),K
  2132.     GOTO 10000
  2133. C
  2134. C
  2135. C  ***************************************
  2136. C  *** ABS (=DABS), IABS, AND UNARY -  ***
  2137. C  ***************************************
  2138. 100    CONTINUE
  2139.     IF(K2.GT.0)GO TO 105
  2140.     CALL ERRMSG(16)
  2141.     GO TO 89999
  2142. 105    GOTO (110,120,130,130,140,140,140,130,120),K2
  2143.     STOP 100
  2144. C
  2145. C
  2146. C  ASCII
  2147. 110    CALL ERRMSG (12)
  2148.     GOTO 89999
  2149. C
  2150. C
  2151. C  DECIMAL AND REAL
  2152. 120    DO 121 I=1,8
  2153. 121    EIGHT(I)=STACK1(I,ST1PT-1)
  2154.     IF (K.NE.111) GOTO 123
  2155. C
  2156. C
  2157. C  UNARY -
  2158.     REAL=-REAL
  2159.     GOTO 124
  2160. 123    REAL=DABS(REAL)
  2161. 124    DO 125 I=1,8
  2162. 125    STACK1(I,ST1PT-1)=EIGHT(I)
  2163.     GOTO 90000
  2164. C
  2165. C
  2166. C  INTEGER, HEXADECIMAL, AND OCTAL
  2167. 130    DO 131 I=1,4
  2168. 131    FOUR(I)=STACK1(I,ST1PT-1)
  2169.     IF (K.NE.111) GOTO 133
  2170.     INT=-INT
  2171.     GO TO 134
  2172. 133    IF(INT.LT.0)INT=-INT
  2173. 134    DO 135 I=1,4
  2174. 135    STACK1(I,ST1PT-1)=FOUR(I)
  2175.     GOTO 90000
  2176. C
  2177. C
  2178. C  MULTIPLE PRECISION
  2179. 140    IF (K.NE.111) GOTO 150
  2180.     IF (STACK1(8,ST1PT-1).EQ.PLUS)GOTO 160
  2181. 150    STACK1(8,ST1PT-1)=PLUS
  2182.     GOTO 90000
  2183. 160    STACK1(8,ST1PT-1)=MINUS
  2184.     GOTO 90000
  2185. C
  2186. C
  2187. C  ***************************************
  2188. C  ************  FLOAT  ******************
  2189. C  ***************************************
  2190. 300    CONTINUE
  2191.     GOTO (310,320,330,330,340,340,340,330,320),K2
  2192. C
  2193. C
  2194. C  ASCII
  2195. 310    CALL ERRMSG(12)
  2196.     GOTO 89999
  2197. C
  2198. C
  2199. C  REAL (=DECIMAL)
  2200. 320    CALL ERRMSG (13)
  2201.     GOTO 89999
  2202. C
  2203. C
  2204. C  INTEGER=HEXADECIMAL=OCTAL
  2205. 330    DO 333 I=1,4
  2206. 333    FOUR(I)=STACK1(I,ST1PT-1)
  2207.     REAL=FLOAT(INT)
  2208.     DO 335 I=1,8
  2209. 335    STACK1(I,ST1PT-1)=EIGHT(I)
  2210.     ST1TYP(ST1PT-1)=2
  2211.     GOTO 90000
  2212. C
  2213. C
  2214. C  MULTIPLE PRECISION
  2215. 340    CALL ERRMSG (11)
  2216.     GOTO 89999
  2217. C
  2218. C
  2219. C
  2220. C  ***************************************
  2221. C  *******  IFIX AND INT (=IDINT)  *******
  2222. C  ***************************************
  2223. 400    CONTINUE
  2224.     GOTO (410,420,430,430,440,440,440,430,420),K2
  2225.     STOP 400
  2226. C
  2227. C
  2228. C  ASCII
  2229. 410    CALL ERRMSG (12)
  2230.     GOTO 89999
  2231. C
  2232. C
  2233. C  REAL AND DECIMAL
  2234. 420    DO 421 I=1,8
  2235. 421    EIGHT(I)=STACK1(I,ST1PT-1)
  2236.     INT=IDINT(REAL)
  2237.     DO 424 I=1,4
  2238. 424    STACK1(I,ST1PT-1)=FOUR(I)
  2239.     ST1TYP(ST1PT-1)=4
  2240.     GOTO 90000
  2241. C
  2242. C
  2243. C  INTEGER, HEXADECIMAL, AND OCTAL
  2244. 430    CALL ERRMSG (10)
  2245.     GOTO 89999
  2246. C
  2247. C
  2248. C  MULTIPLE PRECISION
  2249. 440    CALL ERRMSG (11)
  2250.     GOTO 89999
  2251. C
  2252. C
  2253. C
  2254. C  ***************************************
  2255. C  ***************  AINT  ****************
  2256. C  ***************************************
  2257. C
  2258. C  REAL TO REAL TRUNCATION
  2259. 500    CONTINUE
  2260.     GOTO (510,520,530,530,540,540,540,530,520),K2
  2261. C
  2262. C
  2263. C  ASCII
  2264. 510    CALL ERRMSG (12)
  2265.     GOTO 89999
  2266. C
  2267. C
  2268. C  REAL AND DECIMAL
  2269. 520    DO 522 I=1,8
  2270. 522    EIGHT(I)=STACK1(I,ST1PT-1)
  2271. C
  2272. C DON'T USE AINT(SNGL(REAL)) BECAUSE THEN
  2273. C 2.9999999 RESULTS IN 3.0
  2274.     REAL=DINT(REAL)
  2275.     DO 524 I=1,8
  2276. 524    STACK1(I,ST1PT-1)=EIGHT(I)
  2277.     GOTO 90000
  2278. C
  2279. C
  2280. C  INTEGER, HEXADECIMAL, AND OCTAL
  2281. 530    CALL ERRMSG (10)
  2282.     GOTO 89999
  2283. C
  2284. C
  2285. C  MULTIPLE PRECISION
  2286. 540    CALL ERRMSG(11)
  2287.     GOTO 89999
  2288. C
  2289. C
  2290. C
  2291. C
  2292. C  ****************************************
  2293. C  ****************************************
  2294. C  ********                        ********
  2295. C  ******** REAL TO REAL FUNCTIONS ********
  2296. C  ********                        ********
  2297. C  ********  EXP      (=DEXP)      ********
  2298. C  ********  ALOG     (=DLOG)      ********
  2299. C  ********  ALOG10   (=DLOG10)    ********
  2300. C  ********  SQRT     (=DSQRT)     ********
  2301. C  ********  SIN      (=DSIN)      ********
  2302. C  ********  COS      (=DCOS)      ********
  2303. C  ********  TANH     (DTANH)      ********
  2304. C  ********  ATAN     (=DATAN)     ********
  2305. C  ********                        ********
  2306. C  ****************************************
  2307. C  ****************************************
  2308. C
  2309. C
  2310. C
  2311. 10000    CONTINUE
  2312.     GOTO (11000,12000,15000,15000,15000,15000,15000,15000,12000),K2
  2313.     STOP 10000
  2314. C
  2315. C
  2316. C  ASCII
  2317. 11000    CALL ERRMSG (12)
  2318.     GOTO 89999
  2319. C
  2320. C
  2321. C  REAL AND DECIMAL
  2322. 12000    DO 12010 I=1,8
  2323. 12010    EIGHT(I)=STACK1(I,ST1PT-1)
  2324.     K=K-6
  2325.     GOTO (12100,12200,12300,12400,12500,12600,12700,12800,
  2326.      1  12840,12860,12880),K
  2327. C
  2328. C
  2329. C  EXP
  2330. 12100    REAL=DEXP(REAL)
  2331.     GOTO 14000
  2332. C
  2333. C
  2334. C  ALOG
  2335. 12200    REAL=DLOG(REAL)
  2336.     GOTO 14000
  2337. C
  2338. C
  2339. C  DLOG10
  2340. 12300    REAL=DLOG10(REAL)
  2341.     GOTO 14000
  2342. C
  2343. C
  2344. C  DSQRT
  2345. 12400    IF (REAL.GE.0.D0) GOTO 12410
  2346. 12405    CALL ERRMSG (14)
  2347.     GOTO 89999
  2348. 12410    REAL=DSQRT (REAL)
  2349.     GOTO 14000
  2350. C
  2351. C
  2352. C  DSIN
  2353. 12500    REAL=DSIN(REAL)
  2354.     GOTO 14000
  2355. C
  2356. C
  2357. C  DCOS
  2358. 12600    REAL=DCOS(REAL)
  2359.     GOTO 14000
  2360. C
  2361. C
  2362. C  DTANH
  2363. 12700    REAL=DTANH(REAL)
  2364.     GOTO 14000
  2365. C
  2366. C
  2367. C  DATAN
  2368. 12800    REAL=DATAN(REAL)
  2369.     GOTO 14000
  2370. C
  2371. C ASIN
  2372. 12840    CONTINUE
  2373.     IF(REAL.LT. -1.0.OR.REAL.GT. 1.0) GOTO 12405
  2374.     REAL=DASIN(REAL)
  2375.     GOTO 14000
  2376. C
  2377. C ACOS
  2378. 12860    CONTINUE
  2379.     IF(REAL.LT. -1.0.OR.REAL.GT. 1.0) GOTO 12405
  2380.     REAL=DACOS(REAL)
  2381.     GOTO 14000
  2382. C
  2383. C TAN
  2384. 12880    CONTINUE
  2385.     IF(REAL.GT.1.570795)REAL=1.570795
  2386.     IF(REAL.LT. -1.570795) REAL = -1.570795
  2387. C CLAMP TO AVOID OVERFLOW
  2388.     REAL=DTAN(REAL)
  2389. C    GOTO 14000
  2390. C (GOTO NOT NEEDED IF THIS IS THE LAST FUNCTION)
  2391. 14000    DO 14010 I=1,8
  2392. 14010    STACK1(I,ST1PT-1)=EIGHT(I)
  2393.     GOTO 90000
  2394. C
  2395. C
  2396. C  INTEGER, HEXADECIMAL, OCTAL, AND MULTIPLE PRECISION
  2397. 15000    CONTINUE
  2398.     CALL CONTYP(STACK1,ST1PT-1,K2,2,RETCD2)
  2399.     GO TO(15010,89999),RETCD2
  2400.     STOP 15000
  2401. 15010    ST1TYP(ST1PT-1)=2
  2402.     GO TO 12000
  2403. C
  2404. C
  2405. C  EXIT
  2406. 89999    RETCD=2
  2407. 90000    ST2PT=ST2PT-1
  2408.     RETURN
  2409.     END
  2410. c -h- ce2a.fms    Fri Aug 22 13:00:17 1986    
  2411.     SUBROUTINE CE2A(LNIN,LNOUT)
  2412. C CONVERT ENCODED FORMULAS TO NORMAL ASCII
  2413. C NOTE: ONLY HAS TO HANDLE STANDARD NAMES AS A$5$ TYPE FORMS AND P# AND D# FORMS
  2414. C ARE NOT TRANSLATED TO PACKED ONES.
  2415.     CHARACTER*1 NAME(4),NUMBER(6)
  2416.     CHARACTER*1 LNIN,LNOUT
  2417.     CHARACTER*6 NUMBR6
  2418.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  2419.     DIMENSION LNIN(128),LNOUT(128)
  2420. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2421. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2422.     InTeGer*4 RRWACT,RCLACT
  2423. C    COMMON/RCLACT/RRWACT,RCLACT
  2424.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2425.      1  IDOL7,IDOL8
  2426. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2427. C     1  IDOL7,IDOL8
  2428.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2429. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2430.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2431. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2432. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2433. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2434.     InTeGer*4 KLVL
  2435. C    COMMON/KLVL/KLVL
  2436.     InTeGer*4 IOLVL,IGOLD
  2437. C    COMMON/IOLVL/IOLVL
  2438. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2439. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2440.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2441.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2442.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2443.      3  k3dfg,kcdelt,krdelt,kpag
  2444. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2445. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2446. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2447. C    LOGICAL*2 L63,L192,L255,L127
  2448.     LOGICAL*4 L1,L2
  2449. C    InTeGer*4 I63,I192,I255,I127
  2450.     InTeGer*4 I63,I192,I127
  2451.     InTeGer*4 I1,I2
  2452. C    EQUIVALENCE(L127,I127)
  2453. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  2454.     EQUIVALENCE (I1,L1),(I2,L2)
  2455.     INTEGER*4 FNAM(25)
  2456.     character*4 fnmx(25)
  2457.     CHARACTER*1 FCHNM(4,25)
  2458.     equivalence(fnmx(1)(1:1),fnam(1),fchnm(1,1))
  2459. c    EQUIVALENCE(FNAM(1),FCHNM(1,1))
  2460.     save fnmx,i63,i192,i127
  2461.     DATA FNMX/'MIN ','MAX ','AVG ','SUM ','STD ','IF  ',
  2462.      1  'AND ','IOR ','NOT ','CNT ','NPV ','LKP ',
  2463.      2  'LKN ','LKE ','XOR ','EQV ','MOD ','REM ','SGN ','IRR ',
  2464.      3  'RND ','PMT','PVL','AVE','CHS'/
  2465. C    DATA I63/63/,I192/192/,I255/255/,I128/128/
  2466.     DATA I63/63/,I192/192/,I127/127/
  2467.     LI=1
  2468.     LO=1
  2469. C LI = INPUT LOCATION
  2470. C LO=OUTPUT LOCATION
  2471. 100    CONTINUE
  2472.     LCC=ICHAR(LNIN(LI))
  2473.     IF(LCC.NE.255)GOTO 200
  2474. C FIND BINARY PATTERNS TO USE
  2475.     I1=ICHAR(LNIN(LI+1))
  2476.     I2=IMASK(I1,I192)
  2477. C    L2=L1.AND.L192
  2478.     I1=IMASK(I1,I63)
  2479. C    L1=L1.AND.L63
  2480.     ID1=I1
  2481.     I1=ICHAR(LNIN(LI+2))
  2482.     I1=IMASK(I1,I127)
  2483. C    L1=L1.AND.L127
  2484.     ID2=I2*2+I1
  2485.     LI=MIN0(LI+3,109)
  2486. C DO MASKING TO GET BINARY COORDS
  2487.     CALL IN2AS(ID1,NAME)
  2488. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  2489.     IL2=ID2-1
  2490.     WRITE(NUMBR6(1:6),1000)IL2
  2491. C    ENCODE(6,1000,NUMBER)IL2
  2492. 1000    FORMAT(I6)
  2493. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  2494. C THROW OUT SPACES AND COPY THE REST.
  2495.     DO 202 N=1,4
  2496.     IF(ICHAR(NAME(N)).LE.32)GOTO 202
  2497.     LNOUT(LO)=NAME(N)
  2498.     LO=LO+1
  2499.     IF(LO.GT.110)GOTO 300
  2500. 202    CONTINUE
  2501.     DO 203 N=1,6
  2502.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  2503. C IF 32 ISN'T SPACE, LOSE
  2504.     LNOUT(LO)=NUMBER(N)
  2505.     LO=LO+1
  2506.     IF(LO.GT.110)GOTO 300
  2507. 203    CONTINUE
  2508.     GOTO 300
  2509. C COPY MISC. CHARACTER
  2510. 200    CONTINUE
  2511.     II=ICHAR(LNIN(LI))
  2512.     IF(II.LT.230.OR.II.GT.254)GOTO 220
  2513. C FUNCTION NAME...
  2514.     II=II-229
  2515.     LNOUT(LO)=FCHNM(1,II)
  2516.     LNOUT(LO+1)=FCHNM(2,II)
  2517.     LNOUT(LO+2)=FCHNM(3,II)
  2518.     LI=LI+1
  2519.     LO=LO+3
  2520. C FILL IN ASCII FORM OF FUNCTION HERE...
  2521.     GOTO 300
  2522. 220    CONTINUE
  2523.     LNOUT(LO)=LNIN(LI)
  2524.     LO=LO+1
  2525.     LI=LI+1
  2526. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  2527. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  2528.     LO=MIN0(LO,110)
  2529.     DO 400 N=LO,110
  2530. 400    LNOUT(N)=char(0)
  2531.     DO 1 N=111,128
  2532. 1    LNOUT(N)=LNIN(N)
  2533. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  2534.     RETURN
  2535.     END
  2536. c -h- cmdmun.for    Fri Aug 22 13:00:17 1986    
  2537.     SUBROUTINE CMDMUN(LINE)
  2538. C COPYRIGHT (C) 1983-1991 GLENN AND MARY EVERHART
  2539. C ALL RIGHTS RESERVED
  2540. ccc
  2541. ccc junk VT100 escape sequence parsing except for arrow keys and
  2542. ccc PF2 since it's mostly not useful in MSDOS anyway.
  2543. ccc
  2544.     CHARACTER*1 LINE(120),LC,LINBUF(220),CW(134)
  2545. C    InTeGer*4 IOLVL,IGOLD
  2546.     EXTERNAL INDX
  2547. C    COMMON/IOLVL/IOLVL,IGOLD
  2548.     InTeGer*4 RRWACT,RCLACT
  2549. C    COMMON/RCLACT/RRWACT,RCLACT
  2550.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2551.      1  IDOL7,IDOL8
  2552. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2553. C     1  IDOL7,IDOL8
  2554.     Logical LEXIST
  2555.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2556. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2557.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2558. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2559. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2560. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2561.     InTeGer*4 KLVL
  2562. C    COMMON/KLVL/KLVL
  2563.     InTeGer*4 IOLVL,IGOLD
  2564. C    COMMON/IOLVL/IOLVL
  2565. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2566. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2567.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2568.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2569.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2570.      3  k3dfg,kcdelt,krdelt,kpag
  2571. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2572. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2573. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2574. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2575. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2576.     Integer*4 FH
  2577.     Common/CONSFH/FH
  2578.     Integer Initd,UseDK,UseDF
  2579.     common/udfudk/usedf,usedk
  2580.     save initd
  2581.     Data Initd/0/
  2582. c Assume compilation with -h so this stays around
  2583.     If(Initd.ne.0)Goto 2408
  2584.     Initd=1
  2585.     UseDF=0
  2586.     UseDK=0
  2587. c Before inserting the DK: part, check that dk:AKA.CMD can be found.
  2588.     Inquire(File='AKA.CMD',Exist=Lexist)
  2589.     If(Lexist)UseDF=1
  2590.     If(LExist)goto 2408
  2591. C Inquire on login directory first; if file not there THEN look in DK:
  2592. c This allows one to avoid a system requestor for device DK
  2593.     Inquire(File='DK:AKA.CMD',EXIST=LEXIST)
  2594.     If(Lexist)UseDF=1
  2595.     IF(Lexist)UseDK=1
  2596. c Usedk = 1 if stuff is seen in dk:
  2597. c usedf = 1 if stuff found in default OR dk:
  2598. 2408    Continue
  2599.     ITERX=0
  2600. C ALLOW RESCAN OF READ-IN COMMANDS UP TO 10 TIMES.
  2601. 6501    CONTINUE
  2602.     ITERX=ITERX+1
  2603.     IF(ITERX.GT.10)RETURN
  2604.     LI=1
  2605. C ALLOW ARROWS OR OTHER SIMILAR KEYS TO BE RECOGNIZED
  2606.     LL=ICHAR(LINE(LI))
  2607. C ALLOW ! OR ESCAPE TO BE LEADIN FOR ESCAPE SEQUENCES
  2608.     IF(LL.EQ.155.OR.LL.EQ.33.OR.LL.EQ.27)GOTO 1000
  2609. C ALLOW % SPECIAL TREATMENT
  2610.     IF(ICHAR(LINE(1)).EQ.37)GOTO 7000
  2611.     IF(LINE(1).EQ.'^')IGOLD=IGOLD+1
  2612.     IF(LINE(1).EQ.'^')GOTO 7223
  2613. C IF WE SEE , COULB BE THAT ESC GOT EATEN BY VMS...
  2614.     IF(LINE(LI).EQ.'[')GOTO 1000
  2615. C CONVERT LOWER TO UPPER CASE
  2616.     NMX=120
  2617.     DO 41 N=1,120
  2618. C CHECK FOR DOUBLE QUOTE (34 DECIMAL). LEAVE L.C. IF SO
  2619.     NNN=ICHAR(LINE(N))
  2620.     IF(NNN.EQ.34)NMX=2
  2621. C IF WE SEE " CHARACTER THEN ONLY CONVERT 1ST 2 CHARACTERS TO U.C.
  2622.     if(n.gt.3)goto 41
  2623.     if(nnn.eq.64.or.nnn.eq.125.or.nnn.eq.36)nmx=1
  2624. C characters }, $, or @ in column 1 mean no messing with case...unix hack...
  2625. 41    CONTINUE
  2626.     JFED=0
  2627.     DO 1 N=1,NMX
  2628.     LL=ICHAR(LINE(N))
  2629.     IF(LL.GT.96.AND.LL.LT.123)LL=LL-32
  2630.     LINE(N)=CHAR(LL)
  2631.     IF(LINE(N).EQ.'_'.AND.LINE(N+1).EQ.'_')JFED=N
  2632. 1    CONTINUE
  2633.     IF(JFED.LE.0)GOTO 520
  2634. C IF __ SEEN (2 UNDERSCORES IN A ROW), CALL FRMEDT AFTER REMOVING THE __ FROM
  2635. C THE COMMAND LINE.
  2636.     DO 521 KKK=JFED,118
  2637.     LINE(KKK)=LINE(KKK+2)
  2638. 521    CONTINUE
  2639.     LINE(119)=Char(0)
  2640.     LINE(120)=Char(0)
  2641.     KKK=110
  2642.     CALL FRMEDT(LINE,KKK)
  2643. 520    CONTINUE
  2644.     IF(LINE(1).NE.'M')GOTO 2000
  2645. C    IF(LINE(1).NE.'M')RETURN
  2646.     LI=2
  2647.     GOTO 1000
  2648. 1000    CONTINUE
  2649. C HANDLE ESCAPE SEQUENCES
  2650. C ENCODE VT100 SEQUENCES HERE. MUST MODIFY FOR OTHERS.
  2651. C IF VMS PASSES 2 ESCS, PASS 1ST, TEST SECOND.
  2652. C NOTE CURSOR UP,DOWN, RIGHT, LEFT ARE CODED AS ESC A,B,C, OR D
  2653. C WITH POSSIBLE CRUFT BETW ESC AND THE LETTER.
  2654.     LL=ICHAR(LINE(LI+1))
  2655.     IF(LL.EQ.155.OR.LL.EQ.27)LI=LI+1
  2656.     LC=(LINE(LI+1))
  2657.     IF(LC.EQ.'['.OR.LC.EQ.'O')LC=(LINE(LI+2))
  2658.     IF(LC.NE.'?'.AND.LC.NE.'Q')GOTO 10
  2659. C MAKE PF2 MEAN HELP, JUST LIKE EDT
  2660. C FIX UP AMIGA HELP KEY ALSO TO MEAN HELP...
  2661.     LINE(LI)=CHAR(72)
  2662. C 72 = ASCII FOR 'H'
  2663.     LGGG=IGOLD+8
  2664.     IF(IGOLD.LE.0)GOTO 488
  2665.     LINE(LI+1)=CHAR((LGGG/10)+48)
  2666.     LINE(LI+2)=CHAR(MOD(LGGG,10)+48)
  2667. 488    CONTINUE
  2668. C    RETURN
  2669.     GOTO 2000
  2670. 10    CONTINUE
  2671. C HANDLE AUX KEYPAD KEYS AS INDIRECTS (FOR NOW)
  2672. C MAP ENTER KEY INTO AUX KEYPAD RANGE
  2673.     IF(LC.EQ.'M')LC='o'
  2674.     IF(LC.GE.'l'.AND.LC.LE.'y')GOTO 2650
  2675.     IF(LC.GE.'P'.AND.LC.LE.'S')GOTO 2100
  2676. C HANDLE INDIRECT CALLS AT 2100 FOR PF1 THRU PF4 IF AANY
  2677.     LL=ICHAR(LC)
  2678.     IF(LL.GE.48.AND.LL.LE.63)GOTO 2640
  2679.     LL=LL-65
  2680. C SUBTRACT ASCII A
  2681.     IF (LL.LT.0.OR.LL.GT.3)GOTO 2000
  2682. C ARROW KEYS HERE. ADJUST AND PASS THEM TO REST OF PROGRAM
  2683.     LK=LL
  2684.     IF(LL.EQ.3)LK=2
  2685.     IF(LL.EQ.2)LK=3
  2686.     LK=LK+49
  2687. C ADJUST FOR ASCII VALUE
  2688.     LINE(LI)=CHAR(LK)
  2689. C STASH NEW CELL IN.
  2690. C DON'T DISTURB GOLD STATUS ON MOTION OR ON HELP. ONLY ON INDIRECT
  2691. C COMMAND FILES.
  2692.     RETURN
  2693. C    GOTO 2000
  2694. 2640    CONTINUE
  2695. C AMIGA FUNCTION KEYS
  2696.     LL=LL-48+ICHAR('l')
  2697.     LC=CHAR(LL)
  2698. c Fix up as though VT100 function chars and go on
  2699. 2650    CONTINUE
  2700.     LL=ICHAR(LC)
  2701.     LL=LL-ICHAR('l')+ICHAR('A')
  2702. C MAPPING IS:
  2703. C  KEY    CHAR    AKx.CMD  x=
  2704. C  0    p    E
  2705. c  1    q    F
  2706. C  2    r    G
  2707. c  3    s    H
  2708. c  4    t       I
  2709. c  5    u    J
  2710. c  6    v    K
  2711. c  7    w    L
  2712. c  8    x    M
  2713. c  9    y    N
  2714. c  ,    l    A
  2715. c  -    m    B
  2716. c  .    n    C
  2717. c ENTER o    D
  2718.     LC=CHAR(LL)
  2719.     LINE(1)=CHAR(64)
  2720. C 64 IS ASCII @ CHARACTER
  2721.     IVL=0
  2722. C INCLUDE "DK:" IN STRING
  2723. c
  2724.     If(UseDF.eq.0) Goto 7223
  2725.     If(UseDK.eq.0) Goto 2099
  2726.     LINE(2)='D'
  2727.     LINE(3)='K'
  2728.     LINE(4)=':'
  2729.     IVL=3
  2730. 2099    Continue
  2731.     LINE(2+IVL)='A'
  2732.     LINE(3+IVL)='K'
  2733.     GOTO 2600
  2734. 2100    CONTINUE
  2735. C GENERATE INDIRECT FILE CALLS FROM PF1, PF3, PF4 KEYS IF ANY
  2736. C (THESE GIVE LETTERS P, R, OR S)
  2737.     LINE(1)=CHAR(64)
  2738.     IVL=0
  2739.     If(UseDF.eq.0) Goto 7223
  2740.     If(UseDK.eq.0) Goto 2098
  2741.     LINE(2)='D'
  2742.     LINE(3)='K'
  2743.     LINE(4)=':'
  2744.     IVL=3
  2745. 2098    Continue
  2746.     LINE(2+IVL)='K'
  2747.     LINE(3+IVL)='Y'
  2748. 2600    CONTINUE
  2749.     LINE(4+IVL)=LC
  2750.     IF(IGOLD.LE.0)GOTO 7202
  2751. C GOLD ADDS EXTRA A,B,C,D,E,... ETC. AFTER FILENAME
  2752.     LINE(5+IVL)=CHAR(64+IGOLD)
  2753.     IVL=IVL+1
  2754. C ADD EXTRA LETTER FOR GOLDED COMMANDS
  2755. 7202    CONTINUE
  2756.     LINE(5+IVL)='.'
  2757.     LINE(6+IVL)='C'
  2758.     LINE(7+IVL)='M'
  2759.     LINE(8+IVL)='D'
  2760.     LINE(9+IVL)=char(0)
  2761. C GENERATE @KYP, @KYR, OR @KYS COMMAND ON PF1, PF3, PF4
  2762. 2000    CONTINUE
  2763.     IGOLD=0
  2764.     RETURN
  2765. 7000    CONTINUE
  2766. C PROCESS %%% FORMS
  2767.     I1=INDX(LINE(2),37)
  2768. C IF I1 IS 1, THEN WE JUST HAVE %% AND THERE'S NOTHING TO DUMP TO
  2769. C THE SCREEN. OTHERWISE DUMP IT OUT HERE..
  2770.     I1=I1+1
  2771.     IF(I1.LE.2.OR.I1.GT.80)GOTO 7002
  2772.     II1=I1-1
  2773.     IV=II1-1
  2774.     CALL SWRT(LINE(2),IV)
  2775. 7301    FORMAT(80A1,60A1)
  2776. 7002    CONTINUE
  2777.     IF(I1.GT.80)RETURN
  2778. C COPY WHATEVER NEEDS TO BE COPIED TO LINBUF
  2779.     DO 7003 II=1,80
  2780. 7003    LINBUF(II)=char(0)
  2781.     I2=INDX(LINE(I1+1),37)
  2782.     IF(I2.GT.80)RETURN
  2783.     I2=I2+I1
  2784.     I1=I1+1
  2785.     II2=I2-1
  2786.     II=0
  2787.     IF(II2.LT.I1)GOTO 7540
  2788.     DO 7004 LL=I1,II2
  2789.     II=II+1
  2790. 7004    LINBUF(II)=LINE(LL)
  2791. 7540    CONTINUE
  2792.     IF(I2.GT.80)RETURN
  2793. C IF LINE(I2+1) HAS & THEN CLOSE FILE RIGHT HERE AND BUG OFF
  2794.     IF(LINE(I2+1).NE.'&')GOTO 8005
  2795.     CLOSE (IOLVL)
  2796.     IOLVL=11
  2797.     LINE(I2+1)='\'
  2798. 8005    CONTINUE
  2799. C SEE IF LINE(I2+1) CONTAINS A ?
  2800.     IF(LINE(I2+1).NE.'?'.AND.LINE(I2+1).NE.'\')GOTO 7005
  2801. C HAVE TO READ IN USER'S LINE HERE... READ OFF UNIT 5 ALWAYS...
  2802.     LX=II+1
  2803. c    rewind 11
  2804. c    If(FH.NE.0)goto 9201
  2805. c    READ(11,7301,END=7035,ERR=7035)(LINBUF(II),II=LX,120)
  2806. c    rewind 11
  2807. c    Goto 9202
  2808. c9201    Continue
  2809. c read in main window
  2810.     Call Getttl(CW)
  2811.     If(ichar(cw(1)).eq.26.or.
  2812.      1  ichar(cw(1)).eq.28)goto 7035
  2813. c filter so funny chars are treated as eof... ctl Z or ctl \ are eof.
  2814.     KK=1
  2815. c copy to Linbuf array (as much as fits, anyway
  2816.     Do 9203 II=LX,120
  2817.     Linbuf(II)=CW(KK)
  2818.     KK=KK+1
  2819. 9203    Continue
  2820. c9202    Continue
  2821. c For AMIGA we use lun 11 for console, both input and output,
  2822. c for all commands except normal sheet operation (e.g. help etc.)
  2823. C NOW SEE IF LINBUF(LX) IS EITHER A \ CHAR OR ANY CONTROL CHARACTER
  2824.     LC=LINBUF(LX)
  2825.     IF(LINE(I2+1).EQ.'\'.OR.LINE(I2+1).EQ.'!')GOTO 7005
  2826.     IF(IOLVL.EQ.11)GOTO 7005
  2827. C IF WE SEE ANYTHING EXCEPT A CONTROL CHAR OR \, REWIND THE FILE...
  2828. C THIS ALLOWS US TO HAVE A SORT OF "ENTER MODE" AND A "COMMAND MODE"
  2829. C A LA SUPERCALC ETC.
  2830.     IF(LC.NE.'\'.AND.LC.GT.CHAR(32))REWIND IOLVL
  2831. C COMMENT OUT ANY TERMINAL COMMAND
  2832.     IF(LC.EQ.'\'.OR.LC.EQ.'!'.OR.LC.LE.CHAR(32))LINBUF(1)='*'
  2833.     GOTO 7005
  2834. 7035    CONTINUE
  2835. C RECOVER AFTER CTL-Z ON EXPECTED INPUT.
  2836. C    REWIND 5
  2837.     LINBUF(1)='*'
  2838.     CLOSE (IOLVL)
  2839. c    IF(IOLVL.EQ.11)OPEN(11,FILE='CON:40/150/300/40/Analy Command')
  2840.     IOLVL=11
  2841. 7005    CONTINUE
  2842.     DO 7006 II=1,120
  2843. 7006    LINE(II)=LINBUF(II)
  2844.     GOTO 6501
  2845. C ALLOW RESCAN OF COMMAND LINE AFTER READ-IN.
  2846. C    RETURN
  2847. C RETURN AFTER BUMPING IGOLD. COMMENT OUT CMD
  2848. 7223    CONTINUE
  2849.     LINE(1)='*'
  2850.     RETURN
  2851.     END
  2852. c -h- cmnd.f40    Fri Aug 22 13:00:17 1986    
  2853.     SUBROUTINE CMND(RETCD)
  2854. C COPYRIGHT (C) 1983 GLENN EVERHART
  2855. C ALL RIGHTS RESERVED
  2856. C 60=MAX REAL ROWS
  2857. C 301=MAX REAL COLS
  2858. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2859. C VBLS AND TYPE DIMENSIONED 60,301
  2860. C   ***************************************************
  2861. C   *                                                 *
  2862. C   *         SUBROUTINE  CMND                        *
  2863. C   *                                                 *
  2864. C   ***************************************************
  2865. C
  2866. C
  2867. C  UPON ENTRANCE, NONBLK POINT TO THE "*" IN LINE
  2868. C  INDICATING A COMMAND.  THIS ROUTINE DETERMINES WHICH COMMAND
  2869. C  IS DESIRED AND CALLS THE APPROPRIATE SUBROUTINE.
  2870. C
  2871. C  RETCD:
  2872. C  1=NORMAL
  2873. C  2=BYPASS NEXT READ BECAUSE READ COMMAND HAS BEEN EXECUTED
  2874. C     TO CHANGE LINE(80)
  2875. C  3=ERROR, SO GO TO 1000 TO SET LEVEL=1
  2876. C
  2877. C
  2878. C MODIFY CLASSES: M1
  2879. C
  2880.  
  2881. C
  2882. C   CMND CALLS
  2883. C
  2884. C  AT      TO PROCESS A FILE OF CALC COMMANDS
  2885. C  BASCNG  TO CHANGE THE DEFAULT BASE FOR CONSTANTS
  2886. C  CLOSE   CLOSE FILE OF CALC COMMANDS
  2887. C  DECLR   DECLARE VAIABLES TO BE A CERTAIN DATA TYPE
  2888. C  ERRMSG  PRINTS ERROR MESSAGES
  2889. C  EXIT    RETURN TO OPERATING SYSTEM
  2890. C  GETNNB  GETS NEXT NON-BLANK FROM LINE(80)
  2891. C  STRCMP  LOOKS FOR A SPECIFIED STRING IN LINE(80)
  2892. C  ZERO    ZEROES ALL VARIABLES
  2893. C  ZNEG    TO SEE IF A VARIABLE HAS POSITIVE VALUE
  2894. C
  2895. C
  2896. C
  2897. C  CMND IS CALLED BY CALC WHO HAS IDENTIFIED THE '*'
  2898. C  INDICATING A COMMAND IS DESIRED.
  2899. C
  2900. C
  2901. C
  2902. C
  2903. C   VARIABLE      USE
  2904. C
  2905. C
  2906. C  CCHAR      TEMPORARILY HOLDS A SINGLE CHARACTER.
  2907. C  DIGITS    HOLDS ASCII REPRESENTATION OF DIGITS.
  2908. C  I         TEMPORARY INDEX.
  2909. C  ID        ARGUMENT FOR SUBROUTINE DECLR. INDICATES
  2910. C            A PARTICULAR DATA TYPE.
  2911. C  IPT       POINTER FOR LINE(80).
  2912. C  ITCNTV    0 IF NO ITERATION. IF POSITIVE, INDEX
  2913. C            OF VARIABLE USED TO CONTROL ITERATION ON THAT LEVEL.
  2914. C  KIND(15)  HOLDS FIRST LETTER OF ALL LEGAL COMMANDS.
  2915. C  LEVEL     HOLDS LOGICAL I/O UNIT WHERE NEXT COMMAND COMES FROM.
  2916. C  LINE(80)  HOLDS COMMAND LINE.
  2917. C  NONBLK    POINTER FOR LINE(80).
  2918. C  RETCD     HOLDS RETURN CODE.
  2919. C  RETCD2    HOLDS RETURN CODE.
  2920. C  VIEWSW    VIEW SWITCH:
  2921. C            0 = OFF
  2922. C            1 = DISPLAY COMMAND LINES
  2923. C            2 = DISPLAY VALUE OF EXPRESSIONS
  2924. C            3 = DISPLAY ALL
  2925. C
  2926. C
  2927. C
  2928. C    SUBROUTINE CMND(RETCD)
  2929. C
  2930. C
  2931. C    EXTERNAL INDX
  2932.     InTeGer*4 LEVEL,NONBLK,LEND
  2933.     InTeGer*4  RETCD,RETCD2,VIEWSW,BASED
  2934. C    InTeGer*4 IOLVL
  2935. C    COMMON/IOLVL/IOLVL
  2936.     InTeGer*4 ZNEG,ITCNTV(6)
  2937. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2938. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2939.     InTeGer*4 RRWACT,RCLACT
  2940. C    COMMON/RCLACT/RRWACT,RCLACT
  2941.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2942.      1  IDOL7,IDOL8
  2943. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2944. C     1  IDOL7,IDOL8
  2945.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2946. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2947.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2948. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2949. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2950. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2951.     InTeGer*4 KLVL
  2952. C    COMMON/KLVL/KLVL
  2953.     InTeGer*4 IOLVL,IGOLD
  2954. C    COMMON/IOLVL/IOLVL
  2955. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2956. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2957.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2958.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2959.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  2960.      3  k3dfg,kcdelt,krdelt,kpag
  2961. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2962. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2963. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2964.     Character*1 WRK(130)
  2965.     CHARACTER*1 WRKX(130),WRK2X(130)
  2966.     CHARACTER*1 WRK2(128)
  2967.     CHARACTER*35 CWRK,CWRKX,CWRK2
  2968.     CHARACTER*11 CWRK2B
  2969.     Character*1 wrk2b(11)
  2970.     EQUIVALENCE(CWRK2B(1:1),WRK2(1),wrk2b(1))
  2971.     EQUIVALENCE(CWRK2(1:1),WRK2(1))
  2972.     EQUIVALENCE(WRK(1),WRKX(1),CWRK(1:1),CWRKX(1:1))
  2973. C    EQUIVALENCE(WRK(1),CWRK),(CWRKX,WRKX(1),WRK(1))
  2974. C DEFINE SOME LARGER ARRAYS TO NULL TERMINATE WRK AND WRK2 ARRAYS.
  2975. c    EQUIVALENCE(WRK(1),WRKX(1))
  2976.     EQUIVALENCE(WRK2(1),WRK2X(1))
  2977.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  2978.     Real*8 VAVBLS(3,27)
  2979.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  2980.     InTeGer*4 TYPE(1,2),VLEN(9)
  2981.     REAL*8 XAC,XVBLS(1,1)
  2982.     INTEGER*4 JVBLS(2,1,1)
  2983.     EQUIVALENCE(XAC,AVBLS(1,27))
  2984.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  2985.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  2986.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  2987.     CHARACTER*1 FVLD(1,1)
  2988.     COMMON/FVLDC/FVLD
  2989. C
  2990.     CHARACTER*1  LINE(80),KIND(23),ASCII(4),DEC(6),HEX(2),INT(6),
  2991.      ;  M10(2),M8(1),M16(2),OCTAL(4),REAL(3),CCHAR
  2992.     CHARACTER*1 DIGITS(16,3)
  2993. C
  2994.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2995.     COMMON /ITERA/ITCNTV
  2996.     COMMON /DIGV/ DIGITS
  2997.     character*127 c11wrk
  2998. C
  2999.     save kind,ascii,dec,hex,m19,m8,m16,octal,real
  3000.     DATA KIND
  3001.      1/'@','A','B','C','D','E','H','I','M','N','O','R','S','V','Z'
  3002.      2,'P','W','G','Q','F','J','X','U'/
  3003. C NOTE PWGQFJX ADDED BY GCE FOR ANALYTICALC INTERFACE.
  3004. C  FREE: K,U,Y, + SPECIAL CHARACTERS (LIKE .,;'"#$%^, ETC.)
  3005.     DATA  ASCII/'S','C','I','I'/,  DEC/'E','C','I','M','A','L'/
  3006.     DATA  HEX/'E','X'/, INT/'N','T','E','G','E','R'/
  3007.     DATA  M10/'1','0'/,  M8/'8'/
  3008.     DATA  M16/'1','6'/
  3009.     DATA  OCTAL/'C','T','A','L'/
  3010.     DATA  REAL/'E','A','L'/
  3011. C    DATA WRKX/130*0/,WRK2X/130*0/
  3012. C
  3013. C
  3014. C
  3015. C PICK UP NON-BLANK CHARACTER AFTER '*'
  3016.     RETCD=1
  3017.     CALL GETNNB(IPT,RETCD2)
  3018.     GOTO(2,4),RETCD2
  3019.     STOP 2
  3020. 2    NONBLK=IPT
  3021. C NONBLK POINTS TO 1ST NONBLANK CHARACTER AFTER *
  3022. C
  3023.     DO 3 I=1,23
  3024.     IF (LINE(NONBLK).EQ.KIND(I)) GOTO 6
  3025. 3    CONTINUE
  3026. C
  3027. C
  3028. C UNIDENTIFIED COMMAND
  3029. 4    GOTO 995
  3030. C
  3031. C
  3032. C
  3033. C GO TO DIFFERENT SECTIONS ON THE BASIS OF THE FIRST CHARACTER
  3034. C OF THE COMMAND.
  3035. 6    GOTO (10,20,30,1000,40,50,60,70,80,90,100,110,50,
  3036.      1  130,140,210,220,250,290,330,360,480,780),I
  3037.     STOP 6
  3038. C
  3039. C
  3040. C
  3041. C
  3042. C **************************************************
  3043. C *****    *@  INDIRECT COMMAND PROCESSING    ******
  3044. C **************************************************
  3045. 10    CALL AT(RETCD)
  3046.     GOTO (1000,999),RETCD
  3047.     STOP 10
  3048. C
  3049. C
  3050. C
  3051. C
  3052. C **************************************************
  3053. C ******      *A     DECLARE TYPE ASCII       ******
  3054. C **************************************************
  3055. 20    CALL STRCMP (ASCII,4,RETCD2)
  3056.     ID=1
  3057.     GOTO (200,995),RETCD2
  3058.     STOP 20
  3059. C
  3060. C
  3061. C
  3062. C
  3063. C **************************************************
  3064. C ******       *B      BASE DEFAULT          *******
  3065. C **************************************************
  3066. 30    CONTINUE
  3067.     CALL BASCNG(RETCD2)
  3068.     write(c11wrk,34)based
  3069.     c11wrk(20:20)=char(13)
  3070.     c11wrk(21:21)=char(10)
  3071.     IF(VIEWSW.NE.0)call vwrt(c11wrk,21)
  3072. 34    FORMAT(' DEFAULT BASE IS ',I2)
  3073.     GO TO (1000,999),RETCD2
  3074.     STOP 30
  3075. C
  3076. C
  3077. C
  3078. C
  3079. C ********************************************************
  3080. C **   *C   COMMENT, JUST RETURN (VIA STATEMENT 1000)   **
  3081. C ********************************************************
  3082. C
  3083. C
  3084. C
  3085. C **************************************************
  3086. C *******     *D     DECLARE TYPE DECIMAL    *******
  3087. C **************************************************
  3088. 40    CALL STRCMP(DEC,6,RETCD2)
  3089.     ID=2
  3090.     GOTO (200,995),RETCD2
  3091.     STOP 40
  3092. C
  3093. C
  3094. C **************************************************
  3095. C **********          *E   EXIT             ********
  3096. C **************************************************
  3097. 50    CONTINUE
  3098. C SET RETCD=4 ON EXIT IF EXIT COMMAND, SO CALC RETURNS TO ITS CALLER.
  3099.     IF (LEVEL.EQ.1) RETCD=4
  3100.     IF (LEVEL.EQ.1) RETURN
  3101. C    IF (LEVEL.EQ.1) CALL EXIT
  3102.     IF(ITCNTV(LEVEL).EQ.0)GOTO 55
  3103.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GOTO 55
  3104. C ITERATION VARIABLE IS POSITIVE SO EXECUTE FILE AGAIN
  3105.     REWIND LEVEL
  3106.     GO TO 1000
  3107. C
  3108. C NOTE THAT WHEN EXITING A LEVEL THAT WAS ITERATED, ITCNTV
  3109. C IS NOT SET TO ZERO. THIS REQUIRES THAT WHEN ENTERED AT
  3110. C SUBROUTINE 'AT' AND ITERATION IS NOT DESIRED, THAT ITCNTV
  3111. C MUST BE SET TO ZERO THERE
  3112.  
  3113. 55    CLOSE(LEVEL)
  3114.     LEVEL=LEVEL-1
  3115. 59    GOTO 1000
  3116. C
  3117. C
  3118. C
  3119. C
  3120. C
  3121. C **************************************************
  3122. C * *H DECLARE VARIABLES TO BE OF TYPE HEXADECIMAL *
  3123. C **************************************************
  3124. 60    CALL STRCMP (HEX,2,RETCD2)
  3125.     ID=3
  3126.     GOTO (200,995),RETCD2
  3127.     STOP 60
  3128. C
  3129. C
  3130. C
  3131. C
  3132. C **************************************************
  3133. C * *I DECLARE VARIABLE TO BE OF TYPE INTEGER (*4) *
  3134. C **************************************************
  3135. 70    CALL STRCMP (INT,6,RETCD2)
  3136.     ID=4
  3137.     GOTO (200,995),RETCD2
  3138.     STOP 70
  3139. C
  3140. C
  3141. C **************************************************
  3142. C *  *M  DECLARE VARIABLE TO BE MULTIPLE PRECISION *
  3143. C **************************************************
  3144. 80    CALL STRCMP (M10,2,RETCD2)
  3145.     ID=5
  3146.     GOTO (200,84),RETCD2
  3147.     STOP 80
  3148. C
  3149. C
  3150. C  SEE IF MULTIPLE PRECISION IS OCTAL
  3151. 84    CALL STRCMP (M8,1,RETCD2)
  3152.     ID=6
  3153.     GOTO (200,88),RETCD2
  3154.     STOP 84
  3155. C
  3156. C
  3157. C  SEE IF MULTIPLE PRECISION HEXADECIMAL
  3158. 88    CALL STRCMP (M16,2,RETCD2)
  3159.     ID=7
  3160.     GOTO (200,995),RETCD2
  3161.     STOP 88
  3162. C
  3163. C
  3164. C
  3165. C
  3166. C ************************************************************
  3167. C **  *N SUPPRESS PRINTING OF VARIABLES WHEN VALUES CHANGE  **
  3168. C ************************************************************
  3169. 90    VIEWSW=1
  3170.     GOTO 1000
  3171. C
  3172. C
  3173. C
  3174. C
  3175. C **************************************************
  3176. C ***  *O  DECLARE VARIABLE TO BE OF TYPE OCTAL  ***
  3177. C **************************************************
  3178. 100    CALL STRCMP (OCTAL,4,RETCD2)
  3179.     ID=8
  3180.     GOTO (200,995),RETCD2
  3181.     STOP 100
  3182. C
  3183. C
  3184. C
  3185. C
  3186. C
  3187. C **************************************************
  3188. C ***********     *R ENCOUNTERED       *************
  3189. C **************************************************
  3190. C
  3191. C  *R    SEE IF A REAL DECLARATION
  3192. 110    CALL STRCMP (REAL,3,RETCD2)
  3193.     ID=9
  3194.     GOTO (200,114),RETCD2
  3195.     STOP 110
  3196. C
  3197. C
  3198. C  OTHERWISE ASSUME A READ IS REQUIRED
  3199. 114    IF (LEVEL.NE.1) GOTO 117
  3200. c    Rewind 11
  3201.     c11wrk=char(13) // char(10) // 'Calr>'
  3202.     call vwrt(c11wrk,7)
  3203. c    WRITE(11,116)
  3204. c    Rewind 11
  3205.     GOTO 118
  3206. c116    FORMAT(' CALR>',$)
  3207. 117    Continue
  3208. c    Rewind 11
  3209.     c11wrk=char(13) // char(10) // 'Calc0>'
  3210.     c11wrk(7:7)=char(48+level)
  3211.     call vwrt(c11wrk,8)
  3212. cc    WRITE (11,119) LEVEL
  3213. c    Rewind 11
  3214. 119    FORMAT (' CALC<',I1,'>',$)
  3215. 118    Continue
  3216. c    Rewind 11
  3217.     Call vget(line,80)
  3218. c    READ (11,115,END=1000,ERR=990) LINE
  3219. c    Rewind 11
  3220. 115    FORMAT (80A1)
  3221. C
  3222. C  NOTE THAT IF <CR> IS HIT AS THE ONLY INPUT, RETURN IS NORMAL
  3223. C  AND PROCESSING CONTINUES ON LEVEL (RETCD=2)
  3224.     RETCD=2
  3225.     GOTO 1000
  3226. C
  3227. C
  3228. C
  3229. C
  3230. C
  3231. C ************************************************************
  3232. C ***  *V ACTIVATE PRINTING OF VARIABLE WHEN VALUES CHANGE ***
  3233. C ************************************************************
  3234. 129    NONBLK=IPT
  3235. 130    CALL GETNNB(IPT,RETCD2)
  3236.     GO TO (129,132),RETCD2
  3237.     STOP  130
  3238. 132    CCHAR=LINE(NONBLK)
  3239.     IF(CCHAR.NE.DIGITS(10,1))GO TO 134
  3240. C
  3241. C  *VIEW 0 ENCOUNTERED
  3242.     VIEWSW=0
  3243.     GO TO 1000
  3244. 134    IF(CCHAR.NE.DIGITS(1,1))GO TO 136
  3245. C
  3246. C *VIEW 1 ENCOUNTERED
  3247.     VIEWSW=1
  3248.     GO TO 1000
  3249. 136    IF(CCHAR.NE.DIGITS(2,1))GO TO 138
  3250.     VIEWSW=2
  3251.     GO TO 1000
  3252. 138    VIEWSW=3
  3253.     GOTO 1000
  3254. C
  3255. C
  3256. C
  3257. C
  3258. C **************************************************
  3259. C **********   *Z   ZERO OUT ALL VARIABLES  ********
  3260. C **************************************************
  3261. 140    CALL ZERO
  3262.     GOTO 1000
  3263. C
  3264. C
  3265. C
  3266. C
  3267. C
  3268. C MAKE DECLARATIONS
  3269. 200    CALL DECLR(ID,RETCD2)
  3270.     GO TO(1000,999),RETCD2
  3271.     STOP 200
  3272. C
  3273. C
  3274. C
  3275. C
  3276. C
  3277. C **** ERROR PROCESSING ****
  3278. C
  3279. 990    I=27
  3280.     REWIND LEVEL
  3281.     GO TO 998
  3282. 995    I=3
  3283. 998    CALL ERRMSG(I)
  3284. 999    RETCD=3
  3285. 1000    CONTINUE
  3286.     RETURN
  3287. C
  3288. C P COMMAND - SET PLACEMENT OF PHYSICAL POSN IN SHEET
  3289. C *P WILL PROMPT FOR INPUTS OF LOCATIONS.
  3290. C
  3291. 210    CONTINUE
  3292. C
  3293.     RETCD=1
  3294.     CALL CMND2(RETCD,1)
  3295.     RETURN
  3296. C W COMMAND - WRITE % TO CURRENT PHYSICAL LOC IN SHEET. USE E32.25
  3297. C FORMAT.
  3298. C  DOES NOT PROMPT. THEREFORE, IF USED INSIDE SPREADSHEET, HAS THE
  3299. C  EFFECT OF CONVERTING CURRENT CELL'S FORMULA TO A LITERAL NUMBER
  3300. C  AND FREEZING IT THAT WAY. THEREFORE A FORMULA CONTAINING *W WILL
  3301. C  NORMALLY ONLY EXECUTE THE *W ONCE (AFTERWARDS BEING OVERWRITTEN).
  3302. C
  3303. 220    CONTINUE
  3304.     RETCD=1
  3305.     CALL CMND2(RETCD,2)
  3306. C
  3307.     RETURN
  3308. C
  3309. C *G SEEN.
  3310. C THE SYNTAX OF *G IS *G V1,V2 WHICH WILL GET VALUE OF VBLS(G1,G2)
  3311. C  AND LOAD IT INTO %. THE DIMENSIONS ARE CLAMPED TO LEGAL BOUNDS
  3312. C  AND TYPE=4 MEANS USE INTEGER, TYPE=2 CONVERTS VARIABLES TO
  3313. C  INTEGER. CALLS VARSCN TO DO THIS STUFF.
  3314. C  THIS GIVES A MEASURE OF INDIRECTION.
  3315. 250    CONTINUE
  3316.     RETCD=1
  3317. C SAY ALL'S WELL.
  3318.     CALL CMND2(RETCD,3)
  3319. C
  3320.     RETURN
  3321. C
  3322. C *Q QUERY DATABASE COMMAND
  3323. C
  3324. C
  3325. 290    CONTINUE
  3326.     RETCD=1
  3327.     CALL CMND2(RETCD,4)
  3328. C
  3329.     RETURN
  3330. C
  3331. C *F LABEL  GOTO LABEL COMMAND (CONDITIONAL)
  3332. C
  3333. C
  3334. C THE SYNTAX OF THE *F COMMAND IS :
  3335. C  *F LABEL
  3336. C  WITH THE OPERATION OF LOCATING A LINE BEGINNING WITH THE
  3337. C  STRING "*CLABEL" (SO IT IS PASSED OVER BY NORMAL CALC
  3338. C  PROCESSING). THE INPUT FILE ON IOLVL IS REWOUND AND
  3339. C  SCANNING GOES TO THE EOF OR UNTIL THE STRING IS FOUND.
  3340. C  RETCD=2 IF NO SUCH LABEL IS FOUND.
  3341. C
  3342. C  AS A FURTHER AID, IF THE % VARIABLE IS 0 OR NEGATIVE, THE
  3343. C  COMMAND IS IGNORED.
  3344. 330    CONTINUE
  3345.     RETCD=1
  3346.     CALL CMND2(RETCD,5)
  3347. C
  3348.     RETURN
  3349. C
  3350. C *J LABEL - JUST LIKE *F LABEL BUT ON CALC'S COMMAND FILES.
  3351. C I.E., FINDS A LINE STARTING WITH *CLABEL
  3352. C (NOTE IT STARTS FROM START OF FILE AND DOES THIS ONLY IF % IS POSITIVE).
  3353. C ITERATION OF COMMAND FILES REMAINS UNDER NORMAL CONTROL.
  3354. 360    CONTINUE
  3355.     RETCD=1
  3356.     CALL CMND2(RETCD,6)
  3357.     RETURN
  3358. C *X COMMAND
  3359. C  XC FILESPEC CELLNAME
  3360. C    READS FILESPEC AS A SAVED SPEADSHEET (NUMERIC OR FORMULA)
  3361. C  AND LOADS ITS VALUE INTO CURRENT CELL AND % ACCUMULATOR. DOES
  3362. C  NOT LOAD FORMULA UNLESS F SEEN. THUS 2 VARIANTS:
  3363. C   *XF FILESPEC CELLNAME    LOAD FORMULA AND VALUE
  3364. C   *XV FILESPEC CELLNAME    LOAD VALUE
  3365. C NOTE ANY CHARACTER AFTER *X THAT ISN'T "F" IS EQUIVALENT TO V FOR EASY USE.
  3366. 480    CONTINUE
  3367.     RETCD=1
  3368.     CALL CMND2(RETCD,7)
  3369.     RETURN
  3370. C *U FUNCTION ARGS
  3371. C HANDLE USER FUNCTION CALL...
  3372. 780    CONTINUE
  3373.     RETCD=1
  3374. C PASS LINE AND ARGS TO SUBROUTINE TO PARSE (EXTERNALIZE THE WORK)
  3375. C COMMON /V/ HAS DATA NEEDED FOR ARGUMENTS...
  3376.     CALL USRFCT(LINE,RETCD,WRK2)
  3377. C IF RETCD CHANGES IN USRFCT THIS ALLOWS ERROR CODES BACK.
  3378.     RETURN
  3379.     END
  3380. c -h- cmnd2.f40    Fri Aug 22 13:00:17 1986    
  3381.     SUBROUTINE CMND2(RETCD,I)
  3382. C COPYRIGHT (C) 1983 GLENN EVERHART
  3383. C ALL RIGHTS RESERVED
  3384. C
  3385. C EXTRA ROUTINES MOVED HERE FROM INSIDE CMND SO THAT THEY CAN BE OVERLAIN IN
  3386. C 256K VERSION TO GAIN A GREAT DEAL OF SPACE.
  3387.     INCLUDE aparms.inc
  3388.     EXTERNAL INDX
  3389.     InTeGer*4 LEVEL,NONBLK,LEND
  3390.     InTeGer*4  RETCD,VIEWSW,BASED
  3391. C    InTeGer*4 IOLVL,retcd2
  3392. C    COMMON/IOLVL/IOLVL
  3393.     InTeGer*4 ZNEG,ITCNTV(6)
  3394. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3395. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3396.     InTeGer*4 RRWACT,RCLACT
  3397. C    COMMON/RCLACT/RRWACT,RCLACT
  3398.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  3399.      1  IDOL7,IDOL8
  3400. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  3401. C     1  IDOL7,IDOL8
  3402.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3403. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3404.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3405. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3406. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3407. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  3408.     InTeGer*4 KLVL,ierror
  3409. C    COMMON/KLVL/KLVL
  3410.     InTeGer*4 IOLVL,IGOLD
  3411. C    COMMON/IOLVL/IOLVL
  3412. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  3413. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  3414.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3415.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3416.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  3417.      3  k3dfg,kcdelt,krdelt,kpag
  3418. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3419. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3420. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  3421.     CHARACTER*1 WRK2(128),LETA
  3422.     CHARACTER*35 CWRK,CWRKX,CWRK2
  3423.     CHARACTER*50 CWRK50
  3424.     EQUIVALENCE (CWRK50(1:1),CWRK(1:1))
  3425.     CHARACTER*11 CWRK2B
  3426.     Character*1 wrk2b(11)
  3427.     CHARACTER*1 WRKX(130),WRK2X(130)
  3428.     Character*1 WRK(128)
  3429.     EQUIVALENCE(CWRK2B,WRK2(1),Wrk2b(1),Cwrk2)
  3430. c    EQUIVALENCE(CWRK2,WRK2(1))
  3431.     EQUIVALENCE(WRK(1),WRKX(1),CWRK(1:1),CWRKX(1:1))
  3432. C    EQUIVALENCE(WRK(1),CWRK),(CWRKX,WRKX(1),WRK(1))
  3433. C DEFINE SOME LARGER ARRAYS TO NULL TERMINATE WRK AND WRK2 ARRAYS.
  3434. c    EQUIVALENCE(WRK(1),WRKX(1))
  3435.     EQUIVALENCE(WRK2(1),WRK2X(1))
  3436.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  3437.     Real*8 VAVBLS(3,27)
  3438.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  3439.     InTeGer*4 TYPE(1,2),VLEN(9)
  3440.     REAL*8 XAC,XVBLS(1,1),xyval
  3441.     INTEGER*4 JVBLS(2,1,1)
  3442.     EQUIVALENCE(XAC,AVBLS(1,27))
  3443.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  3444.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  3445.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  3446.     CHARACTER*1 FVLD(1,1)
  3447.     COMMON/FVLDC/FVLD
  3448. C    character*1 cchar
  3449.     CHARACTER*1  LINE(80)
  3450.     CHARACTER*1 DIGITS(16,3)
  3451. C
  3452.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  3453.     COMMON /ITERA/ITCNTV
  3454.     COMMON /DIGV/ DIGITS
  3455. C I ARGUMENT SELECTS COMMAND.
  3456. C 1 = *P
  3457. C 2 = *W
  3458. C 3 = *G 
  3459. C 4 = *Q
  3460. C 5 = *F
  3461. C 6 = *G
  3462. C 7 = *X
  3463.     IF(I.NE.1)GOTO 7000
  3464. C *P COMMANDS
  3465. C IF THE COMMAND IS *P VAR THEN SET TO VARIABLE LOCATION.
  3466.     KK1=3
  3467.     KK2=20
  3468.     IF(LINE(3).EQ.'@')GOTO 217
  3469. C ONLY LOOK IN COLS 3-20. COLUMNS 1,2 ARE THE *W COMMAND.
  3470.     CALL VARSCN(LINE,KK1,KK2,KEK,KK,KKK,IVLD)
  3471.     IF(IVLD.NE.0)GOTO 216
  3472.     GOTO 218
  3473. 217    CONTINUE
  3474. C ALLOW *W@V1,V2 TO GOTO LOCATION OF V1,V2 (COL,ROW)
  3475. C  THIS ALLOWS PROGRAMMED ACCESS TO VARIABLES.
  3476.     L1=4
  3477.     L2=60
  3478.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1A,ID2A,IVLD1)
  3479.     IF(IVLD1.EQ.0)GOTO 1000
  3480.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  3481.     IF(TYPE(1,1).EQ.2)GOTO 219
  3482.     CALL JVBLGT(1,ID1A,ID2A,JVBLS(1,1,1))
  3483.     LCL=JVBLS(1,1,1)
  3484.     GOTO 2200
  3485. 219    CONTINUE
  3486.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  3487.     LCL=XVBLS(1,1)
  3488. 2200    CONTINUE
  3489. C NOW HAVE COLUMN NUMBER. PASS DELIMITER (WHATEVER IT IS) AND GO ON
  3490.     L1=LSTCH+1
  3491.     L2=60
  3492. C ASSUME WE GET THERE WITHIN 60 CHARACTERS...
  3493.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1B,ID2B,IVLD2)
  3494.     IF(IVLD2.EQ.0)GOTO 1000
  3495. C SEEMS LIKE OK VARIABLE... GO AHEAD
  3496.     CALL TYPGET(ID1B,ID2B,TYPE(1,1))
  3497.     CALL JVBLGT(1,ID1B,ID2B,JVBLS(1,1,1))
  3498.     LRW=JVBLS(1,1,1)
  3499.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  3500.     IF(TYPE(1,1).EQ.2)LRW=XVBLS(1,1)
  3501. C ADJUST FOR ACCUMULATOR ROW BY ADDING 1
  3502.     LRW=LRW+1
  3503. C NOW HAVE COLUMN AND ROW NUMBERS. GET VARIABLE USING THEM AFTER
  3504. C CLAMPING TO MAX VALUES.
  3505.     LCL=MAX0(1,LCL)
  3506.     LRW=MAX0(1,LRW)
  3507.     LCL=MIN0(LCL,MCOLS)
  3508.     LRW=MIN0(LRW,MROWS)
  3509.     KK=LCL
  3510.     KKK=LRW
  3511.     GOTO 216
  3512. 218    CONTINUE
  3513. c    rewind 11
  3514.     IF(LEVEL.EQ.1)call Vwrt(' Set Phys loc. Column=',22)
  3515. c211    FORMAT(' SET PHYS LOC. COLUMN=')
  3516. c    rewind 11
  3517.     LLLV=LEVEL
  3518.     IF(LEVEL.EQ.1)LLLV=11
  3519.     if(lllv.ne.11)READ(LLLV,212,END=700,ERR=700)KK
  3520.     if(lllv.eq.11)call vgeti(kk)
  3521. 212    FORMAT(I7)
  3522. c    rewind 11
  3523.     IF(LEVEL.EQ.1)Call Vwrt(' Set Phys loc. Row=',19)
  3524. c213    FORMAT(' SET PHYS LOC. ROW =')
  3525. c    rewind 11
  3526.     If(lllv.ne.11)READ(LLLV,212,END=700,ERR=700)KKK
  3527.     if(lllv.eq.11)call Vgeti(kkk)
  3528. c    rewind 11
  3529.     KKK=KKK+1
  3530. 216    KK=MAX0(1,KK)
  3531.     KKK=MAX0(1,KKK)
  3532.     KK=MIN0(MCOLS,KK)
  3533.     KKK=MIN0(MROWS,KKK)
  3534. C CLAMP TO LEGAL SIZE
  3535.     PROW=KK
  3536.     PCOL=KKK
  3537. C
  3538.     RETURN
  3539. C TERMINAL READ ERROR AND END PROCESSING
  3540. 700    CONTINUE
  3541. c    IF(LEVEL.EQ.1)CLOSE(11)
  3542. c    IF(LEVEL.EQ.1)OPEN(11,FILE='CON:20/100/300/40/Analy Command')
  3543.     IF(LEVEL.NE.1)REWIND LEVEL
  3544.     IF(ITCNTV(LEVEL).EQ.0)GOTO 55
  3545.     IF(ZNEG(ITCNTV(LEVEL)).EQ.1)GOTO 55
  3546.     RETURN
  3547. 7000    CONTINUE
  3548.     IF(I.NE.2)GOTO 7200
  3549. C *W COMMANDS
  3550. C    IRX=(PCOL-1)*60+PROW
  3551.     CALL REFLEC(PCOL,PROW,IRX)
  3552.     CALL WRKFIL(IRX,WRK,0)
  3553. C    READ(7'IRX)WRK
  3554. C GET RECORD INTO MEMORY
  3555.     IF(LINE(3).EQ.'F')GOTO 224
  3556.     WRITE(CWRK(1:35),221)XAC
  3557. C    ENCODE(35,221,WRK)XAC
  3558. C PUT VARIABLE VALUE AS STRING INTO FILE BUFFER
  3559. 221    FORMAT(D32.25)
  3560.     GOTO 225
  3561. 224    CONTINUE
  3562. C WRITE AND USE LOCAL FORMAT
  3563.     WRK2(1)='('
  3564.     DO 226 K=1,9
  3565.     WRK2(1+K)=WRK(119+K)
  3566. 226    CONTINUE
  3567.     WRK2(11)=')'
  3568.     WRITE(CWRK(1:35),WRK2B)XAC
  3569. 225    CONTINUE
  3570.     DO 222 K=36,110
  3571. 222    WRK(K)=CHAR(32)
  3572.     CALL WRKFIL(IRX,WRK,1)
  3573. C    WRITE(7'IRX)WRK
  3574.     RETURN
  3575. 7200    CONTINUE
  3576.     IF(I.NE.3)GOTO 7400
  3577. C *G COMMANDS
  3578.     L1=3
  3579.     L2=60
  3580.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1A,ID2A,IVLD1)
  3581.     IF(IVLD1.EQ.0)GOTO 1000
  3582.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  3583.     IF(TYPE(1,1).EQ.2)GOTO 251
  3584.     CALL JVBLGT(1,ID1A,ID2A,JVBLS(1,1,1))
  3585.     LCL=JVBLS(1,1,1)
  3586.     GOTO 252
  3587. 251    CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  3588.     LCL=XVBLS(1,1)
  3589. 252    CONTINUE
  3590. C NOW HAVE COLUMN NUMBER. PASS DELIMITER (WHATEVER IT IS) AND GO ON
  3591.     L1=LSTCH+1
  3592.     L2=60
  3593. C ASSUME WE GET THERE WITHIN 60 CHARACTERS...
  3594.     CALL VARSCN(LINE,L1,L2,LSTCH,ID1B,ID2B,IVLD2)
  3595.     IF(IVLD2.EQ.0)GOTO 1000
  3596. C SEEMS LIKE OK VARIABLE... GO AHEAD
  3597.     CALL JVBLGT(1,ID1B,ID2B,JVBLS(1,1,1))
  3598.     CALL TYPGET(ID1B,ID2B,TYPE(1,1))
  3599.     LRW=JVBLS(1,1,1)
  3600.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  3601.     IF(TYPE(1,1).EQ.2)LRW=XVBLS(1,1)
  3602. C ADJUST FOR ACCUMULATOR ROW BY ADDING 1
  3603.     LRW=LRW+1
  3604. C NOW HAVE COLUMN AND ROW NUMBERS. GET VARIABLE USING THEM AFTER
  3605. C CLAMPING TO MAX VALUES.
  3606.     LCL=MAX0(1,LCL)
  3607.     LRW=MAX0(1,LRW)
  3608.     LCL=MIN0(LCL,MCOLS)
  3609.     LRW=MIN0(LRW,MROWS)
  3610. C RETURN VALUE.
  3611.     CALL TYPGET(LCL,LRW,TYPE(1,1))
  3612.     IF(TYPE(1,1).EQ.2)CALL XVBLGT(LCL,LRW,XAC)
  3613.     IF(TYPE(1,1).NE.2)CALL JVBLGT(1,LCL,LRW,JVBLS(1,1,1))
  3614.     IF(TYPE(1,1).NE.2)XAC=JVBLS(1,1,1)
  3615. C USE IMPLICIT CONVERSION FROM FORTRAN HERE. NOTE WE RETURN WITH
  3616. C THE LOOKED UP VALUE IN XAC.
  3617.     RETURN
  3618. 7400    CONTINUE
  3619.     IF(I.NE.4)GOTO 7600
  3620. C *Q COMMANDS
  3621. C *Q QUERY DATABASE COMMAND
  3622. C
  3623. C
  3624. C THIS COMMAND IS DESIGNED TO PERMIT CALC TO ACCESS SEQUENTIAL (FOR NOW)
  3625. C FILES AND PULL IN VALUES. ARRAY WRK IS USED TO HOLD THE RECORDS AND
  3626. C MAY DISPLAY WHATEVER IS DESIRED.
  3627. C
  3628. C OPERATION IS AS FOLLOWS:
  3629. C
  3630. C *QW/F filespec ?KEYSTRING? <cc>
  3631. C WHERE THE W/F FLAG MEANS WRITE TO FORMULA AT CURRENT LOC (MAYBE MODIFIED
  3632. C EARLIER BY THE *P COMMAND) AND F FLAG MEANS RETURN % AS VALUE OBTAINED BY
  3633. C ATTEMPTING A DECODE ON THE FILE LINE BETWEEN DELIMITER CHARACTERS
  3634. C cc GIVEN INSIDE  CHARACTERS. FILE IS ASSUMED TO START WITH
  3635. C "KEYSTRING" WHERE ANY CHARACTER IS A MATCH EXACTLY EXCEPT THAT
  3636. C THE _ CHARACTER INDICATES A WILDCARD.
  3637. C SPECIAL CASES:
  3638. C  IF ` IS 1ST CHAR OF KEYSTRING, RECORDS MUST HAVE KEYSTRING STARTING
  3639. C AT COL 1 (EXCLUDING THE `)
  3640. C  IF <CC> STRING HAS ` AS 1ST CHARACTER, THEN IT IS OF FORM
  3641. C <`NM> WHERE N=ASCII CODE FOR COLUMN WANTED + 32 AND M = ASCII CODE
  3642. C   FOR LENGTH DESIRED + 32
  3643. C  THIS ALLOWS POSITIONAL RETRIEVAL (THOUGH PAINFULLY)
  3644. C
  3645. C A SECOND KEYSTRING MAY BE ENTERED INSIDE A SECOND PAIR OF ? CHARACTERS TOO.
  3646. C  THE SEARCH WILL SEEK THE KEYS ANYWHERE IN THE RECORDS READ, UP TO 128
  3647. C  CHARACTERS LONG EACH.
  3648. C SECOND KEYSTRING MAY NOT BE ANCHORED TO START OF LINE.
  3649. C  AS AN ADDED ATTRACTION:
  3650. C   *QFK  OR *QFN  WON'T CLOSE LUN 4 AT END. IN ADDITION *QFN WON'T
  3651. C  CLOSE IT AT START EITHER ALLOWING SEQUENTIAL RETRIEVALS OUT OF
  3652. C  DATA FILES. DITTO *QW VARIANTS.
  3653. C    IRX=(PCOL-1)*60+PROW
  3654.     CALL REFLEC(PCOL,PROW,IRX)
  3655. C    IF(LINE(3).EQ.'W')READ(7'IRX)WRK
  3656.     IF(LINE(3).EQ.'W')CALL WRKFIL(IRX,WRK,0)
  3657.     IF(LINE(3).NE.'W'.AND.LINE(3).NE.'F')RETURN
  3658.     IL=INDX(LINE,32)
  3659.     IF(IL.GT.40)GOTO 299
  3660.     IL2=INDX(LINE(IL+1),32)
  3661.     IF(IL2.GT.38)GOTO 299
  3662. C ENSURE LUN 4 AVAILABLE
  3663.     IF(LINE(4).NE.'C'.AND.LINE(4).NE.'N')CLOSE(4)
  3664.     LINE(IL2+IL)=CHAR(0)
  3665.     IF(LINE(4).NE.'N'.AND.LINE(4).NE.'C')
  3666.      1   CALL RASSIG(4,LINE(IL+1),ierror)
  3667.     if(ierror.ne.0)return
  3668. C THIS MAKES LUN 4 BE THE ONE WE WANT
  3669.     LINE(IL2+IL)=CHAR(32)
  3670.     KKK=ICHAR('?')
  3671.     IQ1=INDX(LINE,KKK)
  3672. C LOCATE THE KEY
  3673.     IF(IQ1.GE.70)GOTO 299
  3674.     KKK=ICHAR('?')
  3675.     IQ2=INDX(LINE(IQ1+1),KKK)
  3676.     IF(IQ2.GE.72)GOTO 299
  3677. C NOW KNOW KEY IS IQ2-1 LONG, STARTS AT IQ1+1
  3678. C
  3679. C ALLOW DOUBLE KEYS IF ANOTHER ?? PAIR IS SEEN.
  3680.     KEYS2=0
  3681.     KKK=ICHAR('?')
  3682.     IQ3=INDX(LINE(IQ1+IQ2+1),KKK)
  3683.     IF(IQ3.GT.3)GOTO 297
  3684. C WELL, THERE'S A 2ND STRING THERE MAYBE.
  3685.     IQ4=INDX(LINE(IQ3+IQ1+IQ2+1),KKK)
  3686.     IF(IQ4.GT.30)GOTO 297
  3687.     IF(IQ4.EQ.1)GOTO 297
  3688.     KEYS2=1
  3689. C FLAG WE HAVE A SECOND KEY. SOMETHING'S THERE.
  3690.     LCL=IQ3+IQ2+IQ1+1
  3691.     LRW=LCL+IQ4-1
  3692. 297    READ(4,332,END=299,ERR=299)WRK2
  3693.     IQQ=IQ2-1
  3694.     IXX=128-IQ2
  3695. C COMPARE THE ENTIRE RECORD FOR THE KEY, MATCH ANYWHERE.
  3696.     IF(LINE(IQ1+1).NE.'`')GOTO 376
  3697. C IF 1ST CHAR OF KEY IS ` THEN SEARCH BEGINS AT LINE START ONLY. KEY IS
  3698. C 1 LESS.
  3699.     IQ1=1+IQ1
  3700.     IXX=1
  3701.     IQQ=IQQ-1
  3702. C ADJUST SO SEARCH IS 1 CHAR LESS.
  3703. 376    CONTINUE
  3704.     DO 350 KKK=1,IXX
  3705.     CALL SCMP(LINE(IQ1+1),WRK2(KKK),IQQ,ICOD)
  3706.     IF(ICOD.NE.0)GOTO 351
  3707. 350    CONTINUE
  3708. C DON'T JUST FALL THRU
  3709.     GOTO 353
  3710. 351    CONTINUE
  3711.     IF(KEYS2.EQ.0)GOTO 353
  3712. C CHECK SECOND KEY STRING IN RECORD IF ANY WAS ASKED FOR.
  3713. C (THAT'S ALL YOU GET. 2 KEYS MAX.)
  3714. C LINE(LCL) TO LINE(LRW) CONTAINS KEY.
  3715.     IXY=128-IQ4+1
  3716.     ICC=IQ4-1
  3717.     DO 354 KKK=1,IXY
  3718.     CALL SCMP(LINE(LCL),WRK2(KKK),ICC,ICOD)
  3719.     IF(ICOD.NE.0)GOTO 355
  3720. 354    CONTINUE
  3721. 355    CONTINUE
  3722. 353    IF(ICOD.EQ.0)GOTO 297
  3723. C HERE FOUND THE KEYED RECORD. NOW EXAMINE COMMAND LINE FOR
  3724. C SPECIAL CHARACTERS. IF NONE, JUST COPY THE FIRST CHARACTERS
  3725. C IN THE TEXT INTO EITHER THE BUFFER OR ENCODE THEM.
  3726.     KKK=ICHAR('<')
  3727.     IQ1=INDX(LINE,KKK)
  3728.     IF(IQ1.LE.0.OR.IQ1.GT.75)GOTO 296
  3729.     KKK=ICHAR('>')
  3730.     IQ2=INDX(LINE(IQ1+1),KKK)
  3731.     IF(IQ2.LE.0.OR.IQ2.GT.8)GOTO 296
  3732.     KKQ=ICHAR(LINE(IQ1+1))
  3733.     KK=INDX(WRK2,KKQ)
  3734. C MUNGE THE SEARCH SO THAT IF THE SPECIAL CHAR IS ` THEN THE NEXT 2
  3735. C CHARACTERS HAVE START AND LENGTH ENCODED AS ASCII CODE -32 DECIMAL
  3736. C WHICH ALLOWS FIELDS TO BE PLACED ANYWHERE (THOUGH SOMEWHAT PAINFULLY)
  3737.     IF(LINE(IQ1+1).EQ.'`')KK=ICHAR(LINE(IQ1+2))-32
  3738.     IF(KK.GT.125)GOTO 299
  3739. C NOTE THAT THE KEY FORM WOULD THEN GIVE
  3740. C  <`!@> FOR START COLUMN=1 AND LENGTH =32 (ASCII 64 = @ AND ASCII 33 = !)
  3741. C THIS MEANS USER HAS TO KNOW ASCII ORDER BUT AT LEAST IT'S IN MANUAL.
  3742.     IF(LINE(IQ1+1).EQ.'`')KKK=ICHAR(LINE(IQ1+3))-32
  3743.     KKQ=ICHAR(LINE(IQ1+2))
  3744.     IF(LINE(IQ1+1).NE.'`')KKK=INDX(WRK2(KK+1),KKQ)+KK
  3745.     GOTO 295
  3746. 296    CONTINUE
  3747. C DEFAULT, NO SPECIAL CHARS.
  3748.     KK=0
  3749.     KKK=110
  3750. 295    CONTINUE
  3751.     KL=KKK-KK-1
  3752.     KK=KK+1
  3753.     IF(LINE(3).NE.'W')GOTO 294
  3754.     KL=MIN0(KL,109)
  3755.     DO 293 N=1,KL
  3756.     WRK(N)=WRK2(KK)
  3757. 293    KK=KK+1
  3758.     WRK(KL+1)=char(0)
  3759. C WRITE OUT THE RECORD'S KEY PART INTO SHEET FILE
  3760.     CALL WRKFIL(IRX,WRK,1)
  3761. C    WRITE(7'IRX)WRK
  3762.     XAC=1.
  3763.     GOTO 298
  3764. 294    CONTINUE
  3765. C FLOAT THE VALUE, RETURN IN XAC
  3766.     DO 750 N=1,35
  3767.     WRK(N)=CHAR(32)
  3768.     IF(N.LE.KL)WRK(N)=WRK2(KK-1+N)
  3769. 750    CONTINUE
  3770.     READ(CWRK(1:35),221,ERR=299)XAC
  3771. C    DECODE(KL,221,WRK2(KK),ERR=299)XAC
  3772. 298    CONTINUE
  3773. C IF IT'S A KEEP OR NEXT TYPE OPERATION, LEAVE LUN 4 OPEN.
  3774. C FIRST ONE MUST BE A KEEP (TO OPEN FILE IN THE FIRST PLACE)
  3775. C AND SUBSEQUENT OPERATIONS MAY BE A N OPERATIONS, WHICH
  3776. C WILL JUST CONTINUE SEQUENTIAL READIN OF DATA. USER HAS TO
  3777. C KEEP TRACK. NOTE RETURN VALUE IS -999999. (6 9'S) IF WE
  3778. C FAIL AND HAVE TO CLOSE FILE.
  3779.     IF(LINE(4).EQ.'K'.OR.LINE(4).EQ.'N')RETURN
  3780.     CLOSE(4)
  3781.     RETURN
  3782. 299    CONTINUE
  3783. C RETURN -999999 IF WE FAIL IN FINDING FILE.
  3784.     XAC=-999999.
  3785.     CLOSE(4)
  3786. C    COME HERE FOR NON-RECOVERABLE ERRORS IN FORMAT TOO.
  3787. C
  3788.     RETURN
  3789. 7600    CONTINUE
  3790.     IF(I.NE.5)GOTO 7800
  3791. C *F COMMANDS
  3792.     IF(XAC.LE.0)RETURN
  3793.     REWIND IOLVL
  3794.     IF(IOLVL.EQ.11)RETURN
  3795. 333    READ(IOLVL,332,END=331,ERR=331)WRK
  3796. 332    FORMAT(128A1)
  3797.     IF(WRK(1).NE.'*'.OR.WRK(2).NE.'C')GOTO 333
  3798.     ISSL=2
  3799.     ISSS=2
  3800.     IF(LINE(3).EQ.' ')ISSL=3
  3801.     IF(WRK(3).EQ.' ')ISSS=3
  3802.     CALL SCMP(LINE(ISSL),WRK(ISSS),80,ICODE)
  3803.     IF(ICODE.EQ.0)GOTO 333
  3804.     RETURN
  3805. C ERROR ENTRY WHERE WE SEE WE FAILED TO FIND LABEL.
  3806. 331    CONTINUE
  3807.     IF(IOLVL.NE.11)CLOSE(IOLVL)
  3808.     IOLVL=11
  3809.     RETCD=2
  3810. C
  3811.     RETURN
  3812. 7800    CONTINUE
  3813.     IF(I.NE.6)GOTO 8000
  3814. C *G
  3815.     IF(LEVEL.EQ.1.OR.XAC.LE.0)RETURN
  3816.     REWIND LEVEL
  3817. 363    READ(LEVEL,362,END=55,ERR=55)WRK
  3818. 362    FORMAT(128A1)
  3819.     IF(WRK(1).NE.'*'.OR.WRK(2).NE.'C')GOTO 363
  3820.     ISSL=2
  3821.     ISSS=2
  3822.     IF(LINE(3).EQ.' ')ISSL=3
  3823.     IF(WRK(3).EQ.' ')ISSS=3
  3824.     CALL SCMP(LINE(ISSL),WRK(ISSS),80,ICODE)
  3825.     IF(ICODE.EQ.0)GOTO 363
  3826. C
  3827.     RETURN
  3828. 8000    CONTINUE
  3829.     IF(I.NE.7)GOTO 8200
  3830. C *X COMMANDS
  3831. C NOW GET THE ARGS
  3832.     JFFG=0
  3833.     IF(LINE(3).EQ.'F')JFFG=1
  3834. C NOW HAVE FORMULA FLAG.
  3835.     IQ3=4
  3836. C ALLOW 1 SPACE OPTIONALLY
  3837.     IF(LINE(IQ3).EQ.' ')IQ3=5
  3838.     IQ1=INDX(LINE(IQ3),32)
  3839.     IQ1=IQ1+IQ3-1
  3840. C NULL TERMINATE FILENAME WHILE PARSING IT (DON'T LET ASSIGN SEE VBL NAME)
  3841.     LINE(IQ1)=char(0)
  3842.     CLOSE(4)
  3843. 9770    CALL RASSIG(4,LINE(IQ3),ierror)
  3844.     if(ierror.ne.0)return
  3845. C REPLACE THE SPACE FOR VARSCN'S SIGHT
  3846.     LINE(IQ1)=CHAR(32)
  3847. C IQ1 NOW HAS START INDEX FOR VARSCN DESIRED... GO GET VRBL NAME.
  3848.     KK1=IQ1
  3849.     KK2=IQ1+20
  3850.     CALL VARSCN(LINE,KK1,KK2,KEK,KK,KKK,IVLD)
  3851.     IF(IVLD.LE.0)GOTO 481
  3852. C GOT VALID VARIABLE NAME. KK,KKK ARE ROW,COL
  3853. C NOW WE KNOW HOW TO RETRIEVE THE DATA OFF FILE IN UNIT 4
  3854. C READ INTO WRK ARRAY TILL WE GET IT.
  3855.     IQ3=KK
  3856.     IQ4=KKK-1
  3857. 483    READ(4,332,END=488,ERR=488)WRK
  3858. C IGNORE TITLE
  3859. 486    CONTINUE
  3860. C NOTE WE READ IN THE NUMBER IN NUMERIC FORMAT. EASIER THAT WAY.
  3861. c    IF(JFFG.EQ.0)READ(4,484,END=488,ERR=488)IRRW,ICCL,XYVAL
  3862. c    IF(JFFG.NE.0)READ(4,489,END=488,ERR=488)IRRW,ICCL,
  3863. c     1  (WRK(IV),IV=1,110)
  3864. c484    FORMAT(1X,I5,1X,I5,1X,E50.35)
  3865. c489    FORMAT(1X,I5,1X,I5,1X,110A1)
  3866.     READ(4,484,END=488,ERR=488)LETA,IRRW,ICCL,
  3867.      1  (WRK(IV),IV=1,110)
  3868. C ALWAYS READ TEXT AS ALPHA
  3869.     READ(CWRK50(1:50),6486,ERR=5486)XYVAL
  3870. C DECODE AND STORE IN XYVAL IF POSSIBLE
  3871. 6486    FORMAT(BN,D50.35)
  3872. 5486    CONTINUE
  3873. C HACK OUT TRAILING BLANKS
  3874.     DO 5322 IV=1,110
  3875.     IVV=111-IV
  3876.     IF(ICHAR(WRK(IVV)).GT.32)GOTO 5323
  3877.     WRK(IVV)=CHAR(0)
  3878. 5322    CONTINUE
  3879. 5323    CONTINUE
  3880. C &&&&
  3881. 484    FORMAT(1A1,I5,1X,I5,1X,110A1,50A1)
  3882.     READ(4,485,END=488,ERR=488)LFVLD,(WRK(IV),IV=120,128),KKTYP
  3883. C ALLOW FLAG OF 3 FOR NUMERIC,RECALCULATE... 2 FOR NUMERIC, NO RECALC.
  3884. C 1 CONTINUES TO MEAN ALWAYS RECALCULATE.
  3885.     IF(LFVLD.LT.-1)LFVLD=-3
  3886.     IF(LFVLD.GT.1)LFVLD=3
  3887. C
  3888. 485    FORMAT(I3,1X,9A1,1X,I5)
  3889. C READS IN AN ENTRY OF SAVED SHEET. TEST IF IN OUR RANGE.
  3890.     IF(IRRW.EQ.IQ3.AND.ICCL.EQ.IQ4)GOTO 487
  3891.     GOTO 486
  3892. 487    CONTINUE
  3893. C SUCCESS. NOW FILL IN VALUE OR FORMULA.
  3894.     IF(JFFG.EQ.0)GOTO 6487
  3895. C IF READING IN FORMULA, TRY AND GET VALUE OUT OF VALUE
  3896. C RECORD
  3897.     IF(LETA.NE.'p')GOTO 6487
  3898. C OK, THIS IS A VALUE RECORD WHICH SHOULD BE IMMEDIATELY FOLLOWED
  3899. C BY A FORMULA RECORD.
  3900. C   JUST DECODE THE VALUE AND RECORD IT.
  3901. C  ... ACTUALLY IT'S ALREADY DECODED SO JUST RECORD IT.
  3902.     CALL XVBLST(PROW,PCOL,XYVAL)
  3903.     XAC=XYVAL
  3904. C GO BACK AND GET FORMULA
  3905.     GOTO 486
  3906. 6487    CONTINUE
  3907. C    IRX=(PCOL-1)*60+PROW
  3908.     CALL REFLEC(PCOL,PROW,IRX)
  3909.     WRK(118)=CHAR(15)
  3910.     WRK(119)=CHAR(LFVLD)
  3911.     CALL FVLDST(PROW,PCOL,LFVLD)
  3912. C    FVLD(PROW,PCOL)=LFVLD
  3913. C SET UP TO SAVE FORMULA.
  3914. C SAVE EITHER FORMULA OR VALUE.
  3915.     IF(JFFG.EQ.0)GOTO 4890
  3916.     CALL CA2E(WRK,WRK2)
  3917.     CALL WRKFIL(IRX,WRK2,1)
  3918.     GOTO 488
  3919. 4890    CONTINUE
  3920. C SET UP NUMBER IF HERE.
  3921.     CALL TYPSET(PROW,PCOL,KKTYP)
  3922. C    TYPE(PROW,PCOL)=KKTYP
  3923.     CALL FVLDST(PROW,PCOL,LFVLD)
  3924. C    FVLD(PROW,PCOL)=LFVLD
  3925.     CALL XVBLST(PROW,PCOL,XYVAL)
  3926. C    XVBLS(PROW,PCOL)=XYVAL
  3927.     XAC=XYVAL
  3928. 488    CONTINUE
  3929.     CLOSE(4)
  3930.     RETURN
  3931. 481    CONTINUE
  3932.     CLOSE(4)
  3933.     RETCD=2
  3934. C
  3935.     RETURN
  3936. 8200    CONTINUE
  3937. 55    CLOSE(LEVEL)
  3938.     LEVEL=LEVEL-1
  3939. 1000    CONTINUE
  3940.     RETURN
  3941.     END
  3942. c -h- contyp.for    Fri Aug 22 13:00:17 1986    
  3943.     SUBROUTINE CONTYP (STACK,INDXX,OLDTYP,NEWTYP,RETCD)
  3944. C COPYRIGHT (C) 1983 GLENN EVERHART
  3945. C ALL RIGHTS RESERVED
  3946. C 60=MAX REAL ROWS
  3947. C 301=MAX REAL COLS
  3948. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3949. C VBLS AND TYPE DIMENSIONED 60,301
  3950. C *                                                *
  3951. C *            SUBROUTINE CONTYP                   *
  3952. C
  3953. C
  3954. C  CONVERTS CONSTANT IN STACK(I,INDXX) FROM OLDTYP TO NEWTYP
  3955. C  IF OLDTYP.EQ.NEWTYP A RETURN IS MADE IMMEDIATELY.
  3956. C  NOTE THAT TYPE(INDXX) IS NOT CHANGED BY THIS ROUTINE
  3957. C  TYPE CODES:
  3958. C
  3959. C    0    NO CHANGE
  3960. C    1    ASCII
  3961. C    2    DECIMAL
  3962. C    3    HEXADECIMAL
  3963. C    4    INTEGER
  3964. c note: multiple precision conversions diked out
  3965. C    5    M10
  3966. C    6    M8
  3967. C    7    M16
  3968. C    8    OCTAL
  3969. C    9    REAL
  3970. C
  3971. C  RETCD    MEANING
  3972. C
  3973. C    1    O.K.
  3974. C    2    ERROR
  3975. C
  3976. C
  3977. C   MODIFY CLASSES:  M3,M4,M8
  3978. C
  3979. C  CONTYP CALLS:
  3980. C
  3981. C   ERRMSG   PRINTS OUT ERROR MESSAGES
  3982. C   MULCON   CONVERTS MULTIPLE PRECISION TO MULTIPLE PRECISION
  3983. C            OF A DIFFERENT BASE
  3984. C
  3985. C
  3986. C
  3987. C  CONTYP IS CALLED BY
  3988. C
  3989. C   CALUN    CALCULATES UNARY OPERATIONS
  3990. C   CALBIN   CALCULATES BINARY OPERATIONS
  3991. C   VARIABLE     USE
  3992. C
  3993. C  BASE        HOLDS BASE OR POWERS OF THAT BASE (INTEGER*4).
  3994. C  BASVEC      HOLDS LEGAL BASES: 8,10, AND 16
  3995. C  EIGHT(8)    CHARACTER*1 ARRAY TO PICK OFF REAL*8 VALUES.
  3996. C  FOUR(4)     CHARACTER*1 ARRAY TO PICK OFF INTEGER*4 VALUES.
  3997. C  I,J,M       TEMPORARY VALUES.
  3998. C  IBASE       HOLDS BASE OF A NUMBER WHEN BASE HOLDS THE POWERS
  3999. C              OF THAT BASE.
  4000. C  IEND        HOLDS THE NUMBER OF MULTIPLE PRECISION DIGITS THAT
  4001. C              WILL BE PICKED UP WHEN CONVERTING TO INTEGER*4.
  4002. C  INDXX       POINTER TO VARIABLE BEING CONVERTED.
  4003. C  INT         HOLDS INTEGER*4 VALUES EQUIVALENCED TO VECTOR FOUR.
  4004. C  IS          TEMPORARILY HOLDS MULTIPLE PRECISION BASE 8 OR BASE
  4005. C              16 DIGITS.
  4006. C  IS2         TEMPORARILY HOLDS A DIGIT VALUE WHEN CHECKING MULTIPLE
  4007. C              PRECISION BASE 8 AND BASE 16 NUMBERS TO SEE IF THEY
  4008. C              ARE TOO LARGE TO FIT IN INTEGER*4.
  4009. C  ISGN        USED WHEN DETERMINING THE MAXIMUM NUMBER THAT CAN BE
  4010. C              HELD BY INTEGER*4. 1=POSITIVE, 2= NEGATIVE. ALSO HOLDS
  4011. C              0 OR 7 FOR BASE 8 MAXIMUM NUMBER CHECK. HOLDS 0 OR 15
  4012. C              FOR BASE 16 MAXIMUM NUMBER CHECK.
  4013.  
  4014. C  K           TEMPORARILY HOLDS INTEGER*4 VALUES.
  4015. C  NEWTYP      NEW DATA TYPE REQUESTED.
  4016. C  OLDTYP      DATA TYPE OF THE VARIABLE TO BE CONVERTED.
  4017. C  RBASE       BASE WHEN CONVERTING FROM MULTIPLE PRECISION TO REAL*8.
  4018. C  REAL        HOLDS REAL*8 VALUES. EQUIVALENCED TO ARRAY EIGHT.
  4019. C  RETCD       RETURN CODE. 1=O.K.  2=ERROR.
  4020. C  RPOWER      HOLDS POWERS OF RBASE WHEN CONVERTING FROM MULTIPLE
  4021. C              PRECISION TO REAL*8.
  4022. C  STACK(I,INDXX)  HOLDS VARIABLE TO BE CONVERTED.
  4023. C
  4024. C
  4025. C    SUBROUTINE CONTYP (STACK,INDXX,OLDTYP,NEWTYP,RETCD)
  4026. C
  4027. c    REAL*8 REAL,RBASE,RPOWER,DFLOAT
  4028.     Real*8 real,dfloat
  4029. c    INTEGER*4 K,INT,BASE,M
  4030.     Integer*4 int
  4031.     InTeGer*4 OLDTYP,NEWTYP,RETCD,BASVEC(3),INDXX
  4032.     InTeGer*4 MAX10(10,2)
  4033.     InTeGer*4 I
  4034. c    InTeGer*4 ISGN,IS,IS2
  4035. C
  4036.     CHARACTER*1 EIGHT(8),FOUR(4)
  4037.     CHARACTER*1 STACK(8,40)
  4038. C
  4039.     EQUIVALENCE (FOUR,INT),(REAL,EIGHT)
  4040. C
  4041.     save basvec,max10
  4042.     DATA BASVEC/10,8,16/
  4043.     DATA MAX10/2,1,4,7,4,8,3,6,4,7,2,1,4,7,4,8,3,6,4,8/
  4044. C
  4045. C
  4046. C  SET DEFAULT RETURN CODE
  4047.     RETCD=1
  4048.     IF(OLDTYP.GT.0)GO TO 910
  4049. C
  4050. C VARIABLE UNDEFINED
  4051.     CALL ERRMSG(16)
  4052.     RETCD=2
  4053.     RETURN
  4054. C
  4055. C
  4056. C
  4057. 910    IF(NEWTYP.EQ.0) RETURN
  4058.     IF (OLDTYP.EQ.NEWTYP) RETURN
  4059.     GOTO (1000,2000,3000,3000,4000,5000,6000,3000,2000), OLDTYP
  4060.     STOP 1000
  4061. C
  4062. C
  4063. C
  4064. C **************************************************
  4065. C **************  OLDTYP = ASCII  ******************
  4066. C **************************************************
  4067. C
  4068. C  START BY CONVERTING TO INTEGER*4
  4069. 1000    CONTINUE
  4070. C
  4071. C
  4072. C  IF INTEGER, HEXADECIMAL OR OCTAL, ALMOST DONE
  4073.     DO 1002 I=2,8
  4074. 1002    STACK(I,INDXX)=char(0)
  4075.     IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  4076. C
  4077. C
  4078. C
  4079.     DO 1008 I=1,4
  4080. 1008    FOUR(I)=STACK(I,INDXX)
  4081.     IF (NEWTYP.EQ.2.OR.NEWTYP.EQ.9) GOTO 1200
  4082. C
  4083. C
  4084. C  MULTIPLE PRECISION
  4085. 1010    continue
  4086.     RETURN
  4087. C
  4088. C
  4089. C  DECIMAL OR REAL
  4090. 1200    REAL=DFLOAT(INT)
  4091.     DO 1210 I=1,8
  4092. 1210    STACK(I,INDXX)=EIGHT(I)
  4093.     RETURN
  4094. C
  4095. C
  4096. C
  4097. C **************************************************
  4098. C *********  OLDTYP = DECIMAL OR REAL  *************
  4099. C **************************************************
  4100. C
  4101. 2000    IF (NEWTYP.EQ.2.OR.NEWTYP.EQ.9) RETURN
  4102. C
  4103. C
  4104.     DO 2002 I=1,8
  4105. 2002    EIGHT(I)=STACK(I,INDXX)
  4106. C
  4107. C
  4108. C  ZERO STACK(I,INDXX)
  4109.     DO 2004 I=1,8
  4110. 2004    STACK(I,INDXX)=CHAR(0)
  4111. C
  4112. C
  4113. C  CONVERT TO INTEGER
  4114. C  MAKE SURE CONVERSION DOESN'T BLOW UP
  4115.     IF(REAL.LT.-2147483648.D0.OR.REAL.GT.2147483647.D0)
  4116.      1 GOTO 6050
  4117. C
  4118. C
  4119. C
  4120. 2007    INT=REAL
  4121. C
  4122. C SEE IF NEWTYP IS MULTIPLE PRECISION
  4123.     IF (NEWTYP.GE.5.AND.NEWTYP.LE.7) GOTO 1010
  4124.     DO 2008 I=1,4
  4125. 2008    STACK(I,INDXX)=FOUR(I)
  4126. C
  4127. C RETURN IF TYPE IS INTEGER, HEX, OR OCTAL
  4128.     IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  4129. C
  4130. C ASCII SO CLEAR OUT BYES 2,3, AND 4
  4131. 2009    DO 2010 I=2,4
  4132. 2010    STACK(I,INDXX)=CHAR(0)
  4133.     RETURN
  4134. C
  4135. C
  4136. C
  4137. C
  4138. C
  4139. C
  4140. C **************************************************
  4141. C *******  OLDTYP = INTEGER, HEX, OR OCTAL  ********
  4142. C **************************************************
  4143. C
  4144. 3000    IF (NEWTYP.EQ.3.OR.NEWTYP.EQ.4.OR.NEWTYP.EQ.8) RETURN
  4145.     DO 3002 I=1,4
  4146. 3002    FOUR(I)=STACK(I,INDXX)
  4147. C
  4148. C SEE IF NEWTYP IS ASCII
  4149.     IF (NEWTYP.EQ.1) GOTO 2009
  4150. C
  4151. C IF NOT REAL*8 THEN IT IS MULTIPLE PRECISION (PROCESS AT 1010)
  4152.     IF (NEWTYP.NE.2.AND.NEWTYP.NE.9) GOTO 1010
  4153. C
  4154. C PROCESS AS REAL*8
  4155.     GOTO 1200
  4156. C
  4157. C *************  OLDTYP = M10  *********************
  4158. C
  4159. 4000    CONTINUE
  4160.     RETURN
  4161. 4040    continue
  4162.     RETURN
  4163. C
  4164. C **************  OLDTYP = M8  *********************
  4165. C
  4166. 5000    CONTINUE
  4167. C ***************  OLDTYP = M16  *******************
  4168. C
  4169. 6000    CONTINUE
  4170.     RETURN
  4171. C
  4172. C ***** ERROR RETURN ******
  4173. 6050    RETCD=2
  4174. C ILLEGAL CONVERSION ATTEMPTED.
  4175.     CALL ERRMSG(26)
  4176.     RETURN
  4177. C
  4178.     END
  4179. c -h- imask.for    Fri Aug 22 12:54:45 1986    
  4180.     INTEGER FUNCTION IMASK(I1,I2)
  4181.     InTeGer*4 I1,I2
  4182.     InTeGer*4 IXX
  4183.     IXX=I1.AND.I2
  4184.     IMASK=IXX
  4185. c    imask=iand(i1,i2)
  4186.     RETURN
  4187.     END
  4188. c    integer function ior(i1,i2)
  4189. c    integer*4 i1,i2,ixx
  4190. c    ixx=i1.OR.i2
  4191. c    imask=ixx
  4192. c    return
  4193. c    end
  4194.     REAL*8 FUNCTION DFLOAT(IN)
  4195.     INTEGER IN
  4196.     REAL*8 XX
  4197.     XX=IN
  4198.     DFLOAT=XX
  4199.     RETURN
  4200.     END
  4201. C ********ANALYASM.FTN ##################################3
  4202. c AnalytiCalc Amiga specific terminal I/O routines.
  4203. c note ttyini is also special and opens console window...
  4204.     Subroutine SWRT(ibuf,isz)
  4205. c write isz bytes from ibuf onto console window
  4206.     Include dos.inc
  4207.     Integer*4 Isz,i
  4208.     Integer*4 cwrite
  4209. cc    external cmove,cattron,cread !$pragma C(cmove,cattron,cread)
  4210. cc    external ccleareol,cclear,crefresh !$pragma C(ccleareol,cclear,crefresh)
  4211. cc    external cattroff,cclose,copen !$pragma C(cattroff,cclose,copen)
  4212. cc    external cwrite !$pragma C(cwrite)
  4213. c    External cwrite,cread
  4214. C    common/consfh/fh
  4215.     CHARACTER*1 OARRY(100)
  4216.     InTeGer*4 OSWIT,OCNTR
  4217. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  4218. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  4219.     InTeGer*4 IPS1,IPS2,MODFLG
  4220. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  4221.        InTeGer*4 XTCFG,IPSET,XTNCNT
  4222.        CHARACTER*1 XTNCMD(80)
  4223. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  4224. C VARY FLAG ITERATION COUNT
  4225.     INTEGER KALKIT
  4226. C    COMMON/VARYIT/KALKIT
  4227.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  4228.     InTeGer*4 RCMODE,IRCE1,IRCE2
  4229. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4230. C     1  IRCE2
  4231. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  4232. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  4233. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  4234. C RCFGX ON.
  4235. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  4236. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  4237. C  AND VM INHIBITS. (SETS TO 1).
  4238.     INTEGER*4 FH
  4239. C FILE HANDLE FOR CONSOLE I/O (RAW)
  4240. C    COMMON/CONSFH/FH
  4241.     CHARACTER*1 ARGSTR(52,4)
  4242. C    COMMON/ARGSTR/ARGSTR
  4243.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  4244.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  4245.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4246.      3  IRCE2,FH,ARGSTR
  4247.     integer*4 j,iisz,amiga
  4248.     external amiga
  4249.     character*2 crlf
  4250.     character*80 ibuf
  4251.     do 1 i=1,isz
  4252.     j=isz+1-i
  4253.     if(ichar(ibuf(j:j)).gt.6) goto 2
  4254. 1    continue
  4255. 2    continue
  4256. cccc *** begin unix specific changes
  4257. cccc must ensure we don't emit CR from here...only LF...at bol
  4258. cccc since CR erases the line to be displayed.
  4259. ccc    ilfdn=0
  4260. ccc    idocr=0
  4261. ccc    do 3 n=1,j
  4262. ccc    if(ichar(ibuf(n:n)).ne.13)goto 4
  4263. cccc a c.r. seen. Delay it until a LF seen if any
  4264. cccc emit a space to avoid vertical spacing
  4265. ccc    ibuf(n:n)=char(32)
  4266. cccc convert cr to lf (UNIX ONLY!!!)
  4267. ccc    idocr=1
  4268. ccc4    continue
  4269. ccc    if(ichar(ibuf(n:n)).ne.10)goto 3
  4270. ccc    ilfdn=1
  4271. ccc3    continue
  4272. cccc ** end unix specific changes
  4273. ccc    iisz=j
  4274.     if(fh.ne.0)I=amiga(Write,fh,ibuf,isz)
  4275. ccc    If(fh.ne.0)I=cwrite(fh,%ref(ibuf),iisz)
  4276. ccc    crlf(1:1)=char(13)
  4277. ccc    crlf(2:2)=char(10)
  4278. ccc    if(idocr.ne.0.and.ilfdn.ne.0.and.fh.ne.0)I=
  4279. ccc     1  cwrite(fh,%ref(crlf),2)
  4280.     return
  4281.     end
  4282.     Subroutine ttyin(IIMODE,line)
  4283. c read 132 char line off console
  4284. C iimode=0 in Command-Mostly mode, 1 in Enter mostly mode.
  4285.     Integer*4 iact,n,IIMODE
  4286.     include dos.inc
  4287.     Integer*4 cwrite
  4288. cc    External cread,cwrite !$pragma C(cread,cwrite)
  4289. cc    External copen,cclose !$pragma C(copen,cclose)
  4290. C    common/consfh/fh
  4291.     integer*4 amiga
  4292.     external amiga
  4293.     CHARACTER*1 OARRY(100)
  4294.     InTeGer*4 OSWIT,OCNTR
  4295. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  4296. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  4297.     InTeGer*4 IPS1,IPS2,MODFLG
  4298. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  4299.        InTeGer*4 XTCFG,IPSET,XTNCNT
  4300.        CHARACTER*1 XTNCMD(80)
  4301. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  4302. C VARY FLAG ITERATION COUNT
  4303.     INTEGER KALKIT
  4304. C    COMMON/VARYIT/KALKIT
  4305.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  4306.     InTeGer*4 RCMODE,IRCE1,IRCE2
  4307. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4308. C     1  IRCE2
  4309. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  4310. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  4311. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  4312. C RCFGX ON.
  4313. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  4314. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  4315. C  AND VM INHIBITS. (SETS TO 1).
  4316.     INTEGER*4 FH
  4317.     Character*1 wrkchr,lstchr
  4318.     Integer*4 iescst
  4319. C FILE HANDLE FOR CONSOLE I/O (RAW)
  4320. C    COMMON/CONSFH/FH
  4321.     CHARACTER*1 ARGSTR(52,4)
  4322. C    COMMON/ARGSTR/ARGSTR
  4323.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  4324.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  4325.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  4326.      3  IRCE2,FH,ARGSTR
  4327.     character*1 line(132)
  4328.     InTeGer*4 RRWACT,RCLACT
  4329. C    COMMON/RCLACT/RRWACT,RCLACT
  4330.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  4331.      1  IDOL7,IDOL8
  4332. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  4333. C     1  IDOL7,IDOL8
  4334.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4335. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4336.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4337. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4338. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  4339. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  4340.     InTeGer*4 KLVL
  4341. C    COMMON/KLVL/KLVL
  4342.     InTeGer*4 IOLVL,IGOLD
  4343. C    COMMON/IOLVL/IOLVL
  4344. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  4345. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  4346.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4347.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4348.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  4349.      3  k3dfg,kcdelt,krdelt,kpag
  4350. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4351. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4352. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  4353.     Integer UseDK,UseDF
  4354.     common/udfudk/usedf,usedk
  4355.     Integer*4 Kone
  4356.     character*4 cwi4
  4357.     Character*1 xlf
  4358. CCC    InTeGer*4 LLCMD,LLDSP,initd
  4359. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4360. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4361.     xlf=char(10)
  4362.     iescst=0
  4363.     Kone=1
  4364.     wrkchr=char(0)
  4365. c initially, no ESC seen
  4366. c Set up to read raw: device OK.
  4367. c If we see an ESC character then look for either a return
  4368. c (to terminate in any case) or some character whose value is
  4369. c greater than 64. However ESC O will be passed and the scan will
  4370. c continue.
  4371. C implement deletion of last character also with DEL or with
  4372. C backspace keys
  4373. c
  4374. c Initially zero entire buffer so we later can find length via looking
  4375. c for anything non-zero. Also serves to put in terminators for things
  4376. c like the INDX function to prevent them from running on indefinitely.
  4377.     do 1 n=1,132
  4378. 1    line(n)=char(0)
  4379. c if mode 0, (command mostly) then / is NOT special
  4380.     if(fh.eq.0)goto 1000
  4381. c Here begin the read loop
  4382.     n=1
  4383. 4000    continue
  4384.     lstchr=wrkchr
  4385.     wrkchr=char(0)
  4386. C zero wrkchr for safety
  4387.     kesc=0
  4388.     iact=0
  4389.     iact=amiga(Read,fh,wrkchr,Kone)
  4390. ccc     call cread(fh,%ref(wrkchr),Kone,kesc,iact)
  4391. c kesc returns special curses chars; if over 256, they mean esc
  4392. c sequences and the like...
  4393. ccc    if (kesc.gt.256)goto 7000
  4394.     If(Iact.le.0)goto 4000
  4395.     If(ichar(wrkchr).eq.0)goto 4000
  4396. CCC Add this to just read the line
  4397. CC    iact=amiga(Read,fh,line,132)
  4398. ccCC    iact=(fh,line,132)
  4399. 4050    Continue
  4400.     If(ichar(wrkchr).ne.8.and.ichar(wrkchr).ne.127)goto 4100
  4401. C back up a character and try again
  4402. c Last char was backspace or DEL, so back up by one, echo backspace.
  4403.     n=max0(1,(n-1))
  4404.     lstchr=char(8)
  4405. C echo a backspace
  4406. C 8 is ASCII backspace...
  4407.     ii=Amiga(Write,fh,Lstchr,Kone)
  4408. ccc    ii=cwrite(fh,%ref(Lstchr),Kone)
  4409.     Goto 4000
  4410. 4100    Continue
  4411. c C.R. is 13, LF is 10, FF is 14, so terminate on any of these
  4412. c traditional line terminators.
  4413.     If(ichar(wrkchr).lt.16)goto 5000
  4414. c Normal character, just echo it.
  4415.     ii=Amiga(Write,fh,wrkchr,kone)
  4416. ccc    ii=cwrite(fh,%ref(wrkchr),kone)
  4417. c echo the character back
  4418. c Then store it.
  4419.     line(n)=wrkchr
  4420.     n=min0(n+1,131)
  4421.     if(ichar(wrkchr).eq.27.or.ichar(Wrkchr).eq.155)iescst=1
  4422. c <ESC>O is actually an escape sequence initiator
  4423.     If(iescst.eq.1.and.wrkchr.eq.'O'.and.ichar(lstchr)
  4424.      1  .eq.27) goto 4200
  4425. c Otherwise an escape sequence ends in a letter
  4426.     If(Iescst.eq.0)goto 4200
  4427.     ii=ichar(wrkchr)
  4428.     If(ii.eq.91)goto 4200
  4429. c 91 is ascii for [
  4430.     If(ii.le.64.or.ii.ge.127)Goto 4200
  4431.     Return
  4432. C terminate read at end of any escape sequence
  4433. c from A to z except [ are possible esc seq delimiters.
  4434. 4200    Continue
  4435. c The above condition terminates an ESC sequence after ESC and any other
  4436. c characters followed by (and including) any character greater than 'A'
  4437. c which should take care of just about every ANSI escape sequence.
  4438.     if(n.lt.131)goto 4000
  4439. c Terminate even if we never get C.R. but not 'till we've got
  4440. c all there is to get...
  4441.     Return
  4442. 5000    continue
  4443. c Echo line terminator
  4444.     line(n)=wrkchr
  4445.     ii=Amiga(Write,fh,wrkchr,kone)
  4446.     If(ichar(wrkchr).eq.13)ii=Amiga(Write,fh,xlf,Kone)
  4447. ccc    ii=cwrite(fh,%ref(wrkchr),kone)
  4448. ccc    If(ichar(wrkchr).eq.13)ii=cwrite(fh,%ref(xlf),Kone)
  4449. c echo lf after cr
  4450. c done reading now.
  4451.     Return
  4452. 1000    Continue
  4453. C fakeout fallback position, reading workbench window
  4454.     Read(*,1500)line
  4455. 1500    format(132a1)
  4456.     return
  4457. C the material below 7000 is used in the curses version which is more
  4458. C trouble than it's worth to link on amiga; absoft fortran does
  4459. C not lend itself to linking with C code, unfortunately.
  4460. ccc7000    continue
  4461. cccc just got an escape sequence. Fake entry of appropriate command
  4462. cccc for AnalytiCalc and terminate the call...
  4463. cccc&&&&&&&&
  4464. cccc kesc=258=dow,,259=up,260=left,261=right
  4465. ccc    kkkk=n
  4466. cccc save n for a little below
  4467. ccc    line(n)=char(27)
  4468. ccc    n=min0(n+1,131)
  4469. ccc    line(n)='['
  4470. ccc    n=min0(n+1,131)
  4471. ccc    if(kesc.gt.261)goto 7001
  4472. ccc    if (kesc.eq.258)line(n)='B'
  4473. ccc    if (kesc.eq.259)line(n)='A'
  4474. ccc    if (kesc.eq.260)line(n)='D'
  4475. ccc    if (kesc.eq.261)line(n)='C'
  4476. cccc model vt100 esc seqs so they'll work in either mode
  4477. ccc    n=min0(n+1,131)
  4478. ccc    return
  4479. cccc handle HELP key; use a dedicated key rather than PF2 in this
  4480. cccc case. This is value 363.
  4481. ccc7001    if (kesc.ne.363) goto 7002
  4482. ccc    line(n)='Q'
  4483. ccc    n=min0(n+1,131)
  4484. ccc    return
  4485. ccc7002    continue
  4486. cccc    if(kesc.lt.264.or.kesc.gt.277)goto 7003
  4487. cccc handle function keys (first bunch of 'em anyway)
  4488. cccc    line(n)=char((kesc-264)+ichar('l'))
  4489. cccc    n=min0(n+1,131)
  4490. cccc returns fake "keypad" cmds
  4491. cccc    return
  4492. ccc7003    continue
  4493. cccc anything else, try and invoke a cmd file.
  4494. ccc    n=kkkk
  4495. ccc    if(n.gt.100)return
  4496. ccc    line(n)='@'
  4497. ccc    n=n+1
  4498. ccc    if(usedk.eq.0)goto 7004
  4499. ccc    line(n)='A'
  4500. ccc    n=n+1
  4501. ccc    line(n)='D'
  4502. ccc    n=n+1
  4503. ccc    line(n)='K'
  4504. ccc    n=n+1
  4505. ccc    line(n)=':'
  4506. ccc    n=n+1
  4507. ccc7004    continue
  4508. ccc    line(n)='A'
  4509. ccc    n=n+1
  4510. ccc    line(n)='C'
  4511. ccc    n=n+1
  4512. ccc    line(n)='C'
  4513. ccc    n=n+1
  4514. cccc decode into cwi4 the key value from curses and tack that onto
  4515. cccc the filename
  4516. ccc    write(cwi4,7005)kesc
  4517. ccc7005    format(i3)
  4518. cccc know that there will be 3 digits
  4519. ccc    line(n)=cwi4(1:1)
  4520. ccc    line(n+1)=cwi4(2:2)
  4521. ccc    line(n+2)=cwi4(3:3)
  4522. cccc add the type ".cmd"
  4523. ccc    line(n+3)='.'
  4524. ccc    line(n+4)='C'
  4525. ccc    line(n+5)='M'
  4526. ccc    line(n+6)='D'
  4527. cccc that should do it...
  4528. ccc    return
  4529.     end
  4530.     subroutine swset(i)
  4531.     integer*4 i
  4532. c dummy setup sub
  4533.     return
  4534.     end
  4535.     subroutine exitqq
  4536. c exit routine ... just do fortran stop to make it complete
  4537. creset nlormal math
  4538. c    call standard_arithmetic()
  4539.     stop "Thanks for using AnalyRim ... bye now"
  4540.        end
  4541.     subroutine xsystem(line)
  4542.     include dos.inc
  4543. c execute an amigados command
  4544. c    integer*4 inp,outp
  4545.     character*80 line
  4546.     character*80 l2
  4547.     logical*4 succ
  4548.     Logical*4 Amiga
  4549.     External Amiga
  4550. c search for a null first
  4551.     do 11 n=1,79
  4552.     kk=n
  4553.     if(ichar(line(n:n)).eq.0)goto 22
  4554. 11    continue
  4555. 22    continue
  4556.     do 1 n=1,79
  4557.     m=81-n
  4558. c space is ascii code 32
  4559. c look for trailing whitespace to remove
  4560.     if(ichar(line(m:m)).gt.32)goto 2
  4561. 1    continue
  4562. 2    n=m
  4563.     n=min0(kk-1,n)
  4564. c pick as end either first null seen or first
  4565. c whitespace.
  4566. c n= last character of non-null
  4567.     k=1
  4568.     if((line(1:1).eq.'$').or.(line(1:1).eq.'}'))k=2
  4569.     if(k.ge.n)return
  4570.     open(unit=2,file='ram:AnalyJnk.Tmp')
  4571.     write(2,1000)line(k:n)
  4572.     if(line(1:1).eq.'$')write(2,1001)
  4573. 1000    format(A)
  4574. 1001    Format('EndCLI')
  4575.     close(unit=2)
  4576.     inp=0
  4577.     outp=0
  4578.     if(line(1:1).eq.'$')l2=
  4579.      1  'NEWCLI CON:0/0/600/190/ASpwn FROM ram:AnalyJnk.Tmp'
  4580.      2  // char(0)
  4581.     if(line(1:1).ne.'$')l2=
  4582.      1  'NEWSHELL CON:0/0/600/190/ASpwn FROM ram:AnalyJnk.Tmp'
  4583.      2  // char(0)
  4584.     succ=amiga(Execute,l2,
  4585.      2  inp,outp)
  4586. cccc    line(1:1)=' '
  4587. cccc    kkkk=n+1
  4588. cccc    line(kkkk:kkkk)=char(0)
  4589. ccccc    succ=system(line(1:kkkk))
  4590. ccc    succ=lib$spawn(line(1:n))
  4591. c execute argument as sh command in unix.
  4592.     return
  4593.     end
  4594. C ************ AnalyDM.Ftn ######################################
  4595. c -h- declr.for    Fri Aug 22 13:02:54 1986    
  4596.     SUBROUTINE DECLR(ITYP,RETCD)
  4597. C COPYRIGHT (C) 1983 GLENN EVERHART
  4598. C ALL RIGHTS RESERVED
  4599. C 60=MAX REAL ROWS
  4600. C 301=MAX REAL COLS
  4601. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  4602. C VBLS AND TYPE DIMENSIONED 60,301
  4603. C **************************************************
  4604. C *                                                *
  4605. C *       SUBROUTINE  DECLR (ITYP,RETCD)           *
  4606. C *                                                *
  4607. C **************************************************
  4608. C
  4609. C
  4610. C ANALYZES VECTOR LINE TO DETERMINE WHAT VARIABLES GET THEIR
  4611. C TYPES CHANGED. THE NEW TYPE IS SPECIFIED AS AN ARGUMENT IN
  4612. C THE CALL:
  4613. C
  4614. C
  4615. C  TYPE CODE
  4616. C    1  ASCII
  4617. C    2  DECIMAL (REAL BUT DECIMAL POINT FOR OUTPUT)
  4618. C    3  HEXADECIMAL
  4619. C    4  INTEGER
  4620. C    5  MULTIPLE PRECISION (BASE 10)
  4621. C    6  MULTIPLE PRECISION (BASE 8)
  4622. C    7  MULTIPLE PRECISION (BASE 16)
  4623. C    8  OCTAL
  4624. C    9  REAL
  4625. C
  4626. C  IF NEGATIVE, TYPE IS DEFINED BUT VARIABLE HAS
  4627. C  NOT BEEN ASSIGNED A VALUE
  4628. C
  4629. C
  4630. C  RETCD     MEANING
  4631. C  1    =    O.K.
  4632. C  2    =    ERROR
  4633. C
  4634. C  NOTE:  AS IN FORTRAN, VARIABLES IN DECLARATIONS MUST BE SEPARATED
  4635. C         BY COMMAS
  4636. C
  4637. C
  4638. C  MODIFICATION CLASSES: M1, M2
  4639. C
  4640. C
  4641. C
  4642. C
  4643. C DECLR CALLS:
  4644. C
  4645. C  ERRMSG   PRINTS ERROR MESSAGES
  4646. C
  4647. C
  4648. C
  4649. C DECLR IS CALLED BY CMND, THE ROUTINE THAT DECODES COMMANDS.
  4650. C
  4651. C
  4652. C
  4653. C
  4654. C       VARIABLE        USE
  4655. C
  4656. C    ALPHA           LIST OF LEGAL VARIABLE NAMES. THE FIRST 26 ARE
  4657. C                    ALPHABETIC, THE 27TH IS THE CHARACTER '%'.
  4658. C    BLANK           ' '
  4659. C    I,I2,I3         TEMPORARY VALUES.
  4660. C    ITYP            CODE THAT GIVES THE TYPE OF VARIABLE FOR A
  4661. C                    PARTICULAR CALL TO THIS ROUTINE. VARIABLES ARE
  4662. C                    EITHER DECLARED TO BE OF THIS TYPE OR, IF NO
  4663. C                    VARIABLES ARE SPECIFIED, A LIST OF ALL THE
  4664. C                    VARIABLES OF THAT TYPE ARE GIVEN.
  4665. C    LEND            LAST NON-BLANK IN VECTOR LINE(80).
  4666. C    LINE(80)        HOLDS INPUT COMMAND LINE. IF DECLARATION HAS
  4667. C                    NO ARGUMENT, THIS VECTOR IS THEN USED TO OUTPUT
  4668. C                    A LIST OF VARIABLES OF THE TYPE SPECIFIED.
  4669. C    NONBLK          START SCAN OF VARIABLE LIST.
  4670. C    TYPE            HOLDS THE TYPE CODE FOR EACH VARIABLE.
  4671. C
  4672. C
  4673. C
  4674. C
  4675. C
  4676. C
  4677. C
  4678. C    SUBROUTINE DECLR(ITYP,RETCD)
  4679.     InTeGer*4 LEVEL,NONBLK,LEND
  4680.     InTeGer*4  RETCD,VIEWSW,BASED,VLEN(9)
  4681.     InTeGer*4 TYPE(1,2)
  4682.     InTeGer*4 I,I2,I3,ITYP
  4683. C
  4684.     CHARACTER*1  LINE(80),AVBLS(24,27),VBLS(8,1,1)
  4685.     Real*8 VAVBLS(3,27)
  4686.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  4687.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  4688.     Character*127 cwrk
  4689. C
  4690.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  4691.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  4692.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  4693. C
  4694. C
  4695. C
  4696.     IF(NONBLK.EQ.LEND)GO TO 500
  4697. C
  4698. C
  4699. C **************************************************
  4700. C ****** DECLARE VARIABLES TO BE OF TYPE ITYP ******
  4701. C **************************************************
  4702.     I2=NONBLK+1
  4703. 10    CONTINUE
  4704. C10    IF (LINE(I2).EQ.BLANK) GOTO 60
  4705. C    DO 20 I3=1,26
  4706. C    IF (LINE(I2).EQ.ALPHA(I3)) GOTO 30
  4707. C20    CONTINUE
  4708. C *****&&&&& ADD VARIABLE SIZE SUPPORT - GCE
  4709.     CALL VARSCN(LINE,I2,LEND,LSTCHR,ID1,ID2,IVALID)
  4710. C VARSCN SEARCHES FOR VALID VARIABLE NAME STRINGS INCLUDING C$+EXPR
  4711. C AND R$+EXPR FOR LOC-RELATIVE NAMES IN ABSOLUTE AND C@+N, R@+N FOR RELATIVE
  4712. C NAMES IN DISPLAY SYSTEM. IT RETURNS THE ID1, ID2 INDICES FOR
  4713. C THE VARIABLES IN VBLS ARRAY AND TYPE ARRAY. FOR SINGLE ALPHAS
  4714. C A-Z, ID1 RETURNS 1-26 AND ID2=1. % RETURNS ID1=27, ID2=1.
  4715.     IF(IVALID.EQ.0) GOTO 22
  4716. C VALID FLAG IS NONZERO IF VARIABLE NAME IS VALID, ELSE 0.
  4717.     I2=LSTCHR
  4718. C LSTCHR RETURNS LAST CHARACTER OF NAME
  4719.     GOTO 30
  4720. C
  4721. C  ILLEGAL CHARACTER IN DECLARATION'S VARIABLE LIST
  4722. 22    I=4
  4723. C
  4724. C
  4725. C
  4726. C ******* ERROR RETURN *******
  4727. 25    RETCD=2
  4728.     CALL ERRMSG(I)
  4729.     RETURN
  4730. C
  4731. C
  4732. C
  4733. C
  4734. 30    CONTINUE
  4735. C IF OLD VARIABLE WAS UNDEFINED, MAKE NEW TYPE LESS THAN 0 ALSO.
  4736. C THIS ALLOWS ONE TO EXAMINE INTERNAL VALUES FOR DIFFERENT DATA
  4737. C TYPES. IF THIS IS NOT NEEDED, IT WOULD BE CLEANER TO ALWAYS MAKE
  4738. C VARIABLES UNDEFINED WHEN THEIR DATA TYPE IS CHANGED. TO DO THIS
  4739. C JUST USE THE STATEMENT
  4740. C    I=-ITYP
  4741.     I=ITYP
  4742. C ****&&&&&& NOTE TYPE NOW 2-DIM
  4743.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  4744.     IF(TYPE(1,1).LE.0)I=-I
  4745.     CALL TYPSET(ID1,ID2,I)
  4746. C    TYPE(ID1,ID2)=I
  4747.     I3=I2+1
  4748.     IF (I3.GT.LEND) GOTO 1000
  4749.     DO 40 I2=I3,LEND
  4750.     IF (LINE(I2).EQ.BLANK) GOTO 40
  4751.     IF (LINE(I2).EQ.COMMA) GOTO 45
  4752. C
  4753. C VARIABLES NOT SEPARATED BY COMMAS
  4754.     I=5
  4755.     GO TO 25
  4756. 40    CONTINUE
  4757.     GOTO 1000
  4758. 45    IF (I2.EQ.LEND) GOTO 22
  4759. 60    I2=I2+1
  4760.     IF (I2.LE.LEND) GOTO 10
  4761.     GO TO 1000
  4762. C
  4763. C
  4764. C
  4765. C
  4766. C
  4767. C
  4768. C **********************************************************************
  4769. C ** NO ARGUMENTS SO SHOW WHAT VARIABLES HAVE BEEN DECLARED THAT TYPE **
  4770. C **********************************************************************
  4771. 500    CONTINUE
  4772.     IF(VIEWSW.EQ.0) GO TO 1000
  4773. C PERHAPS THE ABOVE LINE SHOULD BE REMOVED (???)
  4774. C
  4775. C
  4776. C BLANK OUT OUTPUT LINE.
  4777.     DO 510 I=1,80
  4778. 510    LINE(I)=BLANK
  4779. C
  4780. C
  4781. C SEARCH FOR VARIABLES OF TYPE ITYP. PUT THEM IN LINE(I2) WHEN FOUND FOR
  4782. C LATER PRINTING.
  4783.     I2=0
  4784.     DO 550 I=1,27
  4785. C FAKE UP DISPLAY
  4786. C ****&&&&&
  4787.     CALL TYPGET(I,1,TYPE(1,1))
  4788.     IF(IABS(TYPE(1,1)).NE.ITYP)GO TO 550
  4789.     I2=I2+1
  4790.     LINE(I2)=ALPHA(I)
  4791. 550    CONTINUE
  4792. C
  4793. C
  4794. C GO TO SECTION APPROPRIATE FOR PRINTING EITHER THE LIST OF VARIABLES OR
  4795. C A MESSAGE INDICATING THAT NO VARIABLES ARE OF THAT TYPE.
  4796.     IF(I2.EQ.0) GO TO 600
  4797. C
  4798. C
  4799. C OUTPUT A LIST OF VARIABLES OF TYPE ITYP
  4800.     write(cwrk,560)(line(i),i=1,i2)
  4801.     Call vwrt(char(13)//char(10),2)
  4802.     call vwrt('Variables so declared=',22)
  4803.     call vwrt(cwrk,i2)
  4804. c    WRITE(11,560) (LINE(I),I=1,I2)
  4805. 560    format(30a1)
  4806. c560    FORMAT(' VARIABLES SO DECLARED = ',30A1)
  4807.     GO TO 1000
  4808. C
  4809. C
  4810. C
  4811. C
  4812. C NO VARIABLES OF THAT TYPE
  4813. 600    Continue
  4814.     Call vwrt(char(13)//char(10),2)
  4815.     Call vwrt(' No variables of that type',26)
  4816. c600    WRITE(11,610)
  4817. 610    FORMAT(' NO VARIABLES OF THAT TYPE')
  4818. C
  4819. C
  4820. C
  4821. C **** NORMAL RETURN ****
  4822. 1000    RETCD=1
  4823.     RETURN
  4824.     END
  4825. c -h- doentr.for    Fri Aug 22 13:03:06 1986    
  4826.     SUBROUTINE DOENTR(FORM,LOW,LHIGH)
  4827. C +++++++++++++++++++++++++++++++++++
  4828. C    Character*1 cmdlin(132)
  4829.     CHARACTER*1 FORM,FVLD
  4830.     Include aparms.inc
  4831. c    INTEGER*4 VNLT
  4832.     DIMENSION FORM(128),FVLD(1,1)
  4833. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  4834. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  4835. C SO INITIALLY IGNORE.
  4836. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4837. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4838.     InTeGer*4 RRWACT,RCLACT
  4839. C    COMMON/RCLACT/RRWACT,RCLACT
  4840.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  4841.      1  IDOL7,IDOL8
  4842. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  4843. C     1  IDOL7,IDOL8
  4844.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  4845. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  4846.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4847. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  4848. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  4849. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  4850.     InTeGer*4 KLVL
  4851. C    COMMON/KLVL/KLVL
  4852.     InTeGer*4 IOLVL,IGOLD
  4853. C    COMMON/IOLVL/IOLVL
  4854. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  4855. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  4856.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4857.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4858.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  4859.      3  k3dfg,kcdelt,krdelt,kpag
  4860. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  4861. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  4862. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  4863.     EXTERNAL INDX
  4864.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  4865.     COMMON/D2R/NRDSP,NCDSP
  4866.     InTeGer*4 TYPE(1,2),VLEN(9)
  4867.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  4868.     Real*8 VAVBLS(3,27)
  4869.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  4870.     REAL*8 ACY
  4871.     EQUIVALENCE(ACY,AVBLS(1,27))
  4872.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  4873.     COMMON/FVLDC/FVLD
  4874. C +++++++++++++++++++++++++++++++++++
  4875. C ENABLE { FORMS TO HANDLE ALL POSSIBLE EQUATIONS.
  4876.     CALL FRMEDT(FORM,LLST)
  4877.     IITR=0
  4878. 5050    IITR=IITR+1
  4879.     FORM(111)=Char(0)
  4880.     LCURR=LOW
  4881. C DO AN ENTRY. MUST SCAN FOR MULTIPLE STATEMENTS PER LINE AND ALSO
  4882. C RECOGNIZE FUNCTION NAMES.
  4883. 1000    CONTINUE
  4884.     KKK=ICHAR('\')
  4885.     LSL=INDX(FORM(LCURR),KKK)
  4886.     IF(LSL.EQ.0)LSL=LHIGH-LCURR+1
  4887. C CLAMP AT 80 CHARS LONG INPUT.
  4888.     IF(LSL.LE.79)GOTO 1200
  4889. C STMT HAS NO MULTIPLES. SQUASH IT TO USE ONLY 1ST PART...
  4890.     LSL=79
  4891.     LCURR=LHIGH
  4892.     FORM(80)=Char(0)
  4893. 1200    CONTINUE
  4894.     IF(FORM(LCURR).NE.'<')GOTO 5052
  4895.     IF(ACY.GT.0. .AND.
  4896.      2  IITR.LT.100)GOTO 5050
  4897. C ALLOW IN-FORMULA LOOPING PROVIDED % IS POSITIVE AND
  4898. C WITH LIMITED RETRIES...
  4899. C AVOID CALLING DOSTMT WITH BOGUS < CHARACTER AS "FORMULA" SO
  4900. C WE AVOID ERROR MESSAGES.
  4901.     GOTO 5051
  4902. 5052    CONTINUE
  4903.     CALL DOSTMT(FORM(LCURR),LSL)
  4904. 5051    IF (LCURR.GE.LHIGH)RETURN
  4905.     LCURR=LCURR+LSL
  4906.     If(Lcurr.lt.Lhigh)GOTO 1000
  4907.     Return
  4908.     END
  4909. c -h- doif.for    Fri Aug 22 13:03:17 1986    
  4910.     SUBROUTINE DOIF(LINE,LLB,LRB,LLAST)
  4911. C    PARAMETER 1=1,12=12
  4912.     EXTERNAL INDX
  4913.     CHARACTER*1 LINE(110)
  4914.     REAL*8 V1,V2
  4915.     V1=0.
  4916.     V2=0.
  4917.     LS=LRB-LLB+1
  4918.     CALL GETLOG(LINE(LLB),LS,LOGTYP,LASST)
  4919.     LOV1=LLB
  4920.     LHIV1=LASST+LLB-1
  4921.     IF(LOV1.GE.LHIV1)GOTO 100
  4922. C USE SUM FUNCTION HERE AS TYPE OF FCN
  4923.     LT=4
  4924.     CALL DOMFCN(LINE,LOV1,LHIV1,LT,V1)
  4925. 100    CONTINUE
  4926.     IF(LOGTYP.EQ.0)GOTO 1000
  4927.     LOV2=LASST+2+LLB
  4928.     LHIV2=LRB
  4929.     IF(LOV2.GE.LHIV2)GOTO 200
  4930.     LT=4
  4931.     CALL DOMFCN(LINE,LOV2,LHIV2,LT,V2)
  4932. 200    CONTINUE
  4933.     CALL TEST(LOGTYP,LFLAG,V1,V2)
  4934.     IF(LFLAG.EQ.0)GOTO 700
  4935. C HERE HAVE "TRUE" ALTERNATIVE OF IF STMT
  4936.     KKK=ICHAR('|')
  4937.     LBAR=INDX(LINE,KKK)
  4938.     LBAR=MIN0(LBAR,LLAST)
  4939.     LSTM=LRB+1
  4940. C LSTM TO LBAR IS NOW THE STMT TO EVALUATE. SINCE WE ALREADY HAVE A
  4941. C ROUTINE TO EVALUATE A STMT, DO SO. NOTE PARTIAL RECURSION, SO
  4942. C NO NESTED IFS ALLOWED, AND CALL MUST PERMIT RECURSION ON YOUR
  4943. C MACHINE OR FORGET IT. (OK ON PDP11, VAX).
  4944.     LSZ=LBAR-LSTM
  4945.     IF(LSZ.LT.1)GOTO 1000
  4946.     LSZ=LSZ+1
  4947.     CALL DOSTMI(LINE(LSTM),LSZ)
  4948.     GOTO 1000
  4949. 700    CONTINUE
  4950. C HERE HAVE "FALSE" ALTERNATIVE OF IF STMT
  4951.     KKK=ICHAR('|')
  4952.     LBAR=INDX(LINE,KKK)+1
  4953.     LBAR=MIN0(LBAR,LLAST)
  4954.     LSZ=LLAST-LBAR
  4955.     IF(LSZ.LT.1)GOTO 1000
  4956.     LSZ=LSZ+1
  4957.     CALL DOSTMI(LINE(LBAR),LSZ)
  4958. 1000    CONTINUE
  4959. C THAT'S ALL.
  4960.     RETURN
  4961.     END
  4962. c -h- domath.fms    Fri Aug 22 13:03:28 1986    
  4963.     SUBROUTINE DOMATH(INDEXF,VAR,AC,SS,CTR,ACX)
  4964. C COPYRIGHT (C) 1985, 1986 GLENN C.EVERHART
  4965. C ALL RIGHTS RESERVED
  4966.     INCLUDE aparms.inc
  4967. C    EXTERNAL INDX
  4968.     REAL*8 AC,SS,CTR,ACX,RWRK1,RWRK2
  4969.     DIMENSION EP(20)
  4970.     InTeGer*4 DLFG
  4971. C    COMMON/DLFG/DLFG
  4972.     InTeGer*4 KDRW,KDCL
  4973. C    COMMON/DOT/KDRW,KDCL
  4974.     InTeGer*4 DTRENA
  4975. C    COMMON/DTRCMN/DTRENA
  4976.     REAL*8 EP,PV,FV
  4977.     INTEGER*4 KIRR
  4978. C    COMMON/ERNPER/EP,PV,FV,KIRR
  4979.     InTeGer*4 LASTOP
  4980. C    COMMON/ERROR/LASTOP
  4981.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  4982. C    COMMON/FMTBFR/FMTDAT
  4983.     CHARACTER*1 EDNAM(16)
  4984. C    COMMON/EDNAM/EDNAM
  4985.     InTeGer*4 MFID(2),MFMOD(2)
  4986. C    COMMON/FRM/MFID,MFMOD
  4987.     InTeGer*4 JMVFG,JMVOLD
  4988. C    COMMON/FUBAR/JMVFG,JMVOLD
  4989.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  4990.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  4991. CCC    REAL*8 EP,PV,FV
  4992. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  4993.     REAL*8 VAR,TE
  4994.     INTEGER*4 IWRK1,IWRK2,IDUM
  4995.     LOGICAL*4 LWRK1,LWRK2,LWRK3
  4996.     INTEGER*4 IWRK3
  4997.     EQUIVALENCE(IWRK1,LWRK1),(IWRK2,LWRK2),(IWRK3,LWRK3)
  4998.     InTeGer*4 ICREF,IRREF
  4999. C    COMMON/MIRROR/ICREF,IRREF
  5000.     InTeGer*4 MODPUB,LIMODE
  5001. C    COMMON/MODPUB/MODPUB,LIMODE
  5002.     InTeGer*4 KLKC,KLKR
  5003.     REAL*8 AACP,AACQ
  5004. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5005.     InTeGer*4 NCEL,NXINI
  5006. C    COMMON/NCEL/NCEL,NXINI
  5007.     CHARACTER*1 NAMARY(20,MROWS)
  5008. C    COMMON/NMNMNM/NAMARY
  5009.     InTeGer*4 NULAST,LFVD
  5010. C    COMMON/NULXXX/NULAST,LFVD
  5011.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  5012.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  5013. CCC    REAL*8 AACP,AACQ
  5014. CCC    InTeGer*4 KLKC,KLKR
  5015. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5016.     IF(INDEXF.NE.1)GOTO 100
  5017. C MIN
  5018.     IF(VAR.GE.AC)GOTO 105
  5019.     AC=VAR
  5020.     AACP=KLKC
  5021.     AACQ=KLKR
  5022. 105    CONTINUE
  5023.     ACX=AC
  5024.     RETURN
  5025. 100    IF(INDEXF.NE.2)GOTO 200
  5026. C MAX
  5027.     IF(VAR.LE.AC)GOTO 107
  5028.     AC=VAR
  5029.     AACP=KLKC
  5030.     AACQ=KLKR
  5031. 107    CONTINUE
  5032. C    IF(VAR.GT.AC)AC=VAR
  5033.     ACX=AC
  5034.     RETURN
  5035. 200    IF(INDEXF.NE.3)GOTO 300
  5036. C AVG
  5037.     AC=AC+VAR
  5038.     CTR=CTR+1.
  5039.     ACX=AC/CTR
  5040.     RETURN
  5041. 300    IF(INDEXF.NE.4)GOTO 400
  5042. C SUM
  5043.     AC=AC+VAR
  5044.     ACX=AC
  5045.     RETURN
  5046. 400    IF(INDEXF.NE.5)GOTO 500
  5047. C STD (STANDARD DEVIATION SQUARED)
  5048.     AC=AC+VAR
  5049.     SS=SS+(VAR*VAR)
  5050.     CTR=CTR+1.
  5051.     ACX=(SS-((AC*AC)/CTR))/CTR
  5052.     RETURN
  5053. 500    CONTINUE
  5054.     IF(INDEXF.NE.7)GOTO 600
  5055. C AND
  5056.     IF(SS.NE.0.)IWRK1=AC
  5057.     IF(SS.EQ.0.)IWRK1=VAR
  5058.     SS=1.
  5059.     IWRK2=VAR
  5060.     LWRK1=LWRK1.AND.LWRK2
  5061.     AC=IWRK1
  5062.     ACX=AC
  5063.     RETURN
  5064. 600    IF(INDEXF.NE.8)GOTO 700
  5065. C INCLUSIVE OR
  5066.     IWRK1=AC
  5067.     IWRK2=VAR
  5068.     LWRK1=LWRK1.OR.LWRK2
  5069.     AC=IWRK1
  5070.     ACX=AC
  5071.     RETURN
  5072. 700    IF (INDEXF.NE.9)GOTO 800
  5073. C NOT
  5074.     IWRK1=VAR
  5075.     LWRK1=.NOT.LWRK1
  5076.     AC=IWRK1
  5077.     ACX=AC
  5078.     RETURN
  5079. 800    IF(INDEXF.NE.10)GOTO 1000
  5080. C CNT
  5081. C COUNT NONZERO ENTRIES
  5082.     IF(VAR.NE.0.)AC=AC+1.
  5083.     ACX=AC
  5084.     RETURN
  5085. 1000    CONTINUE
  5086.     IF(INDEXF.NE.11)GOTO 1100
  5087. C NPV
  5088.     IF(SS.EQ.0.)GOTO 1050
  5089.     CTR=CTR+1.
  5090. C    AC=AC+VAR*CTR/SS
  5091.     AC=AC+VAR/(SS**(CTR-1))
  5092.     ACX=AC
  5093.     RETURN
  5094. C    GOTO 1200
  5095. 1050    CONTINUE
  5096.     SS=VAR+1.
  5097.     ACX=0.
  5098.     RETURN
  5099. 1100    if(indexf.ne.12) GOTO 1200
  5100. C LKP
  5101.     IF(SS.NE.0.)GOTO 1150
  5102.     SS=1.
  5103.     AC=VAR
  5104.     ACX=-1.
  5105.     RETURN
  5106. C    GOTO 1200
  5107. 1150    CONTINUE
  5108. C    IF(VAR.GE.AC.AND.ACX.LT.0.)ACX=CTR
  5109.     IF(VAR.LT.AC.OR.ACX.GE.0.)GOTO 1155
  5110.     ACX=CTR
  5111.     AACP=KLKC
  5112.     AACQ=KLKR
  5113. 1155    CONTINUE
  5114.     CTR=CTR+1.
  5115.     RETURN
  5116. 1200    CONTINUE
  5117.     IF(INDEXF.NE.13)GOTO 1300
  5118. C LKN
  5119.     IF(SS.NE.0.)GOTO 1250
  5120.     SS=1.
  5121.     AC=VAR
  5122.     ACX=-1.
  5123.     GOTO 1300
  5124. 1250    CONTINUE
  5125. C    IF(VAR.LE.AC.AND.ACX.LT.0.)ACX=CTR
  5126.     IF(VAR.GT.AC.OR.ACX.GT.0.)GOTO 1256
  5127.     ACX=CTR
  5128.     AACP=KLKC
  5129.     AACQ=KLKR
  5130. 1256    CONTINUE
  5131.     CTR=CTR+1.
  5132.     RETURN
  5133. 1300    CONTINUE
  5134.     IF(INDEXF.NE.14)GOTO 1400
  5135. C LKE
  5136.     IF(SS.NE.0.)GOTO 1350
  5137.     SS=1.
  5138.     AC=VAR
  5139.     ACX=-1.
  5140.     GOTO 1400
  5141. 1350    CONTINUE
  5142. C    IF(VAR.EQ.AC.AND.ACX.LT.0.)ACX=CTR
  5143.     IF(VAR.NE.AC.OR.ACX.GE.0.)GOTO 1355
  5144.     ACX=CTR
  5145.     AACP=KLKC
  5146.     AACQ=KLKR
  5147. 1355    CONTINUE
  5148.     CTR=CTR+1.
  5149.     RETURN
  5150. 1400    CONTINUE
  5151.     IF(INDEXF.NE.15)GOTO 1500
  5152. C XOR
  5153.     IF(SS.NE.0)IWRK1=AC
  5154.     IF(SS.EQ.0)IWRK1=VAR
  5155.     SS=SS+1.
  5156.     IF(SS.EQ.1.)GOTO 1405
  5157.     IWRK2=VAR
  5158.     LWRK3=LWRK1.OR.LWRK2
  5159.     LWRK1=LWRK1.AND.LWRK2
  5160.     IWRK1=IWRK3-IWRK1
  5161. 1405    AC=IWRK1
  5162.     ACX=AC
  5163.     RETURN
  5164. 1500    CONTINUE
  5165.     IF(INDEXF.NE.16)GOTO 1600
  5166. C EQV
  5167. C NOTE THE EQUIVALENCE FUNCTION IS JUST THE COMPLEMENT OF
  5168. C THE XOR FUNCTION. DO THE COMPLEMENT VIA THE .NOT. OPERATOR.
  5169.     IF(SS.NE.0)IWRK1=AC
  5170.     IF(SS.EQ.0)IWRK1=VAR
  5171.     SS=SS+1.
  5172.     IF(SS.EQ.1.)GOTO 1505
  5173.     IWRK2=VAR
  5174.     LWRK3=LWRK1.OR.LWRK2
  5175.     LWRK1=LWRK1.AND.LWRK2
  5176.     IWRK1=IWRK3-IWRK1
  5177.     LWRK1=.NOT.LWRK1
  5178. 1505    AC=IWRK1
  5179.     ACX=AC
  5180.     RETURN
  5181. 1600    CONTINUE
  5182.     IF(INDEXF.NE.17)GOTO 1700
  5183. C MOD
  5184. C MODULO (V1 MOD V2)
  5185.     IF(SS.NE.0)RWRK1=AC
  5186.     IF(SS.EQ.0)RWRK1=VAR
  5187.     SS=SS+1.
  5188.     IF(SS.EQ.1.)GOTO 1605
  5189.     RWRK2=VAR
  5190.     RWRK1=DMOD(RWRK1,RWRK2)
  5191. 1605    AC=RWRK1
  5192.     ACX=AC
  5193.     RETURN
  5194. 1700    CONTINUE
  5195.     IF(INDEXF.NE.18)GOTO 1800
  5196. C REMAINDER -- INTEGER MODULO
  5197.     IF(SS.NE.0)IWRK1=AC
  5198.     IF(SS.EQ.0)IWRK1=VAR
  5199.     SS=SS+1.
  5200.     IF(SS.EQ.1.)GOTO 1705
  5201.     IWRK2=VAR
  5202.     IWRK1=JMOD(IWRK1,IWRK2)
  5203. 1705    AC=IWRK1
  5204.     ACX=AC
  5205.     RETURN
  5206. 1800    CONTINUE
  5207.     IF(INDEXF.NE.19)GOTO 1900
  5208. C SGN
  5209. C RETURN 1.0 * SIGN OF ARGUMENT.
  5210.     AC=DSIGN(1.0D0,VAR)
  5211.     ACX=AC
  5212.     RETURN
  5213. 1900    CONTINUE
  5214.     IF(INDEXF.NE.20)GOTO 2000
  5215. C IRR - INTERNAL RATE OF RETURN
  5216.     AC=0.
  5217.     ACX=0.
  5218.     IF(KIRR.LT.20)KIRR=KIRR+1
  5219.     IF(KIRR.EQ.1)PV=VAR
  5220.     IF(KIRR.EQ.2)FV=VAR
  5221.     IF(KIRR.LT.3)RETURN
  5222. C IRRPV,FV,RETURNS...
  5223.     IWRK1=KIRR-2
  5224.     EP(IWRK1)=VAR
  5225.     RWRK1=.15
  5226.     RWRK2=.25
  5227. C ITERATIVELY SOLVE FOR INTERNAL RATE OF RETURN.
  5228. 1903    TE=0.
  5229.     SS=FV/((1.D0+RWRK1)**(IWRK1))
  5230.     DO 1905 IWRK2=1,IWRK1
  5231.     AC=EP(IWRK2)/((1.D0+RWRK1)**IWRK2)
  5232.     SS=SS+AC
  5233. 1905    CONTINUE
  5234.     RWRK2=RWRK1*(SS+TE)/PV
  5235.     IF(DABS(RWRK1-RWRK2).LT..00001)GOTO 1910
  5236.     RWRK1=RWRK2
  5237.     GOTO 1903
  5238. 1910    CONTINUE
  5239.     AC=RWRK2
  5240.     ACX=AC
  5241.     RETURN
  5242. 2000    CONTINUE
  5243.     IF(INDEXF.NE.21)GOTO 2100
  5244. C RND[] - RANDOM NUMBER RETURN
  5245.     AC=RND(IDUM)
  5246.     ACX=AC
  5247.     RETURN
  5248. 2100    CONTINUE
  5249.        IF(INDEXF.NE.22)GOTO 2200
  5250. C PMT FUNCTION
  5251. C PMT[PRINCIPAL, INTEREST, NPERIODS] ARE ARGS
  5252. C PAYMENT (MORTGAGE PAYMENT PER PERIOD
  5253. C COMPUTED AS PAYMENT=PRINCIPAL*(INTEREST/(1-(1+INTEREST)**NPERIODS))
  5254. C (CORRECT EVEN IF INTEREST=0
  5255. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  5256.     AC=0.
  5257.     ACX=0.
  5258.     KIRR=KIRR+1
  5259.     EP(KIRR)=VAR
  5260.     IF(KIRR.LT.3)RETURN
  5261. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  5262.     AC=EP(1)*(EP(2)/(1.-((1.+EP(2))**(-EP(3)))))
  5263.     ACX=AC
  5264.     RETURN
  5265. 2200    CONTINUE
  5266.     IF(INDEXF.NE.23)GOTO 2300
  5267. C PVL FUNCTION
  5268. C PVL[PAYMENT,INTEREST,NPERIODS] ARE ARGS
  5269. C PRESENT VALUE COMPUTED AS
  5270. C PV=PAYMENT*(1.-(1.+INTEREST)**-NPERIODS)/INTEREST
  5271. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  5272.     AC=0.
  5273.     ACX=0.
  5274.     KIRR=KIRR+1
  5275.     EP(KIRR)=VAR
  5276.     IF(KIRR.LT.3)RETURN
  5277. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  5278.     AC=EP(1)*EP(3)
  5279.     IF(EP(3).EQ.0..OR.EP(2).EQ.0.)GOTO 2205
  5280.     AC=EP(1)*((1.-(1.+EP(2))**(-EP(3)))/EP(2))
  5281. 2205    ACX=AC
  5282.     RETURN
  5283. 2300    CONTINUE
  5284.     IF(INDEXF.NE.24)GOTO 2400
  5285. C AVE AVERAGE EXCLUDING ZERO CELLS
  5286.     IF(VAR.EQ.0.)GOTO 2305
  5287.     AC=AC+VAR
  5288.     CTR=CTR+1.
  5289. 2305    ACX=AC/DMAX1(CTR,1.0D0)
  5290.     RETURN
  5291. 2400    CONTINUE
  5292.     IF(INDEXF.NE.25)GOTO 2500
  5293. C CHS
  5294. C CHOOSE FROM ARGS USING 1ST ARG AS COUNT INTO RANGE...
  5295. C (SIMILAR TO CLASSICAL "CHOOSE" FUNCTION...)
  5296. C RETURNS 0.0 OR VALUE OF NTH ARG WHERE N IS INDEX OF ARG...
  5297. C    IF(KIRR.EQ.0)ACX=0.
  5298.     KIRR=KIRR+1
  5299.     IF(KIRR.EQ.1)IWRK1=VAR+1.
  5300.     IF(KIRR.NE.IWRK1)GOTO 2450
  5301. C SAVE LOCATION ALSO OF CELLS.
  5302. C THIS ALLOWS US TO FIND ADDRESSES OF SELECTED CELLS IN CHOOSE FOR ADDRESS MATH.
  5303.     AACP=KLKC
  5304.     AACQ=KLKR
  5305.     SS=VAR
  5306. 2450    CONTINUE
  5307.     ACX=SS
  5308.     AC=ACX
  5309.     RETURN
  5310. 2500    CONTINUE
  5311.     IF(INDEXF.NE.26)GOTO 2600
  5312. C ATM ARCTAN OF 2 ARGS
  5313.     IF(SS.NE.0.)RWRK1=AC
  5314.     IF(SS.EQ.0.)RWRK1=VAR
  5315.     SS=SS+1.
  5316.     IF(SS.LE.1.1)GOTO 2505
  5317.     RWRK2=VAR
  5318. C GET 4 QUADRANT ARCTAN
  5319.     RWRK1=DATAN2(RWRK1,RWRK2)
  5320. 2505    AC=RWRK1
  5321.     ACX=AC
  5322.     RETURN
  5323. 2600    CONTINUE
  5324.     RETURN
  5325.     END
  5326. c -h- domfcn.for    Fri Aug 22 13:03:40 1986    
  5327.     SUBROUTINE DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5328. C LLB = LOC OF
  5329. C LRB = LOC OF
  5330. C INDEXF IS AS ABOVE. GUARANTEED IN RANGE 1-5.
  5331.     INCLUDE aparms.inc
  5332.     CHARACTER*1 LINE(110)
  5333. C +++++++++++++++++++++++++++++++++++
  5334. C PARAMETER 18060=60*301
  5335.     CHARACTER*1 FVLD
  5336.     EXTERNAL INDX
  5337. c    INTEGER*4 VNLT
  5338.     DIMENSION FVLD(1,1)
  5339. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5340. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5341. C SO INITIALLY IGNORE.
  5342. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5343. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5344.     InTeGer*4 RRWACT,RCLACT
  5345. C    COMMON/RCLACT/RRWACT,RCLACT
  5346.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5347.      1  IDOL7,IDOL8
  5348. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5349. C     1  IDOL7,IDOL8
  5350.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5351. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5352.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5353. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5354. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5355. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5356.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kshtf
  5357. C    COMMON/KLVL/KLVL
  5358.     InTeGer*4 IOLVL,IGOLD
  5359. C    COMMON/IOLVL/IOLVL
  5360. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5361. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5362.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5363.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5364.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5365.      3  k3dfg,kcdelt,krdelt,kshtf
  5366. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5367. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5368. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5369. c     3  K3DFG,KCDelt,KRDelt,kpag
  5370.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  5371.     COMMON/D2R/NRDSP,NCDSP
  5372.     InTeGer*4 TYPE(1,2),VLEN(9)
  5373.     REAL*8 XVBLS(1,1)
  5374.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  5375.     Real*8 VAVBLS(3,27)
  5376.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  5377.     INTEGER*4 JVBLS(2,1,1)
  5378.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5379.     REAL*8 XXX
  5380.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5381.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5382.     REAL*8 ACX,ACY
  5383.     REAL*8 AC,SS,CTR
  5384.     EQUIVALENCE(ACY,AVBLS(1,27))
  5385.     InTeGer*4 DLFG
  5386. C    COMMON/DLFG/DLFG
  5387.     InTeGer*4 KDRW,KDCL
  5388. C    COMMON/DOT/KDRW,KDCL
  5389.     InTeGer*4 DTRENA
  5390. C    COMMON/DTRCMN/DTRENA
  5391.     REAL*8 EP,PV,FV
  5392.     DIMENSION EP(20)
  5393.     INTEGER*4 KIRR
  5394. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5395.     InTeGer*4 LASTOP
  5396. C    COMMON/ERROR/LASTOP
  5397.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  5398. C    COMMON/FMTBFR/FMTDAT
  5399.     CHARACTER*1 EDNAM(16)
  5400. C    COMMON/EDNAM/EDNAM
  5401.     InTeGer*4 MFID(2),MFMOD(2)
  5402. C    COMMON/FRM/MFID,MFMOD
  5403.     InTeGer*4 JMVFG,JMVOLD
  5404. C    COMMON/FUBAR/JMVFG,JMVOLD
  5405.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5406.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5407. CCC    InTeGer*4 KDRW,KDCL
  5408. CCC    COMMON /DOT/KDRW,KDCL
  5409.     CHARACTER*1 ILINE(106)
  5410.     InTeGer*4 ILNFG,ILNCT
  5411.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5412.     COMMON/FVLDC/FVLD
  5413.     InTeGer*4 ICREF,IRREF
  5414. C    COMMON/MIRROR/ICREF,IRREF
  5415.     InTeGer*4 MODPUB,LIMODE
  5416. C    COMMON/MODPUB/MODPUB,LIMODE
  5417.     InTeGer*4 KLKC,KLKR
  5418.     REAL*8 AACP,AACQ
  5419. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5420.     InTeGer*4 NCEL,NXINI
  5421. C    COMMON/NCEL/NCEL,NXINI
  5422.     CHARACTER*1 NAMARY(20,MROWS)
  5423. C    COMMON/NMNMNM/NAMARY
  5424.     InTeGer*4 NULAST,LFVD
  5425. C    COMMON/NULXXX/NULAST,LFVD
  5426.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  5427.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  5428. CCC    InTeGer*4 KLKC,KLKR
  5429.     REAL*8 ACP,ACQ
  5430. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  5431.     EQUIVALENCE(ACP,AVBLS(1,16)),(ACQ,AVBLS(1,17))
  5432. C +++++++++++++++++++++++++++++++++++
  5433. C
  5434. C FIRST GET A VARIABLE NAME. ALL MATH FUNCTIONS REQUIRE VARIABLE
  5435. C NAMES SINCE THEIR VARIABLES ARE THEIR ONLY VALID ARGS.
  5436.     CALL MTHINI(INDEXF,AC,SS,CTR,ACX)
  5437. C SET UP PROPER INITS
  5438. C KV2=1 IF A 2ND VBL EXISTS
  5439.     LCR=LLB+1
  5440.     AACP=ACP
  5441.     AACQ=ACQ
  5442. C INIT SAVED P, Q AC'S HERE IN CASE DOMATH MODIFIES...
  5443. C THIS ALLOWS SELECTION FUNCTIONS TO SET COL, ROW IN P AND Q AC.
  5444. 100    CONTINUE
  5445.     KV2=0
  5446.     LB=LCR
  5447.     LE=LRB-1
  5448.     IF(LB.GE.LE)RETURN
  5449.     CALL VARSCN(LINE,LB,LE,LASST,ID1,ID2,IVALID)
  5450.     IF(IVALID.EQ.0)RETURN
  5451. C USE extra cell to check for different sheets, same row/col
  5452. C use separator of } to indicate range is depth.
  5453.     KPG1=KSHTF
  5454.     KDEPSP=0
  5455.     if(Line(Lasst).eq.'}')Goto 8601
  5456.     IF(LINE(LASST).NE.':')GOTO 110
  5457.     Goto 8603
  5458. 8601    Continue
  5459.     KDepsp=1
  5460. 8603    Continue
  5461.     LB=LASST+1
  5462.     LE=LRB-1
  5463.     CALL VARSCN(LINE,LB,LE,LASST,ID1B,ID2B,IVALID)
  5464.     IF(IVALID.NE.0)KV2=1
  5465.     KPG2=KSHTF
  5466.     If(KDepsp.ne.1)goto 8604
  5467.     KDp=0
  5468.     If (kv2.eq.0)goto 8606
  5469.     KDp=kpg2-kpg1
  5470. C KDp is depth to go through. If negative set to zero.
  5471.     if(KDp.lt.0)kdp=0
  5472. 8606    Continue
  5473. 8605    Continue
  5474.     CALL XVBLGT(ID1,ID2,XVBLS(1,1))
  5475.     XXX=XVBLS(1,1)
  5476.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  5477. C USE EQUIVALENCE OF JVBLS AND XVBLS
  5478.     IF(ABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5479.     KLKC=ID1
  5480.     KLKR=ID2-1
  5481.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5482.     id1=id1+kcdelt
  5483.     id2=id2+krdelt
  5484.     kdp=kdp-1
  5485. C Handle all math over the depth argument.
  5486. C (Only partially decode; if argument is ill-formed
  5487. C  then just act as if range were directly below the
  5488. C  top cell.)
  5489.     if(KDp.ge.0)goto 8605
  5490.     GoTo 200
  5491. 8604    Continue
  5492. 110    CONTINUE
  5493.     CALL XVBLGT(ID1,ID2,XVBLS(1,1))
  5494.     XXX=XVBLS(1,1)
  5495. C    XXX=XVBLS(ID1,ID2)
  5496.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  5497. C USE EQUIVALENCE OF JVBLS AND XVBLS
  5498.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5499.     KLKC=ID1
  5500.     KLKR=ID2-1
  5501.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5502.     IF(KV2.EQ.0)GOTO 200
  5503.     IF(ID1.NE.ID1B) GOTO 120
  5504.     IF(ID2.GT.ID2B)GOTO 200
  5505.     M=ID2+1
  5506.     DO 121 MM=M,ID2B
  5507.     CALL XVBLGT(ID1,MM,XVBLS(1,1))
  5508.     XXX=XVBLS(1,1)
  5509.     CALL TYPGET(ID1,MM,TYPE(1,1))
  5510. C    XXX=XVBLS(ID1,MM)
  5511.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5512.     KLKC=ID1
  5513.     KLKR=MM-1
  5514.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5515. 121    CONTINUE
  5516.     GOTO 200
  5517. 120    CONTINUE
  5518.     IF(ID2.NE.ID2B)GOTO 130
  5519.     IF(ID1.GT.ID1B)GOTO 200
  5520.     M=ID1+1
  5521.     DO 131 MM=M,ID1B
  5522.     CALL XVBLGT(MM,ID2,XVBLS(1,1))
  5523.     XXX=XVBLS(1,1)
  5524. C    XXX=XVBLS(MM,ID2)
  5525.     CALL TYPGET(MM,ID2,TYPE(1,1))
  5526.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  5527.     KLKC=MM
  5528.     KLKR=ID2-1
  5529.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  5530. 131    CONTINUE
  5531. 130    CONTINUE
  5532. 200    CONTINUE
  5533. C IF NEXT CHAR IS A COMMA, SKIP IT AND KEEP UP SCAN UNLESS DONE
  5534.     IF(LINE(LASST).EQ.',')GOTO 300
  5535.     ACP=AACP
  5536.     ACQ=AACQ
  5537. C USE P, Q ACCUMULATORS FOR SELECTED COL, ROW COORDS FROM DOMATH
  5538.     RETURN
  5539. 300    LCR=LASST+1
  5540.     GOTO 100
  5541.     END
  5542. c -h- dostmi.for    Fri Aug 22 13:03:55 1986    
  5543.     SUBROUTINE DOSTMI(LINE,LLAST)
  5544. C COPY OF DOSTMT FOR IF FUNCTION.
  5545. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  5546. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  5547.     CHARACTER*1 LINE(110)
  5548.     Include aparms.inc
  5549. C +++++++++++++++++++++++++++++++++++
  5550. C PARAMETER 18060=60*301
  5551.     EXTERNAL INDX
  5552.     CHARACTER*1 FVLD
  5553. c    INTEGER*4 VNLT
  5554.     DIMENSION FVLD(1,1)
  5555. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5556. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5557. C SO INITIALLY IGNORE.
  5558.     COMMON/FVLDC/FVLD
  5559. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5560. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5561.     InTeGer*4 RRWACT,RCLACT
  5562. C    COMMON/RCLACT/RRWACT,RCLACT
  5563.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5564.      1  IDOL7,IDOL8
  5565. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5566. C     1  IDOL7,IDOL8
  5567.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5568. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5569.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5570. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5571. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5572. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5573.     InTeGer*4 KLVL
  5574. C    COMMON/KLVL/KLVL
  5575.     InTeGer*4 IOLVL,IGOLD
  5576. C    COMMON/IOLVL/IOLVL
  5577. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5578. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5579.  
  5580.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5581.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5582.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5583.      3  k3dfg,kcdelt,krdelt,kpag
  5584. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5585. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5586. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5587.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  5588.     COMMON/D2R/NRDSP,NCDSP
  5589.     InTeGer*4 TYPE(1,2),VLEN(9)
  5590.     REAL*8 XVBLS(1,1)
  5591.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  5592.     Real*8 VAVBLS(3,27)
  5593.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  5594.     INTEGER*4 JVBLS(2,1,1)
  5595.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5596.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5597.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5598.     REAL*8 ACY,AACY
  5599.     INTEGER*4 IACY,IIJACY
  5600.     EQUIVALENCE(IIJACY,AACY)
  5601.     EQUIVALENCE(IACY,AVBLS(1,27))
  5602.     EQUIVALENCE(ACY,AVBLS(1,27))
  5603.     InTeGer*4 DLFG
  5604. C    COMMON/DLFG/DLFG
  5605.     InTeGer*4 KDRW,KDCL
  5606. C    COMMON/DOT/KDRW,KDCL
  5607.     InTeGer*4 DTRENA
  5608. C    COMMON/DTRCMN/DTRENA
  5609.     REAL*8 EP,PV,FV
  5610.     DIMENSION EP(20)
  5611.     INTEGER*4 KIRR
  5612. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5613.     InTeGer*4 LASTOP
  5614. C    COMMON/ERROR/LASTOP
  5615.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  5616. C    COMMON/FMTBFR/FMTDAT
  5617.     CHARACTER*1 EDNAM(16)
  5618. C    COMMON/EDNAM/EDNAM
  5619.     InTeGer*4 MFID(2),MFMOD(2)
  5620. C    COMMON/FRM/MFID,MFMOD
  5621.     InTeGer*4 JMVFG,JMVOLD
  5622. C    COMMON/FUBAR/JMVFG,JMVOLD
  5623.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5624.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5625. CCC    InTeGer*4 KDRW,KDCL
  5626. CCC    COMMON /DOT/KDRW,KDCL
  5627.     CHARACTER*1 ILINE(106)
  5628.     InTeGer*4 ILNFG,ILNCT
  5629.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5630. C +++++++++++++++++++++++++++++++++++
  5631.     CALL FNAME(LINE,LLAST,INDEXF)
  5632. C ABOVE GETS FUNCTION NAMES.
  5633. C    NAME    INDEXF
  5634. C    MIN    1
  5635. C    MAX    2
  5636. C    AVG    3
  5637. C    SUM    4
  5638. C    STD    5    (STD DEVIATION)
  5639. C    IF    6    (IF STMT)
  5640. C    AND    7
  5641. C    OR    8
  5642. C    NOT    9
  5643. C    CNT    10 (COUNTS NONZERO ENTRIES)
  5644. C    NPV    11 NET PRESENT VALUE
  5645. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  5646. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  5647. C    LKE    14    LOOKUP EQUAL
  5648. C    XOR    15    EXCLUSIVE OR
  5649. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  5650. C    MOD    17    V1 MODULO V2
  5651. C    REM    18    REMAINDER OF V1/V2
  5652. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  5653. C    IRR    20    INTERNAL RATE OF RETURN
  5654. C USE  AND  TO DELIMIT FUNCTION ARGS.
  5655. C *****************************************************************************
  5656. C **** NOTE: MAX 20 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  5657. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  5658.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  5659. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  5660. C
  5661. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  5662.     IF(INDEXF.NE.6)GOTO 1000
  5663. C
  5664. C **** FIXUP '' NEXT. 2 LINES. REPLACE HERE... ***
  5665.     KKK=ICHAR('[')
  5666.     LLB=INDX(LINE,KKK)
  5667.     KKK=ICHAR(']')
  5668.     LRB=INDX(LINE,KKK)
  5669. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  5670.     IF(LLB.GT.LLAST)RETURN
  5671.     IF(LRB.GT.LLAST)LRB=LLAST
  5672. C ** COMMENT OUT NEVER-USED CODE NEXT AREA...
  5673. C
  5674. C    IF(INDEXF.EQ.6)GOTO 2000
  5675. CC ISOLATE MATH FUNCTIONS
  5676. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5677. CC GET % ABOVE
  5678. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  5679. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  5680. C    CALL XVBLST(KDRW,KDCL,ACX)
  5681. CC    XVBLS(KDRW,KDCL)=ACX
  5682. CC LEAVE RESULT IN % TOO.
  5683. C    ACY=ACX
  5684. C    CALL TYPSET(27,1,TYPE(1,1))
  5685. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  5686. C    RETURN
  5687. C1760    JVBLS(1,1,1)=ACX
  5688. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  5689. CC    JVBLS(1,KDRW,KDCL)=ACX
  5690. C    RETURN
  5691. 2000    CONTINUE
  5692. C HANDLE AN "IF" STATEMENT
  5693. C ILLEGAL HERE INSIDE AN IF, SO JUST IGNORE IT.
  5694. C    CALL DOIF(LINE,LLB,LRB,LLAST)
  5695. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT ] AS LAST CHAR OF STMT.
  5696. C NO DIRECT SET OF VRBL HERE...
  5697.     RETURN
  5698. 1000    CONTINUE
  5699. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  5700.     ILNFG=1
  5701.     LMX=LLAST-1
  5702.     DO 1001 N1=1,LMX
  5703. 1001    ILINE(N1)=LINE(N1)
  5704.     ILNCT=LMX
  5705. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  5706.     IF(ILNCT.GT.80)ILNCT=80
  5707.     CALL CALC
  5708. C STORE EXPRESSION RESULT.
  5709. C CONVERT BETWEEN TYPES FIRST IF NEED BE
  5710.     CALL TYPGET(KDRW,KDCL,LMX)
  5711.     CALL TYPGET(27,1,N1)
  5712.     LMX=IABS(LMX)
  5713.     N1=IABS(N1)
  5714.     IF(N1.EQ.1.OR.(N1.GE.3.AND.N1.LE.8))GOTO 8739
  5715.     N1=2
  5716.     GOTO 8740
  5717. 8739    CONTINUE
  5718.     N1=4
  5719. 8740    CONTINUE
  5720. C ONLY CONCERN HERE IS REAL TYPES (CODE=2) AND INT TYPES (CODE=4)
  5721.     AACY=ACY
  5722.     IF(N1.EQ.LMX)GOTO 2670
  5723.     IF(N1.EQ.2)IIJACY=ACY
  5724.     IF(N1.EQ.4)AACY=IACY
  5725. C DO WHICHEVER CONVERSION IS NEEDED IF ONE IS NEEDED AT ALL.
  5726. 2670    CONTINUE
  5727.     CALL XVBLST(KDRW,KDCL,AACY)
  5728. C    XVBLS(KDRW,KDCL)=ACY
  5729.     RETURN
  5730.     END
  5731. c -h- dostmt.for    Fri Aug 22 13:03:55 1986    
  5732.     SUBROUTINE DOSTMT(LINE,LLAST)
  5733. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  5734. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  5735.     CHARACTER*1 LINE(110)
  5736.     Include aparms.inc
  5737. C +++++++++++++++++++++++++++++++++++
  5738.     CHARACTER*1 FVLD
  5739.     EXTERNAL INDX
  5740. c    INTEGER*4 VNLT
  5741.     DIMENSION FVLD(1,1)
  5742. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  5743. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  5744. C SO INITIALLY IGNORE.
  5745.     COMMON/FVLDC/FVLD
  5746.     InTeGer*4 RRWACT,RCLACT
  5747. C    COMMON/RCLACT/RRWACT,RCLACT
  5748.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5749.      1  IDOL7,IDOL8
  5750. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5751. C     1  IDOL7,IDOL8
  5752.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5753. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5754.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5755. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5756. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5757. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5758.     InTeGer*4 KLVL
  5759. C    COMMON/KLVL/KLVL
  5760.     InTeGer*4 IOLVL,IGOLD
  5761. C    COMMON/IOLVL/IOLVL
  5762. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5763. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5764.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5765.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5766.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5767.      3  k3dfg,kcdelt,krdelt,kpag
  5768. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5769. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5770. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5771. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5772. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5773.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  5774.     COMMON/D2R/NRDSP,NCDSP
  5775.     InTeGer*4 TYPE(1,2),VLEN(9)
  5776.     REAL*8 XVBLS(1,1)
  5777.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  5778.     Real*8 VAVBLS(3,27)
  5779.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  5780.     INTEGER*4 JVBLS(2,1,1)
  5781.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  5782.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  5783.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  5784.     REAL*8 ACY,AACY
  5785.     INTEGER*4 IACY,IIJACY
  5786.     EQUIVALENCE(IACY,AVBLS(1,27))
  5787.     EQUIVALENCE(ACY,AVBLS(1,27))
  5788.     EQUIVALENCE(IIJACY,AACY)
  5789.     InTeGer*4 DLFG
  5790. C    COMMON/DLFG/DLFG
  5791.     InTeGer*4 KDRW,KDCL
  5792. C    COMMON/DOT/KDRW,KDCL
  5793.     InTeGer*4 DTRENA
  5794. C    COMMON/DTRCMN/DTRENA
  5795.     REAL*8 EP,PV,FV
  5796.     DIMENSION EP(20)
  5797.     INTEGER*4 KIRR
  5798. C    COMMON/ERNPER/EP,PV,FV,KIRR
  5799.     InTeGer*4 LASTOP
  5800. C    COMMON/ERROR/LASTOP
  5801.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  5802. C    COMMON/FMTBFR/FMTDAT
  5803.     CHARACTER*1 EDNAM(16)
  5804. C    COMMON/EDNAM/EDNAM
  5805.     InTeGer*4 MFID(2),MFMOD(2)
  5806. C    COMMON/FRM/MFID,MFMOD
  5807.     InTeGer*4 JMVFG,JMVOLD
  5808. C    COMMON/FUBAR/JMVFG,JMVOLD
  5809.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  5810.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  5811. CCC    InTeGer*4 KDRW,KDCL
  5812. CCC    COMMON /DOT/KDRW,KDCL
  5813.     CHARACTER*1 ILINE(106)
  5814.     InTeGer*4 ILNFG,ILNCT
  5815.     COMMON/ILN/ILNFG,ILNCT,ILINE
  5816.  
  5817. C +++++++++++++++++++++++++++++++++++
  5818.     CALL FNAME(LINE,LLAST,INDEXF)
  5819. C ABOVE GETS FUNCTION NAMES.
  5820. C    NAME    INDEXF
  5821. C    MIN    1
  5822. C    MAX    2
  5823. C    AVG    3
  5824. C    SUM    4
  5825. C    STD    5    (STD DEVIATION)
  5826. C    IF    6    (IF STMT)
  5827. C    AND    7
  5828. C    OR    8
  5829. C    NOT    9
  5830. C    CNT    10 (COUNTS NONZERO ENTRIES)
  5831. C    NPV    11 NET PRESENT VALUE
  5832. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  5833. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  5834. C    LKE    14    LOOKUP EQUAL
  5835. C    XOR    15    EXCLUSIVE OR
  5836. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  5837. C    MOD    17    V1 MODULO V2
  5838. C    REM    18    REMAINDER OF V1/V2
  5839. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  5840. C    IRR    20    INTERNAL RATE OF RETURN
  5841. C    RND    21    RANDOM NUMBER BETWEEN 0 AND 1.
  5842. C    PMT    22    PAYMENT FUNCTION
  5843. C    PVL    23    PRESENT VALUE
  5844. C    AVE    24    AVEREAGE EXCLUDING ZERO CELLS
  5845. C    CHS    25    CHOOSE
  5846. C    ATM    26    ARC TAN OF MULTIPLE ARGS (2 ARGS)
  5847. C USE  AND  TO DELIMIT FUNCTION ARGS.
  5848. C *****************************************************************************
  5849. C **** NOTE: MAX 26 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  5850. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  5851.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  5852. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  5853. C
  5854. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  5855.     IF(INDEXF.NE.6)GOTO 1000
  5856. C
  5857.     KKK=ICHAR('[')
  5858.     LLB=INDX(LINE,KKK)
  5859.     KKK=ICHAR(']')
  5860.     LRB=INDX(LINE,KKK)
  5861. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  5862.     IF(LLB.GT.LLAST)RETURN
  5863.     IF(LRB.GT.LLAST)LRB=LLAST
  5864. C *** NOTA BENE
  5865. C NEXT STUFF COMMENTED BECAUSE WE CAN NEVER EXECUTE IT...
  5866. C    IF(INDEXF.EQ.6)GOTO 2000
  5867. CC ISOLATE MATH FUNCTIONS
  5868. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  5869. CC GET % ABOVE
  5870. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  5871. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  5872. C    CALL XVBLST(KDRW,KDCL,ACX)
  5873. CC    XVBLS(KDRW,KDCL)=ACX
  5874. CC LEAVE RESULT IN % TOO.
  5875. C    ACY=ACX
  5876. C    CALL TYPSET(27,1,TYPE(1,1))
  5877. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  5878. C    RETURN
  5879. C1760    JVBLS(1,1,1)=ACX
  5880. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  5881. CC    JVBLS(1,KDRW,KDCL)=ACX
  5882. C    RETURN
  5883. 2000    CONTINUE
  5884. C HANDLE AN "IF" STATEMENT
  5885.     CALL DOIF(LINE,LLB,LRB,LLAST)
  5886. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT  AS LAST CHAR OF STMT.
  5887. C NO DIRECT SET OF VRBL HERE...
  5888.     RETURN
  5889. 1000    CONTINUE
  5890. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  5891.     ILNFG=1
  5892.     LMX=LLAST-1
  5893.     DO 1001 N1=1,LMX
  5894. 1001    ILINE(N1)=LINE(N1)
  5895.     ILNCT=LMX
  5896. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  5897.     IF(ILNCT.GT.80)ILNCT=80
  5898.     CALL CALC
  5899. C STORE EXPRESSION RESULT.
  5900. C FIRST BE SURE STORING RIGHT TYPE
  5901.     CALL TYPGET(KDRW,KDCL,LMX)
  5902. C ONLY WORRY HERE ABOUT INTEGER VS REAL (INT=4, REAL=2 CODE)
  5903.     CALL TYPGET(27,1,N1)
  5904.     N1=IABS(N1)
  5905.     LMX=IABS(LMX)
  5906. C LET ALL DEFAULT TO TYPE 2 (FLOATING) EXCEPT EXPLICIT INTS
  5907.     IF((N1.EQ.1).OR.(N1.GE.3.AND.N1.LE.8))GOTO 2739
  5908.     N1=2
  5909.     GOTO 2740
  5910. 2739    CONTINUE
  5911.     N1=4
  5912. 2740    CONTINUE
  5913.     AACY=ACY
  5914.     IF((N1).EQ.(LMX))GOTO 2670
  5915. C TYPES DIFFER. CONVERT BETWEEN ACY AND IACY.
  5916.     IF((N1).EQ.4)AACY=IACY
  5917.     IF((N1).EQ.2)IIJACY=ACY
  5918. 2670    CONTINUE
  5919.     CALL XVBLST(KDRW,KDCL,AACY)
  5920. C    XVBLS(KDRW,KDCL)=ACY
  5921.     RETURN
  5922.     END
  5923. c -h- dspfil.for    Fri Aug 22 13:04:12 1986    
  5924.     SUBROUTINE DSPFIL(ICODE,FORM,FORM2,FVLDTP,
  5925.      1  LFTMST,LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  5926. C COPYRIGHT (C) 1983 GLENN EVERHART
  5927. C ALL RIGHTS RESERVED
  5928. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  5929.     Include aparms.inc
  5930. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  5931. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  5932. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  5933. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  5934. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  5935. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  5936. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  5937. C FROM THE DISK BASED FILE HERE.
  5938. C    CHARACTER*127 CWRK
  5939. C    CHARACTER*1 CCWRK(128)
  5940.     InTeGer*4 ICODE,LFTMST
  5941. C    EQUIVALENCE(CWRK,CCWRK(1))
  5942.     InTeGer*4 LLU,LLVL,LLVLF
  5943.     InTeGer*4 RRWACT,RCLACT
  5944. C    COMMON/RCLACT/RRWACT,RCLACT
  5945.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  5946.      1  IDOL7,IDOL8
  5947. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  5948. C     1  IDOL7,IDOL8
  5949.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  5950. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  5951.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5952. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  5953. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  5954. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  5955.     InTeGer*4 KLVL
  5956. C    COMMON/KLVL/KLVL
  5957.     InTeGer*4 IOLVL,IGOLD
  5958. C    COMMON/IOLVL/IOLVL
  5959. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  5960. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  5961.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5962.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5963.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  5964.      3  k3dfg,kcdelt,krdelt,kpag
  5965. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  5966. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  5967. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  5968. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  5969. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  5970.     EXTERNAL INDX
  5971.     CHARACTER*7 PRTLX
  5972.     CHARACTER*1 FORM,FVLD,PRTLIN(132)
  5973.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  5974. C    INTEGER*4 VNLT
  5975.     CHARACTER*1 FVLDTP
  5976. c    CHARACTER*1 LBEL(4)
  5977.     CHARACTER*1 FORM2(128),NMSH(80)
  5978.     COMMON/NMSH/NMSH
  5979. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  5980. C THE SCREEN DISPLAY TO A FILE.
  5981. c    InTeGer*4 BORDR,TOMT
  5982. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  5983. C FOR USES SUCH AS SETTING COLORS...
  5984.     CHARACTER*1 OARRY(100)
  5985.     InTeGer*4 OSWIT,OCNTR
  5986. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  5987. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  5988.     InTeGer*4 IPS1,IPS2,MODFLG
  5989. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  5990.        InTeGer*4 XTCFG,IPSET,XTNCNT
  5991.        CHARACTER*1 XTNCMD(80)
  5992. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  5993. C VARY FLAG ITERATION COUNT
  5994.     INTEGER KALKIT
  5995. C    COMMON/VARYIT/KALKIT
  5996.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  5997.     InTeGer*4 RCMODE,IRCE1,IRCE2
  5998. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  5999. C     1  IRCE2
  6000. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  6001. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  6002. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  6003. C RCFGX ON.
  6004. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  6005. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  6006. C  AND VM INHIBITS. (SETS TO 1).
  6007.     INTEGER*4 FH
  6008. C FILE HANDLE FOR CONSOLE I/O (RAW)
  6009. C    COMMON/CONSFH/FH
  6010.     CHARACTER*1 ARGSTR(52,4)
  6011. C    COMMON/ARGSTR/ARGSTR
  6012.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  6013.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  6014.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  6015.      3  IRCE2,FH,ARGSTR
  6016. CCC    InTeGer*4 IC1POS,IC2POS
  6017. CCC    COMMON/ICPOS/IC1POS,IC2POS
  6018.     REAL*8 XVBLS(1,1)
  6019.     CHARACTER*1 DFE(14)
  6020.     CHARACTER*14 CDFE
  6021.     EQUIVALENCE(CDFE(1:1),DFE(1))
  6022.     DIMENSION FORM(128),FVLD(1,1)
  6023. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  6024. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  6025. C SO INITIALLY IGNORE.
  6026. C
  6027. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  6028. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  6029. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6030. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6031.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  6032.     COMMON/D2R/NRDSP,NCDSP
  6033.     InTeGer*4 ILNFG,ILNCT
  6034.     CHARACTER*1 ILINE(106)
  6035.     COMMON/ILN/ILNFG,ILNCT,ILINE
  6036.     INTEGER LENTL(5),LOCOL(5)
  6037.     CHARACTER*1 FILINE(208)
  6038. CCC    CHARACTER*1 OARRY(100)
  6039. CCC    InTeGer*4 OSWIT,OCNTR
  6040. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  6041. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  6042.     InTeGer*4 TYPE(1,2),VLEN(9)
  6043.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  6044.     Real*8 VAVBLS(3,27)
  6045.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  6046.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  6047.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  6048. CCC    InTeGer *4 FORMFG,RCFGX
  6049. CCC    COMMON/FFGG/FORMFG,RCFGX
  6050. C
  6051. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  6052. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  6053. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  6054. C DISPLAY ACTUALLY USED FOR SCREEN.
  6055.     Integer*4 CWids(JIDcl)
  6056. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  6057. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  6058. C AS 20 NOT 75.
  6059.     REAL*8 DVS(JIDcl,JIDrw)
  6060.     INTEGER*4 LDVS(2,JIDcl,JIDrw)
  6061.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  6062.     COMMON /FVLDC/FVLD
  6063. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  6064. C 10 CHARACTERS PER ENTRY.
  6065. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  6066.     COMMON/DSPCMN/DVS,CWIDS
  6067. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  6068. c    InTeGer*4 THISRW,THISCL
  6069. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  6070. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  6071. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  6072. C ROW OFFSET BY 6 FOR NUMBERS.
  6073. C
  6074. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  6075. C FVLD.
  6076. C    CHARACTER*1 IBITMP
  6077. C    DIMENSION IBITMP(2258)
  6078. C    COMMON/INITD/IBITMP
  6079. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  6080. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  6081. C    character*100 fwt
  6082. C
  6083. C CODE FOR WINDOW TILING AND FILE READIN...
  6084. C &%FILENAME,NSKIP,NLEN READS FILE SKIPPING NSKIP RECS AND
  6085. C GETS NLEN RECS IN
  6086. C
  6087. C &&%FILENAME,NSKIP,NLEN JUST INSERTS FILE INTO PRINTOUT
  6088.     IF(IDOL4.EQ.0)GOTO 9880
  6089.     LFTMST=J
  6090. C NEED TO DO IT HERE...
  6091. C FORM ARRAY HAS FILE NAME INFO, IF ANY...
  6092.     KKK=ICHAR('&')
  6093.     LLA=INDX(FORM,KKK)
  6094.     IF(LLA.LE.0.OR.LLA.GT.100)GOTO 9882
  6095.     IF(FORM(LLA+1).EQ.'&')GOTO 9881
  6096. C CHECK &% FORM
  6097.     IF(FORM(LLA+1).NE.'%')GOTO 9882
  6098. C GOT &% FORM HERE.
  6099.     IF(LLVL.EQ.0.OR.LLVLF.EQ.1)GOTO 9885
  6100.     DO 9886 LNNN=1,LLVL
  6101.     LLVLN=LLVL+10
  6102.     CLOSE(LLVLN)
  6103. 9886    CONTINUE
  6104.     LLVL=0
  6105. 9885    CONTINUE
  6106.     LTST=LLA+2
  6107.     LLVLF=1
  6108. C OPEN LLVL
  6109.     CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  6110.     IF(LLEN.LE.0)GOTO 9882
  6111.     LLVL=LLVL+1
  6112.     LLU=LLVL+10
  6113.     IF(LLVL.GT.4)GOTO 9931
  6114.     CALL RASSIG(LLU,FORM(LTST),ierror)
  6115.     if(ierror.ne.0)goto 9931
  6116.     GOTO 9930
  6117. 9931    CONTINUE
  6118.     LENTL(LLVL)=0
  6119.     LOCOL(LLVL)=0
  6120.     CLOSE(LLU)
  6121.     LLVL=LLVL-1
  6122.     LLU=LLVL+10
  6123.     GOTO 9882
  6124. 9930    CONTINUE
  6125.     LOCOL(LLVL)=LFTMST
  6126.     LENTL(LLVL)=LLEN
  6127.     IF(LSKIP.LE.0)GOTO 9906
  6128.     DO 9907 LL=1,LSKIP
  6129. 9907    READ(LLU,9889,END=9909,ERR=9909)FILINE
  6130.     DO 9910 N=1,208
  6131. 9910    FILINE(N)=CHAR(32)
  6132.     GOTO 9911
  6133. 9909    CONTINUE
  6134. C EOF SO CLOSE LUN
  6135.     LENTL(LLVL)=0
  6136.     CLOSE(LLU)
  6137.     LLVL=LLVL-1
  6138.     IF(LLVL.LE.0)GOTO 9880
  6139.     LLU=LLVL+10
  6140. 9911    CONTINUE
  6141. 9906    CONTINUE
  6142. C FILE SET UP NOW... READ IN AT 9982...
  6143. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  6144.     GOTO 9882
  6145. 9881    CONTINUE
  6146. C HERE LOOK FOR && FORM. IF NONE SEEN, SKIP THIS
  6147.     IF(FORM(LLA+1).NE.'&'.OR.FORM(LLA+2).NE.'%')GOTO 9882
  6148. C HERE HAVE A FORM &&%FILE,NS,NL
  6149. C SO CLOSE OFF ALL WINDOWS IN USE AND READ IN FIRST LEVEL FILE SEEN.
  6150.     IF(LLVL.EQ.0.OR.LLVLF.EQ.2)GOTO 9884
  6151.     DO 9883 LNN=1,LLVL
  6152.     LNN1=LNN+10
  6153.     CLOSE(LNN1)
  6154. 9883    CONTINUE
  6155. C NOW ALL OPEN UNITS CLOSED
  6156.     LLVLF=2
  6157.     LLVL=0
  6158. 9884    CONTINUE
  6159.     LTST=LLA+3
  6160. C OPEN LLVL
  6161. 9937    CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  6162.     IF(LLEN.LE.0)GOTO 9882
  6163.     LLVL=LLVL+1
  6164.     LLU=LLVL+10
  6165.     IF(LLVL.GT.4)GOTO 9933
  6166. C    OPEN(LLU,NAME=FORM(LTST),TYPE='OLD',
  6167. C     1  ERR=9933)
  6168.     CALL RASSIG(LLU,FORM(LTST),ierror)
  6169.     if(ierror.ne.0)goto 9933
  6170.     GOTO 9934
  6171. 9933    CONTINUE
  6172.     LLVL=LLVL-1
  6173.     LLU=LLVL+10
  6174.     GOTO 9882
  6175. 9934    CONTINUE
  6176.     LOCOL(LLVL)=LFTMST
  6177.     LENTL(LLVL)=LLEN
  6178.     IF(LSKIP.LE.0)GOTO 9888
  6179.     DO 9887 LL=1,LSKIP
  6180. 9887    READ(LLU,9889,ERR=9901,END=9901)FILINE
  6181. 9889    FORMAT(208A1)
  6182. C8998    FORMAT(1X,208A1)
  6183. 9898    FORMAT(132A1)
  6184.     DO 9908 N=1,208
  6185. 9908    FILINE(N)=Char(32)
  6186. C PUT IN LEADING SPACES INTO FILINE
  6187.     GOTO 9902
  6188. 9901    CONTINUE
  6189.     CLOSE(LLU)
  6190.     LLVL=LLVL-1
  6191.     IF(LLVL.LE.0)GOTO 9880
  6192.     LLU=LLVL+10
  6193. C HIT EOF ON READ, SO BACK UP A LEVEL
  6194. 9902    CONTINUE
  6195. C NOW GO AHEAD & READ... GOT PAST SKIP STUFF.
  6196. 9888    CONTINUE
  6197. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  6198. 9904    IF(LENTL(LLVL).LE.0) GOTO 9901
  6199.     READ(LLU,9889,END=9901,ERR=9901)(FILINE(IV),IV=LOCOL(LLVL),208)
  6200.     LENTL(LLVL)=lentl(llvl)-1
  6201. c update lines left to read in
  6202. C LOOK FOR RECURSIVE CALLS TO DEEPER NESTED FILES TO INCLUDE
  6203.     KKK=ICHAR('&')
  6204.     LTST=INDX(FILINE,KKK)+3
  6205.     LFTMST=LTST-3
  6206. C UPDATE SO IF IT IS A CALL,WE CAN GO HANDLE IT TILL ITS EOF OR A DEEPER CALL
  6207.     IF(LTST.GT.0.AND.LTST.LT.207.AND.FILINE(LTST+1).EQ.'&'
  6208.      1  .AND.FILINE(LTST+2).EQ.'%') GOTO 9937
  6209. C WELL, NOT A DEEPER LEVEL SO JUST GO ON AND READ THIS LEVEL TILL DONE.
  6210.     IF(ICODE.EQ.10)WRITE(8,9889,ERR=9904)FILINE
  6211. c only write 80 chars on ibmpc and its ilk since they screw up on wider.
  6212.     call swrt(filine,80)
  6213. c    WRITE(0,9898,ERR=9904)(FILINE(IVV),IVV=1,132)
  6214.     GOTO 9904
  6215. 9882    CONTINUE
  6216. C HERE HANDLE OLD WINDOW READS IN PROCESS OR JUST EXIT WITHOUT DOING MUCH
  6217.     IF(LLVLF.NE.1)GOTO 9880
  6218. C ONLY HANDLE "OVERLAY" STYLE READS HERE.
  6219. C NORMAL OR-ING IN OF WINDOWS
  6220. C LOOK FOR LUN SUCH THAT J=LOCOL(LUN) INDICATING IT STARTS HERE.
  6221. C READ THIS CELL INTO IT AND FAKE OUT FVLD(1,1) TO GET IT DISPLAYED.
  6222.     IF(LLVL.LE.0)GOTO 9880
  6223.     DO 9912 N=1,LLVL
  6224.     LLM=N+10
  6225.     IF(J.EQ.LOCOL(N))GOTO 9913
  6226. 9912    CONTINUE
  6227.     GOTO 9880
  6228. 9913    CONTINUE
  6229. C NOW READ THE FILE INTO "THIS" CELL (DISPLAY PURPOSES ONLY!)
  6230. C AND FLAG FVLD. Note we assign char(255) to fvldtp to represent -1.
  6231.     LENTL(LLM-10)=LENTL(LLM-10)-1
  6232.     IF(LENTL(LLM-10).GT.0)
  6233.      1  READ(LLM,9889,END=9940,ERR=9940)(FORM(IV),IV=1,109)
  6234.     IF(LENTL(LLM-10).GT.0)FVLDTP=char(255)
  6235.     IF(LENTL(LLM-10).LT.0)GOTO 9940
  6236. C -1 FLAGS THIS AS A "TEXT" CELL DISPLAY.
  6237.     GOTO 9880
  6238. 9940    CONTINUE
  6239.     LENTL(LLM-10)=0
  6240.     LOCOL(LLM-10)=0
  6241.     CLOSE(LLM)
  6242. 9880    CONTINUE
  6243.     RETURN
  6244.     END
  6245. c -h- dspsht.f40    Fri Aug 22 13:04:12 1986    
  6246.     SUBROUTINE DSPSHT(ICODE)
  6247. C COPYRIGHT (C) 1983 GLENN EVERHART
  6248. C ALL RIGHTS RESERVED
  6249.     INCLUDE aparms.inc
  6250. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  6251. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  6252. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  6253. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  6254. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  6255. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  6256. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  6257. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  6258. C FROM THE DISK BASED FILE HERE.
  6259.     CHARACTER*127 CWRK
  6260.     CHARACTER*1 CCWRK(128)
  6261.     InTeGer*4 ICODE,LLU,LLVL,LLVLF
  6262.     EQUIVALENCE(CWRK(1:1),CCWRK(1))
  6263.     InTeGer*4 RRWACT,RCLACT
  6264. C    COMMON/RCLACT/RRWACT,RCLACT
  6265.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  6266.      1  IDOL7,IDOL8
  6267. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  6268. C     1  IDOL7,IDOL8
  6269.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6270. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6271.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6272. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6273. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  6274. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  6275.     InTeGer*4 KLVL,K3DFG,KCDelt,KRDelt,kpag
  6276. C    COMMON/KLVL/KLVL
  6277.     InTeGer*4 IOLVL,IGOLD
  6278. C    COMMON/IOLVL/IOLVL
  6279. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  6280. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  6281.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6282.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6283.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  6284.      3  K3DFG,KCDelt,KRDelt,kpag
  6285. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  6286. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  6287. CCC    InTeGer*4 LLCMD,LLDSP
  6288. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6289. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6290. C    EXTERNAL INDX
  6291.     CHARACTER*7 PRTLX
  6292.     CHARACTER*1 FORM,FVLD,PRTLIN(132)
  6293.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  6294. C    INTEGER*4 VNLT
  6295.     CHARACTER*1 FVLDTP
  6296.     CHARACTER*1 LBEL(4)
  6297.     CHARACTER*1 FORM2(128),NMSH(80)
  6298.     COMMON/NMSH/NMSH
  6299. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  6300. C THE SCREEN DISPLAY TO A FILE.
  6301.     InTeGer*4 BORDR,TOMT
  6302. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  6303. C FOR USES SUCH AS SETTING COLORS...
  6304.     CHARACTER*1 OARRY(100)
  6305.     InTeGer*4 OSWIT,OCNTR
  6306. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  6307. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  6308.     InTeGer*4 IPS1,IPS2,MODFLG
  6309. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  6310.        InTeGer*4 XTCFG,IPSET,XTNCNT
  6311.        CHARACTER*1 XTNCMD(80)
  6312. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  6313. C VARY FLAG ITERATION COUNT
  6314.     INTEGER KALKIT
  6315. C    COMMON/VARYIT/KALKIT
  6316.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  6317.     InTeGer*4 RCMODE,IRCE1,IRCE2
  6318. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  6319. C     1  IRCE2
  6320. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  6321. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  6322. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  6323. C RCFGX ON.
  6324. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  6325. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  6326. C  AND VM INHIBITS. (SETS TO 1).
  6327.     INTEGER*4 FH
  6328. C FILE HANDLE FOR CONSOLE I/O (RAW)
  6329. C    COMMON/CONSFH/FH
  6330.     CHARACTER*1 ARGSTR(52,4)
  6331. C    COMMON/ARGSTR/ARGSTR
  6332.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  6333.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  6334.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  6335.      3  IRCE2,FH,ARGSTR
  6336. CCC    InTeGer*4 IC1POS,IC2POS
  6337. CCC    COMMON/ICPOS/IC1POS,IC2POS
  6338. CCC    InTeGer*4 NULAST,LFVD
  6339. C    INTEGER*4 IOLVL
  6340. C    COMMON/IOLVL/IOLVL
  6341.     InTeGer*4 ICREF,IRREF
  6342. C    COMMON/MIRROR/ICREF,IRREF
  6343.     InTeGer*4 MODPUB,LIMODE
  6344. C    COMMON/MODPUB/MODPUB,LIMODE
  6345.     InTeGer*4 KLKC,KLKR
  6346.     REAL*8 AACP,AACQ
  6347. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  6348.     InTeGer*4 NCEL,NXINI
  6349. C    COMMON/NCEL/NCEL,NXINI
  6350.     CHARACTER*1 NAMARY(20,MROWS)
  6351. C    COMMON/NMNMNM/NAMARY
  6352.     InTeGer*4 NULAST,LFVD
  6353. C    COMMON/NULXXX/NULAST,LFVD
  6354.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  6355.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  6356. CCC    COMMON/NULXXX/NULAST,LFVD
  6357.     REAL*8 XVBLS(1,1),VDSP,VCLC
  6358.     CHARACTER*1 DFE(14)
  6359.     CHARACTER*14 CDFE
  6360.     EQUIVALENCE(CDFE(1:1),DFE(1))
  6361.     DIMENSION FORM(128),FVLD(1,1)
  6362. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  6363. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  6364. C SO INITIALLY IGNORE.
  6365. C
  6366. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  6367. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  6368. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6369. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6370.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  6371.     COMMON/D2R/NRDSP,NCDSP
  6372.     InTeGer*4 ILNFG,ILNCT
  6373.     CHARACTER*1 ILINE(106)
  6374.     COMMON/ILN/ILNFG,ILNCT,ILINE
  6375.     INTEGER LENTL(5),LOCOL(5)
  6376.     CHARACTER*1 FILINE(208)
  6377. CCC    CHARACTER*1 OARRY(100)
  6378. CCC    InTeGer*4 OSWIT,OCNTR
  6379. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  6380. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  6381.     InTeGer*4 TYPE(1,2),VLEN(9)
  6382.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  6383.     Real*8 VAVBLS(3,27)
  6384.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  6385.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  6386.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  6387. CCC    InTeGer *4 FORMFG,RCFGX
  6388. CCC    COMMON/FFGG/FORMFG,RCFGX
  6389. C
  6390. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  6391. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  6392. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  6393. C DISPLAY ACTUALLY USED FOR SCREEN.
  6394.     Integer*4 CWids(JIDcl)
  6395. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  6396. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  6397. C AS 20 NOT 75.
  6398.     REAL*8 DVS(JIDcl,JIDrw)
  6399.     INTEGER*4 LDVS(2,JIDcl,JIDrw)
  6400.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  6401.     COMMON /FVLDC/FVLD
  6402. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  6403. C 10 CHARACTERS PER ENTRY.
  6404. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  6405.     COMMON/DSPCMN/DVS,CWIDS
  6406. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  6407.     InTeGer*4 LFTMST
  6408. c    InTeGer*4 THISRW,THISCL
  6409. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  6410. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  6411. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  6412. C ROW OFFSET BY 6 FOR NUMBERS.
  6413. C
  6414. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  6415. C FVLD.
  6416. C    CHARACTER*1 IBITMP
  6417. C    DIMENSION IBITMP(2258)
  6418. C    COMMON/INITD/IBITMP
  6419. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  6420. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  6421.     character*100 fwt
  6422. C    CHARACTER*1 LBITS(8)
  6423. CC    DATA LBITS/1,2,4,8,16,32,64,128/
  6424. C    LBITS(1)=1
  6425. C    LBITS(2)=2
  6426. C    LBITS(3)=4
  6427. C    LBITS(4)=8
  6428. C    LBITS(5)=16
  6429. C    LBITS(6)=32
  6430. C    LBITS(7)=64
  6431. C    LBITS(8)=128
  6432.     IF(ICODE.NE.10)GOTO 3000
  6433.     CALL UVT100(1,LLCMD,1)
  6434.     CALL UVT100(12,2,0)
  6435.     call Vwrt('Enter Print File Spec, / after to omit borders>',47)
  6436.     if(iolvl.ne.11)READ(IOLVL,26,END=8884,ERR=8884)FORM2
  6437.     if(iolvl.eq.11)call vget(form2,128)
  6438. 26    FORMAT(128A1)
  6439. C FIND SIZE OF LINE READ IN
  6440.     DO 750 N=1,128
  6441.     ISZ=129-N
  6442.     IF(FORM2(N).GT.' ')GOTO 751
  6443. 750    CONTINUE
  6444. 751    CONTINUE
  6445.     ISZ=ISZ+1
  6446.     ISZ=MIN0(127,ISZ)
  6447.     FORM2(ISZ+1)=char(0)
  6448.     BORDR=0
  6449.     TOMT=0
  6450.     DO 4111 N=1,ISZ
  6451. C IF FILENAME HAS / AFTERWARDS, OMIT BORDER
  6452.     IF(FORM2(N).EQ.'/')BORDR=1
  6453. C NULL OUT THE / SO THAT FILENAME WILL PARSE CORRECTLY.
  6454.     IF(FORM2(N).EQ.'/')FORM2(N)=char(0)
  6455.     IF(FORM2(N).EQ.'%')TOMT=1
  6456. 4111    CONTINUE
  6457. C    OPEN(8,FILE=FORM2,RECL=600,STATUS='NEW')
  6458.     CALL WASSIG(8,FORM2)
  6459.     KSHEET=0
  6460.     IF(K3DFG.LE.0)GOTO 2890
  6461.     LR=NRDSP(1,1)
  6462.     LC=NCDSP(1,1)
  6463.     CALL GETSHT(LR,LC,KSHEET)
  6464.     IF(KSHEET.EQ.0)GOTO 2890
  6465.     DO 27 N=1,132
  6466. 27    PRTLIN(N)=Char(32)
  6467.     WRITE(PRTLX(1:7),1891)ksheet
  6468. c    ENCODE(7,1891,PRTLIN)KSHEET
  6469.     GOTO 3666
  6470. 2890    CONTINUE
  6471.     DO 9127 N=1,132
  6472. 9127    PRTLIN(N)=Char(32)
  6473.     WRITE(PRTLX(1:7),2)
  6474. C    ENCODE(7,2,PRTLIN)
  6475.     GOTO 3666
  6476. 3000    CONTINUE
  6477.     NULAST=-4
  6478. 3666    CONTINUE
  6479.     CALL UVT100(13,0,0)
  6480.     IF(TOMT.EQ.0.AND.ICODE.EQ.10)WRITE(8,17)NMSH
  6481.     IF(ICODE.EQ.10)GOTO 2000
  6482.     IF(ICODE.NE.2)GOTO 1000
  6483. C DRAW LABELS FIRST
  6484.     CALL UVT100(1,1,1)
  6485.     CALL UVT100(12,2,0)
  6486.     IF(ICODE.NE.10)call swrt(nmsh,80)
  6487.     CALL UVT100(1,2,1)
  6488.     CALL UVT100(12,2,0)
  6489. C ERASE TOP LINE, START AT COL 7
  6490.     KSHEET=0
  6491.     IF(K3DFG.LE.0)GOTO 1890
  6492.     LR=NRDSP(1,1)
  6493.     LC=NCDSP(1,1)
  6494.     CALL GETSHT(LR,LC,KSHEET)
  6495.     IF(KSHEET.EQ.0)GOTO 1890
  6496.     write(fwt(1:7),1891)ksheet
  6497.     call swrt(fwt,7)
  6498. c    WRITE(6,1891)KSHEET
  6499. 1891    FORMAT('PG=',I4)
  6500.     GOTO 2000
  6501. 1890    CONTINUE
  6502.     call swrt('ROW/COL',7)
  6503. 2    FORMAT('ROW\COL')
  6504. C NOTE EXACTLY 7 CHARACTERS IN FORMAT #2
  6505. 2000    CONTINUE
  6506.     J=8
  6507.     CALL UVT100(13,7,0)
  6508.     DO 1 N1=1,DRWV
  6509.     LR=NRDSP(N1,1)
  6510. C NOTE PHYS SHEET OFFSET BY 1 (SEE VARSCN)
  6511. C DISPLAY SHEET NUMBERS START AT 1
  6512.     IF(ICODE.NE.10)CALL UVT100(1,2,J)
  6513.     IF(KSHEET.GT.0.AND.LR.GE.NRDSP(1,1).AND.
  6514.      1   (LR-(KSHEET)*KCDELT).GE.1) LR=LR-(KSHEET)*KCDELT
  6515.     CALL IN2AS(LR,LBEL)
  6516.     IF(ICODE.EQ.10)GOTO 2020
  6517.     write(fwt(1:100),3)LBEL
  6518.     CALL SWRT(fwt(1:100),4)
  6519. c    WRITE(0,3)LBEL
  6520. 3    FORMAT(4A1)
  6521.     IF(LBEL(4).EQ.' '.AND.LBEL(3).EQ.' ')CALL UVT100(1,2,J+2)
  6522.     IF(LBEL(4).EQ.' '.AND.LBEL(3).NE.' ')CALL UVT100(1,2,J+3)
  6523.     write(fwt(1:100),7)n1
  6524.     call swrt(fwt(1:100),3)
  6525. 7    FORMAT('=',I2)
  6526.     GOTO 2030
  6527. 2020    CONTINUE
  6528.     IF((J+CWIDS(N1)-7).GT.121)GOTO 2030
  6529.     ICWD=MAX0(7,CWIDS(N1))
  6530.     WRITE(CWRK(1:127),2021,ERR=2030)LBEL,N1
  6531.     DO 752 N=1,ICWD
  6532.     PRTLIN(J-1+N)=CCWRK(N)
  6533. 752    CONTINUE
  6534. C    ENCODE(ICWD,2021,PRTLIN(J),ERR=2030),LBEL,N1
  6535. 2021    FORMAT(4A1,'=',I2)
  6536. 2030    CONTINUE
  6537.     J=J+CWIDS(N1)
  6538.     IF(J.GT.132)GOTO 40
  6539. 1    CONTINUE
  6540. 40    CONTINUE
  6541. C NOW COL LBLS DONE
  6542. C DO NUMBERS ACROSS LEFT.
  6543. C ONLY DO SO ON SCREEN.
  6544.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(8,18)PRTLIN
  6545.     DO 2031 KKK=1,132
  6546.     FILINE(KKK)=Char(32)
  6547. 2031    PRTLIN(KKK)=Char(32)
  6548.     IF(ICODE.EQ.10)GOTO 1000
  6549.     CALL UVT100(13,7,0)
  6550.     MCX=MIN0(LLCMD-1,DCLV)+2
  6551. C    LLVL=0
  6552. C ROWS ARE JUST OFFSET...NO MONKEY BUSINESS.
  6553.     DO 6 N1=3,MCX
  6554.     M1=N1-2
  6555.     LC=NCDSP(1,M1)-1
  6556. C N1=DISPLAY ROW
  6557.     CALL UVT100(1,N1,1)
  6558. C ADJUST DISPLAY LABELS FOR PAGE
  6559.     IF(KSHEET.GT.0.AND.LC.GE.(NCDSP(1,1)-1).AND.
  6560.      1   (LC-KSHEET*KRDELT).GE.1)LC=LC-KSHEET*KRDELT
  6561.     write(fwt(1:100),8)lc
  6562.     call swrt(fwt(1:100),6)
  6563. 8    FORMAT(I5,'>')
  6564. 6    CONTINUE
  6565. C NOW DISPLAY VALUES.
  6566. 1000    CONTINUE
  6567.     CALL UVT100(13,0,0)
  6568. C main screen display loop here.
  6569.     If (NCEL.eq.0) GOTO 1011
  6570.     DO 10 N2=1,DCLV
  6571.     JP=8
  6572.     JPL=125
  6573.     DO 110 N1=1,DRWV
  6574.     M1=NRDSP(N1,N2)
  6575.     M2=NCDSP(N1,N2)
  6576. C M1,M2 = PHYS SHEET COORDS OF WHAT IS DISPLAYED.
  6577.     M2M1=M2-1
  6578.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(PRTLX(1:7),8)M2-1
  6579. C *** OMIT DISPLAY IF FVLD=0 ***
  6580. C
  6581.     CALL FVLDGT(M1,M2,FVLD(1,1))
  6582.     IF((ICHAR(FVLD(1,1)).EQ.0).AND.ICODE.NE.2.AND.ICODE.NE.
  6583.      1  10.AND.IDOL4.EQ.0) GOTO 100
  6584. C ******************************
  6585.     VDSP=DVS(N1,N2)
  6586.     CALL XVBLGT(M1,M2,VCLC)
  6587. C    VCLC=XVBLS(M1,M2)
  6588. C SEE IF DISPLAYED AND CALCULATED NUMBERS ARE IDENTICAL.
  6589. C ONLY DISPLAY IF CHANGED.
  6590.     IF(IDOL4.NE.0)GOTO 620
  6591.     IF(VDSP.EQ.VCLC.AND.ICODE.NE.2.AND.ICODE.NE.10)GOTO 100
  6592. 620    IC1POS=M1
  6593.     IC2POS=M2
  6594. C FALL THRU HERE IF WE NEEDTO DISPLAY A NUMBER IN ROW 3+N2, COL N1
  6595. C THEN RE-ESTABLISH FORMAT, ETC.
  6596.     M23=N2+2
  6597.     J=8
  6598.     DO 11 N11=1,N1
  6599. C GET THE COORDS OF OUR CELL.
  6600. 11    J=J+CWIDS(N11)
  6601.     J=J-CWIDS(N1)
  6602. C CURRENT CHARACTER COL NUMBER IS NOW J.
  6603. C    CALL UVT100(1,M23,J)
  6604. C    IRX=(M2-1)*60+M1
  6605.     CALL REFLEC(M2,M1,IRX)
  6606. C
  6607. C GET FORMULA IN NOW
  6608.     CALL WRKFIL(IRX,CWRK(1:127),0)
  6609.     CALL CE2A(CWRK(1:127),FORM)
  6610. C CONVERT ENCODED FORMS TO REGULAR ASCII
  6611. C    READ(7'IRX)FORM
  6612. C ALLOW FOR FVLD TO HAVE CONSTANT VS FORMULA SIGNIFICANCE
  6613.     IF(JCHAR(FORM(119)).LT.-1)FORM(119)=Char(253)
  6614.     IF(JCHAR(FORM(119)).GT.1)FORM(119)=Char(3)
  6615. C
  6616. c try & omit reset here... could mess other places up.
  6617. cC FVLD VALUES OF 2 INDICATE ALREADY-COMPUTED CONSTANTS.DON'T
  6618. cC FORCE THEM TO BE REDONE. OTHERWISE DO FILL IN HOWEVER.
  6619. c    CALL FVLDGT(M1,M2,FVLD(1,1))
  6620. c    IF(ICHAR(FVLD(1,1)).NE.2)CALL FVLDST(M1,M2,FORM(119))
  6621. cC    FVLD(M1,M2)=FORM(119)
  6622. cC    IF(FORM(120).LE.0)CALL FVLDST(M1,M2,char(0))
  6623.     CALL FVLDGT(M1,M2,FVLD(1,1))
  6624.     FVLDTP=FVLD(1,1)
  6625. C HANDLE FILE INCLUSION IN SUBROUTINE...
  6626.     IF (IDOL4.NE.0)CALL DSPFIL(ICODE,FORM,FORM2,FVLDTP,LFTMST,
  6627.      1  LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  6628. C NOTE WE CALL DSPFIL SO IT CAN BE OVERLAIN AND LET THE REST
  6629. C OF DSPSHT STAY RESIDENT. (SHOULD SPEED THINGS UP MOST OF
  6630. C THE TIME)...
  6631. C THIS SETTING OF FVLD ALLOWS THE Q OPTION TO WORK.
  6632.     IF(ICHAR(FVLDTP).NE.0)CALL UVT100(1,M23,J)
  6633. 13    CONTINUE
  6634.     CALL XVBLGT(M1,M2,DVS(N1,N2))
  6635. C    DVS(N1,N2)=XVBLS(M1,M2)
  6636.     IF(ICHAR(FVLDTP).EQ.0)GOTO 100
  6637.     IF(FORMFG.LE.0.AND.JCHAR(FVLDTP).GE.0)GOTO 756
  6638.     DO 757 N=1,100
  6639. 757    FORM2(N)=FORM(N)
  6640. 756    CONTINUE
  6641. C     1  ENCODE(100,17,FORM2)(FORM(II),II=1,100)
  6642. 17    FORMAT(1X,80A1)
  6643.     IF(FORMFG.NE.0)GOTO 4321
  6644.     DO 6304 KKKK=1,9
  6645.     KKKKK=ICHAR(FORM(KKKK+119))
  6646. C    KKKKK=DFMTS(KKKK,N1,N2)
  6647. 6304    DFE(KKKK+1)=Char(MAX0(32,KKKKK))
  6648.     DFE(11)=Char(32)
  6649.     DFE(1)='('
  6650.     DFE(12)=' '
  6651. c omit any \ formats from dfe since encode fouls up with them.
  6652.     DFE(13)=' '
  6653.     DFE(14)=')'
  6654.     CALL TYPGET(M1,M2,TYPE(1,1))
  6655. c    IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  6656. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)DVS(N1,N2)
  6657. c    IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  6658. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)LDVS(1,N1,N2)
  6659.     IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  6660.      1  WRITE(CWRK(1:127),DFE,ERR=4321)DVS(N1,N2)
  6661.     IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  6662.      1  WRITE(CWRK(1:127),DFE,ERR=4321)LDVS(1,N1,N2)
  6663.     IF(JCHAR(FVLDTP).LE.0)GOTO 4321
  6664.     DO 758 N=1,100
  6665. 758    FORM2(N)=CCWRK(N)
  6666. 4321    CONTINUE
  6667.     KWID=CWIDS(N1)
  6668. C  *** FIND OUT HOW MUCH ROOM THERE IS NOW. WE KNOW WHERE WE'RE DISPLAYING, SO
  6669. C  *** ALLOW NULL CELLS TO BE SHOWN PROVIDED WE ARE:
  6670. C  1. DISPLAYING TEXT IN THE CELL, OR
  6671. C  2. IN VIEW FORMULA MODE, AND THE NEXT CELL(S) OVER ARE NULL (FVLD=0)
  6672.     IF(FORMFG.EQ.0.AND.JCHAR(FVLDTP).GE.0)GOTO 8444
  6673.     III=N1+1
  6674.     IF(III.GT.DRWV)GOTO 8446
  6675.     DO 8445 II=III,DRWV
  6676. C FOLLOW ALONG WITH THE DISPLAY'S MAPPING TO SHEET.
  6677.     IIII=NRDSP(II,N2)
  6678.     IIIII=NCDSP(II,N2)
  6679.     CALL FVLDGT(IIII,IIIII,FVLD(1,1))
  6680.     IF(ICHAR(FVLD(1,1)).NE.0)GOTO 8444
  6681.     KWID=KWID+CWIDS(II)
  6682. 8445    CONTINUE
  6683. 8446    CONTINUE
  6684. C TEST IF LAST CELL IS NULL
  6685. 8444    CONTINUE
  6686.     KWID=MIN0(KWID,JPL)
  6687. C ****** END OF MODS FOR PRINTING INTO ADJACENT NULL CELLS.
  6688.     IF(ICODE.NE.10)CALL SWRT(FORM2,KWID)
  6689.     IF(ICODE.NE.10)GOTO 100
  6690.     IF(JPL-KWID.LT.0)GOTO 115
  6691.     DO 759 II=1,KWID
  6692.     IIII=JP+II-1
  6693. 759    PRTLIN(IIII)=FORM2(II)
  6694. C    ENCODE(KWID,17,PRTLIN(JP),ERR=100)(FORM2(II),II=1,KWID)
  6695. 100    CONTINUE
  6696. 115    CONTINUE
  6697. C HERE KEEP TRACK OF AMOUNT PRINTED.
  6698.     JP=JP+CWIDS(N1)
  6699.     JPL=JPL-CWIDS(N1)
  6700. 110    CONTINUE
  6701.     IF(ICODE.NE.10)GOTO 10
  6702.     DO 634 KKKQ=1,132
  6703.     IF(ICHAR(PRTLIN(KKKQ)).LT.32)PRTLIN(KKKQ)=Char(32)
  6704. 634    CONTINUE
  6705.     WRITE(8,18)(PRTLIN(II),II=1,JP)
  6706. 18    FORMAT(1X,100A1,34A1)
  6707.     DO 19 LN1=1,132
  6708. 19    PRTLIN(LN1)=Char(32)
  6709. 10    CONTINUE
  6710. 1011    Continue
  6711.     IF(ICODE.EQ.10)CLOSE(8)
  6712.     IF(IDOL4.EQ.0)RETURN
  6713.     DO 9915 N=1,4
  6714.     LLU=N+10
  6715.     CLOSE(LLU)
  6716. 9915    CONTINUE
  6717.     LLVL=0
  6718. 8884    RETURN
  6719.     IOLVL=11
  6720.     CLOSE(3)
  6721. c    CLOSE(11)
  6722. c    OPEN(UNIT=11,FILE='CON:0/0/100/100/Analy Command')
  6723.     RETURN
  6724.     END
  6725.     SUBROUTINE GETSHT(LR,LC,KSHEET)
  6726. c FIGURE CORRECT SHEET, ENSURING THAT THE LR,LC PAIR IS
  6727. c SENSIBLY WITHIN IT.
  6728.     Include aparms.inc
  6729. c    INCLUDE VKLUGPRM.FTN''
  6730.     InTeGer*4 RRWACT,RCLACT
  6731. C    COMMON/RCLACT/RRWACT,RCLACT
  6732.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  6733.      1  IDOL7,IDOL8
  6734. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  6735. C     1  IDOL7,IDOL8
  6736.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  6737. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  6738.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6739. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  6740. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  6741. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  6742.     InTeGer*4 KLVL,K3DFG,KCDelt,KRDelt,kpag
  6743. C    COMMON/KLVL/KLVL
  6744.     InTeGer*4 IOLVL,IGOLD
  6745. C    COMMON/IOLVL/IOLVL
  6746. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  6747. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  6748.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  6749.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  6750.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  6751.      3  K3DFG,KCDelt,KRDelt,kpag
  6752.     KSHEET=0
  6753.     KK1=MRC
  6754.     KK2=MRC
  6755.     IF(KRDELT.GT.0)KK1=(LC-2)/KRDELT
  6756.     IF(KCDELT.GT.0)KK2=(LR-1)/KCDELT
  6757.     KK=MIN0(KK1,KK2)
  6758.     IF(KK.GE.(MRC-100))GOTO 222
  6759. C IF BOTH DELTAS ARE ZERO DON'T TOUCH ANYTHING.
  6760.     KSHEET=MAX0(KK,0)
  6761. C KSHEET NONZERO FLAGS WE MAKE THE MOD
  6762.     IF(LR.LT.KSHEET*KCDELT)GOTO 2220
  6763.     IF((LC-1).LT.KSHEET*KRDELT)GOTO 2220
  6764. 222    CONTINUE
  6765.     GOTO 2221
  6766. 2220    CONTINUE
  6767.     KSHEET=0
  6768. 2221    CONTINUE
  6769.     RETURN
  6770.     END
  6771. c -h- errcx.for    Fri Aug 22 13:08:07 1986    
  6772.     SUBROUTINE ERRCX (RETCD)
  6773. C COPYRIGHT (C) 1983 GLENN EVERHART
  6774. C ALL RIGHTS RESERVED
  6775. C 60=MAX REAL ROWS
  6776. C 301=MAX REAL COLS
  6777. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  6778. C VBLS AND TYPE DIMENSIONED 60,301
  6779. C **************************************************
  6780. C *                                                *
  6781. C *            SUBROUTINE ERRCX                    *
  6782. C *                                                *
  6783. C **************************************************
  6784. C
  6785. C
  6786. C THIS SUBROUTINE DOES INITIAL SYNTAX CHECKING ON THE INPUT
  6787. C LINE. THE CHECKS MAKE SURE THAT PARENTHESES ARE BALANCED
  6788. C AND THAT THE EQUAL SIGN IS NOT MISUSED.
  6789. C
  6790. C RETCD     MEANING
  6791. C
  6792. C   1        NO ERRORS DETECTED
  6793. C   2        ERROR FOUND
  6794. C
  6795. C
  6796. C
  6797. C
  6798. C   MODIFICATION CLASSES: M1
  6799. C
  6800. C
  6801. C
  6802. C
  6803. C ERRCX CALLS ERRMSG WHICH PRINTS ERROR MESSAGES.
  6804. C
  6805. C
  6806. C
  6807. C ERRCX IS CALLED BY CALC
  6808. C
  6809. C
  6810. C
  6811. C   VARIABLE       USE
  6812. C
  6813. C    ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC
  6814. C                 OR THE CHARACTER %.
  6815. C    BLANK        ' '
  6816. C    I,J          HOLDS TEMPORARY VALUES.
  6817. C    LAST         HOLDS A CODE WHEN LOOKING FOR ERRORS INVOLVING
  6818. C                 THE EQUAL SIGN.
  6819. C    LEND         LAST NON-BLANK CHARACTER IN LINE(80).
  6820. C    LPAR         '('
  6821.  
  6822. C    PARCNT       0 IF PARENTHESIS ENCOUNTERED BALANCE. INCREASED
  6823. C                 BY 1 FOR EVERY LEFT PARENTHESIS, DECREASED BY
  6824. C                 BY 1 FOR EVERY RIGHT PERENTHESIS FOUND.
  6825. C    RETCD        HOLDS RETURN CODE. 1=O.K.  2=ERROR
  6826. C    RPAR         ')'
  6827. C
  6828. C
  6829. C
  6830. C    MODIFIED    REASON
  6831. C
  6832. C    18-MAY-1981    WHEN CHECKING FOR BALANCED PARENTHESIS, DON'T
  6833. C            INCLUDE THOSE THAT ARE PRECEEDED BY A SINGLE QUOTE
  6834. C            (CODE AT DO 100) (PB)
  6835. C
  6836. C
  6837. C
  6838. C    SUBROUTINE ERRCX (RETCD)
  6839.     InTeGer*4 LEVEL,NONBLK,LEND
  6840.     InTeGer*4 RETCD,PARCNT,VIEWSW,BASED
  6841.     InTeGer*4 I,LAST
  6842. C
  6843.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  6844.     CHARACTER*1 LINE(80)
  6845.     CHARACTER*1 QUOTE
  6846.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  6847.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  6848.     save quote
  6849.     DATA QUOTE/''''/
  6850. C
  6851. C
  6852. C
  6853.     RETCD=1
  6854. C
  6855. C **************************************************
  6856. C ******  MAKE SURE PARENTHESIS ARE BALANCED  ******
  6857. C **************************************************
  6858. C
  6859.     PARCNT=0
  6860.     I=NONBLK
  6861. 4100    CONTINUE
  6862. C    DO 100 I=NONBLK,LEND
  6863. C SKIP VARIABLE NAMES WHICH ARE IN ENCODED FORM
  6864.     IF(ICHAR(LINE(I)).NE.255)GOTO 4101
  6865.     I=I+2
  6866.     GOTO 100
  6867. C AT 100 ADD 1 MORE TO I, SKIPPING CRUFT.
  6868. 4101    CONTINUE
  6869.     IF (LINE(I).EQ.LPAR) GOTO 50
  6870.     IF (LINE(I).EQ.RPAR) GOTO 80
  6871.     GOTO 100
  6872. C
  6873. C ENCOUNTERED A LEFT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  6874. C CHARACTER IS NOT A SINGLE QUOTE
  6875. 50    IF(I.EQ.NONBLK) GOTO 60
  6876.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  6877. 60    PARCNT=PARCNT+1
  6878.     GOTO 100
  6879. C
  6880. C ENCOUNTERED A RIGHT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  6881. C CHARACTER IS NOT A SINGLE QUOTE
  6882. 80    IF(I.EQ.NONBLK) GOTO 90
  6883.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  6884. 90    PARCNT=PARCNT-1
  6885.     IF(PARCNT.LT.0)GOTO 160
  6886. 100    CONTINUE
  6887.     I=I+1
  6888.     IF(I.LE.LEND)GOTO 4100
  6889. C
  6890.     IF (PARCNT.EQ.0) GOTO 200
  6891. C
  6892. C
  6893. C UNBALANCED PARENTHESIS
  6894.     I=6
  6895. 140    CALL ERRMSG(I)
  6896. 150    RETCD=2
  6897.     RETURN
  6898. C
  6899. C
  6900. C ILLEGAL EXPRESSION LIKE ')))X((('
  6901. 160    I=8
  6902.     GOTO 140
  6903. C
  6904. C
  6905. C **************************************************
  6906. C *********   = SIGN SYNTAX CHECK   ****************
  6907. C **************************************************
  6908. C
  6909. 200    CONTINUE
  6910. C
  6911. C
  6912. C  ALLOW A=B=C+2
  6913. C  MAY ONLY ASSIGN VALUES TO SINGLE UNSIGNED VARIABLES.
  6914. C  ALSO CATCH  =A
  6915. C       AND    A==B
  6916. C
  6917. C  LAST    =  0    FIRST CHAR OR FOUND =
  6918. C       1    1 ALPHA CHARACTER
  6919. C       2    MORE THAN 1 ALPHA OR
  6920. C        ENCOUNTERED NON-ALPHA
  6921. C        (BUT NOT = OR BLANK)
  6922. C
  6923. C
  6924.     LAST=0
  6925.     I=NONBLK
  6926. 271    CONTINUE
  6927. C    DO 270 I=NONBLK,LEND
  6928.     IF (LINE(I).EQ.BLANK) GOTO 270
  6929.     IF (LINE(I).EQ.EQ) GOTO 230
  6930. C
  6931. C
  6932. C  LOOK FOR ALPHA
  6933. C    DO 220 J=1,27
  6934. C    IF (LINE(I).EQ.ALPHA(J)) GOTO 240
  6935. C220    CONTINUE
  6936. C LOOK FOR ANY VARIABLE NAME (NOT JUST ALPHA) (GCE)
  6937.     LLND=LEND
  6938.     CALL VARSCN(LINE,I,LLND,LSTCHR,ID1,ID2,IVALID)
  6939.     IF(IVALID.EQ.0) GOTO 220
  6940.     I=LSTCHR
  6941.     IF(LSTCHR.LT.LEND)I=LSTCHR-1
  6942. C IF WE GET A GOOD VARIABLE NAME POINT AT ITS END AND GO SAY WE'RE OK.
  6943.     GOTO 240
  6944. 220    CONTINUE
  6945. C
  6946. C
  6947. C   MORE THAN 1 ALPHA OR ENCOUNTERED NON-ALPHA
  6948. C (BUT NOT = SIGN OR BLANK)
  6949. 225    LAST=2
  6950.     GOTO 270
  6951. C
  6952. C
  6953. C = SIGN ENCOUNTERED
  6954. 230    IF (LAST.EQ.1) GOTO 235
  6955. C
  6956. C ILLEGAL USE OF = SIGN
  6957.     GOTO 290
  6958. C
  6959. C HAD 1 ALPHA CHARACTER FOLLOWED BY = SIGN
  6960. 235    LAST=0
  6961.     GOTO 270
  6962. C
  6963. C ENCOUNTERED A VARIABLE NAME (1 CHARACTER)
  6964. 240    IF (LAST.EQ.2) GOTO 270
  6965.     IF (LAST.EQ.1) GOTO 225
  6966. C
  6967. C
  6968. C EXACTLY 1 ALPHA CHARACTER EITHER AS FIRST CHARACTER
  6969. C ENCOUNTERED OR AS THE 1ST CHARACTER AFTER AN = SIGN.
  6970.     LAST=1
  6971. 270    CONTINUE
  6972.     I=I+1
  6973.     IF(I.LE.LEND) GOTO 271
  6974. C *****&&&&&  SIMULATE DO LOOP TO ALLOW MONKEYING WITH INDEX INSIDE.
  6975. C WHICH IS DONE SO WE CAN HUNT FOR VARIABLES BY NAME...
  6976. C
  6977. C
  6978. C <<<<<<<<<<<< ADD ADDITIONAL CHECKS HERE >>>>>>>>>>
  6979. C
  6980.     RETURN
  6981. C
  6982. C
  6983. C ILLEGAL USE OF = SIGN
  6984. 290    I=17
  6985.     GO TO 140
  6986.     END
  6987. c -h- errmsg.for    Fri Aug 22 13:08:07 1986    
  6988.     SUBROUTINE ERRMSG (IMSG)
  6989. C COPYRIGHT (C) 1983 GLENN EVERHART
  6990. C ALL RIGHTS RESERVED
  6991. C 60=MAX REAL ROWS
  6992. C 301=MAX REAL COLS
  6993. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  6994. C VBLS AND TYPE DIMENSIONED 60,301
  6995. C **************************************************
  6996. C *                                                *
  6997. C *       SUBROUTINE  ERRMSG(MSG)                  *
  6998. C *                                                *
  6999. C **************************************************
  7000. C
  7001. C
  7002. C PRINTS OUT ERROR MESSAGES AS REQUESTED BY CODE IN MSG.
  7003. C
  7004. C ERRMSG IS CALLED BY THE FOLLOWING ROUTINES:
  7005. C
  7006. C AT
  7007. C BASCNG
  7008. C CALBIN
  7009. C CALC
  7010. C CALUN
  7011. C CMND
  7012. C CONTYP
  7013. C DECLR
  7014. C ERRCX
  7015. C INPOST
  7016. C MULADD
  7017. C MULDIV
  7018. C MULMUL
  7019. C NEXTEL
  7020. C POSTVL
  7021. C VAROUT
  7022. C ZNEG
  7023. C
  7024. C
  7025. C    VARIABLE    USE
  7026. C
  7027. C   I         TEMPORARY VARIABLE TO AVOID SIDE-EFFECT WITH CALLS
  7028. C             THAT USE A CONSTANT FOR THE ARGUMENT.
  7029. C   MSG       ERROR MESSAGE CODE.
  7030. C
  7031. C
  7032. C
  7033. C  NOTE: USE CODE 25 FOR UNKNOWN CAUSES.
  7034. C
  7035. C
  7036. C
  7037. C    SUBROUTINE ERRMSG (MSG)
  7038. C
  7039.     InTeGer*4 IMSG,I
  7040.     CHARACTER*20 MSG(27)
  7041.     CHARACTER*8 EMSG
  7042.     save msg
  7043.     DATA EMSG/'*ERROR* '/
  7044.     DATA MSG(1)/'1ST CHAR ILLEGAL   '/
  7045.     DATA MSG(2)/'INDIR.NEST OVFLOW  '/
  7046.     DATA MSG(3)/'UNIDENTIFIED CMND  '/
  7047.     DATA MSG(4)/'ILL CHR IN VBL LIST'/
  7048.     DATA MSG(5)/'VBLS NT SEP W/COMMA'/
  7049.     DATA MSG(6)/'UNBAL PARENTHESIS  '/
  7050.     DATA MSG(7)/'STACK 1 OVERFLOW   '/
  7051.     DATA MSG(8)/'ILLEGAL EXPRESSION '/
  7052.     DATA MSG(9)/'STACK 2 OVERFLOW   '/
  7053.     DATA MSG(10)/'FCN ILL W/INT ARGS '/
  7054.     DATA MSG(11)/'FCN ILL W/MPR ARGS '/
  7055.     DATA MSG(12)/'FCN ILL W/ASCI ARG '/
  7056.     DATA MSG(13)/'FCN ILL W/REAL ARG '/
  7057.     DATA MSG(14)/'SQRT OF NEG NUMBER '/
  7058.     DATA MSG(15)/'MP EXP W/NEG POWER '/
  7059.     DATA MSG(16)/'UNDEFINED VARIABLE '/
  7060.     DATA MSG(17)/'ILL USE OF = SIGN  '/
  7061.     DATA MSG(18)/'UNIDENTIFIED FUNCT '/
  7062.     DATA MSG(19)/'ILLEGAL BASE SPEC  '/
  7063.     DATA MSG(20)/'ILLEGAL CHARACTER  '/
  7064.     DATA MSG(21)/'. OK ONLY W/BASE 10'/
  7065.     DATA MSG(22)/'OVER 19 DIGIT MP NO'/
  7066.     DATA MSG(23)/'DIVIDE BY ZERO ERR '/
  7067.     DATA MSG(24)/'ILL REAL EXP FIELD '/
  7068.     DATA MSG(25)/'WEIRD BUG. CALL GE.'/
  7069.     DATA MSG(26)/'ILLEG CONVERSION   '/
  7070.     DATA MSG(27)/'READ ERROR         '/
  7071. C
  7072. C
  7073.     CALL UVT100(1,1,10)
  7074. C WRITE "*ERROR*" FOLLOWED BY MESSAGE TEXT/
  7075.     CALL SWRT(EMSG,8)
  7076.     I=IMSG
  7077.     IF(I.LE.0.OR.I.GT.27)I=25
  7078.     CALL SWRT(MSG(I),20)
  7079. C
  7080. 99    RETURN
  7081.     END
  7082. c -h- flip.for    Fri Aug 22 13:09:05 1986    
  7083.     SUBROUTINE FLIP (VEC,SIZE,PT)
  7084. C COPYRIGHT (C) 1983 GLENN EVERHART
  7085. C ALL RIGHTS RESERVED
  7086. C 60=MAX REAL ROWS
  7087. C 301=MAX REAL COLS
  7088. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  7089. C VBLS AND TYPE DIMENSIONED 60,301
  7090. C **************************************************
  7091. C *                                                *
  7092. C *         SUBROUTINE FLIP(VEC,SIZE,PT)           *
  7093. C *                                                *
  7094. C **************************************************
  7095. C
  7096. C
  7097. C  FLIPS THE NON-ZERO DIGITS UP TO PT IN VECTOR VEC IN REVERSE
  7098. C  ORDER.  USED TO PLACE NUMBERS IN PROPER ORDER INTO VBLS THAT
  7099. C  HAVE BEEN READ IN HIGH ORDER FIRST.
  7100. C
  7101. C FLIP IS CALLED BY NEXTEL
  7102. C
  7103. C   VARIABLE   USE
  7104. C
  7105. C     H1     TEMPORARILY HOLDS A CHARACTER*1 VALUE
  7106. C     I      INDEXES DIGITS THAT ARE FLIPPED.
  7107. C     K      THE MIDPOINT OF THE FLIPPING ACTION.
  7108. C     PT     HOLDS THE RANGE OF THE FLIPPING ACTION.
  7109. C            (USUALLY THE HIGH ORDER NON-ZERO DIGIT)
  7110. C
  7111. C
  7112. C
  7113. C    SUBROUTINE FLIP (VEC,SIZE,PT)
  7114. C
  7115. C
  7116.     InTeGer*4 SIZE,PT
  7117.     InTeGer*4 K
  7118. C
  7119.     CHARACTER*1 VEC(SIZE), H1
  7120. C
  7121. C
  7122.     K=PT/2
  7123.     IF (K.EQ.0) GOTO 20
  7124.     DO 10 I=1,K
  7125.     H1=VEC(I)
  7126.     VEC(I)=VEC(PT+1-I)
  7127. 10    VEC(PT+1-I)=H1
  7128. 20    RETURN
  7129.     END
  7130. c -h- fname.fms    Fri Aug 22 13:09:16 1986    
  7131.     SUBROUTINE FNAME(LINE,LLAST,INDEXF)
  7132. C RETURN FUNCTION NAME IF ANY
  7133. C IMPLEMENT CODE RECOGNITION ALSO...
  7134. C CODES 230-254 ARE THE FUNCTION NAMES... REPLACE THE 3 BYTES BY 1
  7135. C CODE BYTE TO IMPLEMENT...
  7136. C
  7137.     CHARACTER*1 LINE(110)
  7138. c    EXTERNAL INDX
  7139.     INTEGER*4 FNAM(26)
  7140.     character*4 fnmx(26)
  7141.     equivalence(fnmx(1)(1:1),fnam(1))
  7142.     CHARACTER*1 FCHNM(4,26)
  7143.     EQUIVALENCE(FNAM(1),FCHNM(1,1))
  7144.     save fnmx
  7145.     DATA FNMX/'MIN ','MAX ','AVG ','SUM ','STD ','IF  ',
  7146.      1  'AND ','IOR ','NOT ','CNT ','NPV ','LKP ',
  7147.      2  'LKN ','LKE ','XOR ','EQV ','MOD ','REM ','SGN ','IRR ',
  7148.      3  'RND ','PMT','PVL','AVE','CHS','ATM'/
  7149.     INDEXF=0
  7150.     N1=ICHAR(LINE(1))
  7151. C RECOGNIZE ENCODED VARIABLE NAMES.
  7152.     IF(N1.LT.230.OR.N1.GT.254)GOTO 3000
  7153.     INDEXF=N1-229
  7154.     RETURN
  7155. 3000    CONTINUE
  7156.     DO 1 N1=1,26
  7157.     DO 2 N2=1,3
  7158.     IF(LINE(N2).NE.FCHNM(N2,N1))GOTO 1
  7159. 2    CONTINUE
  7160. C IF WE FALL THROUGH, WE HAVE A VALID FCN NAME INDEX IN INDEXF
  7161.     INDEXF=N1
  7162.     GOTO 3
  7163. 1    CONTINUE
  7164. 3    CONTINUE
  7165.     RETURN
  7166.     END
  7167. c -h- frmedt.ftn    Fri Aug 22 13:09:29 1986    
  7168.     SUBROUTINE FRMEDT(INLIN,LEND)
  7169. C COPYRIGHT 1984 GLENN AND MARY EVERHART
  7170. C ALL RIGHTS RESERVED
  7171. C FORMULA EDIT TO FIND AND EDIT FORMULAS OF FORM
  7172. C    {VAR
  7173. C AND REPLACE THE VARIABLE SPEC BY FORMULA FOR THAT VARIABLE
  7174.     INCLUDE aparms.inc
  7175.     CHARACTER*1 INLIN(110),WRK1(120),WRK2(128)
  7176.     CHARACTER*3 WRK13
  7177.     EQUIVALENCE(WRK13(1:1),WRK1(23))
  7178.     InTeGer*4 RRWACT,RCLACT
  7179. C    COMMON/RCLACT/RRWACT,RCLACT
  7180.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  7181.      1  IDOL7,IDOL8
  7182. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  7183. C     1  IDOL7,IDOL8
  7184.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7185. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7186.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7187. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7188. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  7189. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  7190.     InTeGer*4 KLVL
  7191. C    COMMON/KLVL/KLVL
  7192.     InTeGer*4 IOLVL,IGOLD
  7193. C    COMMON/IOLVL/IOLVL
  7194. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  7195. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  7196.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7197.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7198.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  7199.      3  k3dfg,kcdelt,krdelt,kpag
  7200. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7201. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7202. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  7203. CCC    InTeGer*4 LLCMD,LLDSP
  7204. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7205. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7206. C ADD LOGICAL NAMES IN THE FOLLOWING FASHION, TO BE MANIPULATED
  7207. C HERE ALONE:
  7208. C
  7209. C STORE LOGICAL NAMES, UP TO 16 CHARS, HERE IN AN ARRAY WITH
  7210. C DESIRED ID1,ID2 VALUES OF CELLS TO LOAD. WHERE A {NAME IS SEEN,
  7211. C REPLACE WITH DESIRED CELL ADDRESS.
  7212. C  TO DEFINE LOGICAL NAMES, LOOK FOR = AFTER A NAME. IF = IS SEEN
  7213. C  AFTER THE { CHARACTER, ASSUME IT'S A LINE OF FORM {SALES=AA0
  7214. C  (OR {SALES=00 TO DEASSIGN) AND STORE THE NAME. UP TO THE USER
  7215. C  TO PUT THE DESIRED FORMULA IN AS HE LIKES. MAY USE A TEST STMT
  7216. C  IF DESIRED.
  7217. CCC    CHARACTER*1 NAMARY(20,301)
  7218. C ALLOW AS MANY NAMES AS THERE ARE ROWS... ARBITRARY...
  7219.     InTeGer*4 ICREF,IRREF
  7220. C    COMMON/MIRROR/ICREF,IRREF
  7221.     InTeGer*4 MODPUB,LIMODE
  7222. C    COMMON/MODPUB/MODPUB,LIMODE
  7223.     InTeGer*4 KLKC,KLKR
  7224.     REAL*8 AACP,AACQ
  7225. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7226.     InTeGer*4 NCEL,NXINI
  7227. C    COMMON/NCEL/NCEL,NXINI
  7228.     CHARACTER*1 NAMARY(20,MROWS)
  7229. C    COMMON/NMNMNM/NAMARY
  7230.     InTeGer*4 NULAST,LFVD
  7231. C    COMMON/NULXXX/NULAST,LFVD
  7232.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7233.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7234.     InTeGer*2 NAMNUM(10,MROWS)
  7235.     EQUIVALENCE(NAMARY(1,1),NAMNUM(1,1))
  7236. CCC    COMMON/NMNMNM/NAMARY
  7237. C NAMNUM(9,RCL) AND NAMNUM(10,RCL) ARE RRW AND RCL
  7238. C STORAGE. NAMARY(1-18,RCL) STORES NAME ASCII TEXT (POSSIBLY
  7239. C NULL TERMINATED). FIND CELLS VIA LINEAR SEARCH.
  7240.     SAVE NAMMAX
  7241.     InTeGer*4 NAMMAX
  7242. C NAMMAX IS MAX DIM OF NAMARY THAT'S FILLED IN.
  7243.     EXTERNAL INDX
  7244.     InTeGer*4 LEND
  7245.     save nammax
  7246.     DATA NAMMAX/0/
  7247.     LCNT=0
  7248. 1000    IF(LCNT.GT.20)RETURN
  7249.     KKK=ICHAR('{')
  7250.     I1=INDX(INLIN,KKK)
  7251.     IF(I1.LE.0.OR.I1.GT.70)RETURN
  7252. C ONLY ALLOW IF THERE IS A { CHAR THERE
  7253.     IF(INLIN(I1).NE.'{')RETURN
  7254.     KKK=ICHAR('=')
  7255.     I2=INDX(INLIN,KKK)
  7256.     IF(I2.LE.0.OR.I2.LT.I1.OR.I2.GT.70.OR.INLIN(I2)
  7257.      1  .NE.'=')GOTO 5400
  7258.     IF((I2-I1).LE.1)GOTO 5400
  7259. C HERE SEE AN = SIGN AFTER A {VAR STRING. ATTEMPT TO EVALUATE.
  7260. C GUARANTEED AT LEAST 1 CHARACTER OF NAME.
  7261.     I3=MIN0((I2-I1-1),16)
  7262. c check if * seen ( text would then be  {*= ) for printout
  7263.  
  7264. c of symbol table
  7265.     IF(INLIN(I1+1).NE.'*')GOTO 5600
  7266.     IF(NAMMAX.LE.0)GOTO 5600
  7267.     CALL UVT100(1,LLCMD,1)
  7268.     CALL UVT100(12,2,0)
  7269. C ERASE LINE
  7270.     CALL VWRT('Output File:',12)
  7271.     call vget(wrk1,80)
  7272. c    read(11,5602,end=5419,err=5419)(wrk1(II),II=1,80)
  7273. 5602    format(80a1)
  7274.     DO 5603 N=1,79
  7275.     NN=80-N
  7276.     IF(JCHAR(WRK1(NN)).GT.32)GOTO 5604
  7277.     WRK1(NN)=Char(0)
  7278. 5603    CONTINUE
  7279. 5604    CONTINUE
  7280.     close(8)
  7281.     CALL WASSIG(8,WRK1)
  7282. C OPEN OUTPUT FOR WRITE
  7283. C THEN DUMP SYMBOLS THERE
  7284. C SYMBOL TABLE DUMP CAN BE SAVED ANYWHERE AND REENTERED AS
  7285. C ASSIGNMENT STMTS.
  7286.     WRK1(1)='{'
  7287.     DO 5607 N=2,110
  7288. 5607    WRK1(N)=char(0)
  7289.     WRK1(18)='='
  7290.     DO 5605 N=1,NAMMAX
  7291.     IF(NAMNUM(9,N)+NAMNUM(10,N).LE.0)GOTO 5605
  7292.     DO 5608 NN=1,16
  7293. 5608    WRK1(NN+1)=NAMARY(NN,N)
  7294.     CALL IN2AS(KK,WRK1(19))
  7295.     NAMNUM(9,N)=KK
  7296.     WRITE(WRK13(1:3),5606,ERR=5419)NAMNUM(10,N)-1
  7297. C    ENCODE(3,5606,WRK1(23))NAMNUM(10,N)-1
  7298. 5606    FORMAT(I3)
  7299.     K=3
  7300.     WRK2(1)='T'
  7301.     WRK2(2)='E'
  7302.     WRK2(3)=' '
  7303.     DO 5609 KK=1,106
  7304.     I4=JCHAR(WRK1(KK))
  7305.     IF(I4.LE.32)GOTO 5609
  7306.     K=K+1
  7307.     WRK2(K)=CHAR(I4)
  7308. 5609    CONTINUE
  7309. C WRITE OUT DEFINITIONS AS IF THEY WERE ASSIGMNENT STMTS.
  7310.     WRITE(8,5610)(WRK2(KK),KK=1,K)
  7311. 5610    FORMAT(110A1)
  7312. 5605    CONTINUE
  7313.     CLOSE(8)
  7314.     GOTO 5419
  7315. 5600    CONTINUE
  7316.     LO=I2+1
  7317.     IHI=LO+25
  7318.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  7319. C IF IVLD=0 ASSUME WE'RE UNDEFINING THE SYMBOL
  7320.     IF(IVLD.GT.0)GOTO 5402
  7321. C INVALID SYMBOL. UNDEFINE THE STRING.
  7322.     DO 5403 I4=1,NAMMAX
  7323.     DO 5404 I5=1,I3
  7324. C REQUIRE WHOLE STRING FOR SEARCH.
  7325.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5403
  7326. 5404    CONTINUE
  7327. C GOT IT IF WE FALL THRU
  7328.     NAMNUM(9,I4)=0
  7329.     NAMNUM(10,I4)=0
  7330. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  7331.     DO 5432 I5=1,16
  7332. 5432    NAMARY(I5,I4)=Char(0)
  7333. 5403    CONTINUE
  7334.     GOTO 5419
  7335. 5402    CONTINUE
  7336. C VALID ARRAY ELEMENT, DEFINE IT.
  7337.     IF(NAMMAX.LE.0)GOTO 5406
  7338.     DO 5405 I4=1,NAMMAX
  7339.     IF(NAMNUM(9,I4)+NAMNUM(10,I4).EQ.0)GOTO 5410
  7340. 5405    CONTINUE
  7341.     GOTO 5406
  7342. 5410    CONTINUE
  7343. C GOT IT IF WE FALL THRU
  7344.     NAMNUM(9,I4)=ID1
  7345.     NAMNUM(10,I4)=ID2
  7346. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  7347.     GOTO 5407
  7348. 5406    CONTINUE
  7349.     IF(NAMMAX.LT.0)NAMMAX=0
  7350.     NAMMAX=MIN0(NAMMAX+1,MROWS)
  7351.     NAMNUM(9,NAMMAX)=ID1
  7352.     NAMNUM(10,NAMMAX)=ID2
  7353. C NOW SAVE THE SYMBOL NAME
  7354.     I4=NAMMAX
  7355. 5407    CONTINUE
  7356.     DO 5409 I5=1,16
  7357. 5409    NAMARY(I5,I4)=char(0)
  7358.     DO 5408 I5=1,I3
  7359.     NAMARY(I5,I4)=INLIN(I1+I5)
  7360. 5408    CONTINUE
  7361. C NO FURTHER PROCESSING IF WE DID ANY DEFINITION... JUST EXIT
  7362. 5419    CONTINUE
  7363.     INLIN(1)='%'
  7364. C IF A DEFINITION, JUST PUT SOMETHING INNOCUOUS INTO LINE FOR
  7365. C LATER PROCESSING.
  7366.     DO 5421 I5=2,110
  7367. 5421    INLIN(I5)=char(0)
  7368.     RETURN
  7369. 5400    CONTINUE
  7370. C NOW THAT DEFINITIONS ARE TAKEN CARE OF (IF ANY)
  7371. C HANDLE SYMBOLIC SEARCHES
  7372.     if(nammax.le.0)goto 5505
  7373.     LSTCHR=I1+1
  7374.     DO 5501 I4=1,NAMMAX
  7375.     DO 5502 I5=1,16
  7376.     IF(JCHAR(NAMARY(I5,I4)).LE.47)GOTO 5502
  7377.     IF(JCHAR(INLIN(I1+I5)).LE.47)GOTO 5502
  7378.     LSTCHR=I1+I5+1
  7379.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5501
  7380. CC SKIP OUT IF WE HAVE A TERMINATING CHARACTER IN DEF
  7381. CC AND HAD AT LEAST 1 NONTERMINATING CHAR IN DEFINITION.
  7382. C    IF(JCHAR(NAMARY(1,I4)).GT.47.AND.
  7383. C     1     JCHAR(NAMARY(I5,I4)).LE.47) GOTO 5560
  7384. 5502    CONTINUE
  7385. 5560    CONTINUE
  7386. C IF WE FALL THRU WE HAVE A MATCH
  7387.     ID1=NAMNUM(9,I4)
  7388.     ID2=NAMNUM(10,I4)
  7389. C LAST CHECK: BE SURE WE AREN'T GIVING A DELETED SYMBOL.
  7390.     IF((ID1+ID2).GT.0)GOTO 5500
  7391. 5501    CONTINUE
  7392. 5505    continue
  7393.     LO=I1+1
  7394.     IHI=LO+25
  7395.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  7396.     IF(IVLD.LE.0)RETURN
  7397. 5500    CONTINUE
  7398.     DO 11 N1=1,120
  7399. 11    WRK1(N1)=char(0)
  7400. C HERE HAVE A VALID CONSTRUCT SO REPLACE IT
  7401. C (ONLY ONE PER LINE THIS TIME ROUND)
  7402. C    IRX=(ID2-1)*60+ID1
  7403.     CALL REFLEC(ID2,ID1,IRX)
  7404. C COPY FIRST PART OF FORMULA TO WORK ARRAY
  7405.     LO=I1-1
  7406.     IHI=0
  7407.     IF(LO.LE.0)GOTO 10
  7408.     DO 1 N1=1,LO
  7409.     IHI=N1
  7410.     WRK1(IHI)=INLIN(N1)
  7411. 1    CONTINUE
  7412. 10    CONTINUE
  7413.     IHI=IHI+1
  7414.     CALL WRKFIL(IRX,WRK2,0)
  7415. C WRKFIL READS THE FORMULA INTO WRK2. NEXT FIND END OF TEXT
  7416.     DO 2 N1=1,110
  7417.     LO=111-N1
  7418.     IF(ICHAR(WRK2(LO)).GT.32)GOTO 3
  7419. 2    CONTINUE
  7420. 3    CONTINUE
  7421. C LO NOW IS LENGTH OF FORMULA
  7422.     DO 4 N1=1,LO
  7423.     WRK1(IHI)=WRK2(N1)
  7424.     IF(IHI.LT.110)IHI=IHI+1
  7425. 4    CONTINUE
  7426. C TACK ON ANY MORE TEXT
  7427. C RELY ON INLIN BEING 110 CHARS LONG
  7428.     DO 5 N1=LSTCHR,110
  7429.     WRK1(IHI)=INLIN(N1)
  7430.     IF(IHI.LT.110)IHI=IHI+1
  7431. 5    CONTINUE
  7432. C NOW COPY 110 CHARS BACK TO INLIN
  7433.     DO 6 N1=1,110
  7434. 6    INLIN(N1)=WRK1(N1)
  7435.     DO 7 N1=1,110
  7436.     LO=111-N1
  7437.     IF(ICHAR(INLIN(LO)).GT.32)GOTO 8
  7438. C    INLIN(LO)=CHAR(32)
  7439. 7    CONTINUE
  7440. 8    LEND=LO
  7441.     LCNT=LCNT+1
  7442.     GOTO 1000
  7443. C KEEP LOOKING & RECURSING BUT IMPOSE LIMIT
  7444. C    RETURN
  7445.     END
  7446. c -h- fvldgt.for    Fri Aug 22 13:10:38 1986    
  7447.         SUBROUTINE FVLDGT(ID1,ID2,IVAL)
  7448. C
  7449. C FVLDGT - RETURN FVLD BYTE GIVEN 2 DIMS OF ITS "LOCATION"
  7450.     INCLUDE aparms.inc
  7451.         InTeGer*4 ID1,ID2
  7452.         CHARACTER*1 IVAL
  7453. C NEXT BITMAPS IMPLEMENT FVLD
  7454.     EXTERNAL INDX
  7455.         CHARACTER*1 LBITS(8)
  7456.         COMMON/BITS/LBITS
  7457.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  7458.     CHARACTER*1 FVXX(Imps3)
  7459.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  7460.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  7461.         Common/FVLDM/FVXX
  7462. c        COMMON/FVLDM/FV1,FV2,FV4
  7463. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  7464. C TYPES OF AC'S STORAGE:
  7465.         CHARACTER*1 ITYP(Imp1s)
  7466.         InTeGer*4 IATYP(27),ijnkq
  7467.         COMMON/TYP/IATYP,ITYP,ijnkq
  7468.     InTeGer*4 ICREF,IRREF
  7469. C    COMMON/MIRROR/ICREF,IRREF
  7470.     InTeGer*4 MODPUB,LIMODE
  7471. C    COMMON/MODPUB/MODPUB,LIMODE
  7472.     InTeGer*4 KLKC,KLKR
  7473.     REAL*8 AACP,AACQ
  7474. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7475.     InTeGer*4 NCEL,NXINI
  7476. C    COMMON/NCEL/NCEL,NXINI
  7477.     CHARACTER*1 NAMARY(20,Mrows)
  7478. C    COMMON/NMNMNM/NAMARY
  7479.     InTeGer*4 NULAST,LFVD
  7480. C    COMMON/NULXXX/NULAST,LFVD
  7481.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7482.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7483. CCC    InTeGer*4 ICREF,IRREF
  7484. CCC    COMMON/MIRROR/ICREF,IRREF
  7485. C
  7486. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  7487. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  7488. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  7489. C AREAS WITH DATA.
  7490.     InTeGer*4 DLFG
  7491. C    COMMON/DLFG/DLFG
  7492.     InTeGer*4 KDRW,KDCL
  7493. C    COMMON/DOT/KDRW,KDCL
  7494.     InTeGer*4 DTRENA
  7495. C    COMMON/DTRCMN/DTRENA
  7496.     REAL*8 EP,PV,FV
  7497.     DIMENSION EP(20)
  7498.     INTEGER*4 KIRR
  7499. C    COMMON/ERNPER/EP,PV,FV,KIRR
  7500.     InTeGer*4 LASTOP
  7501. C    COMMON/ERROR/LASTOP
  7502.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  7503. C    COMMON/FMTBFR/FMTDAT
  7504.     CHARACTER*1 EDNAM(16)
  7505. C    COMMON/EDNAM/EDNAM
  7506.     InTeGer*4 MFID(2),MFMOD(2)
  7507. C    COMMON/FRM/MFID,MFMOD
  7508.     InTeGer*4 JMVFG,JMVOLD
  7509. C    COMMON/FUBAR/JMVFG,JMVOLD
  7510.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  7511.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  7512. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  7513. CCC        COMMON/FMTBFR/FMTDAT
  7514.         CHARACTER*1 I1,I2,I4
  7515.     CHARACTER*1 IT1,IT2,IT4,IT8
  7516.     LOGICAL*4 LT1,LT2,LT4,LT8
  7517.     InTeGer*4 KT1,KT2,KT4,KT8
  7518.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  7519.        EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  7520.      1(LT8,IT82(1))
  7521.        EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  7522.      1 (KT8,IT82(1))
  7523. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  7524. C ORDER BYTE WITH EQUIVALENCES
  7525.     EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  7526.      1 (IT82(2),IT8)
  7527.     IF(ID2.GT.0)GOTO 2000
  7528. C TRICK ENTRY USING ID IN FIRST ARG, 0 IN 2ND ARG...
  7529. C TELL XVBLST/XVBLGT ABOUT FV4 STATE (SET BY CALL WITH -4 BYTE ON FVLDST)
  7530.     ID=ID1
  7531.         IBT=((ID-1)/8)+1
  7532.     KT1=ID-1
  7533.     KT2=7
  7534.     KT1=IMASK(KT1,KT2)
  7535. C    LT1=LT1.AND.LT2
  7536.     IBIT=KT1+1
  7537. C        IBIT=((ID-1).AND.7)+1
  7538. C        I1=FV1(IBT).AND.LBITS(IBIT)
  7539. C        I2=FV2(IBT).AND.LBITS(IBIT)
  7540. C        I4=FV4(IBT).AND.LBITS(IBIT)
  7541.     KT1=ICHAR(FV1(IBT))
  7542.     KT2=ICHAR(FV2(IBT))
  7543.     KT4=ICHAR(FV4(IBT))
  7544.     KT8=ICHAR(LBITS(IBIT))
  7545.     KT1=IMASK(KT1,KT8)
  7546. C    LT1=LT1.AND.LT8
  7547.     KT2=IMASK(KT2,KT8)
  7548. C    LT2=LT2.AND.LT8
  7549.     KT4=IMASK(KT4,KT8)
  7550. C    LT4=LT4.AND.LT8
  7551.     I1=CHAR(KT1)
  7552.     I2=CHAR(KT2)
  7553.     I4=CHAR(KT4)
  7554.     IVAL=char(0)
  7555. C RETURN NONZERO IF ANY BITS ARE SET.
  7556.     IF((KT1+KT2+KT4).NE.0)IVAL=char(1)
  7557. C    IF((I1+I2+I4).NE.0)IVAL=1
  7558.     RETURN
  7559. 2000    CONTINUE
  7560. C REFLECT ALL BACK TO PRIME STORAGE REGION
  7561. C        ID=(ID2-1)*60+ID1
  7562.     IF(ID2.EQ.1.AND.ID1.LE.MRC)GOTO 7806
  7563.     CALL REFLEC(ID2,ID1,ID)
  7564.     GOTO 7807
  7565. 7806    CONTINUE
  7566.     ID=ID1
  7567. 7807    IBT=((ID-1)/8)+1
  7568.     KT1=ID-1
  7569.     KT2=7
  7570.     KT1=IMASK(KT1,KT2)
  7571. C    LT1=LT1.AND.LT2
  7572.     IBIT=KT1+1
  7573. C        IBIT=((ID-1).AND.7)+1
  7574. C        I1=FV1(IBT).AND.LBITS(IBIT)
  7575. C        I2=FV2(IBT).AND.LBITS(IBIT)
  7576. C        I4=FV4(IBT).AND.LBITS(IBIT)
  7577.     KT1=ICHAR(FV1(IBT))
  7578.     KT2=ICHAR(FV2(IBT))
  7579.     KT4=ICHAR(FV4(IBT))
  7580.     KT8=ICHAR(LBITS(IBIT))
  7581. C    LT1=LT1.AND.LT8
  7582. C    LT2=LT2.AND.LT8
  7583. C    LT4=LT4.AND.LT8
  7584.     KT1=IMASK(KT1,KT8)
  7585.     KT2=IMASK(KT2,KT8)
  7586.     KT4=IMASK(KT4,KT8)
  7587. C    I1=CHAR(KT1)
  7588. C    I2=CHAR(KT2)
  7589. C    I4=CHAR(KT4)
  7590.         IVL=0
  7591.         IF(KT1.NE.0)IVL=1
  7592.         IF(KT2.NE.0)IVL=IVL+2
  7593.         IF(KT4.NE.0)IVL=-IVL
  7594.         IVAL=CHAR(IVL)
  7595. C READS OFF FVLD BYTE FROM 3 BITS, HIGH ONE IS SIGN. TREAT AS SIGN-
  7596. C MAGNITUDE NUMBER IN RANGE -3 TO +3,
  7597.         RETURN
  7598.         END
  7599. c -h- fvldst.for    Fri Aug 22 13:10:51 1986    
  7600.         SUBROUTINE FVLDST(ID1,ID2,IVAL)
  7601. C
  7602. C FVLDST - SET THE BYTE IN FVLD ARRAY
  7603. C NEXT BITMAPS IMPLEMENT FVLD
  7604.     Include aparms.inc
  7605.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  7606.     CHARACTER*1 FVXX(IMps3)
  7607.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  7608.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  7609.         Common/FVLDM/FVXX
  7610. c        COMMON/FVLDM/FV1,FV2,FV4
  7611.         CHARACTER*1 IVAL
  7612.         CHARACTER*1 LBITS(8)
  7613.     EXTERNAL INDX
  7614.         COMMON/BITS/LBITS
  7615. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  7616. C TYPES OF AC'S STORAGE:
  7617.         CHARACTER*1 ITYP(Imp1s)
  7618.         InTeGer*4 IATYP(27),ijnkq
  7619.         COMMON/TYP/IATYP,ITYP,ijnkq
  7620.     InTeGer*4 ICREF,IRREF
  7621. C    COMMON/MIRROR/ICREF,IRREF
  7622.     InTeGer*4 MODPUB,LIMODE
  7623. C    COMMON/MODPUB/MODPUB,LIMODE
  7624.     InTeGer*4 KLKC,KLKR
  7625.     REAL*8 AACP,AACQ
  7626. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7627.     InTeGer*4 NCEL,NXINI
  7628. C    COMMON/NCEL/NCEL,NXINI
  7629.     CHARACTER*1 NAMARY(20,MRows)
  7630. C    COMMON/NMNMNM/NAMARY
  7631.     InTeGer*4 NULAST,LFVD
  7632. C    COMMON/NULXXX/NULAST,LFVD
  7633.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7634.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7635. CCC    InTeGer*4 ICREF,IRREF
  7636. CCC    COMMON/MIRROR/ICREF,IRREF
  7637. C
  7638. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  7639. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  7640. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  7641. C AREAS WITH DATA.
  7642.     InTeGer*4 DLFG
  7643. C    COMMON/DLFG/DLFG
  7644.     InTeGer*4 KDRW,KDCL
  7645. C    COMMON/DOT/KDRW,KDCL
  7646.     InTeGer*4 DTRENA
  7647. C    COMMON/DTRCMN/DTRENA
  7648.     REAL*8 EP,PV,FV
  7649.     DIMENSION EP(20)
  7650.     INTEGER*4 KIRR
  7651. C    COMMON/ERNPER/EP,PV,FV,KIRR
  7652.     InTeGer*4 LASTOP
  7653. C    COMMON/ERROR/LASTOP
  7654.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  7655. C    COMMON/FMTBFR/FMTDAT
  7656.     CHARACTER*1 EDNAM(16)
  7657. C    COMMON/EDNAM/EDNAM
  7658.     InTeGer*4 MFID(2),MFMOD(2)
  7659. C    COMMON/FRM/MFID,MFMOD
  7660.     InTeGer*4 JMVFG,JMVOLD
  7661. C    COMMON/FUBAR/JMVFG,JMVOLD
  7662.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  7663.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  7664. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  7665.     InTeGer*4 IVV,I1,I2,I3,ITA
  7666.     LOGICAL*4 L2,L1,LVV,LTA
  7667.     EQUIVALENCE(L2,I2),(L1,I1),(LVV,IVV)
  7668.     EQUIVALENCE(LTA,ITA)
  7669. CCC        COMMON/FMTBFR/FMTDAT
  7670. c    CHARACTER*1 IT1,IT2,IT4,IT8
  7671.     LOGICAL*4 LT1,LT2,LT4,LT8
  7672.     InTeGer*4 KT1,KT2,KT4,KT8,KW1,KW2
  7673.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  7674.     EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  7675.      1  (LT8,IT82(1))
  7676.     EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  7677.      1  (KT8,IT82(1))
  7678. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  7679. C ORDER BYTE WITH EQUIVALENCES
  7680. C    EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  7681. C     1  (IT82(2),IT8)
  7682. C        CHARACTER*1 I4
  7683.     IF(ID2.EQ.1.AND.ID1.LE.MRC)GOTO 7806
  7684. C ALLOW DELIBERATE CALL WITH EFFECTIVELY ONE ARG.
  7685. 7807    CALL REFLEC(ID2,ID1,ID)
  7686.     GOTO 7808
  7687. 7806    CONTINUE
  7688. C        ID=(ID2-1)*60+ID1
  7689.     ID=ID1
  7690. 7808    IBT=((ID-1)/8)+1
  7691.     KT1=ID-1
  7692.     KT2=7
  7693.     KT1=IMASK(KT1,KT2)
  7694. C    LT1=LT1.AND.LT2
  7695.     IBIT=KT1+1
  7696. C        IBIT=((ID-1).AND.7)+1
  7697. C ZERO ALL 3 FVLD BITS FIRST
  7698. C        FV1(IBT)=FV1(IBT).AND..NOT.LBITS(IBIT)
  7699. C        FV2(IBT)=FV2(IBT).AND..NOT.LBITS(IBIT)
  7700. C        FV4(IBT)=FV4(IBT).AND..NOT.LBITS(IBIT)
  7701.     KT1=ICHAR(FV1(IBT))
  7702.     KT2=ICHAR(FV2(IBT))
  7703.     KT4=ICHAR(FV4(IBT))
  7704.     KT8=ICHAR(LBITS(IBIT))
  7705.     ITA=-KT8-1
  7706. C ITA IS NOW THE COMPLEMENT OF KT8
  7707. C THUS, THE SELECTED BIT IS OFF IN IT, ALL OTHERS ON.
  7708. C    LT1=LT1.AND.LTA
  7709. C    LT2=LT2.AND.LTA
  7710. C    LT4=LT4.AND.LTA
  7711.     KT1=IMASK(KT1,ITA)
  7712.     KT2=IMASK(KT2,ITA)
  7713.     KT4=IMASK(KT4,ITA)
  7714. C FILL IN ALL 3 BITMAPS WITH THEIR PREVIOUS CONTENTS EXCEPT THE
  7715. C CHOSEN BITS.
  7716.     FV1(IBT)=CHAR(KT1)
  7717.     FV2(IBT)=CHAR(KT2)
  7718.     FV4(IBT)=CHAR(KT4)
  7719.     IVVV=JCHAR(IVAL)
  7720.         IVV=IABS(IVVV)
  7721.         I3=0
  7722.         IF(IVVV.LT.0)I3=1
  7723. C    I1=1
  7724. C    I2=2
  7725.     KW2=2
  7726.     KW1=1
  7727.     I2=IMASK(IVV,KW2)
  7728.     I1=IMASK(IVV,KW1)
  7729. C        L2=LVV.AND.L2
  7730. C        L1=LVV.AND.L1
  7731. C NOTE WE ASSUME HEAVILY THAT LOGICAL OPERATIONS WORK BY BINARY
  7732. C ANDS AND ORS IN DATA.
  7733. C ** NOTE WE DON'T NEED TO RELOAD THE KT1 THRU KT4 INTEGERS... ALL ALREADY
  7734. C ARE LOADED... DITTO KT8
  7735. C    KT1=ICHAR(FV1(IBT))
  7736. C    KT2=ICHAR(FV2(IBT))
  7737. C    KT4=ICHAR(FV4(IBT))
  7738. C    KT8=ICHAR(LBITS(IBIT))
  7739.     LT1=LT1.OR.LT8
  7740.     LT2=LT2.OR.LT8
  7741.     LT4=LT4.OR.LT8
  7742. ccc    kt1=ior(kt1,kt8)
  7743. ccc    kt2=ior(kt2,kt8)
  7744. ccc    kt4=ior(kt4,kt8)
  7745. C        IF(I1.NE.0)FV1(IBT)=FV1(IBT).OR.LBITS(IBIT)
  7746. C        IF(I2.NE.0)FV2(IBT)=FV2(IBT).OR.LBITS(IBIT)
  7747. C        IF(I3.NE.0)FV4(IBT)=FV4(IBT).OR.LBITS(IBIT)
  7748.         IF(I1.NE.0)FV1(IBT)=CHAR(KT1)
  7749.         IF(I2.NE.0)FV2(IBT)=CHAR(KT2)
  7750.         IF(I3.NE.0)FV4(IBT)=CHAR(KT4)
  7751.         RETURN
  7752.         END
  7753. c -h- fvpeek.fms    Fri Aug 22 13:11:27 1986    
  7754. C DUMMY FVPEEK
  7755.     SUBROUTINE FVPEEK(ID1,ID2,IGO)
  7756.     InTeGer*4 ID1,ID2,IGO
  7757.     IGO=ID1
  7758.     RETURN
  7759.     END
  7760. c -h- getfnl.for    Fri Aug 22 13:12:09 1986    
  7761.     SUBROUTINE GETFNL(LINE,LSKP,LLEN)
  7762. C PARSE OUT FILENAME AND GET LSKP, LLEN NUMBERS
  7763.     EXTERNAL INDX
  7764.     CHARACTER*1 LINE(80)
  7765.     InTeGer*4 LSKP,LLEN,LO,HI
  7766.     LSKP=0
  7767.     LLEN=32000
  7768. C SET INITIAL NUMBERS TO READ WHOLE FILE
  7769.     KKK=ICHAR(',')
  7770.     N=INDX(LINE,KKK)
  7771.     IF(N.LE.0.OR.N.GT.78)RETURN
  7772. C IF CANNOT FIND COMMA, JUST SKIP OUT & TRY TO CATCH ERRORS ON OPEN.
  7773.     LINE(N)=char(0)
  7774. C NULL TERMINATE FILENAME
  7775.     LO=N+1
  7776.     HI=LO+20
  7777.     CALL GN(LO,HI,LSKP,LINE)
  7778.     LO=N+1
  7779.     KKK=ICHAR(',')
  7780.     N=INDX(LINE(LO),KKK)
  7781.     IF(N.LE.0.OR.N.GT.30)RETURN
  7782.     LO=LO+N
  7783.     HI=LO+20
  7784.     CALL GN(LO,HI,LLEN,LINE)
  7785. C SHOULD HAVE NUMBERS NOW
  7786.     RETURN
  7787.     END
  7788. c -h- getlog.for    Fri Aug 22 13:12:16 1986    
  7789.     SUBROUTINE GETLOG(LINE,LMX,LOGTYP,LASST)
  7790.     CHARACTER*1 LINE(110)
  7791.     EXTERNAL INDX
  7792.     CHARACTER*1 LFN(4,6)
  7793.     CHARACTER*4 XLF(6)
  7794.     INTEGER*4 LF(6)
  7795.     EQUIVALENCE(XLF(1)(1:1),LF(1),LFN(1,1))
  7796. C    EQUIVALENCE(LF(1),LFN(1,1))
  7797.     save xlf
  7798.     DATA XLF/'.GT.','.LT.','.EQ.','.NE.','.GE.','.LE.'/
  7799. C LOGTYP RELATIONSHIP TO RELATIONSHIPS OF 2 VARIABLES
  7800. C IS DEFINED IN ABOVE DATA STMT.
  7801. C IF LINE CONTAINS STRING IN NAME, RETURN TYPE AND END LOC.
  7802.     LMX4=LMX-3
  7803.     DO 100 LL=1,6
  7804.     LOGTYP=LL
  7805.     DO 1 N1=1,LMX4
  7806.     IF(LINE(N1  ).NE.LFN(1,LL))GOTO 2
  7807.     IF(LINE(N1+1).NE.LFN(2,LL))GOTO 2
  7808.     IF(LINE(N1+2).NE.LFN(3,LL))GOTO 2
  7809.     IF(LINE(N1+3).NE.LFN(4,LL))GOTO 2
  7810. C HERE HAVE A MATCH
  7811.     LASST=N1
  7812. C RETURN LOC OF NEXT CHAR AFTER RELATION.
  7813.     GOTO 200
  7814. 2    CONTINUE
  7815. 1    CONTINUE
  7816. 100    CONTINUE
  7817.     LOGTYP=0
  7818. 200    CONTINUE
  7819.     RETURN
  7820.     END
  7821. c -h- getnnb.for    Fri Aug 22 13:13:44 1986    
  7822.     SUBROUTINE GETNNB(IPT,RETCD)
  7823. C COPYRIGHT (C) 1983 GLENN EVERHART
  7824. C ALL RIGHTS RESERVED
  7825. C 60=MAX REAL ROWS
  7826. C 301=MAX REAL COLS
  7827. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  7828. C VBLS AND TYPE DIMENSIONED 60,301
  7829. C **************************************************
  7830.  
  7831. C *                                                *
  7832. C *         SUBROUTINE GETNNB(IPT,RETCD)           *
  7833. C *                                                *
  7834. C **************************************************
  7835. C
  7836. C
  7837. C  GET NEXT NON-BLANK ELEMENT FROM LINE STARTING AT NONBLK+1
  7838. C
  7839. C  RETCD =  1   O.K.
  7840. C        2   NO NON-BLANK FOUND
  7841. C
  7842. C  IPT POINTS TO POSITION IN LINE WHERE NEXT NON-BLANK IS FOUND.
  7843. C  IT IS UP TO CALLING PROGRAM TO RESET NONBLK FOR NEXT SCAN.
  7844. C
  7845. C
  7846. C
  7847. C GETNNB IS CALLED BY
  7848. C
  7849. C AT
  7850. C BASCNG
  7851. C CMND
  7852. C NEXTEL
  7853. C STRCMP
  7854. C
  7855. C
  7856. C   VARIABLE    USE
  7857. C
  7858. C    BLANK      ' '
  7859. C    IPT        RETURNS POSITION OF NEXT NON-BLANK.
  7860. C    K          HOLDS TEMPORARY VALUES.
  7861. C    LEND       LAST NON-BLANK IN LINE(80).
  7862. C    NONBLK     HOLDS CHARACTER TO LEFT OF THE START OF THE SCAN.
  7863. C    RETCD      HOLDS THE RETURN CODE. 1=O.K.  2=THE REST IS BLANKS.
  7864. C
  7865. C
  7866. C    SUBROUTINE GETNNB(IPT,RETCD)
  7867. C
  7868. C
  7869.     InTeGer*4 IPT
  7870.     InTeGer*4 LEVEL,NONBLK,LEND
  7871.     InTeGer*4 VIEWSW,BASED,RETCD
  7872.     InTeGer*4 K
  7873. C
  7874.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  7875. C
  7876.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  7877.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  7878. C
  7879.     RETCD=1
  7880.     IF (NONBLK.GE.LEND) GOTO 999
  7881. C
  7882. C AT LEAST 1 NON-BLANK EXISTS.
  7883.     K=NONBLK+1
  7884.     DO 10 IPT=K,LEND
  7885.     IF (LINE(IPT).NE.BLANK) GOTO 1000
  7886. 10    CONTINUE
  7887. C
  7888. C
  7889. C ACTUALLY, SHOULD NEVER FALL THROUGH IF 'LEND' IS SET CORRECTLY.
  7890. C
  7891. C
  7892. C THE REST ARE BLANKS
  7893. 999    RETCD=2
  7894. 1000    RETURN
  7895.     END
  7896. c -h- getttl.for    Fri Aug 22 13:14:41 1986    
  7897.     SUBROUTINE GETTTL(LINE)
  7898.     Include aparms.inc
  7899.     CHARACTER*1 LINE(132)
  7900.     CHARACTER*3 FNAME
  7901.     CHARACTER*1 FN(3)
  7902.     EQUIVALENCE (FN(1),FNAME(1:1))
  7903.     InTeGer*4 IBBX
  7904.     InTeGer*4 ICREF,IRREF
  7905. C    COMMON/MIRROR/ICREF,IRREF
  7906.     InTeGer*4 MODPUB,LIMODE
  7907. C    COMMON/MODPUB/MODPUB,LIMODE
  7908.     InTeGer*4 KLKC,KLKR
  7909.     REAL*8 AACP,AACQ
  7910. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  7911.     InTeGer*4 NCEL,NXINI
  7912. C    COMMON/NCEL/NCEL,NXINI
  7913.     CHARACTER*1 NAMARY(20,MRows)
  7914. C    COMMON/NMNMNM/NAMARY
  7915.     InTeGer*4 NULAST,LFVD
  7916. C    COMMON/NULXXX/NULAST,LFVD
  7917.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  7918.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  7919. CCC    COMMON/MODPUB/MODPUB,LIMODE
  7920. C MODPUB = MODE USED IN CMD MODE GTMODE ROUTINE
  7921.     InTeGer*4 RRWACT,RCLACT
  7922. C    COMMON/RCLACT/RRWACT,RCLACT
  7923.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  7924.      1  IDOL7,IDOL8
  7925. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  7926. C     1  IDOL7,IDOL8
  7927.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7928. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7929.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7930. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  7931. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  7932. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  7933.     InTeGer*4 KLVL
  7934. C    COMMON/KLVL/KLVL
  7935.     InTeGer*4 IOLVL,IGOLD
  7936. C    COMMON/IOLVL/IOLVL
  7937. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  7938. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  7939.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7940.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7941.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  7942.      3  k3dfg,kcdelt,krdelt,kpag
  7943. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  7944. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  7945. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  7946. CCC    InTeGer*4 LLCMD,LLDSP
  7947. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  7948. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  7949. C LIMODE IS WHAT GETS SET UP IN /# CMND
  7950.     IBBX=0
  7951. C
  7952. C CODE FOR FORTRAN READ...
  7953. C  **** HERE IS THE SECTION OF CODE YOU NEED FOR NON-VMS-SPECIFIC VERSION
  7954. C NOTE READS UNIT 0 TO GET CONSOLE.
  7955. C CHECK THAT WE'RE READING CONSOLE. IF LUN 5 IS OFF CONSOLE, THEN
  7956. C READ USING DIRECT DOS CALLS.
  7957. C  IF (STILL) IN AN INITIALIZER FILE, READ USING REGULAR FORTRAN READS
  7958. C AND ACT NORMALLY.
  7959. C  DISCOVER CONSOLE BECAUSE FILENAME IS 'CON:' OR 'CON'.
  7960. CC    INQUIRE(UNIT=5,NAME=FNAME)
  7961. CC    IF (FN(1).NE.'C'.OR.FN(2).NE.'O'.OR.FN(3).NE.'N')
  7962. CC     1 GOTO 5000
  7963. C CALL ASSEMBLER ROUTINE TO GET CHARACTERS.
  7964.     DO 5001 N=1,132
  7965. 5001    LINE(N)=CHAR(0)
  7966. C FIX IT UP SO A NULL LINE LOOKS HARMLESS...
  7967.     LINE(1)=' '
  7968. C NULL THE LINE FIRST IN FORTRAN; MAKES IT EASIER TO DO ASSEMBLER STUFF.
  7969.     CALL TTYIN(MODPUB,LINE)
  7970.     IF(LINE(1).NE.'/')GOTO 5540
  7971. C DISPLAY HELP MSG AT BOTTOM
  7972.     IF(MODPUB.EQ.0)GOTO 5540
  7973. C ONLY DISPLAY IF IN "AUTOENTER" MODE
  7974. c    CALL UVT100(1,LLDSP,1)
  7975. c    CALL SWRT('Add,Cpy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set',46)
  7976. c    CALL SWRT(',Tst,View,Wrt,Xit,Zap,/,Help',28)
  7977. c    CALL UVT100(1,LLCMD,11)
  7978. C CALL TTYIN NEXT WITH 0 SO / ISN'T TERMINATOR.
  7979. c    N=0
  7980. C    CALL TTYIN(N,LINE(2))
  7981. 5540    CONTINUE
  7982.     IF(ICHAR(LINE(1)).EQ.26)
  7983.      1  GOTO 2000
  7984. C Add,Copy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set,Test,View,Wrt,Xit,Zap,Help,/
  7985. C READ IN AFTER CLOSE AND RE-OPEN IF WE GET EOF ON INPUT SIGNALLED
  7986. C BY CONTROL Z.
  7987. C ASSUME WE'LL USE DOS FUNCTION 1 FOR READIN AND ECHO
  7988. C AND THEN END THE READIN AFTER FIRST CONTROL SEQUENCE.
  7989. C    GOTO 6000
  7990. C5000    CONTINUE
  7991. C    READ(5,1000,END=2000,ERR=2000)LINE
  7992. 1000    FORMAT(132A1)
  7993. 6000    CONTINUE
  7994. CC    IF(ICHAR(LINE(1)).NE.0)RETURN
  7995. CCC IF WE GET 0 MAYBE IT'S AN EXTENDED CODE. TRY RETURNING A HASHED
  7996. CCC VALUE HERE. USE __{CELL WHERE CELL IS A FOLLOWED BY (B+CODE) WHERE
  7997. CC CODE IS THE VALUE RETURNED...
  7998. CC    LINE(5)=CHAR(ICHAR(LINE(2))+66-59)
  7999. CC EXTENDED CODES WE CARE ABOUT START AT 59.
  8000. CC MAP INTO EXTENDED AC'S STARTING AT AB SINCE AA IS THE SAME AS % ACCUMULATOR
  8001. CC WHICH CAN'T BE REASSIGNED THIS WAY.
  8002. C    LINE(5)=CHAR(ICHAR(LINE(2))+7)
  8003. C    LINE(1)='_'
  8004. C    LINE(2)='_'
  8005. C    LINE(3)='{'
  8006. C    LINE(4)='A'
  8007. C
  8008. C WE SHOULD "KNOW" COORDS HERE DESIRED...
  8009. C THEY RUN FROM B TO Z...IMPLYING ID1=28 THRU 53
  8010. CC    II=ICHAR(LINE(5))-66+28
  8011. C    II=ICHAR(LINE(5))-38
  8012. C SCREEN OUT EXTRA JUNK THAT WOULD COME FROM HIGH FUNCT CODES...
  8013. C (DON'T BOTHER MAPPING A<Z+1> TO BA AND SO ON... ONLY 6
  8014. C KEYS IN USABLE RANGE ANYHOW...
  8015. C    IF(II.GT.52)GOTO 1200
  8016. C    III=1
  8017. C    CALL FVLDGT(II,III,IBBX)
  8018. C    IF(IBBX.EQ.0)GOTO 1200
  8019. C SKIP OVER CELLS THAT ARE EMPTY.
  8020. C
  8021. C NULL OUT REMAINDER OF THE LINE TO AVOID CONFUSION HERE.
  8022. C NOTE WE ONLY DO THIS WHERE WE SAW AN INITIAL NULL INDICATING AN
  8023. C EXTENDED FUNCTION INPUT.
  8024. C    IBBX=6
  8025. C    GOTO 1201
  8026. C1200    IBBX=1
  8027. C1201    CONTINUE
  8028. C    DO 1100 N=IBBX,132
  8029. C1100    LINE(N)=CHAR(0)
  8030.     RETURN
  8031. 2000    CONTINUE
  8032. c    CLOSE(18)
  8033.     IOLVL=11
  8034. c    OPEN(18,FILE='CON:20/40/150/150/Analy Command Input')
  8035.     CLOSE(3)
  8036. CC RETRY A READ AFTER EOF...
  8037.     Call vget(line,80)
  8038. c    READ(11,1000,END=4000,ERR=4000)LINE
  8039. c    rewind 11
  8040.     RETURN
  8041. 4000    CONTINUE
  8042. CC IF WE KEEP GETTING ERRORS, JUST QUIT.
  8043. CC AT LEAST STAY AROUND. USER CAN DO @\DEV\CON
  8044. CC TO PARTLY RECOVER...
  8045. C    STOP
  8046. C TRY TO RESET TTY EOF
  8047. C *********
  8048.     RETURN
  8049.     END
  8050. c -h- gmadd.for    Fri Aug 22 13:16:31 1986    
  8051.     SUBROUTINE GMADD(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  8052. C MODIFIED FOR PCCPC
  8053.     Include aparms.inc
  8054. C      SUBROUTINE GMADD(A,B,R,N,M)
  8055.        REAL*8 A,B,R
  8056.        DIMENSION A(1),B(1),R(1)
  8057. C      NM=N*M
  8058.     IAB=(IA2-1)*MCols+IA1-1
  8059.     IBB=(IB2-1)*MCols+IB1-1
  8060.     IRB=(IR2-1)*MCols+IR1-1
  8061.       DO 10 I=1,N
  8062.       DO 10 J=1,M
  8063.     IJ=(I-1)*MCols+J
  8064.     CALL XVBLGT(IJ+IAB,0,A)
  8065.     CALL XVBLGT(IJ+IBB,0,B)
  8066.     R(1)=A(1)+B(1)
  8067.     CALL XVBLST(IJ+IRB,0,R)
  8068. 10    CONTINUE
  8069. C   10 R(IJ)=A(IJ)+B(IJ)
  8070.       RETURN
  8071.       END
  8072. c -h- gmprd.for    Fri Aug 22 13:16:31 1986    
  8073.     SUBROUTINE GMPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  8074.     Include aparms.inc
  8075. C      SUBROUTINE GMPRD(A,B,R,N,M,L)
  8076.     REAL*8 A,B,R
  8077.         DIMENSION A(1),B(1),R(1)
  8078. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  8079.     IAB=(IA2-1)*MCols+IA1-1
  8080.     IBB=(IB2-1)*MCols+IB1-1
  8081.     IRB=(IR2-1)*MCols+IR1-1
  8082.     DO 10 K=1,L
  8083.     DO 10 J=1,M
  8084.     NL=(J-1)*MCols+K
  8085.     R(1)=0.
  8086.     CALL XVBLST(IRB+NL,0,R)
  8087.     DO 10 I=1,N
  8088.     NM=(J-1)*MCols+I
  8089.     ML=(I-1)*MCols+K
  8090.     CALL XVBLGT(IAB+NM,0,A)
  8091.     CALL XVBLGT(IBB+ML,0,B)
  8092.     A(1)=A(1)*B(1)
  8093.     CALL XVBLGT(IRB+NL,0,R)
  8094.     R(1)=R(1)+A(1)
  8095. 10    CALL XVBLST(IRB+NL,0,R)
  8096. C    R(NL)=R(NL)+A(NM)*B(ML)
  8097. C10    CONTINUE
  8098.       RETURN
  8099.       END
  8100. c -h- gmsub.for    Fri Aug 22 13:16:31 1986    
  8101.     SUBROUTINE GMSUB(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  8102. C      SUBROUTINE GMSUB(A,B,R,N,M)
  8103.     Include aparms.inc
  8104.     REAL*8 A,B,R
  8105.     IAB=(IA2-1)*MCols+IA1-1
  8106.     IBB=(IB2-1)*MCols+IB1-1
  8107.     IRB=(IR2-1)*MCols+IR1-1
  8108. C      NM=N*M
  8109.       DO 10 I=1,N
  8110.       DO 10 J=1,M
  8111.       IJ=(I-1)*MCols+J
  8112.     CALL XVBLGT(IAB+IJ,0,A)
  8113.     CALL XVBLGT(IBB+IJ,0,B)
  8114.     A=A-B
  8115.     CALL XVBLST(IRB+IJ,0,A)
  8116. 10    CONTINUE
  8117. C   10 R(IJ)=A(IJ)-B(IJ)
  8118.       RETURN
  8119.       END
  8120. c -h- gmtx.for    Fri Aug 22 13:16:31 1986    
  8121.     SUBROUTINE GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  8122.      1  ID2B,RETCD)
  8123.     CHARACTER*1 LINE(80)
  8124.     integer retcd
  8125. C REQ END MTX NAME IN 20 CHARS.
  8126. C SHOULD BE OK
  8127.     LEND=IBGN+20
  8128. C GET LOC OF MATRIX A (MUST BE SQUARE)
  8129.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  8130.     IF(IVALID.EQ.0)GOTO 300
  8131.     IF(LINE(LSTCHR).NE.':')GOTO 300
  8132.     IBGN=LSTCHR+1
  8133.     LEND=IBGN+20
  8134.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  8135.     IF(IVALID.EQ.0)GOTO 300
  8136. 1000    RETURN
  8137. 300    RETCD=3
  8138.     RETURN
  8139.     END
  8140. c -h- gn.for    Fri Aug 22 13:16:49 1986    
  8141.     SUBROUTINE GN(LAST,LEND,NUM,LINE)
  8142.     IMPLICIT InTeGer*4(A-Z)
  8143. C    PARAMETER 1=1,14=14
  8144.     DIMENSION LINE(110)
  8145.     CHARACTER*1 LINE
  8146.     EXTERNAL INDX
  8147.     CHARACTER*1 NCH
  8148.     InTeGer*4 CH,SFG
  8149.     NUM=0
  8150.     JSSF=0
  8151.     ISSF=0
  8152.     CH=0
  8153.     SFG=1
  8154.     NCH=char(0)
  8155.     DO 1 N=LAST,LEND
  8156.     M=N
  8157.     NCH=LINE(N)
  8158.     CH=ICHAR(NCH)
  8159.     IF(CH.EQ.0)GOTO 2
  8160.     IF(CH.EQ.45)SFG=-1
  8161. C SFG=SIGN FLAG
  8162. C 43 IS ASCII FOR +; 45 IS ASCII FOR - SIGN.
  8163. C IGNORE + SIGNS
  8164.     IF(CH.GT.32)ISSF=ISSF+1
  8165.     IF(ISSF.EQ.0.AND.CH.EQ.32)GOTO 1
  8166. C IGNORE SPACES TOO, PROVIDED THEY ARE LEADING SPACES.
  8167. C (OTHERS MAY BE DELIMITERS.)
  8168.     IF(CH.EQ.43.OR.CH.EQ.45)JSSF=JSSF+1
  8169.     IF(JSSF.GT.1.AND.(CH.EQ.43.OR.CH.EQ.45))GOTO 2
  8170. C IF WE HAVEN'T SEEN A +/- PROCESS IT HERE.
  8171.     IF(CH.EQ.43)GOTO 1
  8172.     IF(CH.EQ.45)GOTO 1
  8173.     IF(CH.LT.48.OR.CH.GT.57)GOTO 2
  8174. C TERMINATE ON ANY NON NUMERIC. SHOULD ALLOW TERMINATE ON SECOND #.
  8175.     IF(NUM.LT.3100)NUM=10*NUM+(CH-48)
  8176. 1    CONTINUE
  8177. C NEXT LINE WAS MAX0...
  8178. 2    LAST=MIN0(M,LEND)
  8179.     NUM=NUM*SFG
  8180. C ACCOUNTED FOR SIGN; NOW RETURN
  8181.     RETURN
  8182.     END
  8183. c -h- gtmung.for    Fri Aug 22 13:17:12 1986    
  8184.     SUBROUTINE GTMUNG(LINE)
  8185.     Include aparms.inc
  8186.     CHARACTER*1 LINE(132)
  8187.     InTeGer*4 IMODE
  8188.     CHARACTER*1 C2
  8189.     InTeGer*4 ICREF,IRREF
  8190. C    COMMON/MIRROR/ICREF,IRREF
  8191.     InTeGer*4 MODPUB,LIMODE
  8192. C    COMMON/MODPUB/MODPUB,LIMODE
  8193.     InTeGer*4 KLKC,KLKR
  8194.     REAL*8 AACP,AACQ
  8195. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  8196.     InTeGer*4 NCEL,NXINI
  8197. C    COMMON/NCEL/NCEL,NXINI
  8198.     CHARACTER*1 NAMARY(20,MRows)
  8199. C    COMMON/NMNMNM/NAMARY
  8200.     InTeGer*4 NULAST,LFVD
  8201. C    COMMON/NULXXX/NULAST,LFVD
  8202.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  8203.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  8204. CCC    COMMON/MODPUB/MODPUB,LIMODE
  8205.     save imode
  8206.     DATA IMODE/0/
  8207. C HANDLE EXTRA MODE PARSING...DEFAULT,TO AVOID ENTER CMD IF NOT NEEDED.
  8208.     I=ICHAR(LINE(1))
  8209.     IF(I.LT.34.OR.I.GT.122)GOTO 6000
  8210.     IF(I.EQ.42)GOTO 6000
  8211. C ASSUME OTHER REASONABLE CHARS ARE CMDS
  8212.     IF(I.GT.34.AND.I.LT.40)GOTO 6000
  8213.     IF(I.EQ.95)GOTO 6000
  8214.     IF(I.GE.58.AND.I.LE.64)GOTO 6000
  8215.     IF(LINE(1).NE.'/')GOTO 100
  8216.     IF(LINE(2).NE.'/')GOTO 110
  8217. C SETUP OLD MODE WITH //
  8218.     IMODE=0
  8219.     GOTO 900
  8220. 110    CONTINUE
  8221.     IF(LINE(2).NE.';')GOTO 120
  8222. C SETUP NEW MODE WITH /;
  8223.     IMODE=1
  8224.     GOTO 900
  8225. 120    CONTINUE
  8226.     IF(LINE(2).NE.'#')GOTO 124
  8227. C SWAP OLD, CURRENT MODES
  8228. C USE IN CMD FILES SO /# SWAPS MODES, THEN // SETS OLD MODE,
  8229. C THEN /# SWAPS BACK
  8230. C (THAT WAY, USER'S MODE DOESN'T CHANGE.)
  8231.     I=LIMODE
  8232.     LIMODE=IMODE
  8233.     IMODE=I
  8234.     GOTO 900
  8235. 124    CONTINUE
  8236.     IF(IMODE.EQ.0)GOTO 6000
  8237. C IF WE JUST SAW /COMMAND, MUNGE OUT THE INITIAL /
  8238.     DO 130 I=1,131
  8239. 130    LINE(I)=LINE(I+1)
  8240.     GOTO 6000
  8241. 100    CONTINUE
  8242.     IF(IMODE.EQ.0)GOTO 6000
  8243. C INPUT DIDN'T START WITH / SO TRY AND MAKE UP AN ENTER
  8244.     IF(LINE(2).EQ.'&')GOTO 6000
  8245. C 1& 2& ETC WORK STILL AS CURSOR CONTROLS
  8246.     C2='N'
  8247.     IF(LINE(1).EQ.'"')C2='"'
  8248. C    IF(LINE(1).GE.'0'.AND.LINE(1).LE.'9')C2='V'
  8249.     IF(LINE(1).LT.'0'.OR.LINE(1).GT.'9')GOTO 170
  8250. C INITIAL CHAR IS A DIGIT. IF 2ND CHAR IS ALSO A DIGIT OR
  8251. C SOMETHING REASONABLE THEN TREAT AS "EV" CMD. OTHERWISE
  8252. C JUST PASS AS A COMMAND SO CURSOR CTLS WORK STILL.
  8253.     IF(LINE(2).LE.' ')GOTO 6000
  8254. C ALLOW DIGIT FOLLOWED BY SPACE OR C.R. TO BE JUST CURSOR MOVE
  8255.     C2='V'
  8256. 170    CONTINUE
  8257. C MOVE DOWN PAST 'EV'
  8258.     II=3
  8259. C ALLOW US TO REMOVE INITIAL " IN E" CASE...
  8260.     IF(C2.EQ.'"')II=2
  8261.     DO 150 I=1,129
  8262.     M=133-I
  8263.     MM=M-II
  8264. 150    LINE(M)=LINE(MM)
  8265.     LINE(1)='E'
  8266.     LINE(2)=C2
  8267.     LINE(3)=' '
  8268.     GOTO 6000
  8269. 900    LINE(1)='*'
  8270. C MAKE COMMENT, THEN GO
  8271. 6000    CONTINUE
  8272. C MAINTAIN MODE FOR REST OF WORLD
  8273.     MODPUB=IMODE
  8274.     RETURN
  8275.     END
  8276. c -h- gtprd.for    Fri Aug 22 13:17:12 1986    
  8277.     SUBROUTINE GTPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  8278.     Include aparms.inc
  8279.     REAL*8 A,B,R
  8280.       DIMENSION A(1),B(1),R(1)
  8281. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  8282.     IAB=(IA2-1)*MCols+IA1-1
  8283.     IBB=(IB2-1)*MCols+IB1-1
  8284.     IRB=(IR2-1)*MCols+IR1-1
  8285.     DO 10 K=1,L
  8286.     DO 10 J=1,M
  8287.     NL=(J-1)*MCols+K
  8288.     R(1)=0.
  8289.     CALL XVBLST(NL+IRB,0,R)
  8290.     DO 10 I=1,N
  8291. C INVERT ROW/COLUMN USE FOR MATRIX A
  8292.     NM=(I-1)*MCols+J
  8293.     ML=(I-1)*MCols+K
  8294.     CALL XVBLGT(IAB+NM,0,A)
  8295.     CALL XVBLGT(IBB+ML,0,B)
  8296.     A(1)=A(1)*B(1)
  8297.     CALL XVBLGT(IRB+NL,0,R)
  8298.     R(1)=R(1)+A(1)
  8299.     CALL XVBLST(IRB+NL,0,R)
  8300. C    R(NL)=R(NL)+A(NM)*B(ML)
  8301. 10    CONTINUE
  8302.       RETURN
  8303.       END
  8304. c -h- index.fdd    Fri Aug 22 13:20:45 1986    
  8305.       INTEGER FUNCTION INDX ( STR, C )
  8306. C
  8307.     INTEGER*4 C
  8308.       CHARACTER * 1 STR ( 1 )
  8309. C
  8310. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  8311. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  8312. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  8313.     I3B=0
  8314.       DO 20019  I = 1, 256
  8315.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  8316. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR 0
  8317.       INDX=0
  8318.       RETURN
  8319. 20021 CONTINUE
  8320.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  8321.     IF(I3B.LE.0)GOTO 2000
  8322. C SKIP ENCODED VARIABLES
  8323.     I3B=I3B-1
  8324.     GOTO 20019
  8325. 2000    CONTINUE
  8326.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  8327.     ix=i
  8328.     if(i.gt.250)ix=0
  8329.       INDX = ( IX )
  8330.       RETURN
  8331. 20023 CONTINUE
  8332. 20022 CONTINUE
  8333. C
  8334. 20019 CONTINUE
  8335. 20020 CONTINUE
  8336.     INDX=255
  8337.     RETURN
  8338.       END
  8339. c -h- in2as.for    Fri Aug 22 13:21:02 1986    
  8340.     SUBROUTINE IN2AS(ROW,CHRS)
  8341.     InTeGer*4 ROW
  8342.     CHARACTER*1 CHRS(4)
  8343.     INTEGER*4 AC,AC1,AC2
  8344.     DO 1 N1=1,4
  8345. 1    CHRS(N1)=CHAR(32)
  8346. C CONVERT ROW TO LETTERS. ASSUMES COL=2 OR MORE. ROW 1=A-Z
  8347. C ROW 2=AA-AZ, THEN BA-BZ ETC.
  8348.     AC=ROW
  8349.     DO 2 N=1,4
  8350.     M=5-N
  8351. C CONVERT BACKWARDS INTO CHRS
  8352.     AC1=(AC/26)
  8353.     AC2=AC1*26
  8354.     IX=AC-AC2
  8355.     IF(.NOT.(IX.EQ.0.AND.AC1.GT.0))GOTO 772
  8356. C CORRECT SO WE GET Z, NOT A<NULL> FOR LABELS.
  8357.     IX=26
  8358.     AC1=AC1-1
  8359. 772    CONTINUE
  8360.     IF(IX.GT.0)CHRS(M)=CHAR(IX+64)
  8361. C CONVERT TO ASCII A-Z CHARACTER
  8362.     AC=AC1
  8363. 2    CONTINUE
  8364. C JUST IGNORE ANY OVERFLOW.
  8365.     RETURN
  8366.     END
  8367. c -h- indxq.for    Fri Aug 22 13:21:14 1986    
  8368.       INTEGER FUNCTION INDXQ ( STR, C )
  8369. C
  8370.     INTEGER*4 C
  8371.       CHARACTER * 1 STR ( 1 )
  8372. C
  8373. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  8374. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  8375. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  8376.     I3B=0
  8377.       DO 20019  I = 1, 256
  8378.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  8379. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR OF THE
  8380. C END OF THE STRING FOR ANALYTICALC. NOTE THAT THIS DIFFERS
  8381. C FROM USUAL RATFOR VERSION.
  8382.       INDXQ=I
  8383.       RETURN
  8384. 20021 CONTINUE
  8385.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  8386.     IF(I3B.LE.0)GOTO 2000
  8387. C SKIP ENCODED VARIABLES
  8388.     I3B=I3B-1
  8389.     GOTO 20019
  8390. 2000    CONTINUE
  8391.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  8392.       INDXQ = ( I )
  8393.       RETURN
  8394. 20023 CONTINUE
  8395. 20022 CONTINUE
  8396. C
  8397. 20019 CONTINUE
  8398. 20020 CONTINUE
  8399.     INDXQ=0
  8400.     RETURN
  8401.       END
  8402. c -h- inpost.for    Fri Aug 22 13:21:23 1986    
  8403.     SUBROUTINE INPOST (RETCD)
  8404. C COPYRIGHT (C) 1983 GLENN EVERHART
  8405. C ALL RIGHTS RESERVED
  8406.     Include aparms.inc
  8407. C 60=MAX REAL ROWS
  8408. C 301=MAX REAL COLS
  8409. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  8410. C VBLS AND TYPE DIMENSIONED 60,301
  8411. C **************************************************
  8412. C *                                                *
  8413. C *            SUBROUTINE  INPOST                  *
  8414. C *                                                *
  8415. C **************************************************
  8416. C
  8417. C
  8418. C  CONVERTS THE INPUT STRING (INFIX NOTATION) TO POSTFIX
  8419. C  FOR LATER EVALUATION BY POSTVL
  8420. C
  8421. C
  8422. C
  8423. C  MODIFICATION CODES:  M3,M10
  8424. C
  8425. C
  8426. C MODIFIED 10-MAR-78 P.B. CHANGED STACK VALUE FOR FUNCTIONS FROM 15 TO 45
  8427. C   THIS CORRECTS IMPROPER EVALUATION OF SQRT(1.)-2.
  8428. C
  8429. C
  8430. C
  8431. C
  8432. C INPOST CALLS
  8433. C
  8434. C  ERRMSG   PRINTS ERROR MESSAGES
  8435. C  NEXTEL   GETS THE NEXT ELEMENT FROM LINE(80)
  8436. C
  8437. C
  8438. C
  8439. C INPOST IS CALLED BY CALC
  8440. C
  8441. C
  8442. C
  8443. C
  8444. C
  8445. C
  8446. C        THE VARIABLE AND FUNCTION CODES.
  8447. C TABLE ALSO GIVES COMPARE VALUES AND STACK VALUES OF
  8448. C FUNCTIONS THAT OCCUR WHEN EXPRESSIONS ARE EVALUATED.
  8449. C
  8450. C
  8451. C
  8452. C
  8453. C    STACK
  8454. C    ELEMENT                COMPARE    STACK
  8455. C    CODE    TYPE        BYTES    VALUE    VALUE
  8456. C
  8457. C    0    UNDEFINED    -    -    -
  8458. C    1    ASCII        1    -    -
  8459. C    2    DECIMAL        8    -    -
  8460. C    3    HEXADECIMAL    4    -    -
  8461. C    4    INTEGER        4    -    -
  8462. C    5    MULT.PREC.(10)    20    -    -
  8463. C    6    MULT.PREC.(8)    20    -    -
  8464. C    7    MULT.PREC.(16)    20    -    -
  8465. C    8    OCTAL        4    -
  8466. C    9    REAL        8    -    -
  8467. C    10-30    UNDEFINED    -    -    -
  8468. C
  8469. C    ----------FUNCTIONS------------
  8470. C
  8471. C    31    ABS (=DABS)    -    70    45
  8472. C    32    IABS        -    70    45
  8473. C    33    FLOAT        -    70    45
  8474. C    34    IFIX        -    70    45
  8475. C    35    AINT        -    70    45
  8476. C    36    INT (=IDINT)    -    70    45
  8477. C    37    EXP (=DEXP)    -    70    45
  8478. C    38    ALOG (=DLOG)    -    70    45
  8479. C    39    ALOG10(=DLOG10)    -    70    45
  8480. C    40    SQRT (=DSQRT)    -    70    45
  8481. C    41    SIN (=DSIN)    -    70    45
  8482. C    42    COS (=DCOS)    -    70    45
  8483. C    43    TANH (=DTANH)    -    70    45
  8484. C    44    ATAN (=DATAN)    -    70    45
  8485. C    45-47    ASIN,ACOS,TAN    -    70    45
  8486. C    45    RESERVED    -    -    -
  8487. C       48-100  RESERVED        -       -       -
  8488. C
  8489. C       110     (               -       70      15
  8490. C       111     UNARY -         -       50      49
  8491. C       112     **              -       40      39
  8492. C       113     *               -       30      31
  8493. C       114     /               -       30      31
  8494. C       115     +               -       20      21
  8495. C       116     -               -       20      21
  8496. C       117     )               -       10      -
  8497. C
  8498. C       200     =               -       10      10
  8499. C
  8500. C
  8501. C
  8502. C    VARIABLE      USE
  8503. C
  8504. C    I,K          HOLDS TEMPORARY InTeGer*4 VALUES.
  8505. C    LASTOP       HOLDS THE TYPE OF LAST ELEMENT OBTAINED
  8506. C                 ON LINE(80). SET AT 0 AT BEGINNING OF EXPRESSION.
  8507. C                 USED BY NEXTEL TO IDENTIFY UNARY OPERATORS.
  8508. C    NONBLK       POINTER IN LINE(80). NEXTEL STARTS SCAN AT NONBLK+1.
  8509. C    OPVAL(200,2)   HOLDS THE COMPARE AND STACK VALUE OF EACH OPERATOR.
  8510. C    PARVAL       HOLDS 110 WHICH IS THE CODE FOR '(' IN STACK 2.
  8511. C    RETCD        RETURN CODE. 1=O.K.  2=ERROR.
  8512. C    RETCD2       RETURN CODE FOR CALL TO NEXTEL.
  8513. C    RETTYP       HOLDS TYPE OF NEXT ELEMENT IN LINE, EITHER A FUNCTION
  8514. C                 CODE OR A DATA TYPE CODE.
  8515. C    RETVAL(100)  HOLDS VALUE OF NEXT ELEMENT IN LINE(80).
  8516. C    ST1LIM       HOLDS LIMIT OF STACK 1.
  8517. C    ST2LIM       HOLDS LIMIT OF STACK 2.
  8518. C    ST1PT        STACK 1 POINTER.
  8519. C    ST2PT        STACK 2 POINTER.
  8520. C    ST1TYP       TYPE OF EACH ELEMENT IN STACK 1
  8521. C    ST2TYP       TYPE OF EACH ELEMENT IN STACK 2
  8522. C    VLEN         HOLDS THE NUMBER OF BYTES USED BY EACH DATA TYPE.
  8523. C
  8524. C
  8525. C
  8526. C
  8527. C    SUBROUTINE INPOST (RETCD)
  8528. C
  8529. C
  8530. C
  8531.     InTeGer*4 LEVEL,NONBLK,LEND
  8532.     InTeGer*4 LASTOP
  8533.     InTeGer*4 VIEWSW,BASED
  8534.     InTeGer*4 OPVAL(200,2),PARVAL
  8535.     InTeGer*4 RETCD,RETCD2,RETTYP
  8536.     InTeGer*4 TYPE(1,2)
  8537.     InTeGer*4 ST1TYP(40),ST2TYP(40),ST1PT,ST2PT
  8538.     InTeGer*4 ST1LIM,ST2LIM
  8539.     InTeGer*4 VLEN(9)
  8540.     InTeGer*4 I,K
  8541. C
  8542.     CHARACTER*1 LINE(80)
  8543.     CHARACTER*1 AVBLS(24,27),RETVAL(20)
  8544.     Real*8 VAVBLS(3,27)
  8545.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  8546.     CHARACTER*1 VBLS(8,1,1)
  8547.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  8548. C
  8549. C
  8550.     COMMON /STACKx/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  8551.      1  ST1LIM,ST2LIM
  8552.     COMMON /V/TYPE,AVBLS,VBLS,VLEN
  8553.     InTeGer*4 DLFG
  8554. C    COMMON/DLFG/DLFG
  8555.     InTeGer*4 KDRW,KDCL
  8556. C    COMMON/DOT/KDRW,KDCL
  8557.     InTeGer*4 DTRENA
  8558. C    COMMON/DTRCMN/DTRENA
  8559.     REAL*8 EP,PV,FV
  8560.     DIMENSION EP(20)
  8561.     INTEGER*4 KIRR
  8562. C    COMMON/ERNPER/EP,PV,FV,KIRR
  8563. c    InTeGer*4 LASTOP
  8564. C    COMMON/ERROR/LASTOP
  8565.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  8566. C    COMMON/FMTBFR/FMTDAT
  8567.     CHARACTER*1 EDNAM(16)
  8568. C    COMMON/EDNAM/EDNAM
  8569.     InTeGer*4 MFID(2),MFMOD(2)
  8570. C    COMMON/FRM/MFID,MFMOD
  8571.     InTeGer*4 JMVFG,JMVOLD
  8572. C    COMMON/FUBAR/JMVFG,JMVOLD
  8573.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  8574.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  8575. CCC    COMMON /ERROR/ LASTOP
  8576.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  8577. C
  8578.     save opval,parval
  8579. C
  8580.     DATA OPVAL/30*-1,17*70,62*-1,70,50,40,30,30,20,20,10,82*-1,10,
  8581.      1             30*-1,17*45,62*-1,15,49,39,31,31,21,21,-1,82*-1,10/
  8582.     DATA PARVAL/110/
  8583. C
  8584. C
  8585. C
  8586. C
  8587. C
  8588. C  INITIALIZE STACKS, RETURN CODE DEFAULT, AND LASTOP
  8589.     RETCD=1
  8590.     ST1PT=1
  8591.     ST2PT=1
  8592.     LASTOP=0
  8593. C
  8594. C SET UP FOR NEXTEL CALL
  8595.     NONBLK=NONBLK-1
  8596. C
  8597. C
  8598. C
  8599. C
  8600. C **************************************************
  8601. C ***** GET NEXT ELEMENT OF EXPRESSION *************
  8602. C **************************************************
  8603. C
  8604. C
  8605. C
  8606. C  NEXTEL RETURNS
  8607. C    1    IF OPERAND
  8608. C    2    IF OPERATOR (VALUE IN RETTYP)
  8609. C    3    IF NO MORE ELEMENTS
  8610. C    4    IF ERROR
  8611. C
  8612. C
  8613. 50    CALL NEXTEL (RETVAL,RETTYP,RETCD2)
  8614.     GOTO (100,200,300,999),RETCD2
  8615.     STOP 50
  8616. C
  8617. C
  8618. C
  8619. C
  8620. C
  8621. C **************************************************
  8622. C ********  OPERAND FOUND, PUT ON STACK 1  *********
  8623. C **************************************************
  8624. C
  8625. C STACK 1 OVERFLOW CHECK
  8626. 100    IF (ST1PT.GT.ST1LIM) GOTO 990
  8627. C
  8628. C
  8629. C
  8630. C
  8631. C
  8632. 109    CONTINUE
  8633. C
  8634. C  SUBROUTINE ERRCX HAS ALREADY ASSURED THAT
  8635. C  IF AN OPERAND IS FOLLOWED BY AN = SIGN, THAT VARIABLE
  8636. C  IS NOT PART OF AN EXPRESSION.
  8637. C
  8638. C  VARIABLE INDEX IS TO BE PLACED IN STACK1 (1,ST1PT)
  8639. C  SO IF YOU WANTED TO SPEED THE OPERATION AT THE EXPENSE
  8640. C  OF SPACE, YOU WOULD ONLY COPY RETVAL(1) IF RETTYP < 0
  8641.     K=VLEN(IABS(RETTYP))
  8642.     DO 110 I=1,K
  8643. 110    STACK1(I,ST1PT)=RETVAL(I)
  8644.     ST1TYP(ST1PT)=RETTYP
  8645.     ST1PT=ST1PT+1
  8646.     GOTO 50
  8647. C
  8648. C
  8649. C
  8650. C
  8651. C
  8652. C
  8653. C
  8654. C
  8655. C **************************************************
  8656. C *****************  OPERATOR  *********************
  8657. C **************************************************
  8658. C
  8659. 200    CONTINUE
  8660. C
  8661. C IF NO OTHER OPERATOR ON STACK 2, PLACE ON STACK 2
  8662.     IF (ST2PT.EQ.1) GOTO 222
  8663. C
  8664. C
  8665. C COMPARE VALUE WITH OPERATOR IN STACK2, IF GREATER OR EQUAL THEN
  8666. C PLACE IN STACK 2 BECAUSE IT HAS HIGHER PRECEDENCE AND IS ASSOCIATED
  8667. C WITH PREVIOUSLY ENCOUNTERED OPERAND, IS A UNARY OPERATOR ASSOCIATED
  8668. C WITH THE FOLLOWING ELEMENT, OR IS A '(' WHICH IS SAVED UNTIL A ')'
  8669. C IS FOUND.
  8670. C
  8671.     K=ST2TYP(ST2PT-1)
  8672.     IF (OPVAL(RETTYP,1).GE.OPVAL(K,2)) GOTO 220
  8673. C
  8674. C
  8675. C IF POPPING OFF ELEMENTS FROM STACK2 BECAUSE ')' WAS FOUND THEN WHEN
  8676. C ')' IS FOUND WE GO TO 230 TO REMOVE THE OPERATOR '(' FROM STACK 2.
  8677. C
  8678.     IF (PARVAL.EQ.K) GOTO 230
  8679.     IF (ST1PT.GT.ST1LIM) GOTO 990
  8680. C
  8681. C
  8682. C
  8683. C OPERATOR ON STACK 2 GOES ONTO STACK 1.
  8684. C
  8685.     ST1TYP(ST1PT)=K
  8686.     ST1PT=ST1PT+1
  8687.     ST2PT=ST2PT-1
  8688.     GOTO 200
  8689. C
  8690. C
  8691. C  PUT OPERATOR ON STACK 2
  8692. 220    IF (ST2PT.GT.ST2LIM) GOTO 992
  8693. 222    ST2TYP(ST2PT)=RETTYP
  8694.     ST2PT=ST2PT+1
  8695.     GOTO 50
  8696. C
  8697. C
  8698. C REMOVE '(' FROM STACK 2
  8699. 230    ST2PT=ST2PT-1
  8700.     GOTO 50
  8701. C
  8702. C
  8703. C
  8704. C
  8705. C
  8706. C **************************************************
  8707. C ******* NO MORE ELEMENTS IN LINE *****************
  8708. C **************************************************
  8709. C
  8710. C CLEAN OFF STACK 2
  8711. 300    IF (ST2PT.EQ.1) GOTO 1000
  8712. C
  8713. C IF A '(' GO TO 350 TO THROW IT AWAY.
  8714.     IF (ST2TYP(ST2PT-1).EQ.PARVAL) GOTO 350
  8715.     IF (ST1PT.GT.ST1LIM) GOTO 990
  8716. C
  8717. C
  8718. C
  8719. C PLACE ELEMENT ON STACK 2 ONTO STACK 1.
  8720. C
  8721.     ST1TYP(ST1PT)=ST2TYP(ST2PT-1)
  8722.     ST1PT=ST1PT+1
  8723. C
  8724. C THROW AWAY '(' FROM STACK 2.
  8725. 350    ST2PT=ST2PT-1
  8726.     GOTO 300
  8727. C
  8728. C
  8729. C
  8730. C
  8731. C *** ERROR HANDLING ***
  8732. C
  8733. C STACK 1 OVERFLOW
  8734. 990    I=7
  8735.     GO TO 998
  8736. C
  8737. C STACK 2 OVERFLOW
  8738. 992    I=9
  8739. C
  8740. C
  8741. 998    CALL ERRMSG(I)
  8742. 999    RETCD=2
  8743. 1000    RETURN
  8744. C
  8745.     END
  8746. c -h- isgn.for    Fri Aug 22 13:21:52 1986    
  8747.       INTEGER FUNCTION ISGN(IARG)
  8748.       InTeGer*4 IARG
  8749.       IF(IARG.EQ.0)ISGN=0
  8750.       IF(IARG.GT.0)ISGN=1
  8751.       IF(IARG.LT.0)ISGN=-1
  8752.       RETURN
  8753.       END
  8754. c -h- jchar.for    Fri Aug 22 13:22:15 1986    
  8755.     INTEGER FUNCTION JCHAR(CHR)
  8756.     CHARACTER*1 CHR
  8757. c    INTEGER*1 ICH
  8758. C RETURN INTEGER VALUE OF CHARACTER AS IF IT WERE A SIGNED
  8759. C INTEGER BETWEEN -128 AND +127
  8760.     INTEGER*4 I
  8761. c    EQUIVALENCE(CHR,ICH)
  8762.     I=ICHAR(CHR)
  8763. c    I=ICH
  8764.     IF(I.GT.127)I=I-256
  8765.     JCHAR=I
  8766.     RETURN
  8767.     END
  8768. c -h- jmod.for    Fri Aug 22 13:22:15 1986    
  8769. C INTEGER*4 MODULO FUNCTION
  8770.     INTEGER*4 FUNCTION JMOD(I1,I2)
  8771.     INTEGER*4 I1,I2,I
  8772.     I=MOD(I1,I2)
  8773.     JMOD=I
  8774.     RETURN
  8775.     END
  8776. c -h- julasc.for    Fri Aug 22 13:22:15 1986    
  8777.     SUBROUTINE JULASC(N,DATSTc,IYR,IMO,IDA)
  8778. C CONVERT JULIAN DATE N INTO ASCII STRING STR
  8779.     character*8 datstc,dst
  8780.     INTEGER*4 DATST(2),DAT(2)
  8781.     equivalence(dst,datst(1))
  8782.     CHARACTER*1 DATSTR(8)
  8783.     CHARACTER*2 YRST(1),MOST(1),DAST(1)
  8784.     EQUIVALENCE(YRST(1)(1:1),DATSTR(1)),
  8785.      1  (MOST(1)(1:1),DATSTR(4))
  8786.     EQUIVALENCE(DAT(1),DATSTR(1))
  8787.     EQUIVALENCE(DAST(1)(1:1),DATSTR(7))
  8788.     InTeGer*4 MLEN(12)
  8789.     save mlen
  8790.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  8791.     DATSTR(3)='/'
  8792.     DATSTR(6)='/'
  8793. C FIRST SUBTRACT OFF WHOLE YEARS
  8794.     IYR=N/365
  8795.     N=N-(365*IYR)
  8796. C ADJUST FOR LEAP YRS SINCE 1981
  8797.     IAC=IYR/4
  8798.     N=N-IAC
  8799. C Account for when this year is a leap year
  8800.     MLEN(2)=28
  8801.     IF(Mod((IYR+81),4).eq.0) MLEN(2)=29
  8802. c (OK for rest of 20th century, anyhow.)
  8803. C (Also OK in 21st, since 2000 IS a leap year (divisible by 400))
  8804. C NOW SUBTRACT OFF MONTHS AS LONG AS POSSIBLE
  8805.     DO 1 NN=1,12
  8806.     IMO=NN
  8807.     IF(N.LE.MLEN(NN))GOTO 2
  8808.     N=N-MLEN(NN)
  8809. 1    CONTINUE
  8810. 2    CONTINUE
  8811.     IDA=N
  8812.     IYR=IYR+81
  8813.     WRITE(YRST(1)(1:2),3,ERR=5)IYR
  8814. C    ENCODE(2,3,YRST,ERR=5)IYR
  8815. 3    FORMAT(I2)
  8816.     WRITE(MOST(1)(1:2),3,ERR=5)IMO
  8817. C    ENCODE(2,3,MOST,ERR=5)IMO
  8818.     WRITE(DAST(1)(1:2),3,ERR=5)IDA
  8819. C    ENCODE(2,3,DAST,ERR=5)IDA
  8820. 5    CONTINUE
  8821.     IF(DATSTR(1).EQ.' ')DATSTR(1)='0'
  8822.     IF(DATSTR(4).EQ.' ')DATSTR(4)='0'
  8823.     IF(DATSTR(7).EQ.' ')DATSTR(7)='0'
  8824.     DATST(1)=DAT(1)
  8825.     DATST(2)=DAT(2)
  8826. C USE INTEGERS SINCE REAL*8 MIGHT OMIT FULL COPY IF
  8827. C EXPONENT BYTE IS 0, AND CHARS MAY CAUSE NORMALIZATION
  8828. C PROBLEMS SOMETIMES.
  8829.     datstc=dst
  8830.     RETURN
  8831.     END
  8832. c -h- julian.for    Fri Aug 22 13:22:15 1986    
  8833. C JULIAN DATE ROUTINES
  8834. C CALLS:
  8835. C    N=JULIAN(YY/MM/DD)
  8836. C    RETURNS JULIAN DATE BASED ON 1/1/80 FOR THAT DATE
  8837. C
  8838. C    CALL JULASC(N,STRADR)
  8839. C    TAKES JULIAN DATE AND DECODES TO ASCII YY/MM/DD
  8840. C
  8841. C    N=JULMDY(IYR,IMO,IDA)
  8842. C    RETURNS JULIAN DATE GIVEN SEPARATE Y,M,D
  8843. C
  8844.     FUNCTION JULIAN(DATSTc)
  8845.     character*8 datstc,dst
  8846.     INTEGER*4 DATST(2),DAT(2)
  8847.     equivalence(dst,datst(1))
  8848.     CHARACTER*1 DATSTR(8)
  8849.     CHARACTER*1 YRST(2),MOST(2),DAST(2)
  8850.     CHARACTER*2 YRST2,MOST2,DAST2
  8851.     EQUIVALENCE(YRST2(1:1),YRST(1),DATSTR(1),DAT(1)),
  8852.      1  (MOST2(1:1),MOST(1),DATSTR(4)),
  8853.      2  (DAST2(1:1),DAST(1),DATSTR(7))
  8854. C    EQUIVALENCE(DATSTR(1),DAT(1))
  8855. C    EQUIVALENCE(YRST(1),DATSTR(1)),(MOST(1),DATSTR(4))
  8856. C    EQUIVALENCE(DAST(1),DATSTR(7))
  8857.     dst=datstc
  8858.     DAT(1)=DATST(1)
  8859.     DAT(2)=DATST(2)
  8860.     IJUL=1
  8861.     READ(YRST2(1:2),1,ERR=2)IYR
  8862. C    DECODE(2,1,YRST,ERR=2)IYR
  8863. 1    FORMAT(I2)
  8864.     READ(MOST2(1:2),1,ERR=2)IMO
  8865.     READ(DAST2(1:2),1,ERR=2)IDA
  8866. C    DECODE(2,1,MOST,ERR=2)IMO
  8867. C    DECODE(2,1,DAST,ERR=2)IDA
  8868.     IJUL=JULMDY(IYR,IMO,IDA)
  8869. 2    CONTINUE
  8870.     JULIAN=IJUL
  8871.  
  8872.     RETURN
  8873.     END
  8874. c -h- julmdy.for    Fri Aug 22 13:22:15 1986    
  8875.     FUNCTION JULMDY(IYR,IMO,IDA)
  8876.     InTeGer*4 MLEN(12)
  8877.     save mlen
  8878.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  8879. C JULIAN DATE FROM Y,M,D
  8880. C BASE=1/1/81
  8881.     IJUL=1
  8882.     IF(IYR.LT.80)GOTO 999
  8883.     IYR=IYR-81
  8884.     IF(IMO.LE.0.OR.IMO.GT.12)GOTO 999
  8885.     IF(IDA.GT.31)GOTO 999
  8886. C JUST RETURN ILLEGAL ENTRIES AS 1/1/80
  8887.     AC=365.25*FLOAT(IYR)
  8888.     IAC=AC
  8889. C SLIGHTLY CRUDE BUT WORKABLE TREATMENT OF YEARS
  8890.     IJUL=IJUL+IAC
  8891. C NOW ADD IN MONTHS.
  8892.     IF(IMO.GT.2.AND.MOD(IYR+1,4).EQ.0)IJUL=IJUL+1
  8893. C ABOVE ACCOUNTS FOR LEAP YEARS
  8894.     III=IMO-1
  8895.     IF(III.LE.0)GOTO 22
  8896.     DO 2 N=1,III
  8897. 2    IJUL=IJUL+MLEN(N)
  8898. 22    CONTINUE
  8899. C NEXT DO DAYS
  8900.     IJUL=IJUL+IDA-1
  8901. C JUST ADD IN DAYS. SHOULD BE GOOD ENOUGH.
  8902. 999    CONTINUE
  8903.     JULMDY=IJUL
  8904.     RETURN
  8905.     END
  8906. c -h- jvblgt.for    Fri Aug 22 13:22:15 1986    
  8907.         SUBROUTINE JVBLGT(ID1,ID2,ID3,IVAL)
  8908. C
  8909. C JVBLGT - GET INTEGER*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  8910. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLGT TO GET
  8911. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  8912.         InTeGer*4 ID1,ID2,ID3
  8913.         INTEGER*4 IVAL,LL(2)
  8914.         REAL*8 XX
  8915.         EQUIVALENCE(LL(1),XX)
  8916.         CALL XVBLGT(ID2,ID3,XX)
  8917.         IVAL=LL(ID1)
  8918.         RETURN
  8919.         END
  8920. c -h- jvblst.for    Fri Aug 22 13:22:15 1986    
  8921.         SUBROUTINE JVBLST(ID1,ID2,ID3,IVAL)
  8922. C JVBLST - SET I*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  8923. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLST TO GET
  8924. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  8925.         InTeGer*4 ID1,ID2,ID3
  8926.         INTEGER*4 IVAL,LL(2)
  8927.         REAL*8 XX
  8928.         EQUIVALENCE(LL(1),XX)
  8929. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONES WE WANT. THEN...
  8930.         CALL XVBLGT(ID2,ID3,XX)
  8931.         LL(ID1)=IVAL
  8932. C PUT BACK THE 8 BYTES.
  8933.         CALL XVBLST(ID2,ID3,XX)
  8934.         RETURN
  8935.         END
  8936. c -h- mdet.for    Fri Aug 22 13:25:39 1986    
  8937.     SUBROUTINE MDET(XVBLS,I1,I2,J1,J2,DET)
  8938.     Include aparms.inc
  8939.     REAL*8 XVBLS(1),DET,SUMA,SUMB
  8940. C NOTE XVBLS IS 60 BY 301 MATRIX IN PORTACALC
  8941. C I1,I2 ARE TOP COL,ROW COORD; J1,J2 ARE BOTTOM
  8942. C STORAGE OF XVBLS IS (COL,ROW) SO LOCATIONS INSIDE
  8943. C IT ARE
  8944. C  ADDR=(ROW-1)*60+COL (60 IS # OF COLS)
  8945.     DET=0.
  8946.     N=J1-I1+1
  8947.     M=J2-I2+1
  8948.     IF(N.NE.M)RETURN
  8949.     IF(N.LE.1)RETURN
  8950. C ONLY SQUARE MATRICES MAY HAVE NONZERO DETERMINANTS
  8951. C ALSO, DIMENSION HAS TO BE > 1
  8952.     NN=N
  8953. C  FIXUP... (OK FOR N=2,3 ANYHOW)
  8954.     IF(N.EQ.2)NN=N-1
  8955. C  SUM OVER DIAGS...
  8956. C MULTIPLY DIAGONALS FROM TOP AND BOTTOM ROWS OF MATRIX AND GET
  8957. C DIFFERENCE EACH TIME FOR ACCURACY
  8958.     DO 1 N1=1,NN
  8959.     SUMA=1.
  8960.     SUMB=1.
  8961.     DO 2 N2=1,N
  8962.     NCL=N1+N2-1
  8963.     N2L=N+1-N2
  8964.     IF(NCL.GT.N)NCL=NCL-N
  8965. C NOW MULTIPLY SUMA (POSITIVE TERMS) BY X(NCL,N2) AND SUMB(NEG TERMS)
  8966. C BY X(NCL,N2L)
  8967.     LA=(N2-2+I2)*MCols+I1+NCL-1
  8968.     LB=(N2L-2+I2)*MCols+I1+NCL-1
  8969.     CALL XVBLGT(LA,0,XVBLS(1))
  8970.     SUMA=SUMA*XVBLS(1)
  8971.     CALL XVBLGT(LB,0,XVBLS(1))
  8972.     SUMB=SUMB*XVBLS(1)
  8973. 2    CONTINUE
  8974. C NOW ACCUMULATE TERMS IN DETERMINANT
  8975.     DET=DET+SUMA-SUMB
  8976. C DO IN THIS ORDER TO AVOID EXCESSIVE LOSS OF PRECISION DUE TO
  8977. C DIFFERENCES OF LARGE TERMS. THIS IS BAD ENOUGH AS IT IS...
  8978. 1    CONTINUE
  8979.     RETURN
  8980.     END
  8981. c -h- mthini.for    Fri Aug 22 13:25:45 1986    
  8982.     SUBROUTINE MTHINI(INDEXF,AC,SS,CTR,ACX)
  8983.     DIMENSION EP(20)
  8984.     Include aparms.inc
  8985.     InTeGer*4 DLFG
  8986. C    COMMON/DLFG/DLFG
  8987.     InTeGer*4 KDRW,KDCL
  8988. C    COMMON/DOT/KDRW,KDCL
  8989.     InTeGer*4 DTRENA
  8990. C    COMMON/DTRCMN/DTRENA
  8991.     REAL*8 EP,PV,FV
  8992.     INTEGER*4 KIRR
  8993. C    COMMON/ERNPER/EP,PV,FV,KIRR
  8994.     InTeGer*4 LASTOP
  8995. C    COMMON/ERROR/LASTOP
  8996.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  8997. C    COMMON/FMTBFR/FMTDAT
  8998.     CHARACTER*1 EDNAM(16)
  8999. C    COMMON/EDNAM/EDNAM
  9000.     InTeGer*4 MFID(2),MFMOD(2)
  9001. C    COMMON/FRM/MFID,MFMOD
  9002.     InTeGer*4 JMVFG,JMVOLD
  9003. C    COMMON/FUBAR/JMVFG,JMVOLD
  9004.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  9005.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  9006. CCC    REAL*8 EP,PV,FV
  9007. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  9008.     REAL*8 AC,SS,CTR,ACX
  9009.     KIRR=0
  9010.     SS=0.
  9011.     CTR=0.
  9012.     ACX=0.
  9013.     DO 1 N=1,20
  9014. 1    EP(N)=0.
  9015.     AC=0.
  9016.     IF(INDEXF.EQ.1)AC=1.E20
  9017.     IF(INDEXF.EQ.2)AC=-1.E20
  9018.     RETURN
  9019.     END
  9020. c -h- mtxequ.for    Fri Aug 22 13:25:54 1986    
  9021.        SUBROUTINE MTXEQU(A1,A2,B1,B2,N,M,D)
  9022.     Include aparms.inc
  9023.     real*8 save,d
  9024. C A1,A2 ARE DIMENSIONS OF A SUBMATRIX ORIGIN IN XVBLS
  9025. C B1,B2 ARE DIMS OF B SUBMATRIX
  9026. C
  9027. C NOTE THIS PROGRAM MUST BE MODIFIED TO WORK WITHIN THE SPREAD
  9028. C SHEET MATRIX RATHER THAN JUST ASSUMING THAT THE N DIMENSION
  9029. C AND M DIMENSION GIVE THE STORAGE ADDRESSES... ALTERNATIVELY,
  9030. C THE PROGRAM MUST OPERATE ONLY ON COPIED, DENSELY STORED
  9031. C MATRICES.
  9032. C
  9033. C
  9034. C   ORIGINAL PROGRAM TEXT FOLLOWS:
  9035. C       DIMENSION A(1),B(1)
  9036. CC ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  9037. C    REAL*8 A,B
  9038. C       KMAX=N-1
  9039. C       DO 90 K=1,KMAX
  9040. C       AMAX=0.
  9041. C       J2=K
  9042. C       DO 20 J1=K,N
  9043. C       IK=(J1-1)*N+K
  9044. C       IF(ABS(AMAX)-ABS(A(IK)))10,20,20
  9045. C10       AMAX=A(IK)
  9046. C       J2=J1
  9047. C20       CONTINUE
  9048. CC       EXCHANGE ROW K,J2 IF NECESSARY
  9049. C       IF(J2-K)30,60,30
  9050. C30       DO 40 J=K,N
  9051. C       J3=(K-1)*N+J
  9052. C       J4=(J2-1)*N+J
  9053. C       SAVE=A(J3)
  9054. C       A(J3)=A(J4)
  9055. C       A(J4)=SAVE
  9056. C40       CONTINUE
  9057. C       DO 50 J=1,M
  9058. C       J3=(K-1)*M+J
  9059. C       J4=(J2-1)*M+J
  9060. C       SAVE=B(J3)
  9061. C       B(J3)=B(J4)
  9062. C50       B(J4)=SAVE
  9063. CC       REDUCTION
  9064. C60       K1=K+1
  9065. C       KK=(K-1)*N+K
  9066. C       DO 80 I=K1,N
  9067. C       IK=(I-1)*N+K
  9068. C       DO 70 J=K1,N
  9069. C       IJ=(I-1)*M+J
  9070. C       KJ=(K-1)*M+J
  9071.  
  9072. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  9073. C       DO 80 J=1,M
  9074. C       IJ=(I-1)*M+J
  9075. C       KJ=(K-1)*N+J
  9076. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  9077. C90       CONTINUE
  9078. CC       SUBSTITUTE BACK
  9079. CC       NN=(N-1)*N+N
  9080. C       NN=N*N
  9081. C       DO 110 J=1,M
  9082. C       NJ=(N-1)*M+J
  9083. C       B(NJ)=B(NJ)/A(NN)
  9084. C       I1MAX=N-1
  9085. C       IF(I1MAX)110,110,95
  9086. C95       DO 111 I1=1,I1MAX
  9087. C       I=N-I1
  9088. C       IJ=(I-1)*M+J
  9089. C       II=(I-1)*N+I
  9090. C       I2=I+1
  9091. C       DO 100 L=I2,N
  9092. C       IL=(I-1)*N+L
  9093. C       LJ=(L-1)*M+J
  9094. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  9095. C       B(IJ)=B(IJ)/A(II)
  9096. C111       CONTINUE
  9097. C110       CONTINUE
  9098. C       RETURN
  9099. C       END
  9100.     INTEGER A1,A2,B1,B2
  9101. C       DIMENSION A(1),B(1)
  9102. C ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  9103. C NOTE THAT OUR COLUMN DIMENSION IS 60, NOT N OR M HERE
  9104. C SUBSCRIPTS ARE (ROW-1)*COL-DIMENSION + COL
  9105. C  THEREFORE, CHANGE *N OR *M IN SUBSCRIPT COMPUTATIONS TO
  9106. C  *60
  9107.     REAL*8 A,AW1,AW2,BW1,BW2,AW3,AW4,AMAX
  9108.     INTEGER ABASE,BBASE
  9109.     ABASE=(A2-1)*MCols+A1-1
  9110.     BBASE=(B2-1)*MCols+B1-1
  9111.     D=1.
  9112.        KMAX=N-1
  9113.        DO 90 K=1,KMAX
  9114.        AMAX=0.
  9115.        J2=K
  9116.        DO 20 J1=K,N
  9117.        IK=(J1-1)*MCols+K
  9118.     CALL XVBLGT(IK+ABASE,0,A)
  9119.        IF(DABS(AMAX)-DABS(A))10,20,20
  9120. 10       AMAX=A
  9121.        J2=J1
  9122. 20       CONTINUE
  9123. C       EXCHANGE ROW K,J2 IF NECESSARY
  9124.        IF(J2-K)30,60,30
  9125. 30       DO 40 J=K,N
  9126.        J3=(K-1)*MCols+J
  9127.        J4=(J2-1)*MCols+J
  9128.     CALL XVBLGT(J3+ABASE,0,SAVE)
  9129. C       SAVE=A(J3)
  9130.     CALL XVBLGT(J4+ABASE,0,AW1)
  9131.     CALL XVBLST(J3+ABASE,0,AW1)
  9132.     CALL XVBLST(J4+ABASE,0,SAVE)
  9133. C       A(J3)=A(J4)
  9134. C       A(J4)=SAVE
  9135. 40       CONTINUE
  9136.        DO 50 J=1,M
  9137.        J3=(K-1)*MCols+J
  9138.        J4=(J2-1)*MCols+J
  9139. C       SAVE=B(J3)
  9140. C       B(J3)=B(J4)
  9141. C50       B(J4)=SAVE
  9142.     CALL XVBLGT(J3+BBASE,0,SAVE)
  9143.     CALL XVBLGT(J4+BBASE,0,BW1)
  9144.     CALL XVBLST(J3+BBASE,0,BW1)
  9145.     CALL XVBLST(J4+BBASE,0,SAVE)
  9146. 50    CONTINUE
  9147. C       REDUCTION
  9148. 60       K1=K+1
  9149.        KK=(K-1)*MCols+K
  9150.     CALL XVBLGT(KK+ABASE,0,A)
  9151.     IF(A.EQ.0)GOTO 999
  9152. C    IF(A(KK).EQ.0.)GOTO 999
  9153.        DO 80 I=K1,N
  9154.        IK=(I-1)*MCols+K
  9155.        DO 70 J=K1,N
  9156.        IJ=(I-1)*MCols+J
  9157.        KJ=(K-1)*MCols+J
  9158. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  9159.     CALL XVBLGT(IJ+ABASE,0,AW1)
  9160.     CALL XVBLGT(KJ+ABASE,0,AW2)
  9161.     CALL XVBLGT(IK+ABASE,0,AW3)
  9162.     CALL XVBLGT(KK+ABASE,0,AW4)
  9163.     AW1=AW1-AW2*AW3/AW4
  9164.     CALL XVBLST(IJ+ABASE,0,AW1)
  9165. 70    CONTINUE
  9166.        DO 80 J=1,M
  9167.        IJ=(I-1)*MCols+J
  9168.        KJ=(K-1)*MCols+J
  9169. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  9170.     CALL XVBLGT(IJ+BBASE,0,BW1)
  9171.     CALL XVBLGT(KJ+BBASE,0,BW2)
  9172.     BW1=BW1-BW2*AW3/AW4
  9173.     CALL XVBLST(IJ+BBASE,0,BW1)
  9174. 80    CONTINUE
  9175. 90       CONTINUE
  9176. C       SUBSTITUTE BACK
  9177.        NN=(N-1)*MCols+N
  9178. C       NN=N*N
  9179.     CALL XVBLGT(NN+ABASE,0,AW1)
  9180.     IF(AW1.EQ.0.)GOTO 999
  9181.        DO 110 J=1,M
  9182.        NJ=(N-1)*MCols+J
  9183. C       B(NJ)=B(NJ)/A(NN)
  9184.     CALL XVBLGT(NJ+BBASE,0,BW1)
  9185.     BW1=BW1/AW1
  9186.     CALL XVBLST(NJ+BBASE,0,BW1)
  9187.        I1MAX=N-1
  9188.        IF(I1MAX)110,110,95
  9189. 95       DO 111 I1=1,I1MAX
  9190.        I=N-I1
  9191.        IJ=(I-1)*MCols+J
  9192.        II=(I-1)*MCols+I
  9193.        I2=I+1
  9194.     CALL XVBLGT(II+ABASE,0,AW1)
  9195.        DO 100 L=I2,N
  9196.        IL=(I-1)*MCols+L
  9197.        LJ=(L-1)*MCols+J
  9198. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  9199.     CALL XVBLGT(IJ+BBASE,0,BW1)
  9200.     CALL XVBLGT(IL+ABASE,0,AW2)
  9201.     CALL XVBLGT(LJ+BBASE,0,BW2)
  9202.     BW1=BW1-AW2*BW2
  9203.     CALL XVBLST(IJ+BBASE,0,BW1)
  9204. 100    CONTINUE
  9205. C       B(IJ)=B(IJ)/A(II)
  9206.     BW1=BW1/AW1
  9207.     CALL XVBLST(IJ+BBASE,0,BW1)
  9208. 111       CONTINUE
  9209. 110       CONTINUE
  9210.        RETURN
  9211. 999    CONTINUE
  9212.     D=0.
  9213.     RETURN
  9214.        END
  9215. C *********************  AnalyF6.Ftn ###################################
  9216. c -h- varscn.for    Fri Aug 22 13:37:17 1986    
  9217. C $DO66
  9218.     SUBROUTINE VARSCN(LINE,IBGN,LEND,LSTCHR,ID1,ID2,IVALID)
  9219. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  9220. C ALL RIGHTS RESERVED
  9221. C
  9222. C VARSCN - SCAN COMMAND LINE FOR VARIABLE NAMES.
  9223. C
  9224. C    SCANS FOR VARIABLE NAMES OF FORM AAANNN WHERE AAA = LETTERS
  9225. C BETWEEN A AND Z UP TO NON-ALPHA, CORRESPONDING TO ROW, FOLLOWED BY
  9226. C NUMBERS IN THE 0-9 RANGE MAKING A DECIMAL COLUMN NUMBER.
  9227. C
  9228. C THE LETTERS ARE FORMED BY
  9229. C A-Z ALONE GIVE ROW 1-26, COL 1. % IS ROW 27,COL1
  9230. C A1-Z1 GIVE ROW 1-26, COL 2
  9231. C AA1-ZZ1 ARE ROW 27-52, COL 2
  9232. C
  9233. C In this version we also recognize cell names using an optional third
  9234. C dimension. Forms like B14#2 would be interpreted as cell B14 of sheet
  9235. C 2 (sheets start at 0). This is a display trick mainly, as cell offsets
  9236. C will be treated as simple 2D addresses as before. However, it will allow
  9237. C some greater automation of the notion of multiple areas. Each "page" is
  9238. C formed by adding constants KCDELT and KRDELT to the column and row
  9239. C of the base number, multiplied by the offset in sheets. These constants
  9240. C are initially zero, collapsing all "pages" on top of one another. This
  9241. C interpretation will occur provided K3DFG is 0 or positive. If it is 
  9242. C negative all 3D interpretation will be ignored, and even parsing of
  9243. C the cell names for trailing # characters will be disabled. (This will
  9244. C allow strict return to the older meanings.)
  9245.     IMPLICIT InTeGer*4 (A-Z)
  9246. C NOTE COL 1 IS DUMMY. DISPLAY THE SHEET SIDEWAYS SO WE GET USUAL VISUAL
  9247. C ROWS, COLS., AND ACCUMULATORS A-Z,% JUST APPEAR AS A FICTITIOUS ROW 0
  9248. C ON DISPLAY, INSTEAD OF REAL COLUMN 1 HERE.
  9249.     Include aparms.inc
  9250.     DIMENSION LINE(LEND)
  9251.     CHARACTER*1 LINE
  9252.     InTeGer*4 TYPE(1,2),VLEN(9)
  9253.     REAL*8 XVBLS(1,1)
  9254.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  9255.     Real*8 VAVBLS(3,27)
  9256.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  9257.     REAL*8 XAVB,xac
  9258.     REAL*4 XAV2(2)
  9259.     CHARACTER*1 XAV1(8)
  9260.     EXTERNAL INDX
  9261.     EQUIVALENCE(XAVB,XAV2(1)),(XAVB,XAV1(1))
  9262.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  9263.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  9264. C ***<<< KLSTO COMMON START >>>***
  9265.     InTeGer*4 DLFG
  9266. C    COMMON/DLFG/DLFG
  9267.     InTeGer*4 KDRW,KDCL
  9268. C    COMMON/DOT/KDRW,KDCL
  9269.     InTeGer*4 DTRENA
  9270. C    COMMON/DTRCMN/DTRENA
  9271.     REAL*8 EP,PV,FV
  9272.     DIMENSION EP(20)
  9273.     INTEGER*4 KIRR
  9274. C    COMMON/ERNPER/EP,PV,FV,KIRR
  9275.     InTeGer*4 LASTOP
  9276. C    COMMON/ERROR/LASTOP
  9277.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  9278. C    COMMON/FMTBFR/FMTDAT
  9279.     CHARACTER*1 EDNAM(16)
  9280. C    COMMON/EDNAM/EDNAM
  9281.     InTeGer*4 MFID(2),MFMOD(2)
  9282. C    COMMON/FRM/MFID,MFMOD
  9283.     InTeGer*4 JMVFG,JMVOLD
  9284. C    COMMON/FUBAR/JMVFG,JMVOLD
  9285.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  9286.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  9287. C ***<<< KLSTO COMMON END >>>***
  9288. CCC    InTeGer*4 DLFG
  9289. CCC    COMMON/DLFG/DLFG
  9290. C DLFG=1 IF D## FORMS ARE SEEN
  9291.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  9292.     COMMON/D2R/NRDSP,NCDSP
  9293. C NRDSP AND NCDSP ARE REAL ROW, COL OF DISPLAY ROW, COL CELLS. NOTE THAT
  9294. C NOT ALL DISPLAY CELLS ARE ALWAYS ACTUALLY SHOWN; ONLY THOSE THAT FIT
  9295. C ARE SHOWN; THE REST "EXIST" BUT DON'T APPEAR UNLESS ROWS ARE SMALL
  9296. C ENOUGH.
  9297. C
  9298. C THIS PROGRAM ALSO HANDLES CELL SPECS OF FORM
  9299. C P#+nnn#+nnn (or P#-nnn#-mmm) FOR Physical cells relative to our current
  9300. C physical cell on the sheet (clamped at boundaries), or of form
  9301. C D#+nnn#+mmm etc for Display cells relative to our current display
  9302. C location as held in the DROW,DCOL cells in commons.
  9303. C ***<<<< RDD COMMON START >>>***
  9304.     InTeGer*4 RRWACT,RCLACT
  9305. C    COMMON/RCLACT/RRWACT,RCLACT
  9306.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  9307.      1  IDOL7,IDOL8
  9308. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  9309. C     1  IDOL7,IDOL8
  9310.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  9311. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9312.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9313. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9314. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  9315. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  9316.     InTeGer*4 KLVL
  9317. C    COMMON/KLVL/KLVL
  9318.     InTeGer*4 IOLVL,IGOLD
  9319. C    COMMON/IOLVL/IOLVL
  9320. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  9321. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  9322.     Integer*4 k3dfg,kcdelt,krdelt,kshtf
  9323.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9324.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9325.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  9326.      3  k3dfg,kcdelt,krdelt,kshtf
  9327. C ***<<< RDD COMMON END >>>***
  9328. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6
  9329. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6
  9330. CCC    InTeGer*4 PROW,PCOL
  9331. C ! PHYSICAL ROW, COL BEING HANDLED.
  9332. CCC    InTeGer*4 DROW,DCOL,DCLV,DRWV
  9333.     InTeGer*4 RSM,CSM,AFG,ASM,VCF,CH
  9334. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9335.     LOGICAL*4 L1,L2
  9336. C    LOGICAL*2 L63,L192,L127
  9337.     InTeGer*4 I1,I2
  9338.     InTeGer*4 I63,I192,I127
  9339.     EQUIVALENCE(I1,L1),(I2,L2)
  9340. C    EQUIVALENCE (I63,L63),(I192,L192),(L127,I127)
  9341.     save i63,i192,i127
  9342.     DATA I63/63/,I192/192/,I127/127/
  9343. C DRWV,DCLV = # OF MAX ROWS, COLS ACTUALLY ON SCREEN NOW. DROW,DCOL
  9344. C ARE ACTUAL "CURSOR" LOCATION.
  9345. C
  9346. C ZERO OUR VARIABLES
  9347.     LPFG=0
  9348. C ! FLAG WE GOT A LOGICAL/PHYSICAL # FORM AND TYPE
  9349.     AFG=0
  9350. C ! FLAG WE SAW AN ALPHA
  9351.     ASM=0
  9352. C ! SUM OF ALPHAS HASHCODED (ACCUMULATOR)
  9353.     NSM=0
  9354. C ! ACCUMULATOR FOR NUMERICS
  9355.     NFG=0
  9356. C ! FLAG WE SAW A NUMERIC
  9357.     RSM=0
  9358. C ! AC FOR ROWS IN # FORMS
  9359.     CSM=0
  9360. C ! AC FOR COLS IN # FORMS
  9361.     ISPC=0
  9362. C ! COUNTER FOR NONSPACES SEEN (USED TO STOP ON TRAILING SPACES)
  9363.     ktpnd=0
  9364.     idol1=0
  9365.     idol2=0
  9366.     IF(LINE(IBGN).NE.'%')GOTO 2000
  9367.     ID1=27
  9368.     ID2=1
  9369.     IVALID=1
  9370.     LSTCHR=IBGN+1
  9371. C SPECIAL CASE FOR % = AC #27
  9372.     RETURN
  9373. 2000    CONTINUE
  9374.     DO 1 N=IBGN,LEND
  9375.     VCF=0
  9376.     LSTCHR=N
  9377.     CH=ICHAR(LINE(N))
  9378.     IF (CH.EQ.255)GOTO 5000
  9379. C 5000 DECODES ENCODED FORMS AND RETURNS THEM...
  9380. C
  9381. C IGNORE SPACES AND TABS IF LEADING
  9382.     IF(CH.GT.32)ISPC=ISPC+1
  9383.     IF(CH.GT.0.AND.CH.LE.32.AND.ISPC.EQ.0)GOTO 1
  9384. C SPECIAL CASE TRAILING DOLLAR SIGNS... SKIP AND FLAG
  9385.     IF(CH.NE.36)GOTO 3443
  9386. C 36 IS ASCII FOR $ SIGN
  9387. C SAW A DOLLAR SIGN
  9388.     IF(AFG.EQ.1.AND.NFG.EQ.0)IDOL1=1
  9389.     IF(AFG.EQ.1.AND.NFG.EQ.1)IDOL2=1
  9390. C LEAVES WITH IDOL1 FLAGGED AS 1 IF LETTER PART WAS FOLLOWED BY
  9391. C DOLLAR SIGN, AND IDOL2 FLAGGED IF NUMBER PART WAS FOLLOWED
  9392. C BY DOLLAR. IGNORES ALL OTHER DOLLAR SIGNS.
  9393.     GOTO 1
  9394. 3443    CONTINUE
  9395. C GET CHARACTER VALUE IN.
  9396. C MUST BE UPPERCASE.
  9397.     IF(.NOT.(CH.GE.65.AND.CH.LT.91)) GOTO 100
  9398. C CH IS AN ALPHA, RANGE A-Z
  9399.     VCF=1
  9400. C ! VALID CHAR SEEN
  9401.     AFG=1
  9402. C !SAW THE ALPHA
  9403.     IF(ASM.LT.MRC)ASM=(CH-64)+26*ASM
  9404.     IF(NFG.NE.0)GOTO 103
  9405. C FILTER OUT TOO-LARGE VALUES...
  9406. C leave the 18000 limit in for now; seems big enough!
  9407.     IF(ASM.GT.(mrc-MCols))GOTO 103
  9408. C 60 * 26 IS LIM ABOVE
  9409.     IF(CH.EQ.80)LPFG=1
  9410. C ! FLAG WE GOT PHYS. FORM MAYBE
  9411.     IF(CH.EQ.68)LPFG=2
  9412. C ! FLAG WE GOT DISPLAY FORM MAYBE
  9413. 100    CONTINUE
  9414. C EXPECT # FORMS TO HAVE # JUST AFTER 1ST ALPHA.
  9415. C 35 IS ASCII VALUE OF '#' CHAR.
  9416.     IF(CH.EQ.35)GOTO 1000
  9417. C NEXT TEST NUMERICS
  9418.     IF(.NOT.(CH.GE.48.AND.CH.LE.57))GOTO 101
  9419. C CH IS A NUMERIC, RANGE 0-9
  9420.     VCF=1
  9421. C ! VALID CHAR SEEN
  9422.     NFG=1
  9423. C ! FLAG WE SAW NUMERIC
  9424.     IF(AFG.NE.0)GOTO 102
  9425.     GOTO 103
  9426. 102    CONTINUE
  9427.     IF(NSM.LT.MRC)NSM=(CH-48)+10*NSM
  9428. C FILTER OUT TOO-LARGE VALUES EARLY
  9429. C 301 * 10 IS LIMIT...
  9430.     IF(NSM.GT.(MRC-MCols))GOTO 103
  9431. C ! CONVERT CHARS TO BINARY AS SEEN
  9432. 101    CONTINUE
  9433.     IF(VCF.EQ.0)GOTO 2
  9434. C !END ON ANY INVALID CHARACTER
  9435. 1    CONTINUE
  9436. 2    CONTINUE
  9437.     IF(AFG.EQ.0)GOTO 103
  9438.     GOTO 950
  9439. 103    CONTINUE
  9440. C INVALID ... NUMERIC AND NO PRIOR ALPHA. FLAG BAD NAME AND EXIT.
  9441.     IVALID=0
  9442.     RETURN
  9443. 950    ID1=ASM
  9444.     ID2=1+NSM
  9445. C ! NOTE ID2=1 IF NO NUMERICS SEEN, MORE OTHERWISE.
  9446.     GOTO 1201
  9447. 1000    CONTINUE
  9448. C HERE HANDLE CURRENT-REFERENCED FORMS USING # AS SPECIAL CHARACTER MEANING
  9449. C THE CURRENT POSITION. THESE TYPES OF REFERENCES MAY BE MOVED AROUND THE
  9450. C SHEET WHICH ACCOUNTS FOR THEIR USEFULNESS. SINCE THERE IS A DISPLAY
  9451. C AND PHYSICAL SHEET WHICH ARE MAPPED BY A MAPPING, ALLOW EITHER
  9452. C TO BE REFERENCED. THUS, COMPLEX CALCULATIONS MAY BE DONE BUT LARGELY
  9453. C HIDDEN. THE ACCUMULATORS MAY BE USED AS SCRATCH STORAGE FOR THIS
  9454. C SORT OF THING.
  9455. C SAW THE # SIGN, SO SEE IF THE + OR - N CAN BE DECODED.
  9456. C IF NO P OR D WAS SEEN HOWEVER WE HAVE AN INVALID NAME, SO FLAG IT.
  9457.     IF(LPFG.EQ.0)GOTO 103
  9458. C PASS THE # SIGN PRIOR TO GETTING THE NUMERIC.
  9459.     LSTCHR=LSTCHR+1
  9460.     iundr=0
  9461.     if(line(lstchr).eq.'_')iundr=1
  9462.     if(line(lstchr).eq.'$')iundr=2
  9463.     if(line(lstchr).ne.'%'.and.iundr.eq.0)goto 3900
  9464. c allow p#%ab form to mean use ac a and b to get offsets from "here"
  9465. c allow P#_ab to be absolute address ref for cells (otherwise like p#%ab)
  9466.     CSM=0
  9467.     RSM=0
  9468. C DEFAULT TO "THIS" CELL
  9469.     LSTCHR=LSTCHR+1
  9470. C PASS THE % SIGN (or other special char we recognize)
  9471.     if(Iundr.lt.2)goto 3906
  9472. c
  9473. c P#$var1var2 is a form that allows relative addressing using ANY of the
  9474. c cells for col and row. First cell is col, 2nd is row
  9475. c The pointers so derived are ABSOLUTE, relative to absolute beginning of
  9476. c the sheet. This seems to me more useful than the relative addressing forms.
  9477. c However, I dislike the offset by 1 for rows so will subtract it off so the
  9478. c accumulators will be addressed as row 0.
  9479.     kkk=lstchr
  9480.     kkkk=lstchr+20
  9481.     klstc=kkk
  9482. c
  9483. c Call copy (without this mod) of varscn subroutine to do the examining of 
  9484. c variable names, so we don't wind up recursively calling ourselves.
  9485. c
  9486.     call varsc2(line,kkk,kkkk,klstc,kr1,kr2,kvld)
  9487.     if(kvld.eq.0)goto 3906
  9488. c try normal processing if this doesn't look like regular variables
  9489.     if(line(klstc).eq.':')klstc=klstc+1
  9490.     kkk=klstc
  9491.     kkkk=kkk+20
  9492.     call varsc2(line,kkk,kkkk,klstc,kc1,kc2,kvld)
  9493.     if(kvld.eq.0)goto 3906
  9494. c Update last chharacter seen pointer to pass these variables.
  9495.     if(line(klstc).eq.':')klstc=klstc+1
  9496.     lstchr=klstc
  9497. c Get the values of the variables and store as integers
  9498.     call xvblgt(kr1,kr2,xac)
  9499.     rsm=xac
  9500.     call xvblgt(kc1,kc2,xac)
  9501.     csm=xac
  9502.     goto 3901
  9503. 3906    continue
  9504.     RSM=ICHAR(LINE(LSTCHR))
  9505.     CSM=ICHAR(LINE(LSTCHR+1))
  9506.     LSTCHR=LSTCHR+2
  9507. C FIX UP ASCII OFFSETS, AND MEANWHILE REQUIRE UPPERCASE
  9508. C AND THAT THERE BE 2 AC'S NAMES AFTER THE %.
  9509. C THIS SHOULD BE HANDY FOR COMMAND FILES.
  9510.     RSM=RSM-64
  9511.     CSM=CSM-64
  9512. C NOW RSM, CSM ARE SUBSCRIPTS. PULL OUT VALUES FROM XVBLS
  9513.     IF(RSM.LE.0.OR.RSM.GT.27)GOTO 103
  9514.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9515.     xavb=vavbls(1,RSM)
  9516. c    DO 3902 IV=1,8
  9517. c3902    XAV1(IV)=AVBLS(IV,RSM)
  9518.     RSM=XAVB
  9519.     xavb=vavbls(1,CSM)
  9520. c    DO 3903 IV=1,8
  9521. c3903    XAV1(IV)=AVBLS(IV,CSM)
  9522.     CSM=XAVB
  9523. C LOADS THE 2 AC'S TO THE OFFSETS AND GOES ON...JUST NEEDS THE
  9524. C 2 LETTERS AFTER P#% OR D#%.
  9525.     goto 3901
  9526. 3900    continue
  9527.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9528. C GN GETS THE +- NN NUMBER AND RETURNS VALUE IN NUM.
  9529. C LSTCHR RETURNS AS NEXT CHAR NOT USED.
  9530.     RSM=NUM
  9531. C 35 IS ASCII FOR '#'
  9532. C allow any delimiter between numbers, though we must have # at start
  9533. C  to delimit valid relative coordinates.
  9534. C    IF(ICHAR(LINE(LSTCHR)).NE.35) GOTO 103
  9535. C IF NO SECOND # SEEN, THE FORM IS INVALID SO SAY SO AND EXIT.
  9536.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9537. CC BUMP PAST THE # IF WE SAW IT.
  9538. C now get the second numeric string and bump LSTCHR past it.
  9539.     NUM=0
  9540.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9541.     CSM=NUM
  9542. C NOW HAVE THE NUMBERS ENCODED. NOTE THAT ## IS VALID.
  9543. 3901    CONTINUE
  9544.     IF(LPFG.EQ.2) GOTO 1200
  9545. C IF HERE, LPFG=1 AND WE ARE ON PHYSICAL SHEET.
  9546.     if(Iundr.ne.0)goto 3908
  9547.     ID2=CSM+PCOL
  9548.     ID1=RSM+PROW
  9549.     goto 1201
  9550. 3908    Continue
  9551.     id2=CSM+1
  9552.     id1=RSM
  9553. c Subtract 1 from row to make accumulator row be number zero. This is more
  9554. c symmetrical with other usages in the sheet cell names. I like it better than
  9555. c making cell A1 be col 1 row 2.
  9556. 1201    CONTINUE
  9557. C Add-in for 3d cells
  9558.     kshtf=0
  9559.     If(k3dfg.lt.0)goto 1202
  9560. C 37 is ascii %
  9561.     IF(LINE(LSTCHR).NE.'%') GOTO 1202
  9562. C pass the trailing % character now
  9563.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9564. C limited form of syntax: either a number is to be used
  9565. C or an accumulator.
  9566.     If(ichar(line(lstchr)).gt.64) goto 1203
  9567. C a number.
  9568.     NUM=0
  9569.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9570.     CSM=NUM
  9571.     Goto 1204
  9572. 1203    Continue
  9573. C a (possible) accumulator
  9574.     csm=ichar(line(lstchr))
  9575.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9576.     CSM=CSM-64
  9577. C Csm now is index to accumulator. Validity check it.
  9578.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9579.     xavb=vavbls(1,csm)
  9580. c    DO 2902 IV=1,8
  9581. c2902    XAV1(IV)=AVBLS(IV,csm)
  9582. C convert the accumulator value.
  9583.     CSM=XAVB
  9584. 1204    Continue
  9585. C now fix up the col and row returned.
  9586.     id1=id1+(csm*kcdelt)
  9587.     id2=id2+(csm*krdelt)
  9588.     kshtf=csm
  9589. C allow our callers to see what (if any) "page" was flagged.
  9590. C note that zero and no page flagged are treated the same.
  9591. 1202    Continue
  9592. C TO ALLOW REFLECTED VALUES TO WORK, LET ALL NORMAL VALUES BY...
  9593. C    IF(ID1.GT.60.OR.ID1.LE.0)GOTO 103
  9594. C    IF(ID2.GT.301.OR.ID2.LE.0)GOTO 103
  9595.     IVALID=1
  9596. C ALL IS WELL
  9597.     RETURN
  9598. 1200    CONTINUE
  9599. C DISPLAY COLUMN RELATIVE.
  9600.     DLFG=1
  9601. C FLAG WE SAW A D## FORM FOR RECALC
  9602.     DRRW=DROW+RSM
  9603.     DRRW=MAX0(1,DRRW)
  9604.     DRRW=MIN0(JIDcl,DRRW)
  9605.     DCCL=DCOL+CSM
  9606. C ENSURE DISPLAY COORDS IN LEGAL BOUNDS
  9607.     DCCL=MAX0(1,DCCL)
  9608.     DCCL=MIN0(JIDrw,DCCL)
  9609. C CLAMP TO WITHIN LEGAL DIMENSIONS.
  9610.     ID1=NRDSP(DRRW,DCCL)
  9611.     ID2=NCDSP(DRRW,DCCL)
  9612.     GOTO 1201
  9613. 5000    CONTINUE
  9614.     IF(ASM.NE.0.OR.NSM.NE.0)GOTO 103
  9615. C HANDLE 255,CODE1,CODE2 FORMS
  9616. C FIRST BYTE IS ALWAYS 255
  9617. C 2ND BYTE IS: HI 2 BITS ARE HI 2 BITS OF ID2. LO 6 BITS ARE ID1
  9618. C 3RD BYTE IS: LO 8 BITS OF ID2
  9619.     I1=ICHAR(LINE(LSTCHR+1))
  9620.     I2=IMASK(I1,I192)
  9621. C    L2=L1.AND.L192
  9622. C    L1=L1.AND.L63
  9623.     I1=IMASK(I1,I63)
  9624.     ID1=I1
  9625.     I1=ICHAR(LINE(LSTCHR+2))
  9626. C    L1=L1.AND.L127
  9627.     I1=IMASK(I1,I127)
  9628. C MUST HAVE 128 BIT ON IN LOW BYTE TO AVOID NULLS IN IT.
  9629.     ID2=I2*2+I1
  9630.     LSTCHR=LSTCHR+3
  9631.     GOTO 1201
  9632.     END
  9633. c -h- varsc2.for
  9634. C $DO66
  9635.     SUBROUTINE VARSC2(LINE,IBGN,LEND,LSTCHR,ID1,ID2,IVALID)
  9636.     Include aparms.inc
  9637. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  9638. C ALL RIGHTS RESERVED
  9639. C
  9640. C VARSC2 - SCAN COMMAND LINE FOR VARIABLE NAMES.
  9641. C    This copy of VARSCN lacks the P#@var1var2 construct and exists to
  9642. C    be called from VARSCN for that construct to parse the var1 and var2
  9643. C    variable names without risk of a recursive call to varscn (which
  9644. C    Fortran generally cannot handle.)
  9645. C
  9646. C    SCANS FOR VARIABLE NAMES OF FORM AAANNN WHERE AAA = LETTERS
  9647. C BETWEEN A AND Z UP TO NON-ALPHA, CORRESPONDING TO ROW, FOLLOWED BY
  9648. C NUMBERS IN THE 0-9 RANGE MAKING A DECIMAL COLUMN NUMBER.
  9649. C
  9650. C THE LETTERS ARE FORMED BY
  9651. C A-Z ALONE GIVE ROW 1-26, COL 1. % IS ROW 27,COL1
  9652. C A1-Z1 GIVE ROW 1-26, COL 2
  9653. C AA1-ZZ1 ARE ROW 27-52, COL 2
  9654.     IMPLICIT InTeGer*4 (A-Z)
  9655. C NOTE COL 1 IS DUMMY. DISPLAY THE SHEET SIDEWAYS SO WE GET USUAL VISUAL
  9656. C ROWS, COLS., AND ACCUMULATORS A-Z,% JUST APPEAR AS A FICTITIOUS ROW 0
  9657. C ON DISPLAY, INSTEAD OF REAL COLUMN 1 HERE.
  9658.     DIMENSION LINE(LEND)
  9659.     CHARACTER*1 LINE
  9660.     InTeGer*4 TYPE(1,2),VLEN(9)
  9661.     REAL*8 XVBLS(1,1)
  9662.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  9663.     Real*8 VAVBLS(3,27)
  9664.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  9665.     REAL*8 XAVB
  9666.     REAL*4 XAV2(2)
  9667.     CHARACTER*1 XAV1(8)
  9668.     EXTERNAL INDX
  9669.     EQUIVALENCE(XAVB,XAV2(1)),(XAVB,XAV1(1))
  9670.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  9671.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  9672. C ***<<< KLSTO COMMON START >>>***
  9673.     InTeGer*4 DLFG
  9674. C    COMMON/DLFG/DLFG
  9675.     InTeGer*4 KDRW,KDCL
  9676. C    COMMON/DOT/KDRW,KDCL
  9677.     InTeGer*4 DTRENA
  9678. C    COMMON/DTRCMN/DTRENA
  9679.     REAL*8 EP,PV,FV
  9680.     DIMENSION EP(20)
  9681.     INTEGER*4 KIRR
  9682. C    COMMON/ERNPER/EP,PV,FV,KIRR
  9683.     InTeGer*4 LASTOP
  9684. C    COMMON/ERROR/LASTOP
  9685.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  9686. C    COMMON/FMTBFR/FMTDAT
  9687.     CHARACTER*1 EDNAM(16)
  9688. C    COMMON/EDNAM/EDNAM
  9689.     InTeGer*4 MFID(2),MFMOD(2)
  9690. C    COMMON/FRM/MFID,MFMOD
  9691.     InTeGer*4 JMVFG,JMVOLD
  9692. C    COMMON/FUBAR/JMVFG,JMVOLD
  9693.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  9694.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  9695. C ***<<< KLSTO COMMON END >>>***
  9696. CCC    InTeGer*4 DLFG
  9697. CCC    COMMON/DLFG/DLFG
  9698. C DLFG=1 IF D## FORMS ARE SEEN
  9699.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  9700.     COMMON/D2R/NRDSP,NCDSP
  9701. C NRDSP AND NCDSP ARE REAL ROW, COL OF DISPLAY ROW, COL CELLS. NOTE THAT
  9702. C NOT ALL DISPLAY CELLS ARE ALWAYS ACTUALLY SHOWN; ONLY THOSE THAT FIT
  9703. C ARE SHOWN; THE REST "EXIST" BUT DON'T APPEAR UNLESS ROWS ARE SMALL
  9704. C ENOUGH.
  9705. C
  9706. C THIS PROGRAM ALSO HANDLES CELL SPECS OF FORM
  9707. C P#+nnn#+nnn (or P#-nnn#-mmm) FOR Physical cells relative to our current
  9708. C physical cell on the sheet (clamped at boundaries), or of form
  9709. C D#+nnn#+mmm etc for Display cells relative to our current display
  9710. C location as held in the DROW,DCOL cells in commons.
  9711. C ***<<<< RDD COMMON START >>>***
  9712.     InTeGer*4 RRWACT,RCLACT
  9713. C    COMMON/RCLACT/RRWACT,RCLACT
  9714.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  9715.      1  IDOL7,IDOL8
  9716. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  9717. C     1  IDOL7,IDOL8
  9718.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  9719. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9720.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9721. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  9722. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  9723. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  9724.     InTeGer*4 KLVL
  9725. C    COMMON/KLVL/KLVL
  9726.     InTeGer*4 IOLVL,IGOLD
  9727. C    COMMON/IOLVL/IOLVL
  9728. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  9729. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  9730.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9731.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9732.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  9733.      3  k3dfg,kcdelt,krdelt,kpag
  9734. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  9735. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  9736. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  9737. C ***<<< RDD COMMON END >>>***
  9738. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6
  9739. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6
  9740. CCC    InTeGer*4 PROW,PCOL
  9741. C ! PHYSICAL ROW, COL BEING HANDLED.
  9742. CCC    InTeGer*4 DROW,DCOL,DCLV,DRWV
  9743.     InTeGer*4 RSM,CSM,AFG,ASM,VCF,CH
  9744. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  9745.     LOGICAL*4 L1,L2
  9746. C    LOGICAL*2 L63,L192,L127
  9747.     InTeGer*4 I1,I2
  9748.     InTeGer*4 I63,I192,I127
  9749.     EQUIVALENCE(I1,L1),(I2,L2)
  9750. C    EQUIVALENCE (I63,L63),(I192,L192),(L127,I127)
  9751.     save i63,i192,i127
  9752.     DATA I63/63/,I192/192/,I127/127/
  9753. C DRWV,DCLV = # OF MAX ROWS, COLS ACTUALLY ON SCREEN NOW. DROW,DCOL
  9754. C ARE ACTUAL "CURSOR" LOCATION.
  9755. C
  9756. C ZERO OUR VARIABLES
  9757.     LPFG=0
  9758. C ! FLAG WE GOT A LOGICAL/PHYSICAL # FORM AND TYPE
  9759.     AFG=0
  9760. C ! FLAG WE SAW AN ALPHA
  9761.     ASM=0
  9762. C ! SUM OF ALPHAS HASHCODED (ACCUMULATOR)
  9763.     NSM=0
  9764. C ! ACCUMULATOR FOR NUMERICS
  9765.     NFG=0
  9766. C ! FLAG WE SAW A NUMERIC
  9767.     RSM=0
  9768. C ! AC FOR ROWS IN # FORMS
  9769.     CSM=0
  9770. C ! AC FOR COLS IN # FORMS
  9771.     ISPC=0
  9772. C ! COUNTER FOR NONSPACES SEEN (USED TO STOP ON TRAILING SPACES)
  9773.     idol1=0
  9774.     idol2=0
  9775.     IF(LINE(IBGN).NE.'%')GOTO 2000
  9776.     ID1=27
  9777.     ID2=1
  9778.     IVALID=1
  9779.     LSTCHR=IBGN+1
  9780. C SPECIAL CASE FOR % = AC #27
  9781.     RETURN
  9782. 2000    CONTINUE
  9783.     DO 1 N=IBGN,LEND
  9784.     VCF=0
  9785.     LSTCHR=N
  9786.     CH=ICHAR(LINE(N))
  9787.     IF (CH.EQ.255)GOTO 5000
  9788. C 5000 DECODES ENCODED FORMS AND RETURNS THEM...
  9789. C
  9790. C IGNORE SPACES AND TABS IF LEADING
  9791.     IF(CH.GT.32)ISPC=ISPC+1
  9792.     IF(CH.GT.0.AND.CH.LE.32.AND.ISPC.EQ.0)GOTO 1
  9793. C SPECIAL CASE TRAILING DOLLAR SIGNS... SKIP AND FLAG
  9794.     IF(CH.NE.36)GOTO 3443
  9795. C 36 IS ASCII FOR $ SIGN
  9796. C SAW A DOLLAR SIGN
  9797.     IF(AFG.EQ.1.AND.NFG.EQ.0)IDOL1=1
  9798.     IF(AFG.EQ.1.AND.NFG.EQ.1)IDOL2=1
  9799. C LEAVES WITH IDOL1 FLAGGED AS 1 IF LETTER PART WAS FOLLOWED BY
  9800. C DOLLAR SIGN, AND IDOL2 FLAGGED IF NUMBER PART WAS FOLLOWED
  9801. C BY DOLLAR. IGNORES ALL OTHER DOLLAR SIGNS.
  9802.     GOTO 1
  9803. 3443    CONTINUE
  9804. C GET CHARACTER VALUE IN.
  9805. C MUST BE UPPERCASE.
  9806.     IF(.NOT.(CH.GE.65.AND.CH.LT.91)) GOTO 100
  9807. C CH IS AN ALPHA, RANGE A-Z
  9808.     VCF=1
  9809. C ! VALID CHAR SEEN
  9810.     AFG=1
  9811. C !SAW THE ALPHA
  9812.     IF(ASM.LT.MRC)ASM=(CH-64)+26*ASM
  9813.     IF(NFG.NE.0)GOTO 103
  9814. C FILTER OUT TOO-LARGE VALUES...
  9815.     IF(ASM.GT.(MRC-MCOls))GOTO 103
  9816. C 60 * 26 IS LIM ABOVE
  9817.     IF(CH.EQ.80)LPFG=1
  9818. C ! FLAG WE GOT PHYS. FORM MAYBE
  9819.     IF(CH.EQ.68)LPFG=2
  9820. C ! FLAG WE GOT DISPLAY FORM MAYBE
  9821. 100    CONTINUE
  9822. C EXPECT # FORMS TO HAVE # JUST AFTER 1ST ALPHA.
  9823. C 35 IS ASCII VALUE OF '#' CHAR.
  9824.     IF(CH.EQ.35)GOTO 1000
  9825. C NEXT TEST NUMERICS
  9826.     IF(.NOT.(CH.GE.48.AND.CH.LE.57))GOTO 101
  9827. C CH IS A NUMERIC, RANGE 0-9
  9828.     VCF=1
  9829. C ! VALID CHAR SEEN
  9830.     NFG=1
  9831. C ! FLAG WE SAW NUMERIC
  9832.     IF(AFG.NE.0)GOTO 102
  9833.     GOTO 103
  9834. 102    CONTINUE
  9835.     IF(NSM.LT.MRC)NSM=(CH-48)+10*NSM
  9836. C FILTER OUT TOO-LARGE VALUES EARLY
  9837. C 301 * 10 IS LIMIT...
  9838.     IF(NSM.GT.(MRC-MCols))GOTO 103
  9839. C ! CONVERT CHARS TO BINARY AS SEEN
  9840. 101    CONTINUE
  9841.     IF(VCF.EQ.0)GOTO 2
  9842. C !END ON ANY INVALID CHARACTER
  9843. 1    CONTINUE
  9844. 2    CONTINUE
  9845.     IF(AFG.EQ.0)GOTO 103
  9846.     GOTO 950
  9847. 103    CONTINUE
  9848. C INVALID ... NUMERIC AND NO PRIOR ALPHA. FLAG BAD NAME AND EXIT.
  9849.     IVALID=0
  9850.     RETURN
  9851. 950    ID1=ASM
  9852.     ID2=1+NSM
  9853. C ! NOTE ID2=1 IF NO NUMERICS SEEN, MORE OTHERWISE.
  9854.     GOTO 1201
  9855. 1000    CONTINUE
  9856. C HERE HANDLE CURRENT-REFERENCED FORMS USING # AS SPECIAL CHARACTER MEANING
  9857. C THE CURRENT POSITION. THESE TYPES OF REFERENCES MAY BE MOVED AROUND THE
  9858. C SHEET WHICH ACCOUNTS FOR THEIR USEFULNESS. SINCE THERE IS A DISPLAY
  9859. C AND PHYSICAL SHEET WHICH ARE MAPPED BY A MAPPING, ALLOW EITHER
  9860. C TO BE REFERENCED. THUS, COMPLEX CALCULATIONS MAY BE DONE BUT LARGELY
  9861. C HIDDEN. THE ACCUMULATORS MAY BE USED AS SCRATCH STORAGE FOR THIS
  9862. C SORT OF THING.
  9863. C SAW THE # SIGN, SO SEE IF THE + OR - N CAN BE DECODED.
  9864. C IF NO P OR D WAS SEEN HOWEVER WE HAVE AN INVALID NAME, SO FLAG IT.
  9865.     IF(LPFG.EQ.0)GOTO 103
  9866. C PASS THE # SIGN PRIOR TO GETTING THE NUMERIC.
  9867.     LSTCHR=LSTCHR+1
  9868.     iundr=0
  9869.     if(line(lstchr).eq.'_')iundr=1
  9870.     if(line(lstchr).ne.'%'.and.iundr.eq.0)goto 3900
  9871. c allow p#%ab form to mean use ac a and b to get offsets from "here"
  9872. c allow P#_ab to be absolute address ref for cells (otherwise like p#%ab)
  9873.     CSM=0
  9874.     RSM=0
  9875. C DEFAULT TO "THIS" CELL
  9876.     LSTCHR=LSTCHR+1
  9877. C PASS THE % SIGN
  9878.     RSM=ICHAR(LINE(LSTCHR))
  9879.     CSM=ICHAR(LINE(LSTCHR+1))
  9880.     LSTCHR=LSTCHR+2
  9881. C FIX UP ASCII OFFSETS, AND MEANWHILE REQUIRE UPPERCASE
  9882. C AND THAT THERE BE 2 AC'S NAMES AFTER THE %.
  9883. C THIS SHOULD BE HANDY FOR COMMAND FILES.
  9884.     RSM=RSM-64
  9885.     CSM=CSM-64
  9886. C NOW RSM, CSM ARE SUBSCRIPTS. PULL OUT VALUES FROM XVBLS
  9887.     IF(RSM.LE.0.OR.RSM.GT.27)GOTO 103
  9888.     IF(CSM.LE.0.OR.CSM.GT.27)GOTO 103
  9889.     xavb=vavbls(1,RSM)
  9890. c    DO 3902 IV=1,8
  9891. c3902    XAV1(IV)=AVBLS(IV,RSM)
  9892.     RSM=XAVB
  9893.     xavb=vavbls(1,CSM)
  9894. c    DO 3903 IV=1,8
  9895. c3903    XAV1(IV)=AVBLS(IV,CSM)
  9896.     CSM=XAVB
  9897. C LOADS THE 2 AC'S TO THE OFFSETS AND GOES ON...JUST NEEDS THE
  9898. C 2 LETTERS AFTER P#% OR D#%.
  9899.     goto 3901
  9900. 3900    continue
  9901.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9902. C GN GETS THE +- NN NUMBER AND RETURNS VALUE IN NUM.
  9903. C LSTCHR RETURNS AS NEXT CHAR NOT USED.
  9904.     RSM=NUM
  9905. C 35 IS ASCII FOR '#'
  9906. C allow any delimiter between numbers, though we must have # at start
  9907. C  to delimit valid relative coordinates.
  9908. C    IF(ICHAR(LINE(LSTCHR)).NE.35) GOTO 103
  9909. C IF NO SECOND # SEEN, THE FORM IS INVALID SO SAY SO AND EXIT.
  9910.     LSTCHR=MIN0(LSTCHR+1,LEND)
  9911. CC BUMP PAST THE # IF WE SAW IT.
  9912. C now get the second numeric string and bump LSTCHR past it.
  9913.     NUM=0
  9914.     CALL GN(LSTCHR,LEND,NUM,LINE)
  9915.     CSM=NUM
  9916. C NOW HAVE THE NUMBERS ENCODED. NOTE THAT ## IS VALID.
  9917. 3901    CONTINUE
  9918.     IF(LPFG.EQ.2) GOTO 1200
  9919. C IF HERE, LPFG=1 AND WE ARE ON PHYSICAL SHEET.
  9920.     if(Iundr.eq.1)goto 3908
  9921.     ID2=CSM+PCOL
  9922.     ID1=RSM+PROW
  9923.     goto 1201
  9924. 3908    Continue
  9925.     id2=CSM
  9926.     id1=RSM
  9927. 1201    CONTINUE
  9928. C TO ALLOW REFLECTED VALUES TO WORK, LET ALL NORMAL VALUES BY...
  9929. C    IF(ID1.GT.60.OR.ID1.LE.0)GOTO 103
  9930. C    IF(ID2.GT.301.OR.ID2.LE.0)GOTO 103
  9931.     IVALID=1
  9932. C ALL IS WELL
  9933.     RETURN
  9934. 1200    CONTINUE
  9935. C DISPLAY COLUMN RELATIVE.
  9936.     DLFG=1
  9937. C FLAG WE SAW A D## FORM FOR RECALC
  9938.     DRRW=DROW+RSM
  9939.     DRRW=MAX0(1,DRRW)
  9940.     DRRW=MIN0(JIDcl,DRRW)
  9941.     DCCL=DCOL+CSM
  9942. C ENSURE DISPLAY COORDS IN LEGAL BOUNDS
  9943.     DCCL=MAX0(1,DCCL)
  9944.     DCCL=MIN0(JIDrw,DCCL)
  9945. C CLAMP TO WITHIN LEGAL DIMENSIONS.
  9946.     ID1=NRDSP(DRRW,DCCL)
  9947.     ID2=NCDSP(DRRW,DCCL)
  9948.     GOTO 1201
  9949. 5000    CONTINUE
  9950.     IF(ASM.NE.0.OR.NSM.NE.0)GOTO 103
  9951. C HANDLE 255,CODE1,CODE2 FORMS
  9952. C FIRST BYTE IS ALWAYS 255
  9953. C 2ND BYTE IS: HI 2 BITS ARE HI 2 BITS OF ID2. LO 6 BITS ARE ID1
  9954. C 3RD BYTE IS: LO 8 BITS OF ID2
  9955.     I1=ICHAR(LINE(LSTCHR+1))
  9956.     I2=IMASK(I1,I192)
  9957. C    L2=L1.AND.L192
  9958. C    L1=L1.AND.L63
  9959.     I1=IMASK(I1,I63)
  9960.     ID1=I1
  9961.     I1=ICHAR(LINE(LSTCHR+2))
  9962. C    L1=L1.AND.L127
  9963.     I1=IMASK(I1,I127)
  9964. C MUST HAVE 128 BIT ON IN LOW BYTE TO AVOID NULLS IN IT.
  9965.     ID2=I2*2+I1
  9966.     LSTCHR=LSTCHR+3
  9967.     GOTO 1201
  9968.     END
  9969. c -h- vvary.for    Fri Aug 22 13:37:17 1986    
  9970. C $DO66
  9971. C VARY CONTROL ROUTINE
  9972. C NOTE: THIS ROUTINE RELIES UPON HAVING ITS DATA AREAS REMAIN INTACT
  9973. C ACROSS CALLS. IT MUST NOT BE IN AN OVERLAY SEGMENT OR THAT WILL FAIL
  9974. C AND IT WILL NOT WORK. SPECIFICALLY IT EXPECTS THE AC ARRAY TO BE
  9975. C SET CORRECTLY.
  9976.     SUBROUTINE VVARY(LINE,RETCD,K)
  9977.     CHARACTER*1 LINE(80)
  9978.     INTEGER RETCD
  9979.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  9980.     Real*8 VAVBLS(3,27)
  9981.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  9982.     InTeGer*4 TYPE(1,2),VLEN(9)
  9983.     REAL*8 XAC,XVBLS(1,1)
  9984.     EQUIVALENCE(XAC,AVBLS(1,27))
  9985.     INTEGER*4 JVBLS(2,1,1)
  9986.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  9987.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  9988.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  9989. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  9990. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  9991. C (IMPLEMENT FOR VAX ONLY)
  9992. C ***<<< XVXTCD COMMON START >>>***
  9993.     CHARACTER*1 OARRY(100)
  9994.     InTeGer*4 OSWIT,OCNTR
  9995. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  9996. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  9997. C    InTeGer*4 IPS1,IPS2,MODFLG
  9998.     InTeGer*4 IC1POS,IC2POS,MODFLG
  9999. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  10000. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  10001.        InTeGer*4 XTCFG,IPSET,XTNCNT
  10002.        CHARACTER*1 XTNCMD(80)
  10003. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  10004. C VARY FLAG ITERATION COUNT
  10005.     INTEGER KALKIT
  10006. C    COMMON/VARYIT/KALKIT
  10007.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  10008.     InTeGer*4 RCMODE,IRCE1,IRCE2
  10009. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10010. C     1  IRCE2
  10011. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  10012. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  10013. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  10014. C RCFGX ON.
  10015. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  10016. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  10017. C  AND VM INHIBITS. (SETS TO 1).
  10018.     INTEGER*4 FH
  10019. C FILE HANDLE FOR CONSOLE I/O (RAW)
  10020. C    COMMON/CONSFH/FH
  10021.     CHARACTER*1 ARGSTR(52,4)
  10022. C    COMMON/ARGSTR/ARGSTR
  10023.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  10024.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  10025.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10026.      3  IRCE2,FH,ARGSTR
  10027. C ***<<< XVXTCD COMMON END >>>***
  10028. CCC    INTEGER KALKIT
  10029. CCC    COMMON/VARYIT/KALKIT
  10030.     EXTERNAL SIGN
  10031.     INTEGER LPUT,LGET
  10032.     REAL*8 SIGN
  10033.     CHARACTER*1 LAC(8)
  10034.     REAL*8 XVAC,VW
  10035.     EQUIVALENCE(LAC(1),XVAC)
  10036.     REAL *8 AC(26)
  10037.     REAL*8 DERIV(8)
  10038.     REAL*8 DEL(8)
  10039.     REAL*8 OLDVV,OLDX,OLDA
  10040.     INTEGER ACV(8)
  10041.     INTEGER CAC(2)
  10042.     INTEGER CCNT(8)
  10043. C UNCOMMENT THIS COMMON DECLARATION AND MOVE DATA STMTS INTO BLOCK
  10044. C IN ORDER TO OVERLAY THIS...
  10045.     COMMON/VRYDAT/AC,DERIV,DEL,CAC,CCNT,OLDVV,OLDX,OLDA,ACV
  10046. C
  10047. C ACV POINTS TO AC'S VARYING
  10048. C CAC = CURRENT INDEX INTO ACV TO FIND AC BEING VARIED
  10049. C AC IS LAST SET OF ACCUMULATORS SEEN
  10050. C IF ACV ENTRY IS 0, MEANS NO AC TO VARY THERE.
  10051.     INTEGER LW,LX,LI
  10052. C ! LOGICAL W,X,I AC'S
  10053.     INTEGER LA
  10054. C ! LOGICAL A AC
  10055. C
  10056. C    DATA DERIV/8*1./,DEL/8*0./
  10057. C    DATA CAC/1,1/,CCNT/8*0/
  10058. C    DATA ACV/8*0/
  10059. C    DATA OLDVV/1./
  10060. C
  10061. C PARSE ARGUMENTS FIRST
  10062. C FIRST 2 ARGS ARE X AND A AC'S (OR GENERAL CELLS)
  10063. C DEFAULT NO REDOING THIS...
  10064.     KALKIT=0
  10065.     IBGN=K+5
  10066.     LEND=IBGN+20
  10067.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LX,ID2A,IVALID)
  10068.     IF (IVALID.EQ.0)GOTO 9900
  10069.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  10070.     IBGN=LSTCHR+1
  10071.     LEND=IBGN+20
  10072.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LA,ID2B,IVALID)
  10073.     IF (IVALID.EQ.0)GOTO 9900
  10074.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  10075.     IBGN=LSTCHR+1
  10076.     LEND=IBGN+20
  10077.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LW,ID3B,IVALID)
  10078.     IF (IVALID.EQ.0)GOTO 9900
  10079.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  10080.     IF(ID3B.NE.1)GOTO 9900
  10081.     IBGN=LSTCHR+1
  10082.     LEND=IBGN+20
  10083.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,LI,ID3B,IVALID)
  10084.     IF (IVALID.EQ.0)GOTO 9900
  10085.     IF(LINE(LSTCHR).NE.',')GOTO 9900
  10086.     IF(ID3B.NE.1)GOTO 9900
  10087. C    IBGN=LSTCHR+1
  10088. C    LEND=IBGN+20
  10089. C LOOP OVER VALUES TO VARY NOW
  10090.     DO 99 N=1,8
  10091. 99    ACV(N)=0.
  10092.     DO 100 N=1,8
  10093. C ALLOW UP TO 8 DIMENSIONS VARIATION
  10094.     IBGN=LSTCHR+1
  10095.     LEND=IBGN+20
  10096.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ACV(N),ID3B,IVALID)
  10097.     IF (IVALID.EQ.0)GOTO 9900
  10098.     IF(LINE(LSTCHR).NE.';')GOTO 110
  10099.     IF(ID3B.NE.1)GOTO 9900
  10100.     IBGN=LSTCHR+1
  10101.     LEND=IBGN+20
  10102. 100    CONTINUE
  10103. 110    CONTINUE
  10104. C NOW HAVE ALL AC POINTERS SET UP.
  10105. C IF I IS NOW 0 OR NEGATIVE (ITER COUNT), REINITIALIZE.
  10106.     ASSIGN 111 TO LGET
  10107.     LLL=LI
  10108.     GOTO 500
  10109. 111    CONTINUE
  10110.     IF(XVAC.GT.0.)GOTO 112
  10111. C INITIALIZE COUNTS
  10112.     LLL=LW
  10113. C GET VALUE OF W FRACTION
  10114.     ASSIGN 114 TO LGET
  10115.     GOTO 500
  10116. 114    CONTINUE
  10117.     VW=XVAC
  10118.     OLDVV=1.
  10119.     DO 113 N=1,8
  10120.     CCNT(N)=0
  10121.     DERIV(N)=1.
  10122.     DEL(N)=VW
  10123. 113    CONTINUE
  10124.     CAC(1)=1
  10125. C COPY CURRENT AC'S INTO SAVED ONES NOW.
  10126.     DO 117 N=1,26
  10127.     LLL=N
  10128.     ASSIGN 118 TO LGET
  10129.     GOTO 500
  10130. 118    AC(N)=XVAC
  10131. 117    CONTINUE
  10132. C AFTER THE INIT, JUST RETURN SINCE WE DON'T WANT TO TRY ANY ITERATIONS
  10133. C WHEN ITER COUNT EXPIRES.
  10134.     KALKIT=0
  10135.     RETURN
  10136. C HERE WHEN ITER COUNT IS POSITIVE.
  10137. 112    CONTINUE
  10138.     XVAC=XVAC-1.
  10139. C UPDATE ITERATION COUNT NOW...
  10140.     KALKIT=XVAC
  10141.     ASSIGN 120 TO LPUT
  10142.     GOTO 600
  10143. 120    CONTINUE
  10144. C
  10145. C NOW PROCEED WITH VARIATIONS...
  10146.     IF(CAC(1).LT.1.OR.CAC(1).GT.8)CAC(1)=1
  10147.     IF(CCNT(CAC(1)).GE.1)GOTO 200
  10148. C CCNT WAS 0 SO WE DIDN'T GET OUR PARTIAL YET. VARY THE
  10149. C AC WE'RE LOOKING AT (CAC = CURRENT AC) AND USE NEW VALUE OF
  10150. C (X-A) FOR A NUMERICAL DERIVATIVE RESULT AFTER A RECALC OF SCREEN...
  10151.     CCNT(CAC(1))=1
  10152. C JUST STARTED THIS AC SO VARY BY THE APPROPRIATE DELTA AND
  10153. C EXIT, ALLOWING PARTIAL TO BE COMPUTED NEXT TIME.
  10154.     LLL=LW
  10155.     ASSIGN 400 TO LGET
  10156.     GOTO 500
  10157. 400    CONTINUE
  10158. C GET W ACC. VALUE
  10159.     VW=XVAC
  10160.     IF(VW.EQ.0.)VW=.5
  10161. C GET CURRENT AC, FIND HOW TO UPDATE IT.
  10162.     LLL=ACV(CAC(1))
  10163.     IF(LLL.LE.0)GOTO 9900
  10164.     ASSIGN 121 TO LGET
  10165.     GOTO 500
  10166. 121    CONTINUE
  10167. C NOW XVAC HAS CURRENT AC FOR THE ONE WE'RE VARYING
  10168. C ADD DEL TO IT AND GET NEW ONE...
  10169. C SAVE OLD X AC VALUE FOR NEXT ITERATION.
  10170. C NOTE LLL IS STILL SET AT CURRENTLY VARYING AC
  10171. C SAVE CURRENT (UNVARIED) VALUE TOO FOR NEXT TIME AROUND.
  10172.     OLDVV=XVAC
  10173.     IF(OLDVV.EQ.0.)OLDVV=1.
  10174.     IF(DEL(CAC(1)).EQ.0.)DEL(CAC(1))=VW
  10175.     XVAC=XVAC*(1.+DEL(CAC(1)))
  10176. C NOW ALL SET... JUST SAVE CURRENT AC'S AND CURRENT X,A
  10177. C SO WE CAN GET DIFFERENCE NEXT TIME AROUND.
  10178. C    AC(ACV(CAC(1)))=XVAC
  10179. C STORE XVAC INTO REAL ACCUMULATORS TOO, SO IT'LL WORK
  10180. C WHEN ALL AC'S ARE RELOADED BELOW.
  10181.     ASSIGN 412 TO LPUT
  10182.     GOTO 600
  10183. 412    CONTINUE
  10184. C AT 1000, RELOAD AC ARRAY FROM REAL AC'S... BUT GET OUR MODIFIED
  10185. C ONE WE JUST STORED TOO.
  10186.     GOTO 1000
  10187. 200    CONTINUE
  10188. C COUNT HERE IS 1 SO WE ALREADY HAVE INFO NOW FOR OUR PARITAL
  10189. C DERIVATIVE. COMPUTE IT AND VARY THE SELECTED AC USING IT
  10190. C THEN STORE IT AND RESET CCNT(CAC) TO 0
  10191.     CCNT(CAC(1))=0
  10192. C MUST GET NEW X AND A VALUES NOW.
  10193.     CALL XVBLGT(LX,ID2A,XVAC)
  10194. C    XVAC=XVBLS(LX,ID2A)
  10195.     IF(ID2A.NE.1)GOTO 201
  10196.     LLL=LX
  10197.     ASSIGN 201 TO LGET
  10198. C EXTRACT CURRENT X FROM AVBLS
  10199.     GOTO 500
  10200. 201    CONTINUE
  10201.     XCURR=XVAC
  10202.     CALL XVBLGT(LA,ID2B,XVAC)
  10203. C    XVAC=XVBLS(1,1)
  10204.     IF(ID2B.NE.1)GOTO 202
  10205.     LLL=LA
  10206.     ASSIGN 202 TO LGET
  10207.     GOTO 500
  10208. 202    CONTINUE
  10209.     ACURR=XVAC
  10210. C NOW WE HAVE ENOUGH TO COMPUTE PARTIAL DERIVATIVE WE NEED.
  10211.     IF(ACV(CAC(1)).LE.0)GOTO 9900
  10212.     IF(OLDVV.EQ.0.)OLDVV=AC(ACV(CAC(1)))
  10213.     IF(OLDVV.EQ.0.)OLDVV=1.
  10214.     DERIV(CAC(1))=((XCURR-ACURR)-(OLDX-OLDA))/(DEL(CAC(1))*OLDVV)
  10215. C NEGATIVE FEEDBACK: IF GOING POSITIVE, MAKE IT NEGATIVE...
  10216. C THIS IS NOT AN ANALYTICAL PROCEDURE ... JUST STEPS IN RIGHT DIRECTION
  10217. C BY APPROPRIATE AMOUNT AND CONTINUES...
  10218. C CLAMP VARIATION TO INITIAL PERCENTAGE IN W ACCUMULATOR
  10219.     LLL=LW
  10220. C OBTAIN VALUE OF W VARIATION NOW...IN CASE USER SETS IT UP TO VARY
  10221.     ASSIGN 203 TO LGET
  10222.     GOTO 500
  10223. 203    CONTINUE
  10224.     VW=XVAC
  10225. C
  10226. C TO ATTEMPT TO GET TO THE ZERO OF (X-A), WE REALLY NEED TO
  10227. C DIVIDE BY THE DERIVATIVE. HOWEVER, IN CASES WHERE THE FUNCTION
  10228. C IS NEAR ITS LOCAL MINIMUM AND SLOWLY VARYING, WE REALLY DON'T WANT
  10229. C TO STEP FAR AWAY (IT MAY NEVER REACH THE ZERO). THEREFORE, TEST
  10230. C TO SEE IF THE DERIVATIVE IS LARGE AND ALLOW DIVISION WHERE IT IS
  10231. C OVER A SOMEWHAT ARBITRARY THRESHOLD (USED 1.0 BELOW), BUT
  10232. C MULTIPLY BY DERIVATIVE OTHERWISE, SO THAT AS THE FUNCTION APPROACHES
  10233. C ZERO SLOPE, THE STEPS GET FINER TO GET INTO THE LOCAL MINIMUM (IF ANY).
  10234. C
  10235. C FORCE NONZERO VARIATION JUST SO WE DON'T GET STUCK.
  10236.     IF(DERIV(CAC(1)).EQ.0.)DERIV(CAC(1))=.01
  10237.     IF(DABS(DERIV(CAC(1))).GT.1.)GOTO 405
  10238.     DEL(CAC(1))=-(OLDX-OLDA)*VW*DERIV(CAC(1))
  10239.     GOTO 406
  10240. 405    CONTINUE
  10241.     DEL(CAC(1))=-(OLDX-OLDA)*VW/DERIV(CAC(1))
  10242. 406    CONTINUE
  10243. C VERY IMPORTANT TO CLAMP SIZE OF STEPS HERE SO WE DON'T WILDLY DIVERGE
  10244. C IN EARLY GOING. SMALL STEPS TAKE LONGER BUT GET TO MINIMA; LARGER ONES
  10245. C WHERE WE DON'T KNOW FUNCTION SHAPE CAN BE DISASTERS.
  10246.     IF(DABS(DEL(CAC(1))).GT.VW)DEL(CAC(1))=VW*SIGN(DEL(CAC(1)))
  10247. C NOW RESTORE AC'S TO OLD ONES AND VARY CURRENT ONE BY
  10248. C THE NEW DELTA.
  10249.     IF(ACV(CAC(1)).LE.0)GOTO 9900
  10250. C NEXT LINE MAKES ADJUSTMENT NEEDED TO OUR VARYING AC.
  10251.     AC(ACV(CAC(1)))=OLDVV*(1.+DEL(CAC(1)))
  10252. C NOW COPY SAVED OLD AC'S ONTO NEW ONES SO WE START WITH AC'S ALL AS THEY
  10253. C WERE IN FIRST STEP SO WE VARY FROM INITIAL X, NOT FROM FIRST VARIED X
  10254. C LOCATION...
  10255.     DO 204 N=1,26
  10256.     XVAC=AC(N)
  10257.     LLL=N
  10258.     ASSIGN 205 TO LPUT
  10259.     GOTO 600
  10260. 205    CONTINUE
  10261. 204    CONTINUE
  10262. C MOVE ON TO THE NEXT CAC VALUE
  10263.     CAC(1)=CAC(1)+1
  10264.     IF(ACV(CAC(1)).LE.0.OR.CAC(1).GT.8)CAC(1)=1
  10265. 1000    CONTINUE
  10266. C SAVE OLD AC'S NOW FOR NEXT TIME
  10267.     DO 1100 N=1,26
  10268.     LLL=N
  10269.     ASSIGN 1101 TO LGET
  10270.     GOTO 500
  10271. 1101    AC(N)=XVAC
  10272. 1100    CONTINUE
  10273. C REMEMBER OLD X AND A VALUES SINCE WE LOOK FOR X=A AS
  10274. C A SEARCH CONDITION. WE MUST ASSUME THAT SOME SORT OF
  10275. C VARIATION OF ACCUMULATORS GIVEN WILL ALLOW US TO SATISFY
  10276. C THE EQUATION (X-A)=0.
  10277.     OLDX=AC(LX)
  10278.     IF(ID2A.NE.1)CALL XVBLGT(LX,ID2A,OLDX)
  10279. C    IF(ID2A.NE.1)OLDX=XVBLS(LX,ID2A)
  10280.     OLDA=AC(LA)
  10281.     IF(ID2B.NE.1)CALL XVBLGT(LA,ID2B,OLDA)
  10282. C    IF(ID2B.NE.1)OLDA=XVBLS(LA,ID2B)
  10283.     RETURN
  10284. 9900    CONTINUE
  10285.     RETCD=3
  10286.     RETURN
  10287. C PROC TO LOAD XVAC WITH VBLS(LLL)
  10288. 500    CONTINUE
  10289.     xvac=vavbls(1,LLL)
  10290. c    DO 501 KKKKN=1,8
  10291. c501    LAC(KKKKN)=AVBLS(KKKKN,LLL)
  10292.     GOTO LGET,(111,114,118,400,121,201,202,203,1101)
  10293. C PROC TO STORE XVAC INTO VBLS(LLL)
  10294. 600    CONTINUE
  10295.     vavbls(1,LLL)=xvac
  10296. c    DO 601 KKKKN=1,8
  10297. c601    AVBLS(KKKKN,LLL)=LAC(KKKKN)
  10298.     GOTO LPUT,(120,412,205)
  10299.     END
  10300. c -h- xqtcmd.for    Fri Aug 22 13:45:23 1986    
  10301. C $DO66
  10302.     SUBROUTINE XQTCMD(ICODE)
  10303. C COPYRIGHT (C) 1983-1990 GLENN AND MARY EVERHART
  10304. c All Rights Reserved
  10305.     Include aparms.inc
  10306. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  10307. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  10308. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  10309. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  10310. C FROM THE DISK BASED FILE HERE.
  10311.     CHARACTER*1 FORM,FVLD,CMDLIN(132),CL127(127)
  10312. C ALLOCATE EXTRA SLOP SPACE AFTER CMDLIN
  10313.     CHARACTER*1 CLWW(136)
  10314.     EQUIVALENCE(CLWW(1),CMDLIN(1))
  10315.     CHARACTER*127 CMDLNA
  10316.     EQUIVALENCE(CMDLIN(1),CL127(1),CMDLNA(1:1))
  10317. C    EQUIVALENCE(CMDLNA,CMDLIN(1))
  10318.     CHARACTER*127 WRKCHR,FORMCH,fwt
  10319. C    equivalence(fwt(1:1),formch(1:1))
  10320.     CHARACTER*1 FORM2(128),NMSH(80)
  10321.     CHARACTER*1 WRKCHA(132),WRK127(127)
  10322.     EQUIVALENCE(WRKCHA(1),WRKCHR(1:1),WRK127(1),FORM2(1))
  10323. C    EQUIVALENCE(FORM2(1),WRK127(1))
  10324. C ***<<<< RDD COMMON START >>>***
  10325.     InTeGer*4 RRWACT,RCLACT
  10326. C    COMMON/RCLACT/RRWACT,RCLACT
  10327.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  10328.      1  IDOL7,IDOL8
  10329. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  10330. C     1  IDOL7,IDOL8
  10331.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  10332. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  10333.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  10334. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  10335. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  10336. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  10337. c    InTeGer*4 KLVL
  10338. C    COMMON/KLVL/KLVL
  10339.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kpag
  10340.     InTeGer*4 IOLVL,IGOLD
  10341. C    COMMON/IOLVL/IOLVL
  10342. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  10343. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  10344.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  10345.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  10346.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  10347.      3  k3dfg,kcdelt,krdelt,kpag
  10348. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  10349. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  10350. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  10351. c     3  k3dfg,kcdelt,krdelt,kpag
  10352. C ***<<< RDD COMMON END >>>***
  10353. CCC    InTeGer*4 RRWACT,RCLACT
  10354. CCC    COMMON/RCLACT/RRWACT,RCLACT
  10355. c    INTEGER*4 VNLT
  10356.     EXTERNAL INDX
  10357. c    EQUIVALENCE(FORM2(1),WRKCHR)
  10358.     COMMON/NMSH/NMSH
  10359.     REAL*8 XVBLS(1,1)
  10360.     INTEGER KPYBAK
  10361. CCC    Integer*4 FH
  10362. CCC    Common/CONSFH/FH
  10363. C ***<<< KLSTO COMMON START >>>***
  10364.     InTeGer*4 DLFG
  10365. C    COMMON/DLFG/DLFG
  10366.     InTeGer*4 KDRW,KDCL
  10367. C    COMMON/DOT/KDRW,KDCL
  10368.     InTeGer*4 DTRENA
  10369. C    COMMON/DTRCMN/DTRENA
  10370.     REAL*8 EP,PV,FV
  10371.     DIMENSION EP(20)
  10372.     INTEGER*4 KIRR
  10373. C    COMMON/ERNPER/EP,PV,FV,KIRR
  10374.     InTeGer*4 LASTOP
  10375. C    COMMON/ERROR/LASTOP
  10376.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  10377. C    COMMON/FMTBFR/FMTDAT
  10378.     CHARACTER*1 EDNAM(16)
  10379. C    COMMON/EDNAM/EDNAM
  10380.     InTeGer*4 MFID(2),MFMOD(2)
  10381. C    COMMON/FRM/MFID,MFMOD
  10382.     InTeGer*4 JMVFG,JMVOLD
  10383. C    COMMON/FUBAR/JMVFG,JMVOLD
  10384.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  10385.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  10386. C ***<<< KLSTO COMMON END >>>***
  10387. CCC    InTeGer*4 JMVFG,JMVOLD
  10388.     INTEGER*4 JVBLS(2,1,1)
  10389. CCC    COMMON/IOLVL/IOLVL
  10390. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  10391. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  10392. C PUT JMVFG INTO A PSECT BY ITSELF SO IT WILL SURVIVE OVERLAYS.
  10393. CCC    COMMON/FUBAR/JMVFG,JMVOLD
  10394.     DIMENSION FORM(128),FVLD(1,1)
  10395.     CHARACTER*1 DFE,FVWRK,FRM127(127)
  10396.     EQUIVALENCE(FORM(1),FORMCH(1:1),FRM127(1))
  10397. C    EQUIVALENCE(FORM(1),FRM127(1)),(FRM127(1),FORMCH)
  10398.     DIMENSION DFE(14)
  10399.     CHARACTER*14 CDFE
  10400.     EQUIVALENCE(CDFE(1:1),DFE(1))
  10401. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  10402. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  10403. C SO INITIALLY IGNORE.
  10404. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  10405. C
  10406. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  10407. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  10408. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6,
  10409. CCC     1  IDOL7,IDOL8
  10410.  
  10411. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6,
  10412. CCC     1  IDOL7,IDOL8
  10413. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  10414. CCC    InTeGer*4 LLCMD,LLDSP
  10415. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  10416.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  10417.     COMMON/D2R/NRDSP,NCDSP
  10418.     InTeGer*4 ILNFG,ILNCT,RCF
  10419. C ***<<< NULETC COMMON START >>>***
  10420.     InTeGer*4 ICREF,IRREF
  10421. C    COMMON/MIRROR/ICREF,IRREF
  10422.     InTeGer*4 MODPUB,LIMODE
  10423. C    COMMON/MODPUB/MODPUB,LIMODE
  10424.     InTeGer*4 KLKC,KLKR
  10425.     REAL*8 AACP,AACQ
  10426. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  10427.     InTeGer*4 NCEL,NXINI
  10428. C    COMMON/NCEL/NCEL,NXINI
  10429.     CHARACTER*1 NAMARY(20,MROWS)
  10430. C    COMMON/NMNMNM/NAMARY
  10431.     InTeGer*4 NULAST,LFVD
  10432. C    COMMON/NULXXX/NULAST,LFVD
  10433.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  10434.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  10435. C ***<<< NULETC COMMON END >>>***
  10436. CCC    COMMON/NCEL/NCEL,NXINI
  10437.     CHARACTER*1 ILINE(106)
  10438.     COMMON/ILN/ILNFG,ILNCT,ILINE
  10439. C ***<<< XVXTCD COMMON START >>>***
  10440.     CHARACTER*1 OARRY(100)
  10441.     InTeGer*4 OSWIT,OCNTR
  10442. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  10443. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  10444. C    InTeGer*4 IPS1,IPS2,MODFLG
  10445.     InTeGer*4 IC1POS,IC2POS,MODFLG
  10446. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  10447. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  10448.        InTeGer*4 XTCFG,IPSET,XTNCNT
  10449.        CHARACTER*1 XTNCMD(80)
  10450. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  10451. C VARY FLAG ITERATION COUNT
  10452.     INTEGER KALKIT
  10453. C    COMMON/VARYIT/KALKIT
  10454.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  10455.     InTeGer*4 RCMODE,IRCE1,IRCE2
  10456. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10457. C     1  IRCE2
  10458. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  10459. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  10460. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  10461. C RCFGX ON.
  10462. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  10463. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  10464. C  AND VM INHIBITS. (SETS TO 1).
  10465.     INTEGER*4 FH
  10466. C FILE HANDLE FOR CONSOLE I/O (RAW)
  10467. C    COMMON/CONSFH/FH
  10468.     CHARACTER*1 ARGSTR(52,4)
  10469. C    COMMON/ARGSTR/ARGSTR
  10470.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  10471.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  10472.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  10473.      3  IRCE2,FH,ARGSTR
  10474. C ***<<< XVXTCD COMMON END >>>***
  10475. CCC    InTeGer*4 IC1POS,IC2POS,MODFLG
  10476. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  10477. CCC    CHARACTER*1 OARRY(100)
  10478. CCC    InTeGer*4 OSWIT,OCNTR
  10479. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  10480. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  10481.     InTeGer*4 TYPE(1,2),VLEN(9)
  10482.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  10483.     Real*8 VAVBLS(3,27)
  10484.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  10485.     CHARACTER*1 FVLDTP
  10486.     REAL*8 XAC,ZAC
  10487.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  10488.     REAL*8 XXAC,XYAC
  10489.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  10490. CCC    InTeGer*4 NULAST,LFVD
  10491. CCC    COMMON/NULXXX/NULAST,LFVD
  10492. CCC    CHARACTER*1 ARGSTR(52,4)
  10493. CCC    COMMON/ARGSTR/ARGSTR
  10494. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  10495. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  10496. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  10497. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  10498. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  10499. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  10500.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  10501.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  10502.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  10503. CCC    COMMON/KLVL/KLVL
  10504.     CHARACTER*1 DEFVB(12)
  10505. CCC    InTeGer*4 MODPUB,LIMODE
  10506. CCC    COMMON/MODPUB/MODPUB,LIMODE
  10507.     COMMON/DEFVBX/DEFVB
  10508. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  10509. CCC     1  IRCE1,IRCE2
  10510. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  10511. CCC     1  IRCE1,IRCE2
  10512. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  10513. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  10514. C  AND VM INHIBITS. (SETS TO 1).
  10515. C
  10516. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  10517. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  10518. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  10519. C DISPLAY ACTUALLY USED FOR SCREEN.
  10520.     Integer*4 CWids(JIDcl)
  10521. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  10522. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  10523. C AS 20 NOT 75.
  10524.     REAL*8 DVS(JIDcl,JIDrw)
  10525.     INTEGER*4 LDVS(2,JIDcl,JIDrw)
  10526.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  10527.     COMMON /FVLDC/FVLD
  10528. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  10529. C 10 CHARACTERS PER ENTRY.
  10530.     COMMON/DSPCMN/DVS,CWIDS
  10531. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  10532.     InTeGer*4 THISRW,THISCL
  10533. C    CHARACTER*1 IBITMP(2258)
  10534. C    COMMON/INITD/IBITMP
  10535. C FOLLOWING COMMON IS TO CONTROL "EXTERNAL" CALL OF XQTCMD
  10536. C TO ALLOW USE FROM INSIDE CELLS.
  10537. CCC    CHARACTER*1 XTNCMD(80)
  10538. CCC    InTeGer*4 XTCFG,XTNCNT,IPSET
  10539. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  10540.     CHARACTER*1 blanks
  10541.     character*1 defplt(24)
  10542.     dimension blanks(30)
  10543.     save blanks
  10544.     data defplt/'$',' ','E','X','E','C','U','T','E',
  10545.      1  ' ','D','K',':','P','L','T','F','I',
  10546.      1  'L','.','P','C','P',0/
  10547.     data blanks/30*' '/
  10548. C
  10549.     OSWIT=2
  10550. C ISSUE A PROMPT FOR COMMAND AND DO A COMMAND
  10551. C
  10552. C  COMMANDS INCLUDE:
  10553. C E = ENTER NUMBERS OR FORMULAS
  10554. C M = MOVE DIRECTION (1,2,3,4 = U,D,L,R)
  10555. C D = DISPLAY CHARACTERISTIC CHANGES
  10556. C
  10557. C DISPLAY ALTERING SUBCOMMANDS:
  10558. C  DL V1:V2 RN:M OR CN:M - DISPLAY VARIABLE RANGE V1:V2 AT DISPLAY
  10559. C  ROW OR COL N THRU M.
  10560. C  RN:M MEANS ACROSS A ROW ON DISPLAY STARTING AT DISPLAY COORD N,M
  10561. C  CN:M MEANS DOWN A DISPLAY COLUMN STARTING AT DISPLAY COORD N,M
  10562. C  DF V1:V2 FORMAT
  10563. C  SET FORMAT FOR DISPLAY OF V1 THRU V2 TO FORMAT (NOT INCL. )
  10564. C  A OR L DESIGNATOR SAYS SHOW TEXT IN FORMULA BUFFER. ELSE SHOW
  10565. C  NUMBER VALUE AT THAT LOC.
  10566. C  DT V1:V2 F OR I - SET NUMERIC TYPE OF V1 THRU V2 TO FLOAT OR INT.
  10567. C  DW N,M - SET WIDTH OF COL. N TO M CHARS WIDE.
  10568. C  DB MC,MR - SET MAX COLS TO MC, MAX ROWS TO MR.
  10569. C
  10570. C V = VIEWSCREEN UPDATE. REDISPLAY EVERYTHING FROM SCRATCH.
  10571. C VF = VIEW BUT DISPLAY FORMULAS ALL LOCS.
  10572. C VM = DISABLE REDRAWING SCREEN UNTIL A V IS SEEN.
  10573. C C = COPY NUMBERS/FORMULAS/DISPLAY STUFF(FORMAT)/ALL/RELOCATING
  10574. C 1,2,3,4 = MOVE CURSOR UP,DOWN,LEFT,RIGHT 1 ROW/COL
  10575. C (THESE DO NOT INVALIDATE CALCULATION SO RECALCULATION IS NOT
  10576. C DONE FOR THESE COMMANDS.)
  10577. C F FILENAME/NNN  FILL SCREEN (DISPLAYED PART ONLY) FROM FILENAME,
  10578. C    SKIPPING NNN RECORDS FIRST IF CALLED FOR. /NNN PART OPTIONAL.
  10579. C  (SPLITS STUFF READ IN ACROSS COLUMNS CURRENTLY DEFINED AND
  10580. C   SETS FVLD FOR DISPLAY OF TEXT, NOT #S.)
  10581. C AR/A n R/C ADDS/SUBTRACTS (INSERTS/DELETES) n ROWS OR COLUMNS
  10582. C   AT CURENT LOCATION. AR/AA SELECTS RELOCATING/ABSOLUTE.
  10583. C R = RECALCULATE SHEET. 17 = RECALCULATE MANUALLY ONLY (R RESETS)
  10584. C K = DROP INTO CALC CALCULATOR (*E RETURNS TO SHEET)
  10585. C L = LOCATE CURSOR (MOVE TO POSITION ON SHEET)
  10586. C (L VARIABLE IS THE COMMAND, AND IT LOCATES ORIGIN ON PHYSICAL
  10587. C SHEET. WILL ALSO MOVE CURSOR ON DISPLAY SHEET IF THAT CELL IS
  10588. C DISPLAYED, BUT OTHERWISE DOES NOT DISPLAY THE NUMBER.)
  10589. C Z = ZERO FORMULA/NUMBERS (OR ALL SHEET)
  10590. C  ZERO VARIABLE ZEROES THAT VARIABLE
  10591. C  ZERO VARIABLE1:VARIABLE2 ZEROES THAT RANGE (ROW OR COL)
  10592. C  ZERO * ZEROES ALL OF THE SHEET.
  10593. C X = EXIT (RETURNS TO OS)
  10594. C P = PUT NUMBERS TO FILE. ALWAYS GENERATES P#+nn#+mm forms based on
  10595. C current location.
  10596. C G = GET NUMBERS OUT OF FILE. USES CURRENT ORIGIN FROM L COMMAND OR 1,1
  10597. C TO ENTER NUMBERS (ALLOWS COMBINING DATA).
  10598. C W = WRITE SCREEN ON PRINTER (HARDCOPY FORMAT APPROX. AS DISPLAY.)
  10599. C OA VARIABLE = SET ORIGIN OF DISPLAY SHEET TO VARIABLE LOC IN
  10600. C  PHYSICAL SHEET (CLAMPED TO MAX. SIZE OF SHEET). STARTS AT R1,C1 OF
  10601. C  DISPLAY SHEET.
  10602. C OR VARIABLE = SET ORIGIN OF DISPLAY SHEET TO LOC'N OF VARIABLE IN
  10603. C  PHYSICAL SHEET. MODIFIES DISPLAY SHEET STARTING AT CURRENT DISPLAY
  10604. C  LOCATION RATHER THAN AT 1,1.
  10605. C
  10606. C NOTE THAT N-ARY FUNCTIONS ARE FNAMEARGS,ARGS,...
  10607. C AND RANGES ARE CELL1:CELLN. MULTIPLE COMMANDS IN FORMULA ARE
  10608. C DELIMITED BY \ CHARACTER.
  10609. C
  10610. C RETURN CODES:
  10611. C IF ICODE=1, COMMAND JUST MOVES ON DISPLAY, SO NO NEED TO RECALCULATE
  10612. C THE ENTIRE SHEET.
  10613. C ICODE =-1 ==> REINITIALIZE DISPLAY DEFAULTS
  10614. C ICODE =2  ==> REDRAW WHOLE SCREEN
  10615. C ICODE =-2 ==> NEW SPREAD SHEET FILE SETUP.
  10616. C OTHER: ALL OK.
  10617. 498    CONTINUE
  10618.     KLVL=1
  10619.     ICODE=3
  10620. C DEFAULT RETURN CODE SAYING ALL WELL
  10621. C FIRST DISPLAY CURRENT CELL AGAIN IN NORMAL.
  10622.     THISRW=DROW
  10623.     THISCL=DCOL
  10624.     FORM(1)=char(0)
  10625. C GET IN THE CURRENT FORMAT WHEREVER WE ARE, EVEN IF NOT ON DISPLAY SHEET.
  10626. C    IRRX=(PCOL-1)*60+PROW
  10627.     CALL REFLEC(PCOL,PROW,IRRX)
  10628.     CALL WRKFIL(IRRX,FORM2,0)
  10629.     CALL CE2A(FORM2,FORM)
  10630. C    READ(7'IRRX)FORM
  10631.     IF(THISRW.LE.0.OR.THISCL.LE.0)GOTO 200
  10632.     N1=NRDSP(THISRW,THISCL)
  10633.     N2=NCDSP(THISRW,THISCL)
  10634.     IXLSTC=THISCL
  10635.     IXLSTR=THISRW
  10636.     IF(THISCL.GT.DCLV.OR.THISRW.GT.DRWV)GOTO 200
  10637. C REDRAW LAST DISPLAYED CELL IN NORMAL (I.E., NOT REVERSE) VIDEO.
  10638. C    IF(ICHAR(FVLD(N1,N2)).EQ.0)GOTO 200
  10639. C ONLY REDRAW NUMBERS. DIRECT DISPLAY OR NOTHING GETS IGNORED.
  10640.     J=8
  10641. C    IRRX=(N2-1)*60+N1
  10642.     CALL REFLEC(N2,N1,IRRX)
  10643. C ADD 6 COLS FOR LABELS
  10644.     DO 1 M1=1,DROW
  10645. C FIND DISPLAY COLUMN TO USE
  10646. 1    J=J+CWIDS(M1)
  10647.     J=J-CWIDS(DROW)
  10648. C USE THISCL+1 TO LET 1ST ROW BE LABELS.
  10649.     ICCC=THISCL+2
  10650. C 0 = 1 IF VT100, 0 IF VT52
  10651. C SAVE PHYS COORDS BEING DISPLAYED NEXT. FVLD CAN BE TESTED FOR NUMERICS
  10652. C DIRECTLY, IF UVT100 NEEDS THAT ACCESS.
  10653.     IC1POS=N1
  10654.     IC2POS=N2
  10655.     IF(PZAP.NE.0)GOTO 3607
  10656.     CALL UVT100(1,ICCC,J)
  10657. C SELECT ROW "THISCL", COL "J"
  10658.     CALL UVT100(13,7,0)
  10659.     CALL FVLDGT(N1,N2,FVLD(1,1))
  10660. C    IF(FVLD(1,1).EQ.0)WRITE(6,5538)
  10661. C5538    FORMAT('>-<')
  10662.     ivv=min0(30,cwids(DROW))
  10663. c reset blanks to be sure we write something even for vt52
  10664. ccc    blanks(1)='>'
  10665.     IF(ICHAR(FVLD(1,1)).EQ.0)CALL SWRT(BLANKS,IVV)
  10666. ccc    blanks(1)=32
  10667. cccccc no VT52's in PCs...
  10668. C5538    FORMAT(1H+,30(a1,'\'))
  10669. 3607    CONTINUE
  10670. C WE CAN BE SURE THE COLUMN IS 3 WIDE OR MORE...
  10671.     CALL FVLDGT(N1,N2,FVLDTP)
  10672.     IF(ICHAR(FVLDTP).EQ.0)GOTO 200
  10673. C    IRRX=(N2-1)*60+N1
  10674. C SELECT REVERSE VIDEO
  10675.     DO 5540 KKKK=1,100
  10676. 5540    CMDLIN(KKKK)=char(32)
  10677.     CALL WRKFIL(IRRX,FORM2,0)
  10678.     CALL CE2A(FORM2,FORM)
  10679. C    READ(7'IRRX)FORM
  10680. C    IF(JCHAR(FORM(120)).LE.0)GOTO 200
  10681.     IF(JCHAR(FVLDTP).LT.0.OR.FORMFG.NE.0)
  10682.      1  WRITE(CMDLNA(1:127),8201)(FORM(II),II=1,100)
  10683. 8201    FORMAT(128A1)
  10684.     IF(FORMFG.NE.0)GOTO 4320
  10685.     DO 6301 KKK=1,9
  10686.     KKKK=ICHAR(FORM(KKK+119))
  10687. C    KKKK=DFMTS(KKK,THISRW,THISCL)
  10688. 6301    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  10689.     DFE(11)=CHAR(32)
  10690. C 32 = ASCII SPACE
  10691.     DFE(1)='('
  10692.     DFE(12)=' '
  10693.     DFE(13)=' '
  10694.     DFE(14)=')'
  10695.     CALL TYPGET(N1,N2,TYPE(1,1))
  10696.     IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  10697.      1  WRITE(CMDLNA(1:127),DFE,ERR=4320)DVS(THISRW,THISCL)
  10698.     IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  10699.      1   WRITE(CMDLNA(1:127),DFE,ERR=4320)LDVS(1,THISRW,THISCL)
  10700. C REDRAW THIS COL. WITH REVERSE VIDEO HERE.
  10701. 4320    IF(PZAP.EQ.0)CALL SWRT(CMDLIN,CWIDS(THISRW))
  10702. C9800    FORMAT('+',128(A,'\'))
  10703. 9000    FORMAT(128A1)
  10704.     IF(PZAP.EQ.0)CALL UVT100(13,0,0)
  10705. C NOTE THIS REDRAWS PREVIOUS COL. IN REVERSE VIDEO.
  10706. C NO CARRIAGE CTL
  10707. 200    CONTINUE
  10708.     IF(PZAP.NE.0)GOTO 3608
  10709.     KKKK=JCHAR(FVLDTP)
  10710. C SKIP LAST LINE UPDATE IF NOT NEEDED FOR SPEEDIER CURSOR
  10711. C POSITIONING.
  10712.     IF(NULAST.EQ.NCEL.AND.LFVD.EQ.0.AND.KKKK.EQ.0)GOTO 222
  10713.     CALL UVT100(1,LLDSP,1)
  10714.     CALL UVT100(12,2,0)
  10715.     IF(JCHAR(FORM(1)).LE.0)GOTO 222
  10716.     DO 1711 IVVVV=1,109
  10717.         IVV=110-IVVVV
  10718.     IF(JCHAR(FORM(IVV)).GT.32)GOTO 2711
  10719. 1711    CONTINUE
  10720. 2711    CONTINUE
  10721.     write(fwt(1:127),9092)ncel,(form(ii),ii=1,IVV)
  10722. 9092    FORMAT(1X,I5,' Used. Curr=',109A1)
  10723.     IVV=IVV+18
  10724.     call swrt(fwt(1:127),IVV)
  10725. C3608    CONTINUE
  10726. 222    CALL UVT100(1,LLCMD,1)
  10727.     NULAST=NCEL
  10728.     LFVD=KKKK
  10729.     CALL UVT100(12,2,0)
  10730. C NOTE PROW IS ACROSS TOP, PCOL IS DOWN SIDE
  10731. C PROW GOES AS ID1, ALPHAS
  10732. C PCOL GOES AS ID2, NUMERICS
  10733.     CALL IN2AS(PROW,FORM)
  10734. C NOTE PCOL STARTS AT 2 FOR NORMAL SHEET VARIABLES. PCOL=1 IS FOR ACCUMULATORS
  10735.     CALL UVT100(13,0,0)
  10736. C WRITE OUT LABEL WITH APPROPRIATE SIZE TO HOLD ROW NUMBER
  10737. C LET PROMPT END WITH > OR : DEPENDING ON OPERATING MODE.
  10738.     FVLDTP='>'
  10739.     IF(MODPUB.EQ.1)FVLDTP=':'
  10740.     IF(PCOL.GE.10000)GOTO 6401
  10741.     ii=pcol-1
  10742.     write(fwt(1:127),9001,err=3608)
  10743.      1   (form(i),i=1,4),ii,FVLDTP
  10744. C    FORM(9)=FVLDTP
  10745.     III=9
  10746.     GOTO 6402
  10747. 6401    CONTINUE
  10748.     ii=pcol-1
  10749.     write(fwt(1:127),9401,err=3608)
  10750.      1   (form(i),i=1,4),ii,FVLDTP
  10751. C    FORM(10)=FVLDTP
  10752.     III=10
  10753. 6402    CONTINUE
  10754.     CALL SWRT(fwt(1:127),III)
  10755. 9401    FORMAT(4A1,I5,1A1)
  10756. 9001    FORMAT(4A1,I4,1A1)
  10757. 3608    CONTINUE
  10758.     IF(XTCFG.NE.0)GOTO 3870
  10759.     Rewind 11
  10760.     IF(IOLVL.NE.11.or.FH.eq.0)READ(IOLVL,9002,END=510,ERR=510)CMDLIN
  10761. C FOR READING THE CONSOLE, WE NEED A QIO$ TO CAPTURE ESCAPE SEQUENCES.
  10762.     IF(IOLVL.EQ.11.and.FH.ne.0)CALL GETTTL(CMDLIN)
  10763.     CALL GTMUNG(CMDLIN)
  10764. C ALLOW CMD LANGUAGE TO LOOK MORE "STANDARD" VIA MUNGE OF INPUTS
  10765. C TO DO THE "EV" OR "ET" OR "EN" FOR USER AND TREAT / AS CMD
  10766. C PREFIX...
  10767.     GOTO 3871
  10768. 3870    CONTINUE
  10769.     XTCFG=0
  10770.     DO 3872 I=1,XTNCNT
  10771.     CMDLIN(I)=XTNCMD(I)
  10772. 3872    CONTINUE
  10773. C COPY IN EXTERNAL COMMAND AND LET IT BE EXECUTED. IT'S THE USER'S
  10774. C PROBLEM IF THE COMMAND REQUIRES STILL FURTHER INPUT...
  10775. C ALSO NULL OUT SOME DELIMITER CHARS AFTER THE COMMAND READ IN.
  10776.     CMDLIN(XTNCNT+1)=Char(0)
  10777.     CMDLIN(XTNCNT+2)=Char(0)
  10778. 3871    CONTINUE
  10779. 9002    FORMAT(64A1,64A1,32A1)
  10780.     CMDLIN(132)=Char(0)
  10781.     CMDLIN(131)=Char(0)
  10782.     CMDLIN(130)=Char(0)
  10783. C  SAVE CURRENT PHYS ROW, COL IN AC'S X AND Y
  10784.     XXAC=PROW
  10785.     XYAC=PCOL
  10786. C ZAP IN SPECIAL FUNCTION KEY REPLIES INTO NORMAL FORMS
  10787.     CALL CMDMUN(CMDLIN)
  10788.     DO 9048 I=1,129
  10789.     K=130-I
  10790. C START AT BACK OF LINE AND ZAP WHITESPACE BY NULL TERMINATOR
  10791.     IF(ICHAR(CMDLIN(K)).GT.32)GOTO 9049
  10792.     CMDLIN(K)=Char(0)
  10793. C ALSO GET RID OF POSSIBLE TRAILING CR, LF.
  10794. 9048    CONTINUE
  10795. 9049    CONTINUE
  10796. C
  10797. C THIS GETS COMMAND LINE IN. NOW ACTON IT.
  10798. C REPOS'N TO OLD LINE NOW.
  10799.     CALL UVT100(1,LLCMD,1)
  10800. C
  10801. C THE FOLLOWING SECTION IMPLEMENTS THE ADDITIONAL FUNCTION OF
  10802. C JOURNALING: (DONE ON VAX ONLY SINCE SPACE REQUIREMENTS FOR FILE
  10803. C OPERATIONS MAY BE A PROBLEM ON PDP11'S).
  10804. C    Command +J FILENAME will record all remaining
  10805. C    line inputs at this point in it. (Assumes JNLFLG=0 initially)
  10806. C    Command +N closes journal file.
  10807.     K=K+1
  10808.     IF(CMDLIN(1).EQ.'+'.AND.CMDLIN(2).EQ.'J'.AND.JNLFLG.NE.1)
  10809.      1   GOTO 4290
  10810.     IF(CMDLIN(1).EQ.'+'.AND.CMDLIN(2).EQ.'N')GOTO 4292
  10811.     IF(JNLFLG.EQ.1)WRITE(10,9002)(CMDLIN(IV),IV=1,K)
  10812.     GOTO 4291
  10813. 4292    CONTINUE
  10814.     CLOSE(10)
  10815.     JNLFLG=0
  10816.     GOTO 9990
  10817. 4290    CONTINUE
  10818.     JNLFLG=1
  10819. C    USE WHATEVER FILE NAME THE USER HAS SUPPLIED AFTER THE +J
  10820. C    FOR FILE TO JOURNAL ONTO. (NO MORE QUESTIONS NEEDED.)
  10821.     CALL WASSIG(10,CMDLIN(4))
  10822.     GOTO 9990
  10823. 4291    CONTINUE
  10824. C
  10825. C
  10826. C ALLOW COMMENTS IF LINE BEGINS WITH * (JUST LIKE CALC)
  10827.     IF(CMDLIN(1).NE.'*')GOTO 6002
  10828.     ICODE=1
  10829. C NO RECALC JUST FOR COMMENTS...
  10830.     GOTO 9990
  10831. 6002    CONTINUE
  10832. C
  10833. C * NEW ****************
  10834. C ADD PLACE TO PUT IN USER COMMANDS. DEFAULT IS NONE EXIST, DO NOTHING
  10835.     IGOTIT=0
  10836.     CALL USRCMD(CMDLIN,ICODE,IGOTIT)
  10837. C WHEN WE GET A COMMAND, SET IGOTIT TO 1 AND WE THEN PROCESS COMMAND NORMALLY
  10838.     IF(IGOTIT.EQ.1)GOTO 9990
  10839. C * NEW ****************
  10840. C
  10841. C COMMAND -PROMPT  WILL READ FROM LUN 5 TO ARGSTR
  10842. C TERMINATING WITH SPACES.
  10843.     IF(CMDLIN(1).NE.'-')GOTO 350
  10844.     ICODE=5
  10845.     CALL UVT100(1,LLCMD,1)
  10846.     CALL UVT100(12,2,0)
  10847.     CALL VWRT(CMDLIN(2),49)
  10848. C    WRITE(0,9800)(CMDLIN(IV),IV=2,50)
  10849.     call vget(form2,128)
  10850. c    READ(11,9000,END=510,ERR=510)FORM2
  10851.     II=1
  10852.     KK=1
  10853.     DO 351 KKK=1,128
  10854. C LOAD UP OUR ARGUMENTS IN ARGSTR(N,1) TO ARGSTR(N,4)
  10855.     ARGSTR(KK,II)=FORM2(KKK)
  10856.     KK=KK+1
  10857.     ARGSTR(KK,II)=char(0)
  10858.     IF(KK.LT.52)GOTO 352
  10859. 354    KK=1
  10860.     II=II+1
  10861.     IF(II.GT.4)GOTO 353
  10862. 352    CONTINUE
  10863.     IF(ICHAR(FORM2(KKK)).GT.32)GOTO 351
  10864. C ON SPACE, GO TO THE NEXT ARGUMENT. ALSO SPILL INTO
  10865. C THE NEXT ARGUMENT IF WE SEE NO SPACES AND JUST TRAIL ALONG.
  10866.     GOTO 354
  10867. 351    CONTINUE
  10868. 353    GOTO 9990
  10869. 350    CONTINUE
  10870. C
  10871. C CONTROL SCROLLING. PERMIT THE COMMAND "SC" TO TURN SCROLLING ON
  10872. C AND "NS" TO TURN IT BACK OFF.
  10873.     IVV=-1
  10874.     IF(CMDLIN(1).EQ.'S'.AND.CMDLIN(2).EQ.'C')IVV=1
  10875.     IF(CMDLIN(1).EQ.'N'.AND.CMDLIN(2).EQ.'S')IVV=0
  10876.     IF(IVV.GE.0)IDOL7=IVV
  10877.     IF(IVV.GE.0)ICODE=5
  10878.     IF(IVV.GE.0)GOTO 9990
  10879. C
  10880. C ALLOW PROGRAMMED "REWIND" OF INPUT COMMAND LINE ON
  10881. C COMMAND LINE BEGINNING WITH "<". MAKE IT CONDITIONAL
  10882. C BY SAYING THAT IF % IS NEGATIVE WE WON'T DO IT.
  10883.     IF(CMDLIN(1).NE.'<')GOTO 356
  10884.     ICODE=5
  10885.     IF(XAC.GT.0..AND.IOLVL.NE.11)REWIND IOLVL
  10886.     GOTO 9990
  10887. 356    CONTINUE
  10888. C
  10889. C HANDLE @FILE COMAND TO CHANGE TO INPUT OFF THAT FILE.
  10890.     IF(CMDLIN(1).NE.'@')GOTO 511
  10891. C WOW, A FILE. (OR AT LEAST SO WE HOPE).
  10892.     CALL RASSIG(3,CMDLIN(2),kkkk)
  10893.     if(kkkk.ne.0)goto 498
  10894. C USE FACT THAT WE JUST NULL TERMINATED THE FILENAME PART AND SET
  10895. C IT TO BE LUN 3.
  10896.     IOLVL=3
  10897. C NOW GO BACK FOR ANOTHER COMMAND...NO SENSE WASTING RECALC TIME SINCE
  10898. C NOTHING HAS REALLY HAPPENED YET.
  10899. C NOTE EVERY READ TO LUN 3 HAS EOF/ERROR CHECK TO GO TO 510 TO RESET
  10900. C TO LUN 5 INPUT AND CLOSE FILE WE OPENED ON 3.
  10901.     GOTO 498
  10902. 511    CONTINUE
  10903. C
  10904. C AA n R, AA n C, AR n R, AR n C COMMANDS
  10905. C
  10906.     IF(CMDLIN(1).NE.'O'.OR.CMDLIN(2).NE.'V')GOTO 6887
  10907. C OV + TURNS ON OVERRIDE
  10908. C OV - TURNS OFF OVERRIDE
  10909. C ALLOWS ONE TO OVERRIDE $ SIGN FORMS' ABSOLUTE NATURE
  10910.     IF(CMDLIN(3).EQ.'+'.OR.CMDLIN(4).EQ.'+')IDOL3=1
  10911.     IF(CMDLIN(3).EQ.'-'.OR.CMDLIN(4).EQ.'-')IDOL3=0
  10912.     GOTO 9990
  10913. 6887    CONTINUE
  10914.     IF(CMDLIN(1).NE.'A')GOTO 8845
  10915. C ADD ROWS OR COLUMNS (OR REMOVE THEM) AT THE CURRENT PHYSICAL LOCATION
  10916. C WHERE AA MEANS ADD ABSOLUTE (NO RELOCATION), AR MEANS ADD RELOCATING
  10917. C (RELOCATE ALL VARIABLES BELOW), AND R OR C SAYS TO ADD/SEBTRACT ROWS
  10918. C OR COLUMNS.
  10919. C
  10920. C FIRST COLLECT THE ARGUMENTS TO THE FUNCTION.
  10921.     KM1=3
  10922.     KM2=10
  10923.     CALL GN(KM1,KM2,ICNT,CMDLIN)
  10924. C GETS THE NUMBER. IF NO NUMBER SEEN OR ZERO, RETURNS 0. IGNORE THEN.
  10925.     IF(ICNT.EQ.0)GOTO 9990
  10926.     ICR=0
  10927. C LOOK FOR THE R OR C
  10928. C START AT CMDLIN(4) TO PASS THE AR/AA AND THE NUMBER IF ANY.
  10929.     DO 8844 KKK=4,50
  10930.     IF(CMDLIN(KKK).EQ.'R')ICR=1
  10931.     IF(CMDLIN(KKK).EQ.'C')ICR=2
  10932.     IF(ICR.NE.0)GOTO 8846
  10933. C SKIP OUT ON FIRST ROW OR COLUMN DESIGNATOR SEEN
  10934. 8844    CONTINUE
  10935. 8846    CONTINUE
  10936.     IF(ICR.EQ.0)GOTO 9990
  10937.     ICODE=2
  10938. C NOW WE HAVE ALL ARGUMENTS. SET UP FOR THE COPY AND PARASITE THE
  10939. C LOGIC USED FOR THE CA OR CR COMMANDS. (NOTE THAT 2ND CHARACTER
  10940. C IS A OR R IN CMDLIN ALREADY SO THOSE COMMANDS' LOGIC WILL BE OK.)
  10941.     JRTR=PROW
  10942.     JRTC=PCOL
  10943.     IF(ICR.EQ.2)JRTC=1
  10944.     IF(ICR.EQ.1)JRTR=1
  10945. C RELOC THESHOLD IS PHYSICAL CURRENT POSITION.
  10946.     IF(ICR.EQ.1)GOTO 8843
  10947. C INSERT OR DELETE COLUMNS
  10948. C FIRST FIGURE OUT HOW MANY COLUMNS MUST BE MOVED RIGHT
  10949.     KD=MCols-PROW-IABS(ICNT)+1
  10950. C LET THIS WORK ONLY ON PRIME SHEET. TOO HARD TO FIGURE IT OUT ON REFLECTED
  10951. C ONES AND IT'LL FOUL LOTS OF USERS UP.
  10952.     IF(KD.LE.0)GOTO 9990
  10953. C CAN'T MOVE 0 COLUMNS. DOESN'T MAKE SENSE.
  10954.     DO 8842 KR=1,KD
  10955.     IRA=MCols-KR+1
  10956. C IRA IS DESTINATION COLUMN IN EACH LOOP.
  10957.     IF(ICNT.LT.0)IRA=PROW-1+KR
  10958. C IRS IS SOURCE COLUMN
  10959.     IRS=MCols-KR+1-ICNT
  10960.     IF(ICNT.LT.0)IRS=PROW+KR-ICNT-1
  10961. C
  10962. C IF DELETING COLUMNS AND DESTINATION IS PAST CURRENT
  10963. C ACTIVE MAX, SKIP THE MOVE SINCE WE'RE NOT ACCOMPLISHING ANYTHING.
  10964.     IF(ICNT.LT.0.AND.IRA.GT.RRWACT)GOTO 8842
  10965. C IF ADDING COLUMNS AND SOURCE IS PAST CURRENT MAX ACTIVE THEN
  10966. C WE'RE DOING NOTHING, SO SKIP THE WORK
  10967.     IF(ICNT.GT.0.AND.IRS.GT.RRWACT)GOTO 8842
  10968.     JDELT=RCLACT
  10969. C    JDELT=301
  10970. C LOOP WE'LL CALL IS OVER ENTIRE ROWS, BUT ONLY DO ONE AT A TIME HERE
  10971.     JD1A=IRA
  10972.     JD1B=1
  10973.     ID1A=IRS
  10974.     ID2A=1
  10975.     I1IN=0
  10976.     I2IN=1
  10977.     JIN1=0
  10978.     JIN2=1
  10979.     ASSIGN 8840 TO KPYBAK
  10980. C CALL INTERNAL COPY-RANGE PROCEDURE INSIDE CA/CR LOGIC
  10981.     GOTO 8364
  10982. 8840    CONTINUE
  10983. 8842    CONTINUE
  10984. C
  10985. C NOW CLEAN UP THE REST OF FORMULAS IF THERE ARE ANY TO DO...
  10986. C MUST RELOCATE OTHER FORMULAE IF CMDLIN(2) IS R
  10987.     KX=PROW-1
  10988. C RELY ON RCLACT HAVING BEEN UPDATED TO REFLECT NEW
  10989. C ADDITIONS IF ANY
  10990.     KY=RCLACT
  10991. C    KY=301
  10992. C RELOCATE UPPER LEFT PART OF SHEET
  10993. C NOTE II1,II2,JJ1,JJ2,JRTR,JRTC ARE UNCHANGED FROM PRIOR CALL SO
  10994. C MAY BE USED... RELVBL ONLY CARES ABOUT RELATIVE MOTION ANYHOW...
  10995. 3600    CONTINUE
  10996.     IF(CMDLIN(2).NE.'R'.OR.KX.LE.0.OR.KY.LE.0)GOTO 9990
  10997.     DO 3601 KK=1,KX
  10998.     DO 3601 KK2=1,KY
  10999.     CALL FVLDGT(KK,KK2,FVLD(1,1))
  11000.     IF(ICHAR(FVLD(1,1)).NE.1)GOTO 3601
  11001. C ONLY RELOCATE FORMULAS, NOT TEXT OR NUMBERS (OR EMPTIES...)
  11002. C    IRX=(KK2-1)*60+KK
  11003.     CALL REFLEC(KK2,KK,IRX)
  11004.     CALL WRKFIL(IRX,FORM,0)
  11005. C    READ(7'IRX)FORM
  11006.     CALL RELVBL(FORM,FORM2,II1,II2,JJ1,JJ2,JRTR,JRTC)
  11007.     CALL WRKFIL(IRX,FORM2,1)
  11008. C    WRITE(7'IRX)FORM2
  11009. 3601    CONTINUE
  11010.     GOTO 9990
  11011. 8843    CONTINUE
  11012. C ROW INSERT/DELETE
  11013. C AGAIN FIND HOW MANY ROWS TO MOVE.
  11014.     KD=MRows-PCOL-IABS(ICNT)+1
  11015.     IF(KD.LE.0)GOTO 9990
  11016.     DO 8839 KC=1,KD
  11017. C ICA = DESTINATION AND ICS IS SOURCE
  11018.     ICA=MRows-KC+1
  11019.     ICS=MRows-KC+1-ICNT
  11020.     IF(ICNT.GT.0)GOTO 8838
  11021.     ICA=PCOL-1+KC
  11022.     ICS=PCOL+KC-1-ICNT
  11023. 8838    CONTINUE
  11024. C IF INSERTING ROWS AND SRC ROW IS BEYOND ACTIVE AREA, SKIP
  11025.     IF(ICNT.GT.0.AND.ICS.GT.RCLACT)GOTO 8839
  11026. C IF DELETING ROWS AND DST ROW IS BEYOND ACTIVE AREA, SKIP
  11027.     IF(ICNT.LT.0.AND.ICA.GT.RCLACT)GOTO 8839
  11028. C NOW CALL COPY LOOP AGAIN.
  11029.     JDELT=RRWACT
  11030. C    JDELT=60
  11031.     JD1A=1
  11032.     JD1B=ICA
  11033. C DEST
  11034.     ID1A=1
  11035.     ID2A=ICS
  11036. C SOURCE
  11037.     I1IN=1
  11038.     I2IN=0
  11039.     JIN1=1
  11040.     JIN2=0
  11041.     ASSIGN 8836 TO KPYBAK
  11042. C CALL INTERNAL RANGE COPY PROCEDURE TO COPY A ROW
  11043.     GOTO 8364
  11044. 8836    CONTINUE
  11045. 8839    CONTINUE
  11046.     KX=RRWACT
  11047. C    KX=60
  11048.     KY=PCOL-1
  11049.     GOTO 3600
  11050. 8845    CONTINUE
  11051. C OA AND OR COMMANDS. SET DISPLAY SHEET MAPPING TO ORIGIN AS FOUND BY
  11052. C  VARIABLE, STARTING AT 1,1 OR (DROW,DCOL) FOR OA AND OR RESPECTIVELY.
  11053.     IF(CMDLIN(1).NE.'O')GOTO 650
  11054. C PROCESS COMMAND...
  11055.     LRO=1
  11056.     LCO=1
  11057.     IF(CMDLIN(2).EQ.'R')LRO=MAX0(1,DROW)
  11058.     IF(CMDLIN(2).EQ.'R')LCO=MAX0(1,DCOL)
  11059. C OM will act like OR in that it will set the mapping of a
  11060. C display starting at the cursor, but unlike OR it will
  11061. C map multiple pages. When 3D actions are disabled it will
  11062. C do nothing.
  11063.     KORM=0
  11064.     IF(CMDLIN(3).NE.'M')GOTO 3944
  11065.     IF(K3DFG.LE.0)GOTO 3924
  11066. C OAMC/ORMC cell remaps display so that each display column is
  11067. C a column from the next lower sheet, so that, for example,
  11068. C a first column might be a1:a20, the next might be a1%1:a20%1,
  11069. C the next a1%2:a20%2 and so on.
  11070. C
  11071. C OAMR/ORMR cell remaps display so that each display row is a row
  11072. C from the next lower sheet, so that for example the first
  11073. C row might be a1:g1, the next a1%1:g1%1, the next a1%2:g1%2
  11074. C and so on. 
  11075. C
  11076. C  Thus the operation ORMC fills the 1st column with the current
  11077. C sheet, then the next with the offsets of the first plus the
  11078. C sheet offset, and so on. ORMR fills the 1st row with the
  11079. C current sheet, then sheet offsets down.
  11080.     IF(CMDLIN(4).EQ.'C')KORM=1
  11081.     IF(CMDLIN(4).EQ.'R')KORM=2
  11082.     IF(KORM.EQ.0)GOTO 3924
  11083. 3944    CONTINUE
  11084. c *** 20 by 75 display constants hardcoded here:
  11085.     LRO=MIN0(LRO,(JIDcl-1))
  11086.     LCO=MIN0(LCO,(JIDrw-1))
  11087. C    LRO=MIN0(LRO,(20-1))
  11088. C    LCO=MIN0(LCO,(75-1))
  11089. C NOW HAVE CORRECT ORIGIN IN DISPLAY SHEET TO USE SET UP.
  11090. C GRAB VARIABLE ID.
  11091.     LA=INDX(CMDLIN,32)
  11092.     IF(LA.GT.20)LA=3
  11093.     LE=40
  11094.     CALL VARSCN(CMDLIN,LA,LE,LSTCX,ID1,ID2,IVLD)
  11095.     IF(IVLD.EQ.0)GOTO 651
  11096. C NOW HAVE VARIABLE NAME AND LOCATION... CAN DO IT FINALLY.
  11097. C NOTE WE'RE GUARANTEED WE START OFF IN BOUNDS BUT MUST CHECK
  11098. C ALONG THE WAY TO BE SURE WE STAY THAT WAY.
  11099.     IQQ=0
  11100.     KKKK=0
  11101. C allow a D modifier (for whatever it's worth) after
  11102. C the ORMR/ORMC/OAMR/OAMC commands. It will be as close to
  11103. C the normal OAD/ORD as practical under the circumstances of
  11104. C a totally different mapping scheme.
  11105.     IF(KORM.NE.0.and.CMDLIN(5).eq.'D')KKKK=1
  11106.     IF(CMDLIN(3).NE.'D')GOTO 6712
  11107. c allow ORA or ORD commands to leave window displacements
  11108. c alone. Fix up so this is default mode for scrolling (making
  11109. c program behavior easier to understand.)
  11110. 7112    CONTINUE
  11111.     KKKK=1
  11112. 6712    CONTINUE
  11113.     KKKKK=NRDSP(LRO,LCO)
  11114.     KKKKKK=NCDSP(LRO,LCO)
  11115. 5711    CONTINUE
  11116. C TO ALLOW REFLECTIONS MUST ALLOW ALL SORTS OF ORIGINS.
  11117.     DO 652 IRO=LRO,DRWV
  11118.     DO 653 ICO=LCO,DCLV
  11119. C HERE CAN SET UP NRDSP AND NCDSP SUITABLY
  11120.     IVV=IRO-LRO
  11121.     IVVV=ICO-LCO
  11122.     IF(KKKK.EQ.0)GOTO 1653
  11123.     IVV=NRDSP(IRO,ICO)-KKKKK
  11124.     IVVV=NCDSP(IRO,ICO)-KKKKKK
  11125. 1653    CONTINUE
  11126.     if(korm.ne.1)goto 2653
  11127. C OMC column mode remap.
  11128. C Bump offsets by kcdelt/krdelt as iro grows BUT
  11129. C not as ico grows.
  11130.     IVV=(LRO-1)+(iro-lro)*kcdelt
  11131.     IVVV=IVVV+(iro-lro)*krdelt
  11132. 2653    Continue
  11133.     if(korm.ne.2)goto 2654
  11134. C OMR row mode remap.
  11135. C bump offsets by kcdelt/krdelt as ico grows BUT not as
  11136. C iro grows.
  11137.     IVV=IVV+(ico-lco)*kcdelt
  11138.     IVVV=(LCO-1)+(ico-lco)*krdelt
  11139. 2654    Continue
  11140.     NRDSP(IRO,ICO)=ID1+IVV
  11141.     NCDSP(IRO,ICO)=ID2+IVVV
  11142. 653    CONTINUE
  11143. 652    CONTINUE
  11144.     IF(DROW.LE.0.OR.DCOL.LE.0)GOTO 3924
  11145.     PROW=NRDSP(DROW,DCOL)
  11146.     PCOL=NCDSP(DROW,DCOL)
  11147. 3924    CONTINUE
  11148. C FORCE REDRAW OF WHOLE SHEET.
  11149.     ICODE=6
  11150.     IF(RCMODE.LE.0)GOTO 9990
  11151. C SKIP RECALC IF IN OLD MODE...
  11152.     ICODE=2
  11153. 651    GOTO 9990
  11154. 650    CONTINUE
  11155. C F FILENAME/NNN
  11156. C READ IN TEXT FROM FILE NAMED AND SPREAD ACROSS DISPLAY SCREEN. SET
  11157. C DISPLAYED SCREEN INTO FVLD(NN)=-1 TO SHOW TEXT ONLY.
  11158.     IF(CMDLIN(1).NE.'F')GOTO 1740
  11159.     LA=INDX(CMDLIN,32)
  11160. C PASS SPACE
  11161.     KKK=ICHAR('/')
  11162.     LB=INDX(CMDLIN(LA+1),KKK)
  11163.     LB=LB+LA
  11164. C LB= LOC OF / CHARACTER
  11165.     LB=MIN0(80,LB)
  11166.     IF(LB.LE.2)GOTO 1741
  11167.     IF((LB-LA).LE.1) GOTO 1741
  11168.     CMDLIN(LB)=char(0)
  11169.     CALL RASSIG(4,CMDLIN(LA+1),kkkk)
  11170.     if(kkkk.ne.0)goto 1742
  11171. C THIS OUGHT TO OPEN THE FILE IF IT EXISTS..
  11172. C NOW IF THERE'S A NUMBER THERE, EXTRACT IT.
  11173.     LSKP=0
  11174.     IF(LB.GT.78.OR.LB.LE.5)GOTO 1743
  11175.     LAA=LB+1
  11176.     LAAA=LB+7
  11177.     CALL GN(LAA,LAAA,LSKP,CMDLIN)
  11178. 1743    CONTINUE
  11179. C NOW SKIP THE LINES
  11180.     IF(LSKP.LE.0)GOTO 1744
  11181.     DO 1745 IV=1,LSKP
  11182.     READ(4,8201,END=1742,ERR=1742)FORM2
  11183. 1745    CONTINUE
  11184. 1744    CONTINUE
  11185. C NOW WE'RE READY TO READ IN THE STUFF.
  11186.     ICODE=2
  11187.     DO 1746 LA=1,DCLV
  11188.     DO 1751 IV=1,128
  11189. 1751    FORM2(IV)=Char(32)
  11190.     READ(4,8201,END=1742,ERR=1742)FORM2
  11191.     IXC=0
  11192.     DO 1747 LB=1,DRWV
  11193. C DRWV = # ACROSS TOP...
  11194. C DCLV=LENGTH
  11195.     ID1=NRDSP(LB,LA)
  11196.     ID2=NCDSP(LB,LA)
  11197. C GET PHYSICAL SHEET COORDINATES AS ID1,ID2
  11198. C MUST THEN COPY CWIDS(LB) CHARS ONTO FILE...
  11199.     CALL FVLDST(ID1,ID2,char(255))
  11200. C    FVLD(ID1,ID2)=-1
  11201. C    IRX=(ID2-1)*60+ID1
  11202.     CALL REFLEC(ID2,ID1,IRX)
  11203.  
  11204.     CALL WRKFIL(IRX,FORM,0)
  11205. C    READ(7'IRX)FORM
  11206.     FORM(119)=Char(255)
  11207.     DO 1749 IVV=1,110
  11208. 1749    FORM(IVV)=char(0)
  11209.     DO 1748 IVV=1,CWIDS(LB)
  11210.     IXC=IXC+1
  11211. 1748    FORM(IVV)=FORM2(IXC)
  11212.     CALL WRKFIL(IRX,FORM,1)
  11213. 1747    CONTINUE
  11214. 1746    CONTINUE
  11215. 1742    CLOSE(4)
  11216. 1741    GOTO 9990
  11217. 1740    CONTINUE
  11218.     IF(CMDLIN(1).NE.'E')GOTO 8000
  11219. C ENTER COMMAND
  11220. C EN expression. expression may be numbers/text.
  11221.     LA=INDX(CMDLIN,32)
  11222.     LA=LA+1
  11223. C SKIP SPACE AFTER "EN"
  11224.     IF(LA.GT.4)LA=4
  11225.     IF (LA.GE.100)GOTO 7901
  11226.     LE=132-LA
  11227.     LE=MIN0(110,LE)
  11228. C    IRX=(PCOL-1)*60+PROW
  11229.     CALL REFLEC(PCOL,PROW,IRX)
  11230. C FIND WHERE IN FILE TO STORE.
  11231.     CALL WRKFIL(IRX,FORM2,0)
  11232.     CALL CE2A(FORM2,FORM)
  11233. C    READ(7'IRX)FORM
  11234.     IF(CMDLIN(2).EQ.'D')
  11235.      1   CALL SED(CMDLIN(LA),FORM,FORM2,ARGSTR,ZAC,110)
  11236. C IF COMMAND IS "ED <DELIM>STRING1<DELIM>STRING2<DELIM>" THEN
  11237. C  SUBSTITUTE STRING2 FOR STRING1 IN FORMULA, RETURN IT TO THE
  11238. C  COMMAND LINE, AND REENTER IT.
  11239. C  NOTE THAT THE STRINGS MAY CONTAIN &n FORMS WHERE 1-4 MEAN
  11240. C  ENTERED ARGUMENTS 1-4, 5 TREATS XAC AS A NUMBER, AND 6
  11241. C  TREATS ZAC AS A SINGLE CHARACTER (ZAC IS VARIABLE Z).
  11242.     DO 5133 II=1,110
  11243. 5133    FORM(II)=char(0)
  11244.     NALF=0
  11245.     NSG=-1
  11246.     NXNUM=3
  11247.     KSG=0
  11248.     N=1
  11249.     IRCE1=PROW
  11250.     IRCE2=PCOL
  11251. C SAVE FOR RE, RI MODES
  11252.     IF(CMDLIN(2).EQ.'T'.OR.CMDLIN(2).EQ.'"')KSG=1
  11253. C "ET" FORMULA ENTERS TEXT ONLY
  11254. C "EV" FORMULA ENTERS NUMBER
  11255.     IF(CMDLIN(2).EQ.'V')NSG=1
  11256. 2097    CONTINUE
  11257.     IF(N.GT.LE)GOTO 7902
  11258. C    DO 7902 N=1,LE
  11259. C LOOK FOR ALPHAS. IF WE FIND ANY, FLAG NOT NUMERIC
  11260. C NOTE @ INCLUDED SINCE COULD HAVE A *@3 COMMAND TO CALL 3.CMD
  11261. C AND REFER TO OTHER CELLS.
  11262. C THIS IS A RESTRICTION: COMMANDS TO CMND NEED TO HAVE ALPHAS
  11263. C SOMEWHERE OR THIS WILL BE FOOLED.
  11264.     IF(CMDLIN(LA).EQ.'P'.AND.
  11265.      1  CMDLIN(LA+1).EQ.'#'.AND.
  11266.      2  CMDLIN(LA+2).EQ.'0'.AND.
  11267.      3  CMDLIN(LA+3).EQ.'#'.AND.
  11268.      4  CMDLIN(LA+4).EQ.'0') GOTO 3356
  11269.     IF(ICHAR(CMDLIN(LA)).GE.ICHAR('@').AND.ICHAR(CMDLIN(LA))
  11270.      1  .LE.ICHAR('Z'))NXNUM=1
  11271. 3356    CONTINUE
  11272.     IF(CMDLIN(LA).EQ.'+'.OR.CMDLIN(LA).EQ.'-')NSG=1
  11273.     IF(CMDLIN(LA).EQ.'['.OR.CMDLIN(LA).EQ.'.')NSG=1
  11274.     IF(CMDLIN(LA).EQ.'(')NSG=1
  11275.     IF(CMDLIN(LA).EQ.'"')KSG=1
  11276. C ON SEEING THE _@V1,V2 CONSTRUCT, REPLACE WITH THE VARIABLE
  11277. C ADDRESSED BY V1,V2 (COL,ROW) BY NAME.
  11278. C ON SEEING THE _#V1 CONSTRUCT, UNPACK UP TO 8 CHARS OUT OF
  11279. C REAL*8 VARIABLE (PACKED BY MULTIPLYING BY 128 EARLIER).
  11280. C  IN EACH CASE, ADJUSTN AND LE TO CONTINUE APPROPRIATELY.
  11281.     IF(ICHAR(CMDLIN(LA)).GT.32)NALF=NALF+1
  11282.     IF(CMDLIN(LA).EQ.'_'.AND.CMDLIN(LA+1).EQ.'@')CALL
  11283.      1  SVBL(CMDLIN,LA,N,LE,FORM)
  11284.     IF(CMDLIN(LA).EQ.'_'.AND.CMDLIN(LA+1).EQ.'#')CALL
  11285.      1  SSTR(CMDLIN,LA,N,LE,FORM)
  11286.     FORM(N)=CMDLIN(LA)
  11287.     LA=LA+1
  11288. C FAKE OUT DO LOOP SINCE SVBL OR SSTR MAY MUNG INDICES INSIDE IT
  11289.     N=N+1
  11290.     GOTO 2097
  11291. 7902    CONTINUE
  11292.     IF(KSG.NE.0)NSG=-1
  11293.     FORM(110)=char(0)
  11294.     IF(ICHAR(FORM(119)).NE.0)GOTO 7903
  11295. C LEAVE DISPLAY INDICATOR ALONE IF SET BUT SET VBL OTHERWISE.
  11296.     IVVVV=NSG*NXNUM
  11297.     FORM(119)=CHAR(IVVVV)
  11298. C SET NEG FOR DISPLAY OF FORMULA, NOT NUMBER. ALLOWS TEXT ENTRY.
  11299. C ASSUME FORMULA IF WE SEE + OR -
  11300. 7903    CONTINUE
  11301. C FORCE FORM TO FOLLOW EDITS EVEN IF FORMAT/TYPE PRESET.
  11302.     IVVVV=JCHAR(FORM(119))
  11303.     IF(IVVVV.NE.0)FORM(119)=CHAR(ISGN(IVVVV)*NXNUM)
  11304.     IF(NALF.LE.0)GOTO 6221
  11305.     CALL FVLDST(PROW,PCOL,FORM(119))
  11306. C ENCODE CELL NAMES PRIOR TO STORING
  11307.     CALL CA2E(FORM,FORM2)
  11308.     CALL WRKFIL(IRX,FORM2,1)
  11309. 6221    CONTINUE
  11310.     ASSIGN 7904 TO NBK
  11311.     GOTO 7905
  11312. C LOOK UP PROW, PCOL, LEAVE DISPLAY COORDS IN LR,LC
  11313. 7905    CONTINUE
  11314.     DO 7906 LA1=1,DRWV
  11315.     LR=LA1
  11316.     DO 7906 LA2=1,DCLV
  11317.     LC=LA2
  11318.     IF(NRDSP(LA1,LA2).EQ.PROW.AND.NCDSP(LA1,LA2).EQ.PCOL)GOTO7907
  11319. 7906    CONTINUE
  11320. C IF WE FALL OUT OF THE LOOP, WE DIDN'T FIND THE LOC; FLAG BY PUTTING 0'S.
  11321.     LR=0
  11322.     LC=0
  11323.     GOTO 7908
  11324. 7907    CONTINUE
  11325. C ARRIVE HERE ON SUCCESS. LR, LC ALL SET UP.
  11326. 7908    CONTINUE
  11327.     GOTO NBK,(7904,8901,8957)
  11328. 7904    CONTINUE
  11329.     IF(LR.EQ.0.OR.LC.EQ.0)GOTO 7901
  11330.     THISRW=LR
  11331.     THISCL=LC
  11332. C    ASCII 1,2,3,4 ARE VALUES 49,50,51,52 IN DECIMAL.
  11333.     LRO=1
  11334.     LCO=1
  11335.     ID1=NRDSP(1,1)
  11336.     ID2=NCDSP(1,1)
  11337.     IF(.NOT.(JMVFG.EQ.51.AND.THISRW.EQ.1))GOTO 7110
  11338. C MUST SCROLL LEFT
  11339.     IF(IDOL7.EQ.0)GOTO 7110
  11340.     IF(ID1.LE.1)GOTO 7110
  11341.     ID1=MAX0(1,ID1-DRWV+2)
  11342.     DROW=MAX0(1,DRWV-2)
  11343.     IQQ=1
  11344.     GOTO 7112
  11345. 7110    CONTINUE
  11346.     IF(JMVFG.EQ.51)THISRW=MAX0(1,(THISRW-1))
  11347.     IF(.NOT.(JMVFG.EQ.52.AND.THISRW.EQ.DRWV))GOTO 7116
  11348. C MUST SCROLL RIGHT
  11349.     IF(IDOL7.EQ.0)GOTO 7116
  11350.     DROW=3
  11351. C    ID1=MIN0(60,ID1+DRWV-MIN0(DRWV,2))
  11352.     ID1=ID1+DRWV-MIN0(DRWV,2)
  11353.     IQQ=1
  11354.     GOTO 7112
  11355. C 7112 FAKES OUT OA CALL TO SCROLL OVER.
  11356. 7116    CONTINUE
  11357.     IF(JMVFG.EQ.52)THISRW=MIN0((THISRW+1),DRWV)
  11358.     IF(.NOT.(JMVFG.EQ.49.AND.THISCL.EQ.1))GOTO 7117
  11359. C MUST SCROLL UP
  11360.     IF(IDOL7.EQ.0)GOTO 7117
  11361.     IF(ID2.LE.2)GOTO 7117
  11362.     DCOL=MAX0(1,DCLV-2)
  11363.     ID2=MAX0(2,ID2-DCLV+2)
  11364.     IQQ=1
  11365.     GOTO 7112
  11366. 7117    CONTINUE
  11367.     IF(JMVFG.EQ.49)THISCL=MAX0(1,(THISCL-1))
  11368.     IF(.NOT.(JMVFG.EQ.50.AND.THISCL.EQ.DCLV))GOTO 7118
  11369. C MUST SCROLL DOWN
  11370.     IF(IDOL7.EQ.0)GOTO 7118
  11371.     DCOL=3
  11372. C    ID2=MIN0(301,ID2+DCLV-MIN0(DCLV,2))
  11373.     ID2=ID2+DCLV-MIN0(DCLV,2)
  11374.     IQQ=1
  11375.     GOTO 7112
  11376. 7118    CONTINUE
  11377.     IF(JMVFG.EQ.50)THISCL=MIN0((THISCL+1),DCLV)
  11378.     DROW=THISRW
  11379.     DCOL=THISCL
  11380.     PROW=NRDSP(DROW,DCOL)
  11381.     PCOL=NCDSP(DROW,DCOL)
  11382. C FORCE REDO OF BOTH LAST AND NEW COLUMN BY DISPLAYER.
  11383.     DVS(LR,LC)=DVS(LR,LC)+.0000000057
  11384.     DVS(DROW,DCOL)=DVS(DROW,DCOL)+.000000062
  11385. 7901    GOTO 9990
  11386. 8000    IF(CMDLIN(1).NE.'M')GOTO 8001
  11387.     ICODE=1
  11388. C MACROCELL COMMAND IF MH (HIDE) OR MS (SHOW)
  11389.     IF(CMDLIN(2).EQ.'S')IDOL4=1
  11390.     IF(CMDLIN(2).EQ.'H')IDOL4=0
  11391.     IF(CMDLIN(2).EQ.'S'.OR.CMDLIN(2).EQ.'H')GOTO 9990
  11392.     IF(CMDLIN(2).NE.'D')GOTO 4401
  11393. C MD MODE COMMAND.
  11394. C  MDD=DISABLE 3D AND DISALLOW 3D VBL NAMES
  11395. C  MDN=NO 3D BUT ALLOW 3D VBL NAMES
  11396. C  MDE=ENABLE 3D. DON'T TRANSLATE VARIABLE NAMES
  11397. C  MDF=FORCE 3D, TRANSLATING VARIABLE NAMES
  11398. C    ALL THESE ALLOW 2 NUMBERS TO FOLLOW, BEING COLUMN AND
  11399. C    ROW DELTAS TO THE NEXT "PLANE".
  11400.     K3DFG=0
  11401.     IF(CMDLIN(3).EQ.'D')K3DFG=-2
  11402.     IF(CMDLIN(3).EQ.'N')K3DFG=0
  11403.     IF(CMDLIN(3).EQ.'E')K3DFG=1
  11404.     IF(CMDLIN(3).EQ.'F')K3DFG=999
  11405. C NOW GRAB ARGS IF ANY.
  11406. C USE INTERNAL PROCEDURE TO DECODE 2 NUMBERS STARTING AT CMDLIN(4)
  11407. C SKIP IF NEXT CHAR IS NOT NUMERIC.
  11408.     If(cmdlin(4).eq.' ')goto 4404
  11409.     IF(Ichar(CMDLIN(4)).LE.47.OR.
  11410.      1   Ichar(CMDLIN(4)).GT.57)GOTO 9990
  11411. 4404    continue
  11412.     ASSIGN 4402 TO KBACK
  11413.     GOTO 8132
  11414. 4402    CONTINUE
  11415.     IF(NCL.GE.0.AND.NCL.LT.Mrows)KCDELT=NCL
  11416.     IF(LCWID.GE.0.AND.LCWID.LT.Mcols)KRDELT=LCWID
  11417.     GOTO 9990
  11418. 4401    CONTINUE
  11419. C MOVE COMMAND
  11420. C M1,M2,M3,M4 MOTION DIRECTION IS U,D,L,R
  11421.     IVVV=ICHAR(CMDLIN(2))
  11422. C ALLOW M0 TO MEAN RESTORE PRIOR STATE OF AUTOMOVE AND
  11423. C SAVE CURRENT STATE AS NEW PRIOR ONE. M1 THRU M5 MEAN SET
  11424. C AUTOMOVE TO 1-5 (5=NO MOTION) AND SAVE OLD STATE AS LAST
  11425. C STATE.
  11426.     IF(CMDLIN(2).EQ.'0')IVVV=JMVOLD
  11427.     JMVOLD=JMVFG
  11428.     JMVFG=IVVV
  11429. C    JMVFG=ICHAR(CMDLIN(2))
  11430. C STORE CHARACTER AS MOVE FLAG
  11431.     GOTO 9990
  11432. 8001    IF(CMDLIN(1).NE.'D')GOTO 8002
  11433. C DISPLAY COMMANDS
  11434. C
  11435. C DISPLAY SORT
  11436. C DSRA 1
  11437. C DS = CONSTANT KEYWORD
  11438. C R/C=ROW/COL (DISPLAY COORD #S)
  11439. C A/D=ASCENDING/DESCENDING ORDER
  11440. C NUMBER= DISPLAY COORD ROW/COL # TO SORT ON.
  11441. C SORTS NUMERIC FIELDS ONLY.
  11442.     IF(CMDLIN(2).NE.'S')GOTO 1752
  11443.     ICODE=2
  11444. C MUST REDRAW. WE DO WHOLESALE RELOCATIONS OF THINGS HERE.
  11445. C FIRST GET ARGUMENTS
  11446.     LAA=6
  11447.     LBB=15
  11448.     CALL GN(LAA,LBB,NBR,CMDLIN)
  11449. C THIS EXTRACTS THE NUMBER OF ROW/COL TO USE.
  11450. C DEFAULT IS PHYS, COL, ASCENDING
  11451.     IF(NBR.LE.0.OR.NBR.GT.MAX0(JIDcl,JIDrw))GOTO 9990
  11452. c    IF(NBR.LE.0.OR.NBR.GT.75)GOTO 9990
  11453.     SSIGN=1.
  11454.     IF(CMDLIN(4).EQ.'D')SSIGN=-1.
  11455. C SSIGN USED TO CONTROL ASCENDING/DESCENDING SORT (MULTIPLY BY IT)
  11456. C GET LENGTH TO GO THRU IN SORT
  11457.     IF(CMDLIN(3).EQ.'C')IDELTA=DCLV-1
  11458.     IF(CMDLIN(3).EQ.'R')IDELTA=DRWV-1
  11459.     I1IN=0
  11460.     I2IN=1
  11461. C GET PHYSICAL COORDINATES OF ROW/COL WE'RE SORTING ON.
  11462.     IF(CMDLIN(3).EQ.'R')GOTO 6222
  11463.     ID1=NRDSP(NBR,1)
  11464.     ID2=NCDSP(NBR,1)
  11465.     GOTO 1753
  11466. 6222    CONTINUE
  11467.     ID1=NRDSP(1,NBR)
  11468.     ID2=NCDSP(1,NBR)
  11469.     I1IN=1
  11470.     I2IN=0
  11471. C HACK TO HANDLE ROW/COL ALIKE
  11472. 1753    CONTINUE
  11473.     IFLIP=0
  11474. C IFLIP = BUBBLESORT FLAG WE CHANGED SOMETHING
  11475. C (USE SIMPLE MINDED SMALL SORT. TOO MUCH OVHD FOR BETTER ONE...NO ROOM)
  11476.     ID1A=ID1
  11477.     ID2A=ID2
  11478. C IGNORE CASE OF IDELTA=0... SHOULDN'T BE ANY WAY FOR THAT TO HAPPEN
  11479.     DO 1754 IV=1,IDELTA
  11480. C SORT HERE. IFLIP=1 IF WE INVERT ANYTHING.
  11481. C JUST COMPARE XVBLS...
  11482. C NOTE WE ASSUME A "NORMAL" TYPE DISPLAY, JUST RESET PHYSICAL STUFF.
  11483.     CALL XVBLGT(ID1A,ID2A,XAC)
  11484.     CALL XVBLGT(ID1A+I1IN,ID2A+I2IN,XVBLS(1,1))
  11485.     IF(XAC*SSIGN.LE.XVBLS(1,1)*SSIGN)GOTO 1755
  11486. C FLIP ASSIGNMENTS
  11487. C FLIP XVBLS NUMBERS TOO TO MAINTAIN SORT. WE RECOMPUTE ANYWAY..
  11488.     CALL XVBLST(ID1A+I1IN,ID2A+I2IN,XAC)
  11489.     CALL XVBLST(ID1A,ID2A,XVBLS(1,1))
  11490.     IFLIP=1
  11491. C SWAP ASSIGNMENTS OF DISPLAY STUFF IF IN RANGE
  11492. C OPERATES LIKE A SORTED OA COMMAND
  11493. C CURRENT PHYSICAL ROW IS ID2A (1...RCL LIMITS)
  11494. C AND PHYS COL IS ID1A.
  11495. C    LDELTA=DRW-1
  11496.     LDELTA=19
  11497. C FOR REASSIGNMENT, ROLE OF I1IN,I2IN CAN BE REVERSED...
  11498.     ID1B=1
  11499. C NOTE DISPLAY ID2 IS 1 LESS THAN PHYSICAL ONE. (AC'S)
  11500.     ID2B=ID2A-1
  11501.     IF(ID2B.LE.0)GOTO 1754
  11502.     IF(CMDLIN(3).NE.'R')GOTO 1756
  11503. C ROW...
  11504. C    LDELTA=DCL-1
  11505.     LDELTA=74
  11506. C ID1 SAME AS DISPLAY COORDS
  11507.     ID1B=ID1A
  11508.     ID2B=1
  11509. 1756    CONTINUE
  11510.     DO 1757 IVV=1,LDELTA
  11511. C FLIP THE ROW/COL 1 ENTRY AT A TIME. JUST CHANGES ASSIGNMENTS.
  11512.     JD1=NRDSP(ID1B,ID2B)
  11513.     JD2=NCDSP(ID1B,ID2B)
  11514.     NRDSP(ID1B,ID2B)=NRDSP(ID1B+I1IN,ID2B+I2IN)
  11515.     NCDSP(ID1B,ID2B)=NCDSP(ID1B+I1IN,ID2B+I2IN)
  11516.     NRDSP(ID1B+I1IN,ID2B+I2IN)=JD1
  11517.     NCDSP(ID1B+I1IN,ID2B+I2IN)=JD2
  11518.     ID1B=ID1B+I2IN
  11519.     ID2B=ID2B+I1IN
  11520. 1757    CONTINUE
  11521. C WE CAN ALWAYS FLIP SINCE WE STAY ON DISPLAY SHEET.
  11522. 1755    CONTINUE
  11523.     ID1A=ID1A+I1IN
  11524.     ID2A=ID2A+I2IN
  11525. 1754    CONTINUE
  11526. C DONE 1 PASS. IF ANYTHING CHANGED, TRY AGAIN.
  11527.     IF(IFLIP.NE.0)GOTO 1753
  11528. C DONE SORT AT END
  11529.     GOTO 9990
  11530. 1752    CONTINUE
  11531. C
  11532.     IF(CMDLIN(2).NE.'L')GOTO 8101
  11533. C DL = DISPLAY LOCATE V1:V2 N:M
  11534.     ASSIGN 8103 TO IBACK
  11535.     GOTO 8104
  11536. C STRIP VARIABLE NAMES OFF CMD LINE STARTING AT POSITION 3
  11537. 8104    LA=3
  11538.     LE=98
  11539.     L1=0
  11540.     LPagmd=0
  11541.     LPag1=0
  11542.     LPag2=0
  11543.     CALL VARSCN(CMDLIN(1),LA,LE,LSTC,ID1A,ID2A,IVLD)
  11544.     L2=0
  11545. C L1,L2 = FLAGS VARIABLE 1,2 FOUND VALIDLY
  11546.     LA=LSTC+1
  11547.     LE=100-LA
  11548.     IF(LE.LE.0.OR.IVLD.LE.0)GOTO 8102
  11549.     L1=1
  11550.     lpag1=kpag
  11551.     IF(CMDLIN(LSTC).eq.'}')Lpagmd=1
  11552.     IF((CMDLIN(LSTC).NE.':').and.(Cmdlin(Lstc).ne.'}'))
  11553.      1   GOTO 8102
  11554. C MUST SEE : BETWEEN NAMES. NO SPACES PERMITTED.
  11555.     CALL VARSCN(CMDLIN,LA,LE,LSTC,ID1B,ID2B,IVLD)
  11556.     IF(IVLD.LE.0)GOTO 8102
  11557.     lpag2=kpag
  11558.     L2=1
  11559. 8102    CONTINUE
  11560. C NOTE THAT LSTC RETURNS AS CHARACTER AFTER VARIABLE LAST GRABBED IN INPUT LINE.
  11561.     GOTO IBACK,(8103,8112,8121,8301,8953,8900,7015)
  11562. C NOW PICK UP RN:M OR CN:M (R=ROW,C=COL)
  11563. 8103    CONTINUE
  11564.     IF(L1.LT.1)GOTO 8101
  11565. C INVALID UNLESS AT LEAST 1 VBL NAME SEEN.
  11566.     LA=LSTC+2
  11567.     RCF=0
  11568.     IF(CMDLIN(LSTC+1).EQ.'R')RCF=2
  11569.     IF(CMDLIN(LSTC+1).EQ.'C')RCF=1
  11570.     IF(RCF.EQ.0)GOTO 8101
  11571.     KM1=1
  11572.     CALL GN(KM1,LE,NUM1,CMDLIN(LA))
  11573.     IF(NUM1.EQ.0)GOTO 8101
  11574.     KKK=ICHAR(':')
  11575.     LE=INDX(CMDLIN(LA),KKK)
  11576.     NUM2=0
  11577.     IF(LE.GT.100)GOTO 8101
  11578.     LA=LA+LE
  11579.     KM1=1
  11580.     KM8=8
  11581.     CALL GN(KM1,KM8,NUM2,CMDLIN(LA))
  11582. C NOW NUM1,NUM2 ARE DESIRED ROW/COL RANGE. NOW SET UP DISPLAY.
  11583.     IF(NUM2.EQ.0.OR.NUM2.GT.JIDrw)GOTO 8101
  11584.     IF(NUM1.GT.JIDcl0)GOTO 8101
  11585. C ILLEGAL ROW/COL IS A NO-GO.
  11586. C R N:M MEANS STARTING AT COL N ROW M GOING L TO R.
  11587. C C N:M MEANS DOWN STARTING THERE. DISPLAY COORDS ASSUMED.
  11588.     IF(ID1A.NE.ID1B.AND.ID2A.NE.ID2B)GOTO 8101
  11589. C ONLY HANDLE ROWS OR COLS, NOT DIAGONALS.
  11590. C MUST BE A PHYS MTX ROW OR COL.
  11591.     LRINC=0
  11592.     LCINC=0
  11593.     IF(RCF.EQ.1)LRINC=1
  11594.     IF(RCF.EQ.2)LCINC=1
  11595.     ASSIGN 8108 TO JBACK
  11596.     GOTO 8109
  11597. C COPY DATA
  11598. 8109    CONTINUE
  11599.     ICODE=6
  11600.     IDELT=1
  11601.     IF(L2.NE.0)IDELT=MAX0(IABS(ID1A-ID1B),IABS(ID2A-ID2B))+1
  11602.     I1IN=0
  11603.     I2IN=1
  11604.     IF(ID1A.EQ.ID1B)GOTO 8106
  11605.     I1IN=1
  11606.     I2IN=0
  11607. 8106    CONTINUE
  11608.     ID1=ID1A
  11609.     ID2=ID2A
  11610.     GOTO JBACK,(8108,8113,8122,8307,8954,7307)
  11611. 8108    CONTINUE
  11612.     ICODE=1
  11613.     IR=NUM1
  11614.     IC=NUM2
  11615. C 1 DIM COPY OF DATA, FOR IDELT ELEMENTS.
  11616.     DO 8105 NM=1,IDELT
  11617. C CLAMP TO MAX DISPLAY ARRAY
  11618.     IF(IR.GT.JIDcl.OR.IC.GT.JIDrw)GOTO 8105
  11619.     NRDSP(IR,IC)=ID1
  11620.     NCDSP(IR,IC)=ID2
  11621.     DVS(IR,IC)=DVS(IR,IC)-1.E-14
  11622. C    THISRW=IR
  11623. C    THISCL=IC
  11624. C    JRX=(ID2-1)*60+ID1
  11625.     CALL REFLEC(ID2,ID1,JRX)
  11626.     CALL WRKFIL(JRX,FORM2,0)
  11627. C    READ(7'JRX)FORM2
  11628. C    DO 7104 N7=1,9
  11629. C7104    DFMTS(N7,IR,IC)=FORM2(N7+119)
  11630. C    DFMTS(10,IR,IC)=0
  11631.     IR=IR+LCINC
  11632.     IC=IC+LRINC
  11633. C NOTE REVERSAL FOR DISPLAY.
  11634.     ID1=ID1+I1IN
  11635.     ID2=ID2+I2IN
  11636. 8105    CONTINUE
  11637. 8101    CONTINUE
  11638.     IF(CMDLIN(2).NE.'F')GOTO 8111
  11639. C DF STUFF - SET FORMAT.
  11640.     ASSIGN 8112 TO IBACK
  11641.     GOTO 8104
  11642. 8112    CONTINUE
  11643. C NOW HAVE VARIABLE ID'S SET UP
  11644.     IF(L1.LE.0)GOTO 8120
  11645. C MUST HAVE 1 OR MORE...
  11646.     ASSIGN 8113 TO JBACK
  11647.     GOTO 8109
  11648. C IDELT NOW SET UP. SET FORMATS UP NOW.
  11649. C FORMATS ARE IN [] BRACKETS. FIND THESE AND USE.
  11650. 8113    CONTINUE
  11651.     ICODE=1
  11652.     KKK=ICHAR('[')
  11653.     LA=INDX(CMDLIN,KKK)+1
  11654.     KKK=ICHAR(']')
  11655.     LB=INDX(CMDLIN,KKK)-1
  11656.     LDELT=LB-LA+1
  11657.     LDELT=MIN0(LDELT,9)
  11658.     DO 8114 LN=1,IDELT
  11659. C IDELT IS OVER VRBL LIST GIVEN. MAY BE 1 ONLY.
  11660. C    IRRX=(ID2-1)*60+ID1
  11661.     CALL REFLEC(ID2,ID1,IRRX)
  11662.     CALL WRKFIL(IRRX,FORM,0)
  11663. C    READ(7'IRRX)FORM
  11664.     IF(CMDLIN(LA).EQ.'*')GOTO 7115
  11665.     IF(CMDLIN(LA).EQ.'A'.OR.CMDLIN(LA).EQ.'L')GOTO 7115
  11666. C KEEP EXISTING FORMAT IF [*] IS USED.
  11667.     DO 7989 KKKK=1,9
  11668. 7989    FORM(119+KKKK)=Char(0)
  11669.     DO 8115 LNA=1,LDELT
  11670.     FORM(LNA+119)=CMDLIN(LA-1+LNA)
  11671.     IF(LNA.LT.9)FORM(LNA+120)=char(0)
  11672. 8115    CONTINUE
  11673. 7115    CONTINUE
  11674. C    FORM(128)=0
  11675.     CALL FVLDGT(ID1,ID2,FVWRK)
  11676.     IVVVV=JCHAR(FVWRK)
  11677.     IF(IVVVV.EQ.0)IVVVV=3
  11678. C SET UP DEFAULT AS NUMERIC.
  11679. C    IVVVV=FVLD(ID1,ID2)
  11680. C    FVLD(ID1,ID2)=MAX0(1,IABS(IVVVV))
  11681.     IVVVV=MAX0(1,IABS(IVVVV))
  11682.     IF(CMDLIN(LA).EQ.'A'.OR.CMDLIN(LA).EQ.'L')IVVVV=
  11683.      1  MIN0(-1,-IABS(IVVVV))
  11684.     CALL FVLDST(ID1,ID2,CHAR(IVVVV))
  11685.     IF(CMDLIN(LA).EQ.'I')CALL TYPSET(ID1,ID2,4)
  11686.     IF(CMDLIN(LA).EQ.'F'.OR.CMDLIN(LA).EQ.'E')
  11687.      1   CALL TYPSET(ID1,ID2,2)
  11688.     FORM(119)=CHAR(IVVVV)
  11689. C
  11690. C TO BE SURE WE DON'T FOUL UP THE FILE, TRY AN ENCODE ON THIS FORMAT
  11691. C PRIOR TO THE WRITE. THAT WAY IF WE BOMB, THE FILE WE HAVE DIRECT ACCESS
  11692. C DATA ON IS NOT CLOBBERED.
  11693.     IF(IVVVV.LE.0)GOTO 7990
  11694.     DO 7988 KKK=1,9
  11695.     KKKK=ICHAR(FORM(119+KKK))
  11696. 7988    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  11697.     DFE(1)='('
  11698.     DFE(12)=' '
  11699.     DFE(13)=' '
  11700.     DFE(14)=')'
  11701.     CALL TYPGET(N1,N2,TYPE(1,1))
  11702.     CALL FVLDGT(N1,N2,FVLD(1,1))
  11703.     IF(JCHAR(FVLD(1,1)).LE.0)GOTO 7990
  11704.     IF(TYPE(1,1).NE.2)GOTO 6223
  11705.     WRITE(WRKCHR(1:127),DFE,ERR=4302)DVS(THISRW,THISCL)
  11706.     GOTO 7990
  11707. 6223    CONTINUE
  11708.         WRITE(WRKCHR(1:127),DFE,ERR=4302)LDVS(1,THISRW,THISCL)
  11709. 7990    CONTINUE
  11710.     CALL WRKFIL(IRRX,FORM,1)
  11711.     DO 8116 NX1=1,JIDcl
  11712.     DO 8116 NX2=1,JIDrw
  11713. C LOCATE DISPLAY CELL IF ANY
  11714.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8117
  11715. 8116    CONTINUE
  11716.     GOTO 8118
  11717. 8117    CONTINUE
  11718.     DVS(NX1,NX2)=DVS(NX1,NX2)-1.23E-12
  11719. 8118    CONTINUE
  11720.     ID1=ID1+I1IN
  11721.     ID2=ID2+I2IN
  11722. 8114    CONTINUE
  11723. 8111    CONTINUE
  11724.     IF(CMDLIN(2).NE.'T')GOTO 8120
  11725. C DT DISPLAY TYPE
  11726.     ASSIGN 8121 TO IBACK
  11727.     GOTO 8104
  11728. C GET VBL NAMES
  11729. 8121    ASSIGN 8122 TO JBACK
  11730.     GOTO 8109
  11731. 8122    LA=LSTC+1
  11732.     IF(L1.LE.0)GOTO 8120
  11733.     KTYP=2
  11734.     IF(CMDLIN(LA).EQ.'I')KTYP=4
  11735.     ICODE=1
  11736.     DO 8123 LNA=1,IDELT
  11737.     CALL TYPSET(ID1,ID2,KTYP)
  11738. C    TYPE(ID1,ID2)=KTYP
  11739.     DO 8126 NX1=1,DRWV
  11740.     DO 8126 NX2=1,DCLV
  11741.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8127
  11742. C FIND DISPLAY LOC IF ANY AND SET IT UP FOR REDRAW
  11743. 8126    CONTINUE
  11744.     GOTO 8128
  11745. 8127    CONTINUE
  11746.     DVS(NX1,NX2)=DVS(NX1,NX2)-1.211E-16
  11747. 8128    CONTINUE
  11748.     ID1=ID1+I1IN
  11749.     ID2=ID2+I2IN
  11750. 8123    CONTINUE
  11751. 8120    CONTINUE
  11752.     IF(CMDLIN(2).NE.'W')GOTO 8130
  11753. C DW SETS COL WIDTH
  11754.     ASSIGN 8131 TO KBACK
  11755.     GOTO 8132
  11756. C GET 2 NUMBERS STARTING AT CMDLIN(4)
  11757. 8132    CONTINUE
  11758.     KM1=1
  11759.     KM6=6
  11760.     CALL GN(KM1,KM6,NCL,CMDLIN(4))
  11761.     KKK=ICHAR(',')
  11762.     LA=INDX(CMDLIN(4),KKK)
  11763. C COMMA MUST BE SEPARATOR
  11764.     LCWID=7
  11765.     IF(LA.GT.100)GOTO 8138
  11766.     KM1=1
  11767.     CALL GN(KM1,KM6,LCWID,CMDLIN(LA+4))
  11768. 8138    GOTO KBACK,(8131,8141,4402)
  11769. 8131    CONTINUE
  11770.     ICODE=6
  11771.     NCL=MAX0(1,NCL)
  11772.     NCL=MIN0(NCL,JIDcl)
  11773.     LCWID=MAX0(1,LCWID)
  11774.     LCWID=MIN0(LCWID,110)
  11775. C COL WIDTH IS 3 TO 110 CHARS.
  11776.     IF(NCL.GT.0)CWIDS(NCL)=LCWID
  11777. 8133    CONTINUE
  11778. 8130    CONTINUE
  11779.     IF(CMDLIN(2).NE.'B')GOTO 8140
  11780. C DB = BOUNDS ON ROW,COL
  11781.     ASSIGN 8141 TO KBACK
  11782.     GOTO 8132
  11783. C PARASITE OTHER CODE TO GET DIGITS
  11784. 8141    MC=NCL
  11785.     MR=LCWID
  11786.     MC=MIN0(MC,JIDcl)
  11787.     MR=MIN0(MR,JIDrw)
  11788. C CLAMP RANGE TO LEGAL
  11789.     IF(MC.GT.0)DRWV=MC
  11790.     IF(MR.GT.0)DCLV=MR
  11791.     ICODE=2
  11792. C REDRAW SCREEN WHEN BOUNDS CHANGE.
  11793. 8140    CONTINUE
  11794.     GOTO 9990
  11795. 8002    IF(CMDLIN(1).NE.'V')GOTO 8003
  11796. C VIEW REDRAW COMMAND
  11797.     IF(CMDLIN(2).EQ.'C'.OR.CMDLIN(2).EQ.'B')CALL SWSET(0)
  11798.     IF(CMDLIN(2).EQ.'I')CALL SWSET(1)
  11799.     IF(CMDLIN(2).EQ.'C'.OR.CMDLIN(2).EQ.'B')MODFLG=0
  11800.     IF(CMDLIN(2).EQ.'I')MODFLG=1
  11801. C VI MEANS VIEW IBM MODE, USING BIOS CALLS FOR DIRECT SCREEN OUTPUT.
  11802.     IF(CMDLIN(2).EQ.'C')CALL UVT100(20,0,0)
  11803.     IF(CMDLIN(2).EQ.'B')CALL UVT100(21,0,0)
  11804. C VC SETS VIEW COLOR MODE
  11805. C VB SETS VIEW B+W MODE
  11806. C REQUIRES UVTGEN MODULE...
  11807.     IF(CMDLIN(2).EQ.'H')GOTO 8320
  11808. 8324    CONTINUE
  11809.     PZAP=0
  11810.     FORMFG=0
  11811.     IF(CMDLIN(2).EQ.'F')FORMFG=1
  11812.     IF(CMDLIN(2).EQ.'M')PZAP=1
  11813.     ICODE=6
  11814.     IF(CMDLIN(2).EQ.'E')ICODE=1
  11815. C VE JUST TURNS ON VIEW MODE, DOESN'T REPAINT ALL.
  11816.     GOTO 9990
  11817. 8320    CONTINUE
  11818.     IF(CMDLIN(3).NE.'+'.AND.CMDLIN(3).NE.'-')GOTO 8324
  11819. C VH+ OR VH-, FLIP VIEW HACK TO SHOW PROGRESS
  11820. C DYMANICALLY
  11821.     IDOL8=1
  11822.     IF(CMDLIN(3).EQ.'-')IDOL8=0
  11823. C IDOL8 = 1 MEANS DO THE DISPLAY, 0 MEANS DON'T.
  11824.     ICODE=3
  11825.     GOTO 9990
  11826. 8003    IF(CMDLIN(1).NE.'C'.AND.CMDLIN(1).NE.'I')GOTO 8004
  11827. C COPY NUMBERS COMMAND
  11828. C COPY (NUMBERS,FORMAT,DISPLAY,ALL)
  11829. C CV=COPY VALUE, CD=COPY DISPLAY FMT, CF=COPY FORMULA, CA=COPY ALL
  11830. C Ca V1:V2 V3:V4 COPIES FIRST RANGE TO SECOND.
  11831. C IR RANGES DOES INPLACE RELOCATION...
  11832. C
  11833. C COLLECT ARGS
  11834.     ASSIGN 8301 TO IBACK
  11835.     GOTO 8104
  11836. 8301    CONTINUE
  11837. C NOW L1,L2 SAY IF VBLS(ID1A,ID2A) AND (ID1B,ID2B) EXIST
  11838. C also Lpagmd says if the first range is page range and
  11839. C Lpag1 and Lpag2 have page ranges.
  11840. C COLLECT JD2A,JD2B. USE SIMILAR INTERNAL PROCEDURE CODE.
  11841.     IF(L1.LE.0)GOTO 8399
  11842.     ASSIGN 8302 TO MBACK
  11843.     GOTO 8303
  11844. 8303    CONTINUE
  11845. C COLLECT 2 VARS STARTING AT LSTC+3
  11846. C SKIPS LSTC DELIMITER.
  11847.     LJ1=0
  11848.     LJ2=0
  11849.     LA=LSTC+1
  11850.     LE=110-LA
  11851.     KPagmd=0
  11852.     KPag1=0
  11853.     KPag2=0
  11854.     IF(LE.LE.0)GOTO 8304
  11855.     CALL VARSCN(CMDLIN,LA,LE,LSTC,JD1A,JD1B,IVLD)
  11856.     LA=LSTC+1
  11857.     LE=110-LA
  11858.     IF(LE.LE.0.OR.IVLD.LE.0)GOTO 8304
  11859.     KPag1=kpag
  11860.     LJ1=1
  11861. C allow } to indicate DEPTH oriented ranges but flag it.
  11862.     If(Cmdlin(lstc).eq.'}')KPagmd=1
  11863.     IF((CMDLIN(LSTC).NE.':').and.(Cmdlin(Lstc).ne.'}'))
  11864.      1    GOTO 8304
  11865.     CALL VARSCN(CMDLIN,LA,LE,LSTC,JD2A,JD2B,IVLD)
  11866.     IF(IVLD.LE.0)GOTO 8304
  11867.     KPag2=kpag
  11868.     LJ2=1
  11869. 8304    GOTO MBACK,(8302,7017)
  11870. 8302    CONTINUE
  11871.     IF(LJ1.LE.0)GOTO 8399
  11872.     IDELT=1
  11873.     IPDL=0
  11874.     If(LPagmd.ne.0.and.Lpag2.gt.LPag1)ipdl=Lpag2-Lpag1
  11875.     If(K3Dfg.le.0)ipdl=0
  11876.     IF(Lpagmd.eq.0.and.
  11877.      1  L2.NE.0.AND.(ID1A.NE.ID1B.AND.ID2A.NE.ID2B))GOTO 8305
  11878.     IF(L2.NE.0)IDELT=MAX0(IABS(ID1A-ID1B),IABS(ID2A-ID2B),
  11879.      1   IPDL)+1
  11880.     if(k3dfg.gt.0.and.lpagmd.ne.0.and.ipdl.gt.0)
  11881.      1  idelt=ipdl+1
  11882.     IKDelt=IDelt
  11883. 8305    CONTINUE
  11884.     JDELT=1
  11885.     JPDL=0
  11886.     If(KPagmd.ne.0.and.Kpag2.gt.KPag1)JPDL=KPag2-KPag1
  11887.     If(K3Dfg.le.0)jpdl=0
  11888.     IF(kpagmd.ne.0.or.LJ2.EQ.0)GOTO 8306
  11889.     IF(JD1A.NE.JD2A.AND.JD1B.NE.JD2B)GOTO 8306
  11890.     JDELT=MAX0(IABS(JD1A-JD2A),IABS(JD1B-JD2B),
  11891.      1    JPDL)+1
  11892. 8306    IF(L2.NE.0)JDELT=MIN0(IDELT,JDELT)
  11893. C For page mode, difference is depth, not row or cols.
  11894.     if(k3dfg.gt.0.and.kpagmd.ne.0.and.jpdl.gt.0)
  11895.      1  jdelt=jpdl+1
  11896. C CHANGE FOR REPLICATE :  JDELT CAN BE JUST JDELT IF L2=0
  11897.     ASSIGN 8307 TO JBACK
  11898. C 8109 IS WHERE WE SET UP I1IN AND I2IN ASSUMING THAT THE VARIABLES
  11899. C ARE SET PROPERLY. HANDLED AS AN INTERNAL PROCEDURE.
  11900.     GOTO 8109
  11901. 8307    CONTINUE
  11902. C 8109 procedure also resets IDELT
  11903.     If(k3dfg.gt.0)IDelt=IKDelt
  11904.     JIN1=1
  11905.     JIN2=0
  11906.     IF(JD1B.EQ.JD2B)GOTO 8308
  11907.     JIN1=0
  11908.     JIN2=1
  11909. 8308    CONTINUE
  11910. C
  11911. C Change for 3D depth ranges:
  11912. C Reset I1IN and I2IN to KRDELT and KCDELT if depth mode and
  11913. C 3D stuff enabled. Reset JIN1 and JIN2 likewise if depth
  11914. C mode there.
  11915. C This has the advantage that it allows cells to be copied
  11916. C from any one dimensional range to any other, even if one
  11917. C or both 1-D ranges are in depth. A certain amount of hacking
  11918. C can allow cells possibly to be copied in overlapping pages
  11919. C also (for stuff like matrix traces).
  11920.     If(K3DFG.LE.0)goto 8610
  11921.     If(LPagmd.le.0)goto 8611
  11922.     I1IN=KCDELT
  11923.     I2IN=KRDELT
  11924. 8611    Continue
  11925.     If(KPagmd.le.0)goto 8610
  11926.     JIN1=KCDELT
  11927.     JIN2=KRDELT
  11928. 8610    Continue
  11929. C CHANGE FOR REPLICATE: IF L2 IS 0 (NO 2ND SRC VARIABLE), NO BUMPS
  11930. C PAST THE SINGLE VARIABLE SPECIFIED.
  11931.     IF(L2.EQ.0)I1IN=0
  11932.     IF(L2.EQ.0)I2IN=0
  11933. C FOR PCC-PC DO RECALC ALWAYS TO ALLOW DISPLAY TO LOOK OK
  11934.     ICODE=3
  11935. C    ICODE=1
  11936. C FORCE RECALC IF ONLY 1 SOURCE VARIABLE.
  11937. C    IF(L2.EQ.0)ICODE=3
  11938.     JRTR=PROW
  11939.     JRTC=PCOL
  11940. C JRTR AND JRTC = RELOCATION THRESHOLDS
  11941. C CELLS ABOVE OR LEFT OF JRTR,JRTC WILL NOT BE RELOCATED IN A CR
  11942. C OPERATION. THIS WILL GENERALLY BE THE PHYSICAL COLUMN OR ROW
  11943. C OF THE CURRENT POSITION. CELLS LOWER OR EQUAL, OR TO THE RIGHT
  11944. C OF THE CURRENT LOCATION OR EQUAL, WILL BE RELOCATED. (VARIABLE
  11945. C NAMES GET EDITED)
  11946.     ASSIGN 8365 TO KPYBAK
  11947.     GOTO 8364
  11948. C 8364 BEGINS COPY PROCEDURE SECTION
  11949. C GOES FOR JDELT CELLS WITH I1IN AND I2IN BEING SOURCE INCREMENTS FOR
  11950. C RRW DIMENSION, RCL DIMENSION, AND JIN1,2 BEING INCREMENTS FOR
  11951. C DESTINATION RRW,RCL DIMENSIONS RESPECTIVELY. USES CMDLIN(2) TO
  11952. C FLAG WHETHER TO HANDLE ALL, JUST FORMAT, RELOCATE, ETC.
  11953. C  ALSO ID1A,ID2A ARE START SOURCE LOCATION
  11954. C  JD1A,JD1B = DEST START LOCATION.
  11955. C
  11956. C COPIES 1 ROW OR COLUMN AT A TIME.
  11957. 8364    CONTINUE
  11958. C    ICODE=1
  11959. C SET DISPLAY UPDATE ON COPIED CELLS
  11960. CCD    DO 3620 JV=1,BRRCL
  11961. CCD3620    IBITMP(JV)=0
  11962.     DO 8309 JV=1,JDELT
  11963.     DO 8380 NX1=1,DRWV
  11964.     DO 8380 NX2=1,DCLV
  11965. C LOCATE DISPLAY CELL IF ANY
  11966.     IF(NRDSP(NX1,NX2).EQ.ID1.AND.NCDSP(NX1,NX2).EQ.ID2)GOTO 8387
  11967. 8380    CONTINUE
  11968.     GOTO 8388
  11969. 8387    CONTINUE
  11970.     DVS(NX1,NX2)=DVS(NX1,NX2)+1.245E-14
  11971. 8388    CONTINUE
  11972. C    JRXX=(JD1B-1)*60+JD1A
  11973. C    IRXX=(ID2A-1)*60+ID1A
  11974.     CALL REFLEC(JD1B,JD1A,JRXX)
  11975.     CALL REFLEC(ID2A,ID1A,IRXX)
  11976.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  11977.     KKKKK=JCHAR(FVLD(1,1))
  11978.     CALL FVLDGT(JD1A,JD1B,FVLD(1,1))
  11979.     IF(KKKKK.EQ.0.AND.ICHAR(FVLD(1,1)).EQ.0)GOTO 8314
  11980. C    IF(FVLD(ID1A,ID2A).EQ.0.AND.FVLD(JD1A,JD1B).EQ.0)GOTO 8314
  11981.     CALL WRKFIL(IRXX,FORM,0)
  11982.     CALL WRKFIL(JRXX,FORM2,0)
  11983.     IF(KKKKK.EQ.-2)CALL FVLDST(ID1A,ID2A,CHAR(253))
  11984.     IF(KKKKK.EQ.2)CALL FVLDST(ID1A,ID2A,CHAR(3))
  11985.     IF(jchar(FORM (119)).EQ. 2)FORM (119)=Char(3)
  11986.     IF(jchar(FORM (119)).EQ.-2)FORM (119)=Char(253)
  11987.     IF(jchar(FORM2(119)).EQ. 2)FORM2(119)=Char(3)
  11988.     IF(jchar(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  11989.     IF(CMDLIN(2).NE.'R'.AND.CMDLIN(2).NE.'A')GOTO 8310
  11990.     IF(CMDLIN(2).NE.'R')GOTO 8366
  11991. C RELOCATE, THEN WRITE NEW CELL
  11992.     II1=ID1A
  11993.     II2=ID2A
  11994.     JJ1=JD1A
  11995.     JJ2=JD1B
  11996.     CALL RELVBL(FORM,FORM2,II1,II2,JJ1,JJ2,JRTR,JRTC)
  11997. C THE ABOVE WILL RELOCATE FORM INTO FORM2 WHICH WE NOW EMIT.
  11998. C ALLOW IR COMMAND TO DO INPLACE RELOCATION.
  11999.     IF(CMDLIN(1).NE.'I')GOTO 6224
  12000.     CALL WRKFIL(IRXX,FORM2,1)
  12001.     GOTO 9222
  12002. 6224    CONTINUE
  12003.     CALL WRKFIL(JRXX,FORM2,1)
  12004.     GOTO 8367
  12005. 8366    CONTINUE
  12006.     CALL WRKFIL(JRXX,FORM,1)
  12007. C    WRITE(7'JRXX)FORM
  12008. 8367    CONTINUE
  12009.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  12010.     CALL TYPSET(JD1A,JD1B,TYPE(1,1))
  12011. C    TYPE(JD1A,JD1B)=TYPE(ID1A,ID2A)
  12012.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  12013.     CALL XVBLST(JD1A,JD1B,XVBLS(1,1))
  12014. C    XVBLS(JD1A,JD1B)=XVBLS(ID1A,ID2A)
  12015.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  12016.     CALL FVLDST(JD1A,JD1B,FVLD(1,1))
  12017. C    FVLD(JD1A,JD1B)=FVLD(ID1A,ID2A)
  12018. 9222    ID1A=ID1A+I1IN
  12019.     ID2A=ID2A+I2IN
  12020.     JD1A=JD1A+JIN1
  12021.     JD1B=JD1B+JIN2
  12022.     GOTO 8309
  12023. 8310    CONTINUE
  12024.     IF(CMDLIN(2).NE.'V')GOTO 8312
  12025.     CALL TYPGET(ID1A,ID2A,TYPE(1,1))
  12026.     CALL TYPSET(JD1A,JD1B,TYPE(1,1))
  12027. C    TYPE(JD1A,JD1B)=TYPE(ID1A,ID2A)
  12028.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  12029.     CALL XVBLST(JD1A,JD1B,XVBLS(1,1))
  12030. C    XVBLS(JD1A,JD1B)=XVBLS(ID1A,ID2A)
  12031. 8312    IF(CMDLIN(2).NE.'D')GOTO 8313
  12032.     CALL FVLDGT(ID1A,ID2A,FVLD(1,1))
  12033.     CALL FVLDST(JD1A,JD1B,FVLD(1,1))
  12034. C    FVLD(JD1A,JD1B)=FVLD(ID1A,ID2A)
  12035.     DO 8315 LXQ=1,10
  12036. 8315    FORM2(118+LXQ)=FORM(118+LXQ)
  12037.     CALL WRKFIL(JRXX,FORM2,1)
  12038. C    WRITE(7'JRXX)FORM2
  12039. 8313    IF(CMDLIN(2).NE.'F')GOTO 8314
  12040.     DO 8316 LXQ=1,110
  12041. 8316    FORM2(LXQ)=FORM(LXQ)
  12042.     CALL WRKFIL(JRXX,FORM2,1)
  12043. 8314    CONTINUE
  12044.     ID1A=ID1A+I1IN
  12045.     ID2A=ID2A+I2IN
  12046.     JD1A=JD1A+JIN1
  12047.     JD1B=JD1B+JIN2
  12048. 8309    CONTINUE
  12049. C RETURN POINT FROM COPY LOOP IN NORMAL COPY
  12050.     GOTO KPYBAK,(8840,8836,8365)
  12051. 8365    CONTINUE
  12052. 8399    GOTO 9990
  12053. 8004    IF(CMDLIN(1).LT.'1'.OR.CMDLIN(1).GT.'4')GOTO 8005
  12054. C 1,2,3,4 POSITIONING COMMANDS
  12055. C USE LLT AND LGT LEXICAL ORDERING TESTS, NOT ARITHMETIC ONES...
  12056.     ICODE=5
  12057. C    IF(CMDLIN(1).EQ.'3')THISRW=MAX0(1,(THISRW-1))
  12058. C    IF(CMDLIN(1).EQ.'4')THISRW=MIN0((THISRW+1),DRWV)
  12059. C    IF(CMDLIN(1).EQ.'1')THISCL=MAX0(1,(THISCL-1))
  12060. C    IF(CMDLIN(1).EQ.'2')THISCL=MIN0((THISCL+1),DCLV)
  12061. C COULD ADD SCROLLING HERE IF DESIRED.
  12062. C    ASCII 1,2,3,4 ARE VALUES 49,50,51,52 IN DECIMAL.
  12063.     MVFG=ICHAR(CMDLIN(1))
  12064.     LRO=1
  12065.     LCO=1
  12066.     ID1=NRDSP(1,1)
  12067.     ID2=NCDSP(1,1)
  12068.     IF(.NOT.(MVFG.EQ.51.AND.THISRW.EQ.1))GOTO 2110
  12069. C MUST SCROLL LEFT
  12070.     IF(IDOL7.EQ.0)GOTO 2110
  12071.     IF(ID1.LE.1)GOTO 2110
  12072.     ID1=MAX0(1,ID1-DRWV+2)
  12073.     DROW=MAX0(1,DRWV-2)
  12074.     IQQ=1
  12075.     GOTO 7112
  12076. 2110    IF(MVFG.EQ.51)THISRW=MAX0(1,(THISRW-1))
  12077.     IF(.NOT.(MVFG.EQ.52.AND.THISRW.EQ.DRWV))GOTO 2116
  12078. C MUST SCROLL RIGHT
  12079.     IF(IDOL7.EQ.0)GOTO 2116
  12080.     DROW=3
  12081. C    ID1=MIN0(60,ID1+DRWV-MIN0(DRWV,2))
  12082.     ID1=ID1+DRWV-MIN0(DRWV,2)
  12083.     IQQ=1
  12084.     GOTO 7112
  12085. C 7112 FAKES OUT OA CALL TO SCROLL OVER.
  12086. 2116    IF(MVFG.EQ.52)THISRW=MIN0((THISRW+1),DRWV)
  12087.     IF(.NOT.(MVFG.EQ.49.AND.THISCL.EQ.1))GOTO 2117
  12088. C MUST SCROLL UP
  12089.     IF(IDOL7.EQ.0)GOTO 2117
  12090.     IF(ID2.LE.2)GOTO 2117
  12091.     DCOL=MAX0(1,DCLV-2)
  12092.     ID2=MAX0(2,ID2-DCLV+2)
  12093.     IQQ=1
  12094.     GOTO 7112
  12095. 2117    IF(MVFG.EQ.49)THISCL=MAX0(1,(THISCL-1))
  12096.     IF(.NOT.(MVFG.EQ.50.AND.THISCL.EQ.DCLV))GOTO 2118
  12097. C MUST SCROLL DOWN
  12098.     IF(IDOL7.EQ.0)GOTO 2118
  12099.     DCOL=3
  12100. C    ID2=MIN0(301,ID2+DCLV-MIN0(DCLV,2))
  12101.     ID2=ID2+DCLV-MIN0(DCLV,2)
  12102.     IQQ=1
  12103.     GOTO 7112
  12104. 2118    IF(MVFG.EQ.50)THISCL=MIN0((THISCL+1),DCLV)
  12105.     PROW=NRDSP(THISRW,THISCL)
  12106.     PCOL=NCDSP(THISRW,THISCL)
  12107.     DROW=THISRW
  12108.     DCOL=THISCL
  12109.     GOTO 9990
  12110. 8005    CONTINUE
  12111. 8007    IF(CMDLIN(1).NE.'R')GOTO 8008
  12112.     IF(CMDLIN(2).NE.'B')GOTO 7333
  12113. C RB VAR SETS RELOCATE BOUNDARY TO VAR COORDS
  12114.     IF(CMDLIN(3).EQ.'*')GOTO 7332
  12115. C NORMAL RB COMMAND
  12116. C RB VAR USES VAR NAME TO RESET BDY
  12117.     LO=3
  12118.     KKKK=20
  12119.     CALL VARSCN(CMDLIN,LO,KKKK,IV,ID1,ID2,IVALID)
  12120.     IF(IVALID.LE.0)GOTO 9990
  12121. C IGNORE ERRORS
  12122.     IDOL5=ID1
  12123.     IDOL6=ID2
  12124.     GOTO 9990
  12125. 7332    IDOL5=20000
  12126.     IDOL6=20000
  12127. C RB* RESETS RELOCATE BDY TO END OF SHEET
  12128.     GOTO 9990
  12129. 7333    CONTINUE
  12130. C RECOMPUTE SHEET.
  12131. C RM COMMAND SETS MANUAL FLAG.
  12132.     RCFGX=0
  12133. c
  12134.     RCONE=0
  12135.     IF(CMDLIN(2).NE.'S')GOTO 5114
  12136.     RRWACT=MCols
  12137.     RCLACT=MRows
  12138. 5114    CONTINUE
  12139. C RCFGX NONZERO INHIBITS RECALCULATION.
  12140. C RCONE SET 1 TO FORCE RECALC OF ALL.
  12141. C CHANGE FROM OTHER SYNTAX: RF FORCES RECALC, R DOES NOT.
  12142.     IF(CMDLIN(2).EQ.'F'.OR.CMDLIN(2).EQ.'R')RCONE=1
  12143. C NOTE RXF (X=ANY CHAR BUT F) ACTS LIKE OLD VERSION RXF.
  12144. C BARE R COMMAND HOWEVER JUST REDOES CALC. F NOW MEANS "FORCE"
  12145. C AND SEEMS A BIT MORE MNEMONIC THIS WAY. ALLOW RR COMMAND
  12146. C TO WORK AS WELL AS RF.
  12147.     IF(CMDLIN(2).NE.'R')RCMODE=0
  12148.     IF(CMDLIN(2).EQ.'E')RCMODE=1
  12149.     IF(CMDLIN(2).EQ.'I')RCMODE=2
  12150. C RE, RI MODE CONTROLS... ALSO RR ACTS LIKE RF BUT STAYS IN
  12151. C RE OR RI MODE... RECALC ENTRY OR INCREMENTAL...
  12152.     IF(CMDLIN(2).EQ.'M')RCFGX=1
  12153.     ICODE=3
  12154. C 3rd char I Inhibits recalc this time but sets modes...
  12155.     IF(CMDLIN(3).EQ.'I')ICODE=1
  12156.     GOTO 9990
  12157. 8008    IF(CMDLIN(1).NE.'K')GOTO 8009
  12158. C DROP INTO CALC BARE.
  12159.     IF(IPSET.NE.0)GOTO 9990
  12160. C CAN'T CALL CALC RECURSIVELY
  12161.     OSWIT=0
  12162.     ILNFG=0
  12163. C    ICODE=-1
  12164. C CLOSE UNIT 1 JUST IN CASE...
  12165.     CLOSE(1)
  12166.     CALL UVT100(11,2,0)
  12167. C ERASE DSPLY
  12168.     KLVL=1
  12169.     ILNCT=0
  12170. C ICODE SET TO 420 SPECIAL CODE TO TELL MAIN PGM TO CALL INTERACTIVE
  12171. C CALCULATOR FCN.
  12172.     ICODE=420
  12173.     GOTO 9990
  12174. 8009    IF(CMDLIN(1).NE.'L')GOTO 8010
  12175. C LOCATE CURSOR ORIGIN
  12176. C FORMAT IS L VARIABLE
  12177. C ONLY 1 VARIABLE NAME TO BE ENTERED.
  12178.     LA=2
  12179.     LE=30
  12180.     CALL VARSCN(CMDLIN,LA,LE,LSTC,ID1A,ID2A,IVLD)
  12181.     L1=IVLD
  12182. C    ASSIGN 8900 TO IBACK
  12183. C    GOTO 8104
  12184. 8900    IF(L1.LT.1)GOTO 9990
  12185. 3800    PROW=ID1A
  12186.     PCOL=ID2A
  12187. C LOOK UP DISPLAY COORDS IF ANY
  12188.     ASSIGN 8901 TO NBK
  12189.     GOTO 7905
  12190. 8901    CONTINUE
  12191.     DROW=LR
  12192.     DCOL=LC
  12193.     THISRW=LR
  12194.     THISCL=LC
  12195. 3801    ICODE=1
  12196.     GOTO 9990
  12197. 8010    CONTINUE
  12198.     IF(CMDLIN(1).NE.'>')GOTO 3802
  12199. C >STRING SEARCHES FORMULAE FOR STRING
  12200.     LA=MIN0(IDOL5,RRWACT)
  12201.     LB=MIN0(IDOL6,RCLACT)
  12202. C NO ACTION UNLESS VALID SEARCH REGION (CURRENT TO RELOC BDY)
  12203. C EXISTS.
  12204.     IF(LA.LT.PROW.OR.LB.LT.PCOL)GOTO 3801
  12205.     DO 3803 ID1=PROW,LA
  12206.     DO 3803 ID2=PCOL,LB
  12207.     ID1A=ID1
  12208.     ID2A=ID2
  12209.     CALL FVLDGT(ID1,ID2,FVLD(1,1))
  12210.     IF(JCHAR(FVLD(1,1)).EQ.0)GOTO 3803
  12211. C HAVE VALID CELL HERE, SO GRAB ITS FORMULA AND COMPARE FOR THE ONE
  12212. C WE'RE LOOKING FOR. IF CMD LINE STARTS WITH >> ANCHOR THE SEARCH AT 1ST
  12213. C COL.
  12214.     LMX=50
  12215.     LMN=2
  12216.     IF(CMDLIN(2).NE.'>')GOTO 3805
  12217.     LMX=1
  12218.     LMN=3
  12219. 3805    CONTINUE
  12220. C    IRX=(ID2-1)*60+ID1
  12221.     CALL REFLEC(ID2,ID1,IRX)
  12222.     CALL WRKFIL(IRX,FORM,0)
  12223.     CALL CE2A(FORM,FORM2)
  12224.     DO 3804 IV=1,LMX
  12225.     KKKK=109-IV
  12226. C COMPARE FORMULA TEXT. USE EXISTING SCMP ROUTINE.
  12227.     CALL SCMP(CMDLIN(LMN),FORM2(IV),KKKK,KKK)
  12228.     IF(KKK.EQ.1.AND.JCHAR(FORM2(IV)).GT.0)GOTO 3800
  12229.     IF(JCHAR(FORM2(IV)).LE.0)GOTO 3803
  12230. 3804    CONTINUE
  12231. 3803    CONTINUE
  12232. C IF WE FALL THROUGH, WE FAILED TO FIND FORMULA SO FORGET IT.
  12233.     GOTO 3801
  12234. 3802    CONTINUE
  12235.     IF(CMDLIN(1).NE.'Z')GOTO 8011
  12236. C ZERO COMMAND
  12237. C ZA OR ZE V1:V2
  12238.     IF(CMDLIN(2).NE.'A')GOTO 8950
  12239. C ZA = ZERO ALL. BE SURE HE MEANS IT.
  12240.     CALL UVT100(1,LLDSP,1)
  12241. c    WRITE(0,8951)
  12242. c8951    FORMAT('Really Zero All of sheet [Y/N]?\')
  12243.     call Vwrt('Really Zero ALL of sheet [Y/N]?',31)
  12244.     III=IOLVL
  12245. C    IF(III.EQ.5)III=0
  12246.     if(iii.ne.11)READ(III,8952,END=510,ERR=510)(FORM2(KKI),KKI=1,4)
  12247.     if(iii.eq.11)call vget(form2,4)
  12248. 8952    FORMAT(4A1)
  12249.     ICODE=6
  12250.     IF(FORM2(1).NE.'Y'.AND.FORM2(1).NE.'y')GOTO 9990
  12251.     CALL UVT100(11,2,0)
  12252.     ICODE=-4
  12253.     GOTO 9990
  12254. 8950    IF(CMDLIN(2).NE.'E')GOTO 9990
  12255.     ASSIGN 8953 TO IBACK
  12256.     GOTO 8104
  12257. C GET NAMES
  12258. 8953    IF(L1.LE.0)GOTO 9990
  12259.     ASSIGN 8954 TO JBACK
  12260.     GOTO 8109
  12261. 8954    CONTINUE
  12262.     DO 8955 NI=1,128
  12263. 8955    FORM2(NI)=char(0)
  12264.     FORM2(118)=Char(15)
  12265.     DO 8823 NI=1,9
  12266. 8823    FORM2(119+NI)=DEFVB(1+NI)
  12267.     DO 8956 NI=1,IDELT
  12268. C    IRX=(ID2-1)*60+ID1
  12269.     CALL REFLEC(ID2,ID1,IRX)
  12270.     CALL WRKFIL(IRX,FORM2,1)
  12271.     CALL FVLDST(ID1,ID2,CHAR(0))
  12272.     CALL XVBLST(ID1,ID2,0.0D0)
  12273.     IPRS=PROW
  12274.     IPCS=PCOL
  12275.     PROW=ID1
  12276.     PCOL=ID2
  12277.     ASSIGN 8957 TO NBK
  12278. C FIND DISPLAY LOC IF ANY
  12279.     GOTO 7905
  12280. 8957    PROW=IPRS
  12281.     PCOL=IPCS
  12282.     IF(LR.EQ.0.OR.LC.EQ.0)GOTO 8958
  12283.     DVS(LR,LC)=DVS(LR,LC)+1.E-11
  12284. 8958    CONTINUE
  12285.     ID1=ID1+I1IN
  12286.     ID2=ID2+I2IN
  12287. 8956    CONTINUE
  12288.     GOTO 9990
  12289. 8011    IF(CMDLIN(1).NE.'X')GOTO 8012
  12290. C EXIT TO OS
  12291. C SINCE THERE'S NO WORKFILE HERE, MAKE SURE HE MEANS IT...
  12292.     IF(IPSET.NE.0)GOTO 9990
  12293.     ICODE=2
  12294.     CALL UVT100(1,LLDSP,1)
  12295.         call 
  12296.      1 swrt('Exit now may lose data unless sheet has been saved'
  12297.      2 ,50)
  12298.     CALL UVT100(1,LLCMD,1)
  12299.     call Vwrt('Confirm Exit Request [Y/N]:',27)
  12300.     III=IOLVL
  12301. C    IF(IOLVL.EQ.5)III=0
  12302.     if(iii.ne.11)READ(III,8952,END=510,ERR=510)(FORM2(KKI),KKI=1,4)
  12303.     if(iii.eq.11)call vget(form2,4)
  12304.     IF(FORM2(1).NE.'Y'.AND.FORM2(1).NE.'y')GOTO 9990
  12305. C END CALL TO GET OUT OF HERE
  12306. c    Close(unit=11)
  12307.     Close(unit=3)
  12308.     Call TTYDEI
  12309. c    call standard_arithmetic()
  12310. C close any open RIM databases, just in case...
  12311.     CALL RMCLOS
  12312.         STOP "Thanks for using AnalytiCalc ...exiting."
  12313. C    CALL EXIT
  12314. 8012    IF(CMDLIN(1).NE.'S')GOTO 8013
  12315. C SAVE SHEET TO DISK (NEW SET OF DATA)
  12316. C NOW JUST PERMITS RESTART...
  12317.     ICODE=-2
  12318.     ISTAT=-2
  12319.     CALL UVT100(11,2,0)
  12320.     GOTO 9990
  12321. 8013    IF(CMDLIN(1).NE.'P')GOTO 8014
  12322.     If(CmdLin(2).eq.'L')GoTo 7014
  12323.     IRTN=0
  12324.     CALL PGET(CMDLIN,ICODE,IRTN)
  12325.     IF(IRTN.EQ.1)GOTO 510
  12326.     GOTO 9990
  12327. 7014    Continue
  12328. c plot v1:v2[,v3:v4];cmdfile to plot a range or two ranges (either y only or x,y pairs)
  12329. c by calling gnuplot as an external routine. Emits a file and fires up the
  12330. c command file in the cmd line (or dk:pltfil.pcp if none)
  12331. c This way different command files can fire up gnuplot for different types of
  12332. c plots, colors, devices, etc. with only ONE primitive here!
  12333. c first collect args
  12334.     assign 7015 to iback
  12335.     goto 8104   
  12336. 7015    continue
  12337. c should now have v1,v2 in (id1a,id2a) and (id1b,id2b) respectively
  12338.     if(l1.eq.0.or.l2.eq.0)goto 9990
  12339. c skip out if we don't have both args valid
  12340.     kivvv=0
  12341.     if(cmdlin(lstc).ne.',')goto 7017
  12342.     kivvv=1
  12343.     assign 7017 to mback
  12344.     goto 8303
  12345. 7017    continue
  12346.     if(kivvv.eq.1.and.(lj1.eq.0.or.lj2.eq.0))goto 9990
  12347. c skip unless both args of second range are legal
  12348. c have v3,v4 in (jd1a,jd1b) and (jd2a,jd2b) now.
  12349. c we also know they are valid and if kivvv is 1 we know a second
  12350. c range was specified.
  12351. c collect cmd file name now.
  12352.     lhich=0
  12353.     if(cmdlin(lstc).ne.';')goto 7018
  12354. c skip looking if delimiter wrong
  12355.     lochr=lstc+1
  12356.     do 7019 n=lochr,70
  12357.     kkk=n
  12358.     if(ichar(cmdlin(n)).le.32)goto 7020
  12359. 7019    continue
  12360.     goto 7018
  12361. c skip if we fall thru...looks illegal
  12362. 7020    continue
  12363. c check we actually saw at least one char
  12364.     if(kkk.eq.lochr)goto 7018
  12365. c saw a char so record
  12366.     lhich=kkk
  12367. 7018    continue
  12368. c now can use lhich as flag
  12369.     open(16,file='pccplt.dat',status='unknown')
  12370. c use sequential file on unit 16 for scratch...now grab values and
  12371. c shove 'em out...
  12372. c Now set up for loop over the ranges given, one of which may be x
  12373. c and the other of which may be y, or the first and only one of
  12374. c which may be y.
  12375. c &&&&&
  12376.     IDELT=1
  12377.     IPDL=0
  12378.     If(LPagmd.ne.0.and.Lpag2.gt.LPag1)ipdl=Lpag2-Lpag1
  12379.     If(K3Dfg.le.0)ipdl=0
  12380.     IF(Lpagmd.eq.0.and.
  12381.      1  L2.NE.0.AND.(ID1A.NE.ID1B.AND.ID2A.NE.ID2B))GOTO 7305
  12382.     IF(L2.NE.0)IDELT=MAX0(IABS(ID1A-ID1B),IABS(ID2A-ID2B),
  12383.      1   IPDL)+1
  12384.     if(k3dfg.gt.0.and.lpagmd.ne.0.and.ipdl.gt.0)
  12385.      1  idelt=ipdl+1
  12386.     IKDelt=IDelt
  12387. 7305    CONTINUE
  12388.     JDELT=idelt
  12389.     JPDL=0
  12390.     If(KPagmd.ne.0.and.Kpag2.gt.KPag1)JPDL=KPag2-KPag1
  12391.     If(K3Dfg.le.0)jpdl=0
  12392. c skip second deltas if only one range
  12393.     if(kivvv.eq.0)goto 7021
  12394.     IF(kpagmd.eq.0.and.
  12395.      1  JD1A.NE.JD2A.AND.JD1B.NE.JD2B)GOTO 7306
  12396.     JDELT=MAX0(IABS(JD1A-JD2A),IABS(JD1B-JD2B),
  12397.      1    JPDL)+1
  12398. 7306    JDELT=MIN0(IDELT,JDELT)
  12399. C For page mode, difference is depth, not row or cols.
  12400.     if(k3dfg.gt.0.and.kpagmd.ne.0.and.jpdl.gt.0)
  12401.      1  jdelt=jpdl+1
  12402. 7021    continue
  12403.     ASSIGN 7307 TO JBACK
  12404. C 8HERE WE SET UP I1IN AND I2IN ASSUMING THAT THE VARIABLES
  12405. C ARE SET PROPERLY. HANDLED AS AN INTERNAL PROCEDURE.
  12406.     GOTO 8109
  12407. 7307    CONTINUE
  12408. C 8edure also resets IDELT
  12409.     if(kivvv.eq.0)goto 7308
  12410.     If(k3dfg.gt.0)IDelt=IKDelt
  12411.     JIN1=1
  12412.     JIN2=0
  12413.     IF(JD1B.EQ.JD2B)GOTO 7308
  12414.     JIN1=0
  12415.     JIN2=1
  12416. 7308    CONTINUE
  12417. C
  12418. C Change for 3D depth ranges:
  12419. C Reset I1IN and I2IN to KRDELT and KCDELT if depth mode and
  12420. C 3D stuff enabled. Reset JIN1 and JIN2 likewise if depth
  12421. C mode there.
  12422. C This has the advantage that it allows cells to be plotted
  12423. C with any one dimensional range and any other, even if one
  12424. C or both 1-D ranges are in depth.
  12425.     If(K3DFG.LE.0)goto 7610
  12426.        If(LPagmd.le.0)goto 7611
  12427.     I1IN=KCDELT
  12428.     I2IN=KRDELT
  12429. 7611    Continue
  12430.     if(kivvv.eq.0)goto 7610
  12431.        If(KPagmd.le.0)goto 7610
  12432.     JIN1=KCDELT
  12433.     JIN2=KRDELT
  12434. 7610    continue
  12435. c******
  12436. C here we just do the opens of cells and write their values out.
  12437.     DO 7309 JV=1,JDELT
  12438. c    CALL REFLEC(JD1B,JD1A,JRXX)
  12439. c    CALL REFLEC(ID2A,ID1A,IRXX)
  12440. C don't care if the cells are invalid...they just return 0 if so.
  12441.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  12442.     xx1=xvbls(1,1)
  12443.     if(kivvv.ne.0)CALL XVBLGT(JD1A,JD1B,XVBLS(1,1))
  12444.     xx2=xvbls(1,1)
  12445.     if(kivvv.eq.0)write(16,7310)xx1
  12446.     if(kivvv.ne.0)write(16,7310)xx1,xx2
  12447. 7310    Format(1pe15.9,2x,1pe15.9)
  12448.     ID1A=ID1A+I1IN
  12449.     ID2A=ID2A+I2IN
  12450.     JD1A=JD1A+JIN1
  12451.     JD1B=JD1B+JIN2
  12452. 7309    CONTINUE
  12453. C RETURN POINT FROM COPY LOOP IN NORMAL COPY
  12454.     close(unit=16)
  12455. c spawn the command now
  12456.     open(16,file='titleinfo.txt',status='unknown')
  12457.     call wrkfil(24,form2,0)
  12458. c get X accumulator and load its' title in
  12459.     write(16,7313)(form2(iv),iv=1,80)
  12460. 7313    format(80a1)
  12461.     call wrkfil(25,form2,0)
  12462.     write(16,7313)(form2(iv),iv=1,80)
  12463. c this puts the contents of the X and Y accumulators in the file.
  12464. C add the Z accumulator also
  12465.     call wrkfil(26,form2,0)
  12466.     write(16,7313)(form2(iv),iv=1,80)
  12467.     close(unit=16)
  12468.     if(lhich.eq.0)goto 7311
  12469.     cmdlin(lhich+1)=char(0)
  12470. c hack for amiga...stick "$" at start of cmd so it'll do the endcli
  12471. c for us automatically.
  12472.     lochr=lochr-1
  12473.     cmdlin(lochr)='$'
  12474.     call xsystem(cmdlin(lochr))
  12475.     goto 9990
  12476. 7311    continue
  12477.     defplt(24)=char(0)
  12478.     call xsystem(defplt(1))
  12479.     goto 9990
  12480. 8014    CONTINUE
  12481. 8015    IF(CMDLIN(1).NE.'G')GOTO 8016
  12482. C GET INPUT NUMBERS OFF SEQUENTIAL FILE. USE CURRENT ORIGIN
  12483.     ICODE=2
  12484.     IRTN=0
  12485.     CALL PGGET(CMDLIN,ICODE,IRTN)
  12486.     IF(IRTN.EQ.1)GOTO 510
  12487. C FLAG WE NEED AT LEAST ONE FULL CALC BEFORE GOING TO PARTIALS...
  12488. C (OK TOO IF IN OLD RCMODE=0 MODE)
  12489.     RCMODE=-IABS(RCMODE)
  12490.     GOTO 9990
  12491. 8016    IF(CMDLIN(1).NE.'W')GOTO 8017
  12492. C WRITE (PRINT) SCREEN OUT TO FILE (MAY BE PRINTER)
  12493. C    CALL DSPSHT(10)
  12494. C    ICODE=1
  12495.     ICODE=400
  12496. C CODE 10 IS PRINT SECRET CODE TO DSPSHT.
  12497.     GOTO 9990
  12498. 8017    CONTINUE
  12499.     IF(CMDLIN(1).NE.'H')GOTO 5019
  12500.     IF(IPSET.NE.0)GOTO 9990
  12501.     IVVV=0
  12502.     IVVVV=ICHAR(CMDLIN(2))
  12503.     ivvx=ICHAR(cmdlin(3))
  12504. 9308    CONTINUE
  12505.     IF(IVVVV.GE.48.AND.IVVVV.LE.57)IVVV=IVVVV-48
  12506.     if(ivvx.lt.48.or.ivvx.gt.57)goto 9381
  12507. c implement 2 digit help code.
  12508.     ivvvx=ivvx-48
  12509.     ivvv=(ivvv*10)+ivvvx
  12510.     ivvv=min0(ivvv,99)
  12511. 9381    continue
  12512. C SELECT HELP LEVEL 0-9 IF SPECIFIED.
  12513.     ICODE=30+IVVV
  12514.     GOTO 9990
  12515. 5019    CONTINUE
  12516. C *** ALLOW EVALUATION OF A CELL TO PERMIT INTERACTIVE COMMAND FILES TO
  12517. C *** BE CONTROLLED RATIONALLY. KEYWORD IS "TEST"
  12518.     IF(CMDLIN(1).NE.'T'.OR.CMDLIN(2).NE.'E')GOTO 4302
  12519. C TEST EXPRESSION IS SYNTAX.
  12520. C COPY CMDLIN INTO XTNCMD AND FLAG VIA ICODE=430
  12521.     XTNCNT=0
  12522.     ICODE=430
  12523.     DO 4307 N=1,80
  12524. 4307    XTNCMD(N)=Char(0)
  12525. C FIRST ZERO OUT EXTERNAL CMD LINE, THEN FILL IN WHAT'S NEEDED.
  12526.     DO 4303 N=1,79
  12527.     XTNCMD(N)=CMDLIN(3+N)
  12528. C ALLOW "TE <ANY EXPRESSION>" WITH OPTIONAL SPACE. JUST RETURNS VALUE IN
  12529. C % VARIABLE.
  12530.     IF(ICHAR(XTNCMD(N)).LT.32)GOTO 4304
  12531.     XTNCNT=N
  12532. 4303    CONTINUE
  12533. 4304    CONTINUE
  12534.     XTNCMD(XTNCNT+1)=Char(0)
  12535.     GOTO 9990
  12536. 4302    CONTINUE
  12537. C LET DOUBLE DOT (..) INDICATE TO GO BACK TO CONSOLE, CLOSING INPUT FILE
  12538.     IF (CMDLIN(1).EQ.'.'.AND.CMDLIN(2).EQ.'.')GOTO 510
  12539. C ELSE PRINT MESSAGE THAT WE DON'T UNDERSTAND THAT ONE & GO ON
  12540. C PRINT INVALID CMD MSG IF NOT JUST A SPACE OR C.R.
  12541.     IF(ICHAR(CMDLIN(1)).GT.32)CALL SWRT('Invalid Command.',16)
  12542.     GOTO 200
  12543. C ERROR ON READIN ADDRESS. REWIND TERMINAL IF USER
  12544. C TYPES CTRL Z (EOF), ELSE LEAVE INDIRECT FILES.
  12545. 510    CONTINUE
  12546. C    IF(IOLVL.EQ.5)REWIND 5
  12547.     CLOSE(3)
  12548. c    CLOSE(11)
  12549. c    Rewind 11
  12550. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  12551.     IOLVL=11
  12552.     GOTO 498
  12553. 9990    CONTINUE
  12554. C HERE CLEAN UP AND RETURN
  12555. C FIRST DISPLAY LAST CURRENT COL IN NORMAL VIDEO
  12556.     IF(IXLSTR.LE.0.OR.IXLSTC.LE.0)GOTO 2000
  12557.     N1=NRDSP(IXLSTR,IXLSTC)
  12558.     N2=NCDSP(IXLSTR,IXLSTC)
  12559. C    IRRX=(N2-1)*60+N1
  12560.     CALL REFLEC(N2,N1,IRRX)
  12561. C REWRITE LAST LOCATION WITH NO REVERSE VIDEO.
  12562. C    IF(FVLD(N1,N2).EQ.0)GOTO 2000
  12563.     IF(IXLSTC.GT.DCLV.OR.IXLSTR.GT.DRWV)GOTO 2000
  12564. C ONLY REDRAW NUMBERS. DIRECT DISPLAY OR NOTHING GETS IGNORED.
  12565.     IF(ICODE.LT.0.OR.ICODE.EQ.2)GOTO 2000
  12566. C NO SENSE REDRAWING IF WE'RE ABOUT TO ERASE DISPLAY ANYWAY.
  12567.     IF(ICODE.GT.30)GOTO 2000
  12568.     J=8
  12569. C ADD 6 COLS FOR LABELS
  12570. C DROW,DCOL IS CURRENT DISPLAY LOC.
  12571.     DO 3301 M1=1,IXLSTR
  12572. C FIND DISPLAY COLUMN TO USE
  12573. 3301    J=J+CWIDS(M1)
  12574.     J=J-CWIDS(IXLSTR)
  12575. C USE THISCL+1 TO LET 1ST ROW BE LABELS.
  12576.     ICCC=IXLSTC+2
  12577. C JVTINC = 1 IF VT100, 0 IF VT52
  12578. C JVTINC NEEDED SINCE UVT100 FOR VT100 DOES BACKSPACE AT THE SGR ENTRY
  12579. C AND THUS WE NEED TO CORRECT FOR IT. THIS WAS FIXED IN THE UVT52
  12580. C VERSION AND ITS DESCENDANTS.
  12581.     IC1POS=N1
  12582.     IC2POS=N2
  12583.     IF(PZAP.NE.0)GOTO 2000
  12584.     CALL UVT100(1,ICCC,J)
  12585. C SELECT ROW "IXLSTC", COL "J"
  12586.     CALL UVT100(13,0,0)
  12587. C DESELECT REVERSE VIDEO
  12588.     CALL FVLDGT(N1,N2,FVLDTP)
  12589.     ivv=min0(30,cwids(IXLSTR))
  12590.     IF(ICHAR(FVLDTP).EQ.0)CALL SWRT(BLANKS,IVV)
  12591.     IF(ICHAR(FVLDTP).EQ.0)GOTO 2000
  12592.     CALL WRKFIL(IRRX,FORM2,0)
  12593.     CALL CE2A(FORM2,FORM)
  12594. C    READ(7'IRRX)FORM
  12595.     DO 5546 KKKK=1,100
  12596.     IV=ICHAR(FORM(KKKK))
  12597.     IV=MAX0(IV,32)
  12598. 5546    FORM(KKKK)=Char(IV)
  12599.     IF(JCHAR(FVLDTP).LT.0.OR.FORMFG.NE.0)
  12600.      1  WRITE(CMDLNA(1:127),8201)(FORM(II),II=1,100)
  12601. C FILL IN TEXT FOR FORMULA IF FVLD < 0 HERE; BELOW, FILL IN VALUE TEXT IF FVLD
  12602. C > 0.
  12603.     IF(FORMFG.NE.0)GOTO 4324
  12604. C ALWAYS DO FORMULAS IF FORMFG SET (VF MODE).
  12605.     DO 6302 KKK=1,9
  12606.     KKKK=ICHAR(FORM(KKK+119))
  12607. C    KKKK=DFMTS(KKK,IXLSTR,IXLSTC)
  12608. 6302    DFE(KKK+1)=CHAR(MAX0(32,KKKK))
  12609.     DFE(11)=char(32)
  12610. C 32 = ASCII SPACE
  12611.     DFE(1)='('
  12612. C REMEMBER: NO \ EDITING IN INTERNAL WRITES!
  12613.     DFE(12)=' '
  12614.     DFE(13)=' '
  12615.     DFE(14)=')'
  12616.     CALL TYPGET(N1,N2,TYPE(1,1))
  12617.     IF(JCHAR(FVLDTP).LE.0)GOTO 4324
  12618.     IF(TYPE(1,1).NE.2)GOTO 6226
  12619.         WRITE(CMDLNA(1:127),DFE,ERR=4324)DVS(IXLSTR,IXLSTC)
  12620.     GOTO 4324
  12621. 6226    CONTINUE
  12622.     WRITE(CMDLNA(1:127),DFE,ERR=4324)LDVS(1,IXLSTR,IXLSTC)
  12623. C REDRAW THIS COL. WITHOUT REVERSE VIDEO HERE.
  12624. 4324    CALL SWRT(CMDLIN,CWIDS(IXLSTR))
  12625. C NOTE THIS REDRAWS PREVIOUS COL. IN NORMAL VIDEO.
  12626. C NO CARRIAGE CTL
  12627. 2000    CONTINUE
  12628. C NOW COMPLETE ANY CLEANUP.
  12629. C SET CMDLIN TO 0 AT START TO INHIBIT ANY MISINTERPRETATION.
  12630. C WE USE CMDLIN AS A BUFFER IN REDRAWIND DSPLY SO DON'T LET IT GET
  12631. C CLOBBERED.
  12632.     DO 945 K=1,132
  12633. 945    CMDLIN(K)=Char(0)
  12634.     RETURN
  12635.     END
  12636.  
  12637. C *************** AnalyNS.Ftn #####################################
  12638. c -h- nextel.fms    Tue Sep  2 10:58:55 1986    
  12639.     SUBROUTINE NEXTEL (RETVAL,RETTYP,RETCD)
  12640. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  12641. C ALL RIGHTS RESERVED
  12642.     Include aparms.inc
  12643. C
  12644. C  SCANS LINE(80) FROM NONBLK+1 AND RETURNS THE NEXT ELEMENT.
  12645. C  THIS ELEMENT COULD BE A CONSTANT, VALUE OF A VARIABLE, A
  12646. C  BINARY FUNCTION CODE, OR A UNARY FUNCTION CODE. UPON RETURN,
  12647. C  NONBLK POINTS TO LAST CHARACTER OF NEXT ELEMENT.
  12648. C
  12649. C  RETCD  =    1  IF OPERAND (VALUE IN RETVAL(100)
  12650. C        2  IF OPERATOR (VALUE IN RETTYP)
  12651. C        3  NO MORE ELEMENTS
  12652. C        4  IF ERROR
  12653. C
  12654. C  RETVAL  HOLDS VALUE OF OPERAND FOUND (EITHER CONSTANT OR IF
  12655. C       A VARIABLE (A-Z,%), THE VALUE OF THAT VARIABLE)
  12656. C
  12657. C  RETTYP  IS THE TYPE CODE
  12658. C NEXTEL CALLS
  12659. C
  12660. C ERRMSG     PRINTS OUT ERROR MESSAGES
  12661. C FLIP       REVERSES THE NON-LEADING ZERO DIGITS IN A VECTOR
  12662. C GETNNB     GETS THE NEXT NON-BLANK FROM LINE(80)
  12663. C
  12664. C NEXTEL IS CALLED BY INPOST
  12665. C
  12666. C
  12667. C    VARIABLE    USE
  12668. C    ---------   ----------------------------------
  12669. C
  12670. C    ALPHA(27)   HOLDS LEGAL VARIABLE NAMES.
  12671. C
  12672. C    ARROW       '^'
  12673. C
  12674. C    B10         SWITCH SET WHEN CONSTANT IS NOT OCTAL (MAY BE
  12675. C                DECIMAL OR HEX BECAUSE THE DIGIT 8 OR 9 WAS FOUND).
  12676. C
  12677. C    B16         SWITCH SET WHEN CONSTANT IS HEXADECIMAL BECAUSE
  12678. C                DIGIT A, B, C, D, E, OR F WAS FOUND.
  12679. C
  12680. C    BASE        HOLDS BASE OF CONSTANT.
  12681. C
  12682. C    CHAR1       HOLDS A SINGLE CHARACTER FROM LINE.
  12683. C
  12684. C    DEFBAS      THE DEFAULT BASE SPECIFIED.
  12685. C
  12686. C    DIGITS(16,3) HOLDS ASCII CHARACTERS FOR THE DIGITS OF BASES
  12687. C                 8, 10, AND 16.
  12688. C
  12689. C    DOT          '.'
  12690. C
  12691. C    EQ           '='
  12692. C
  12693. C    EXCODE       CODE FOR EXPONENTIATION.
  12694. C
  12695. C    FCNT         NUMBER OF UNARY FUNCTIONS DEFINED BY VECTOR FUNCT
  12696. C
  12697. C    FUNCT (NAME,INDXX) HOLDS FUNCTION NAMES.
  12698. C
  12699. C    FUNVAL(I,J)
  12700. C     IF I=1, THE VALUE IS THE NUMBER OF CHARACTERS IN THE J-TH
  12701. C             FUNCTION WHOSE NAME IS THE FUNCT(K,J) WHERE K=1,2,3...10
  12702. C     IF I=2, THE VALUE IS THE STACK ELEMENT CODE FOR THE J-TH
  12703. C             FUNCTION WHOSE NAME IS IN FUNCT(K,J), K=1,2,3...10
  12704. C
  12705. C
  12706. C    I,J,K,L  HOLDS TEMPORARY VALUES
  12707. C
  12708. C    I1,I2    HOLD VALUE OF DIGITS IN E OR D SPECIFICATION.
  12709. C
  12710. C    IALPHA   INDEX INTO ALPHA OF THE FIRST NON-BLANK CHARACTER FOUND.
  12711. C
  12712. C    IHOLD    HOLDS TEMPORARY VALUES
  12713. C
  12714. C    INT      PICKS UP INTEGER*4 VALUES.
  12715. C
  12716. C    IPT      POINTER TO ELEMENTS IN LINE(80).
  12717. C
  12718. C    IPT2     POINTER TO ELEMENTS IN LINE(80).
  12719. C
  12720. C    LASTOP  USED TO HOLD VALUE OF LAST OPERATOR SO THAT UNARY OPERATORS
  12721. C            CAN BE IDENTIFIED IN CASES LIKE A*-B AND A/(-3).
  12722. C
  12723. C    MINUS   '-'
  12724. C
  12725. C    OPER(9) HOLDS LEGAL ONE CHARACTER OPERATORS LIKE '+' AND '*'.
  12726. C
  12727. C    PLUS    '+'
  12728. C
  12729. C    QUOTE   "'"
  12730. C
  12731. C    RB      HOLDS NEGATIVE POWERS OF 10.(BASE 10)
  12732. C
  12733. C    REAL    PICKS UP REAL*8 CONSTANTS.
  12734. C
  12735. C    RETCD   RETURN CODE:
  12736. C              1 IF OPERAND (VALUE IN RETVAL(100))
  12737. C              2 IF OPERATOR (VALUE IN RETTYP)
  12738. C              3 NO MORE ELEMENTS.
  12739. C              4 IF ERROR.
  12740. C
  12741. C    RETCD2  RETURN CODE WHEN CALLING GETNNB.
  12742. C
  12743. C    RETPT   INDEXES DIGITS PICKED UP FOR A CONSTANT.
  12744. C
  12745. C    RETTYP  THE TYPE CODE OF THE RETURNED ELEMENT.
  12746. C
  12747. C    TYPE    TYPE CODE FOR EACH VARIABLE.
  12748. C
  12749. C    VBLS    HOLDS VALUE OF VARIABLES.
  12750. C
  12751. C    VLEN    GIVES LENGTH IN BYTES FOR EACH DATA TYPE.
  12752. C
  12753. C LASTOP MUST BE SET TO ZERO AT START OF EXPRESSION
  12754. C
  12755. C
  12756.     REAL*8 REAL,RB,ACX,XAC
  12757.     INTEGER*4 INT
  12758.     EXTERNAL INDX,DFLOAT
  12759.     REAL*8 DFLOAT
  12760. c    InTeGer*4 INDXX
  12761.     InTeGer*4 LEVEL,NONBLK,LEND
  12762.     InTeGer*4 LASTOP
  12763.     InTeGer*4 VIEWSW,BASED,VLEN(9),DEFBAS
  12764.     InTeGer*4 TYPE(1,2)
  12765.     InTeGer*4 RETCD,RETCD2,RETTYP,EXCODE
  12766.     InTeGer*4 B10,B16,RETPT,BASE
  12767.     InTeGer*4 FCNT
  12768.     InTeGer*4 I,J,K,L,IALPHA,IHOLD,IPT,IPT2,I1,I2
  12769. C
  12770.     CHARACTER*1 CHAR1,DOT,ARROW,QUOTE,STAR,MINUS,PLUS
  12771.     CHARACTER*1 RETVAL(20)
  12772.     integer*4 RVLF(5)
  12773.     real*8 frvlf
  12774.     character*1 crvlf(20)
  12775.     equivalence(frvlf,rvlf(1),crvlf(1))
  12776. c    EQUIVALENCE (RVLF(1),RETVAL(1))
  12777.     CHARACTER*1 FUNCT(10,40)
  12778.     InTeGer*4   FUNVAL(2,40)
  12779.     CHARACTER*1 AVBLS(24,27)
  12780.     Real*8 VAVBLS(3,27)
  12781.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  12782.     EQUIVALENCE(XAC,AVBLS(1,27))
  12783.     CHARACTER*1 VBLS(8,1,1)
  12784.     CHARACTER*1 OPER(9),DIGITS(16,3)
  12785.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  12786.     CHARACTER*1 FOUR(4),EIGHT(8)
  12787. C
  12788.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  12789.     COMMON /DIGV/ DIGITS
  12790.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  12791.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  12792. C ***<<< KLSTO COMMON START >>>***
  12793.     InTeGer*4 DLFG
  12794. C    COMMON/DLFG/DLFG
  12795.     InTeGer*4 KDRW,KDCL
  12796. C    COMMON/DOT/KDRW,KDCL
  12797.     InTeGer*4 DTRENA
  12798. C    COMMON/DTRCMN/DTRENA
  12799.     REAL*8 EP,PV,FV
  12800.     DIMENSION EP(20)
  12801.     INTEGER*4 KIRR
  12802. C    COMMON/ERNPER/EP,PV,FV,KIRR
  12803. c    InTeGer*4 LASTOP
  12804. C    COMMON/ERROR/LASTOP
  12805.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  12806. C    COMMON/FMTBFR/FMTDAT
  12807.     CHARACTER*1 EDNAM(16)
  12808. C    COMMON/EDNAM/EDNAM
  12809.     InTeGer*4 MFID(2),MFMOD(2)
  12810. C    COMMON/FRM/MFID,MFMOD
  12811.     InTeGer*4 JMVFG,JMVOLD
  12812. C    COMMON/FUBAR/JMVFG,JMVOLD
  12813.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  12814.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  12815. C ***<<< KLSTO COMMON END >>>***
  12816. CCC    COMMON /ERROR/ LASTOP
  12817. C
  12818.     EQUIVALENCE (REAL,EIGHT),(FOUR,INT)
  12819. C
  12820.     save dot,arrow,quote,star,minus,plus,oper,funct,funval
  12821.     save excode,fcnt
  12822.     DATA DOT/'.'/,ARROW/'^'/,QUOTE/''''/,STAR/'*'/
  12823.     DATA MINUS/'-'/,PLUS/'+'/
  12824.     DATA OPER/'(','-','!','*','/','+','-',')','='/
  12825. C
  12826. C  NUMBER OF FUNCTIONS
  12827.     DATA FCNT/30/
  12828. C
  12829.     DATA FUNCT/'A','B','S',' ',' ',' ',' ',' ',' ', ' ',
  12830.      1             'D','A','B','S',' ',' ',' ',' ',' ',' ',
  12831.      2             'I','A','B','S',' ',' ',' ',' ',' ',' ',
  12832.      3             'F','L','O','A','T',5*' ','I','F','I','X',6*' ',
  12833.      5             'A','I','N','T',6*' ','I','N','T',7*' ',
  12834.      7             'I','D','I','N','T',5*' ','E','X','P',7*' ',
  12835.      9             'D','E','X','P',6*' ','A','L','O','G','1','0',4*' ',
  12836.      2             'D','L','O','G','1','0',4*' ','A','L','O','G',6*' ',
  12837.      4             'D','L','O','G',6*' ','S','Q','R','T',6*' ',
  12838.      6             'D','S','Q','R','T',5*' ','S','I','N',7*' ',
  12839.      8             'D','S','I','N',6*' ','C','O','S',7*' ',
  12840.      1             'D','C','O','S',6*' ','T','A','N','H',6*' ',
  12841.      2             'D','T','A','N','H',5*' ','A','T','A','N',6*' ',
  12842.      3             'D','A','T','A','N',5*' ',
  12843.      1             'A','S','I','N',6*' ','D','A','S','I','N',5*' ',
  12844.      2             'A','C','O','S',6*' ','D','A','C','O','S',5*' ',
  12845.      3             'T','A','N',' ',6*' ','D','T','A','N',106*' '/
  12846.     DATA EXCODE/112/
  12847.        DATA FUNVAL/3,31,4,31,4,32,5,33,4,34,4,35,3,36,5,36,3,37,4,37,
  12848.      1 6,39,6,39,4,38,4,38,4,40,5,40,3,41,4,41,3,42,4,42,4,43,5,43,
  12849.      2       4,44,5,44,4,45,5,45,4,46,5,46,3,47,4,47,20*0/
  12850. C
  12851. 10    CONTINUE
  12852.     CALL GETNNB(IPT,RETCD2)
  12853.     IF (RETCD2.EQ.1) GOTO 50
  12854. C
  12855. C  NO MORE ELEMENTS
  12856.     LASTOP=0
  12857.     RETCD=3
  12858.     RETURN
  12859. C
  12860. C
  12861. C  INITIALIZE VARIABLES
  12862. 50    CONTINUE
  12863.     B10=0
  12864.     B16=0
  12865.     RETTYP=0
  12866.     RETPT=0
  12867.     REAL=0.D0
  12868.     RETCD=1
  12869.     DEFBAS=BASED
  12870. C    RVLF=0.0D0
  12871. C COMMENT OUT DO LOOP OVER 20 BYTES FOR SPEED.
  12872. C (INSTEAD JUST ZERO 8 BYTES WE WILL LIKELY USE)
  12873.     DO 60 I=1,8
  12874. C    DO 60 I=1,20
  12875. 60    RETVAL(I)=char(0)
  12876. c    Rvlf(1)=0
  12877. c    Rvlf(2)=0
  12878. C
  12879. 70    CHAR1=LINE(IPT)
  12880.     NONBLK=IPT
  12881. C
  12882. C
  12883. C  SEE IF ALPHABETIC OR %
  12884. C SHORTCUT IF IT'S A CELL NAME .. GO JUST EVALUATE IT.
  12885. C ALSO WORKS FOR ENCODED FUNCT NAMES.
  12886.     IF(ICHAR(CHAR1).GE.255)GOTO 12000
  12887. C SEPARATE OUT FUNCTION CALLS FOR FASTER EXECUTION...SKIP TRYING FUNCT. NAME
  12888. C FIRST AS VARIABLE NAME (WHICH CAN TAKE LONG TIME TO CONVERT BEFORE WE DISCOVER
  12889. C IT ISN'T NEEDED...)
  12890. C
  12891.     IF(ICHAR(CHAR1).GE.230)GOTO 13201
  12892. C ADD COUPLE MORE SHORTCUTS... DON'T JUST LOOP TO SEE IF WE HAVE
  12893. C AN ALPHA CHARACTER...
  12894.     IF(CHAR1.NE.ALPHA(27))GOTO 78
  12895.     I=27
  12896.     GOTO 10000
  12897. 78    CONTINUE
  12898.     IF(CHAR1.LT.'A'.OR.CHAR1.GT.'Z')GOTO 79
  12899. C TRY TO AVOID LOTS OF EXTRA FUNCTION CALLS...
  12900. C COMPARE CHARS AS CHARACTER VALUES... SHOULD STILL BE OK.
  12901. CCC    IF(ICHAR(CHAR1).LT.ICHAR(ALPHA(1))
  12902. CCC     1  .OR.ICHAR(CHAR1).GT.ICHAR(ALPHA(26)))GOTO 79
  12903. C USE FACT THAT ASCII CHARACTER CODES ARE IN A CONTINUOUS RANGE
  12904. CCC    I=ICHAR(CHAR1)-ICHAR(ALPHA(1))
  12905.     I=ICHAR(CHAR1)-65
  12906. C 65 IS ASCII VALUE FOR 'A' CHARACTER.
  12907. C (HARDCODE FOR SPEED...)
  12908.     GOTO 10000
  12909. 79    CONTINUE
  12910. C DELETE 3 LINES FOLLOWING:
  12911. C    DO 80 I=1,27
  12912. C    IF (CHAR1.EQ.ALPHA(I)) GOTO 10000
  12913. C80    CONTINUE
  12914. C
  12915. C
  12916. C  NOT ALPHA SO SEE IF AN OPERATOR
  12917.     DO 100 I=1,9
  12918.     IF (CHAR1.EQ.OPER(I)) GOTO 20000
  12919. 100    CONTINUE
  12920. C
  12921. C
  12922. C SEE IF AN OPERAND
  12923. C *** EVIDENTLY SHORT LOOP RUNS AS FAST AS A COUPLE DECISIONS AND SOME
  12924. C MATH; LEAVE IN.
  12925. 140    DO 150 I=1,16
  12926.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  12927. 150    CONTINUE
  12928. C
  12929. C
  12930. C
  12931.     IF (CHAR1.EQ.DOT) GOTO 40000
  12932. C
  12933. C
  12934. C
  12935.     IF (CHAR1.EQ.ARROW) GOTO 300
  12936. C
  12937. C
  12938. C
  12939.     IF (CHAR1.EQ.QUOTE) GOTO 200
  12940. C
  12941. C
  12942. C  ADDITIONAL CONSTANT OPERATOR WOULD GO HERE
  12943. C
  12944. C
  12945. C *** ERROR *** ILLEGAL CHARACTER ENCOUNTERED
  12946. 190    CALL ERRMSG (20)
  12947.     GOTO 99000
  12948. C
  12949. C
  12950. C
  12951. C
  12952. C **************************************
  12953. C ****** ASCII CONSTANT SPECIFIED ******
  12954. C **************************************
  12955. 200    CONTINUE
  12956.     NONBLK=NONBLK+1
  12957.     RETVAL(1)=LINE(NONBLK)
  12958.     RETTYP=1
  12959.     GOTO 35100
  12960. C
  12961. C
  12962. C
  12963. C
  12964. C **************************************
  12965. C ****** IMMEDIATE BASE SPECIFIED ******
  12966. C **************************************
  12967. 300    CALL GETNNB(IPT,RETCD2)
  12968.     IF (RETCD2.EQ.1) GOTO 320
  12969. C
  12970. C
  12971. C *** ERROR *** ILLEGAL BASE SPECIFICATION
  12972. 310    CALL ERRMSG(19)
  12973.     GOTO 99000
  12974. C
  12975. C
  12976. C  IMMEDIATE BASE SPECIFICATION
  12977. 320    CHAR1=LINE(IPT)
  12978.     NONBLK=IPT
  12979.     IF (CHAR1.EQ.DIGITS(8,3)) GOTO 360
  12980.     IF (CHAR1.NE.DIGITS(1,3)) GOTO 310
  12981. C
  12982. C
  12983. C FIRST DIGIT IS 1 SO IMMEDIATE BASE MIGHT BE 10 OR 16
  12984.     CALL GETNNB (IPT,RETCD2)
  12985.     IF (RETCD2.EQ.2) GOTO 310
  12986.     CHAR1=LINE(IPT)
  12987.     NONBLK=IPT
  12988.     IF (CHAR1.EQ.DIGITS(10,1)) GOTO 365
  12989.     IF (CHAR1.NE.DIGITS(6,1)) GOTO 310
  12990. C
  12991. C
  12992. C IMMEDIATE BASE IS 16
  12993.     DEFBAS=16
  12994.     GOTO 370
  12995. C
  12996. C
  12997. C IMMEDIATE BASE IS 8
  12998. 360    DEFBAS=8
  12999.     GOTO 370
  13000. C
  13001. C
  13002. C IMMEDIATE BASE IS 10
  13003. 365    DEFBAS=10
  13004. C
  13005. C
  13006. C
  13007. 370    CALL GETNNB(IPT,RETCD2)
  13008.     IF (RETCD2.EQ.2) GOTO 310
  13009.     CHAR1=LINE(IPT)
  13010.     NONBLK=IPT
  13011. C
  13012. C
  13013. C GO FIND OUT WHAT NUMBER HAS THAT DEFAULT BASE
  13014.     GOTO 140
  13015. C
  13016. C
  13017. C
  13018. C
  13019. C ****************************************************
  13020. C ****** SEARCH TO SEE IF A UNARY FUNCTION NAME ******
  13021. C ****************************************************
  13022. 10000    CONTINUE
  13023.     IALPHA=I
  13024.     IHOLD=NONBLK
  13025. C
  13026. C
  13027. C SCAN EACH OF THE FUNCTION NAMES.
  13028.     DO 10060 I=1,FCNT
  13029. C
  13030. C K HOLDS NUMBER OF NON-BLANK CHARACTERS IN THE FUNCTION NAME.
  13031.     K=FUNVAL(1,I)
  13032.     IPT2=IHOLD
  13033.     NONBLK=IHOLD
  13034.     IF (K.EQ.0) GOTO 10060
  13035. C
  13036. C
  13037. C SCAN EACH LETTER OF THE FUNCTION'S NAME
  13038.     DO 10050 J=1,K
  13039.     IF (LINE(IPT2).NE.FUNCT(J,I)) GOTO 10060
  13040.     IF (J.EQ.K) GOTO 10100
  13041.     CALL GETNNB (IPT2,RETCD2)
  13042.     IF (RETCD2.EQ.2) GOTO 10060
  13043.     NONBLK=IPT2
  13044. 10050    CONTINUE
  13045.     STOP 10050
  13046. C
  13047. 10060    CONTINUE
  13048. 10070    NONBLK=IHOLD
  13049.     GOTO 12000
  13050. C
  13051. C
  13052. C  FUNCTION FOUND (LEAVES NONBLK POINTING AT LAST CHARACTER)
  13053. 10100    CONTINUE
  13054. C
  13055. C
  13056. C
  13057. C
  13058. C **********************************
  13059. C ****** UNARY FUNCTION FOUND ******
  13060. C **********************************
  13061.     RETTYP=ICHAR(CHAR(FUNVAL(2,I)))
  13062.     LASTOP=RETTYP
  13063.     RETCD=2
  13064.     GOTO 99099
  13065. C
  13066. C
  13067. C
  13068. C
  13069. C
  13070. C ********************************
  13071. C ****** VARIABLE SPECIFIED ******
  13072. C ********************************
  13073. 12000    CONTINUE
  13074. C
  13075. C
  13076. C  IALPHA HOLDS INDEX INTO ALPHA OF NAME
  13077. C ******&&&&&& REMOVE BLK OF CODE STARTING HERE...
  13078. C    CALL GETNNB (IPT,RETCD2)
  13079. C    IF (RETCD2.EQ.2) GOTO 12060
  13080. CC
  13081. CC
  13082. CC MAKE SURE NEXT CHARACTER IS NOT ALPHA
  13083. C    DO 12050 I=1,27
  13084. C    IF (LINE(IPT).EQ.ALPHA(I)) GOTO 12200
  13085. C12050    CONTINUE
  13086. C *****&&&&& ...ENDING HERE
  13087. C ADD BELOW...
  13088.     LLB=IPT
  13089.     LRB=LEND
  13090.     CALL VARSCN(LINE,LLB,LRB,LSTCHR,ID1,ID2,IVALID)
  13091. C    IF(IVALID.EQ.0)GOTO 12200
  13092. C    IPT=LSTCHR
  13093. C leave the following "60" in place. It's only roughly right
  13094. C (probably should be more like 30) but will do since funct.
  13095. C names are 3 chars...
  13096.     IF(IVALID.NE.0.AND.ID2.LE.1.AND.ID1.GT.60)GOTO 13201
  13097.     IF(IVALID.NE.0)GOTO 12201
  13098. C NOT VALID VARIABLE. SEE IF A 2 + ARGUMENT FUNCTION...
  13099. C
  13100. C COME HERE DIRECT FOR FUNCTIONS ENCODED...
  13101. 13201    CONTINUE
  13102.     I=IPT+9
  13103.     CALL FNAME(LINE(IPT),I,INDEXF)
  13104.     IF(INDEXF.EQ.6.OR.INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 12202
  13105. C NOW KNOW THERE IS A FUNCTION THERE, SO HANDLE IT.
  13106.     LLAST=LEND-IPT+1
  13107.     I=INDX(LINE(IPT),ICHAR(']'))
  13108.     IF(I.LE.0.OR.I.GT.LLAST)GOTO 12202
  13109.     LRB=I
  13110.     LLB=INDX(LINE(IPT),ICHAR('['))
  13111.     IF(LLB.LE.0.OR.LLB.GT.LLAST)GOTO 12202
  13112.     CALL DOMFCN(LINE(IPT),LLB,LRB,INDEXF,ACX)
  13113.     XAC=ACX
  13114.     TYPE(1,1)=2
  13115.     CALL TYPSET(1,27,TYPE(1,1))
  13116. C    TYPE(27,1)=2
  13117.     ID1=27
  13118.     ID2=1
  13119.     LSTCHR=LRB+IPT
  13120. C GO AND MERGE AS THOUGH WE JUST GOT A VARIABLE % AND HAD TO
  13121. C RETURN ITS VALUE.
  13122.     GOTO 12201
  13123. C IF NOT VALID FUNCTION REPORT AN ERROR.
  13124. 12202    GOTO 12200
  13125. 12201    IPT=LSTCHR
  13126.     IF(LSTCHR.LT.LEND)IPT=IPT-1
  13127.     NONBLK=IPT
  13128. C RESET NONBLK ALST SO WE RESET GETNNB TOO...
  13129. C WAS IPT=LSTCHR+1
  13130. C IPT POINTS AFTER VARIABLE NAME...
  13131. C ENSURE NON ALPHA AFTER VARIABLE NAME
  13132.     CALL GETNNB(IPT,RETCD2)
  13133.     IF(RETCD2.EQ.2) GOTO 12060
  13134. C
  13135. C IF THE NEXT CHARACTER IS AN = SIGN DON'T RETURN VALUE
  13136. C OF VARIABLE, JUST PUT INDEX INTO VBLS INTO LOWER BYTE
  13137. C OF RETVAL.
  13138.     IF (LINE(IPT).EQ.EQ) GOTO 12100
  13139. C
  13140. C
  13141. C ************************************************
  13142. C ****** RETURN VALUE OF VARIABLE SPECIFIED ******
  13143. C ************************************************
  13144. 12060    CALL TYPGET(ID1,ID2,RETTYP)
  13145. C12060    RETTYP=TYPE(ID1,ID2)
  13146. C *****&&&&&
  13147. C MUST CLAMP TYPES SO EXTENDED VARIABLES CAN'T BE MULT PRCN VRBLS.
  13148.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12061
  13149.     IF (RETTYP.EQ.5)RETTYP=4
  13150.     IF (RETTYP.EQ.6)RETTYP=8
  13151.     IF (RETTYP.EQ.7)RETTYP=3
  13152. 12061    CONTINUE
  13153.     IF(RETTYP.LE.0)GO TO 12080
  13154.     K=VLEN(RETTYP)
  13155.     if(id1.le.27.and.id2.eq.1)goto 12063
  13156.     call xvblgt(id1,id2,frvlf)
  13157. 12093    do 12064 kqkq=1,8
  13158.     retval(kqkq)=crvlf(kqkq)
  13159. 12064    continue
  13160.     goto 12080
  13161. 12063    continue
  13162.     DO 12070 I=1,K
  13163. C    CALL VBLGET(I,ID1,ID2,RETVAL(I))
  13164. C    RETVAL(I)=VBLS(I,ID1,ID2)
  13165. c    GOTO 12070
  13166. 12068    RETVAL(I)=AVBLS(I,ID1)
  13167. 12070    CONTINUE
  13168. C
  13169. 12080    LASTOP=RETTYP
  13170.     GOTO 99099
  13171. C
  13172. C
  13173. C
  13174. C *******************************************************
  13175. C ****** VARIABLE SPECIFIED BUT FOLLOWED BY = SIGN ******
  13176. C *******************************************************
  13177. 12100    CONTINUE
  13178. C    RETVAL(1)=IALPHA
  13179. C    RETTYP=TYPE(IALPHA)
  13180.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  13181.     CALL RVBOO(RETVAL,ID1,ID2)
  13182. C RVBOO JUST STUFFS ID1,ID2 INTO RETVAL ARRAY
  13183. C AS 2 INTEGERS.
  13184.     RETTYP=TYPE(1,1)
  13185. c for unix or vms versions we may need to use
  13186. c    call rvboo(rvlf,id1,id2)
  13187. c    goto 12093
  13188. c for absoft compiler we can however get away with just
  13189. c storing into retval direct.
  13190.     GOTO 12080
  13191. C
  13192. C
  13193. C
  13194. C *** ERROR *** UNIDENTIFIED FUNCTION
  13195. 12200    CALL ERRMSG(18)
  13196.     GOTO 99000
  13197. C
  13198. C
  13199. C
  13200. C
  13201. C
  13202. C **********************
  13203. C ****** OPERATOR ******
  13204. C **********************
  13205. C
  13206. C  I IS INDEX INTO OPER TO TELL WHAT OPERATOR IT IS
  13207. 20000    CONTINUE
  13208.     RETCD=2
  13209.     IF(I.NE.4)GO TO 20050
  13210. C
  13211. C
  13212. C IF AN ASTERISK IS FOUND THE NEXT CHARACTER MUST BE EXAMINED
  13213. C TO SEE IF '**' WAS SPECIFIED FOR EXPONENTIATION.
  13214.     CALL GETNNB (IPT,RETCD2)
  13215.     IF(RETCD2.NE.1)GO TO 99000
  13216.     IF (LINE(IPT).NE.STAR) GOTO 20050
  13217. C
  13218. C
  13219. C '**' SPECIFIED (EXPONENTIATION)
  13220.     RETTYP=EXCODE
  13221.     NONBLK=IPT
  13222.     GO TO 12080
  13223. C
  13224. C
  13225. C
  13226. C  SET DEFAULT RETTYP FOR OPERATORS
  13227. 20050    RETTYP=109+I
  13228. C
  13229. C
  13230. C  CHECK OUT POSSIBLE UNARY OPERATOR "-"
  13231.     IF (RETTYP.NE.111) GOTO 20080
  13232. C
  13233. C
  13234. C IF A MINUS IS ENCOUNTERED AND THERE WAS NO PREVIOUS ELEMENT OR
  13235. C IF PREVIOUS ELEMENT WAS AN OPERATOR OR = SIGN THEN OPERATOR
  13236. C IS UNARY.
  13237.     IF (LASTOP.EQ.0.OR.(LASTOP.GE.110.AND.LASTOP.LE.116).OR.
  13238.      ;      LASTOP.EQ.200) GOTO 20090
  13239. C
  13240. C
  13241. C  BINARY SUBTRACTION OPERATOR
  13242.     RETTYP=116
  13243.     GOTO 12080
  13244. C
  13245. C
  13246. C
  13247. C SEE IF A '+' SIGN
  13248. 20080    IF(RETTYP.NE.115)GO TO 20085
  13249. C
  13250. C
  13251. C DETERMINE IF IT IS A UNARY PLUS
  13252.     IF(LASTOP.NE.0.AND.LASTOP.LE.100)GO TO 20085
  13253. C
  13254. C
  13255. C SEE IF LAST OPERATOR WAS ')'
  13256.     IF(LASTOP.EQ.117)GO TO 20085
  13257. C
  13258. C
  13259. C UNARY '+' FOUND.
  13260.     RETCD=1
  13261.     GO TO 10
  13262. C
  13263. C
  13264. C
  13265. C RESET LASTOP TO 0 IF LEFT PARENTHESIS IS FOUND (CODE 110)
  13266. C IF RETTYP IS FOR =, SET TO PROPER CODE
  13267. 20085    IF(RETTYP.EQ.110)GO TO 20090
  13268.     IF(RETTYP.EQ.118)RETTYP=200
  13269.     GO TO 12080
  13270. C
  13271. C
  13272. C UNARY -
  13273. 20090    CONTINUE
  13274.     GOTO 99097
  13275. C
  13276. C
  13277. C
  13278. C
  13279. C
  13280. C
  13281. C *************************
  13282. C ****** NON-DECIMAL ******
  13283. C *************************
  13284. C
  13285. 30000    RETPT=RETPT+1
  13286.     IF (RETPT.LE.19) GOTO 30020
  13287. C
  13288. C
  13289. C *** ERROR *** MULTIPLE PRECISION IS LIMITED TO 19 DIGITS
  13290. C (ACTUALLY, NO LONGER PRESENT...)
  13291.     CALL ERRMSG(22)
  13292.     GOTO 99000
  13293. C
  13294. C
  13295. C  I HOLDS INDEX INTO DIGITS THAT WAS A MATCH.
  13296. C  SEE IF VALUE OF DIGIT IMPLIES A HIGHER BASE.
  13297. 30020    IF (I.NE.16) GOTO 30030
  13298.     I=0
  13299.     GOTO 30050
  13300. 30030    IF (I.EQ.8.OR.I.EQ.9) B10=1
  13301.     IF(I.GT.9) B16=1
  13302. 30050    RETVAL(RETPT)=CHAR(I)
  13303. C
  13304. C
  13305. C GET NEXT CHARACTER
  13306.     CALL GETNNB (IPT,RETCD2)
  13307.     IF (RETCD2.NE.1) GOTO 30100
  13308.     NONBLK=IPT
  13309.     CHAR1=LINE(IPT)
  13310.     DO 30070 I=1,16
  13311.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  13312. 30070    CONTINUE
  13313.     IF (CHAR1.EQ.DOT) GOTO 40000
  13314.     NONBLK=NONBLK-1
  13315. 30100    CONTINUE
  13316. C
  13317.     IF (DEFBAS.EQ.16.OR.B16.EQ.1) GOTO 30200
  13318.     IF (DEFBAS.EQ.10.OR.B10.EQ.1) GOTO 30300
  13319. C
  13320. c add code here to check for non -calc mode and goto 40000 if so
  13321. c if defbas.ne.8 and if we're working on a floating number
  13322. C
  13323. C *****************************
  13324. C ****** BASE 8 CONSTANT ******
  13325. C *****************************
  13326.     BASE=8
  13327. C
  13328. C
  13329. C IF MORE THAN 10 DIGITS IT IS MULTIPLE PRECISION
  13330.     IF (RETPT.GT.10) GOTO 30170
  13331.     RETTYP=8
  13332. C
  13333. C
  13334. C  CONVERT TO OCTAL, HEX OR INTEGER
  13335. 30110    INT=0
  13336. 30130    DO 30132 L=1,7
  13337.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 30140
  13338. 30132    CONTINUE
  13339. 30140    DO 30150 I=L,RETPT
  13340.     INT=INT*BASE+ICHAR(RETVAL(I))
  13341.     RETVAL(I)=char(0)
  13342. 30150    CONTINUE
  13343.     RETVAL(20)=char(0)
  13344. 30155    DO 30160 I=1,4
  13345. 30160    RETVAL(I)=FOUR(I)
  13346.     GOTO 35100
  13347. C
  13348. C
  13349. C ************************************************
  13350. C ****** MULTIPLE PRECISION BASE 8 CONSTANT ******
  13351. C ************************************************
  13352. 30170    RETTYP=6
  13353. 30180    CALL FLIP (RETVAL,8,RETPT)
  13354. c was 20 above, not 8 but we shortened stack arrays so shorten this
  13355.     GOTO 35100
  13356. C
  13357. C
  13358. C
  13359. C *********************
  13360. C ****** BASE 16 ******
  13361. C *********************
  13362. 30200    BASE=16
  13363. C
  13364. C
  13365. C IF MORE THAN 7 DIGITS IT IS MULTIPLE PRECISION.
  13366.     IF (RETPT.GT.7) GOTO 30270
  13367. C
  13368. C
  13369. C
  13370. C  HEXADECIMAL
  13371.     RETTYP=3
  13372.     GOTO 30110
  13373. C
  13374. C
  13375. C
  13376. C
  13377. C ****************************************
  13378. C ****** MULTIPLE PRECISION BASE 16 ******
  13379. C ****************************************
  13380. 30270    RETTYP=7
  13381.     GOTO 30180
  13382. C
  13383. C
  13384. C *********************
  13385. C ****** BASE 10 ******
  13386. C *********************
  13387. 30300    BASE=10
  13388. C
  13389. C
  13390. C IF MORE THAN 9 DIGITS IT IS MULTIPLE PRECISION.
  13391.     IF (RETPT.GT.9) GOTO 30370
  13392. C
  13393. C
  13394. C  INTEGER
  13395.     RETTYP=4
  13396.     GOTO 30110
  13397. C
  13398. C
  13399. C ****************************************
  13400. C ****** MULTIPLE PRECISION BASE 10 ******
  13401. C ****************************************
  13402. 30370    RETTYP=5
  13403.     GOTO 30180
  13404. C
  13405. C
  13406. C
  13407. C
  13408. C
  13409. C SET LASTOP AND EXIT
  13410. 35100    LASTOP=RETTYP
  13411.     GOTO 99099
  13412. C
  13413. C
  13414. C *****************************
  13415. C ****** REAL OR DECIMAL ******
  13416. C *****************************
  13417. 40000    IF (B16.NE.1) GOTO 40020
  13418. C
  13419. C
  13420. C *** ERROR ***  '.' MAY ONLY BE USED WITH BASE 10
  13421.     CALL ERRMSG(21)
  13422.     GOTO 99000
  13423. C
  13424. C
  13425. C
  13426. 40020    IF (RETPT.EQ.0) GOTO 40200
  13427. C
  13428. C
  13429. C IGNORE LEADING ZEROES
  13430.     DO 40022 L=1,19
  13431.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 40030
  13432. 40022    CONTINUE
  13433. C
  13434. C IF ALL ZEROES THE LAST ONE COUNTS!
  13435.     L=19
  13436. C
  13437. C
  13438. C CONVERT TO A REAL*8 NUMBER
  13439. 40030    CONTINUE
  13440.     REAL=0.D0
  13441.     DO 40060 I=L,RETPT
  13442.     REAL=REAL*10.D0+ICHAR(RETVAL(I))
  13443.     RETVAL(I)=char(0)
  13444. 40060    CONTINUE
  13445. C
  13446. C
  13447. C  PICK UP FRACTIONAL PART OF REAL (DECIMAL)
  13448. 40200    CONTINUE
  13449.     RB=1.0D0
  13450.     RETTYP=2
  13451. 40205    CALL GETNNB (IPT,RETCD2)
  13452.     IF (RETCD2.EQ.1) GOTO 40300
  13453. C
  13454. C IF NO MORE, YOU GOT IT ALL SO GO PLACE VALUE IN RETVAL.
  13455.     GOTO 40537
  13456. C
  13457. C
  13458. C
  13459. 40300    NONBLK=IPT
  13460.     CHAR1=LINE(IPT)
  13461.     DO 40320 I=1,10
  13462.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40330
  13463. 40320    CONTINUE
  13464.     GOTO 40350
  13465. 40330    IF (I.EQ.10) I=0
  13466.     RB=0.1D0*RB
  13467.     REAL=REAL+DFLOAT(I)*RB
  13468.     GOTO 40205
  13469. C
  13470. C
  13471. C CHECK TO SEE IF E OR D EXPONENT SPECIFICATION IS USED.
  13472. 40350    IF (CHAR1.EQ.DIGITS(13,3).OR.CHAR1.EQ.DIGITS(14,3)) GOTO 40360
  13473.     NONBLK=NONBLK-1
  13474.     GO TO 40537
  13475. C
  13476. C
  13477. C *********************************************
  13478. C ****** E AND D EXPONENT SPECIFICATIONS ******
  13479. C *********************************************
  13480. 40360    CONTINUE
  13481.     CALL GETNNB(IPT,RETCD2)
  13482.     IF (RETCD2.EQ.1) GOTO 40370
  13483. C
  13484. C
  13485. C *** ERROR *** ILLEGAL REAL EXPONENT FIELD SPECIFIED
  13486. 40365    CALL ERRMSG (24)
  13487.     GOTO 99000
  13488. C
  13489. C
  13490. 40370    CHAR1=LINE(IPT)
  13491.     IF (CHAR1.EQ.MINUS) GOTO 40380
  13492.     RB=10.D0
  13493.     IF (CHAR1.NE.PLUS) GOTO 40400
  13494.     GOTO 40390
  13495. 40380    RB=0.1D0
  13496. C
  13497. C
  13498. C
  13499. 40390    NONBLK=IPT
  13500.     CALL GETNNB (IPT,RETCD2)
  13501. 40400    IF (RETCD2.GE.2) GOTO 40365
  13502.     NONBLK=IPT
  13503.     CHAR1=LINE(IPT)
  13504.     DO 40450 I=1,10
  13505.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40480
  13506. 40450    CONTINUE
  13507.     GOTO 40365
  13508. 40480    IF (I.EQ.10) I=0
  13509. C
  13510. C
  13511. C I1 HOLDS 1ST DIGIT OF EXPONENT SPECIFICATION
  13512.     I1=I
  13513.     CALL GETNNB (IPT,RETCD2)
  13514.     IF (RETCD2.GE.2) GOTO 40550
  13515.     CHAR1=LINE(IPT)
  13516.     NONBLK=IPT
  13517.     DO 40500 I=1,10
  13518.     IF(CHAR1.EQ.DIGITS(I,1)) GO TO 40520
  13519. 40500    CONTINUE
  13520.     NONBLK=NONBLK-1
  13521.     GOTO 40550
  13522. C
  13523. C
  13524. C I2 HOLDS SECOND DIGIT OF EXPONENT SPECIFICATION.
  13525. 40520    IF (I.EQ.10) I=0
  13526.     I2=I
  13527. C
  13528. C
  13529. 40530    RETTYP=9
  13530.     REAL=REAL*RB**(I1*10+I2)
  13531. C
  13532. C
  13533. C
  13534. C ***************************************************
  13535. C ****** COPY REAL*8 INTO RETURN VECTOR RETVAL ******
  13536. C ***************************************************
  13537. 40537    DO 40540 I=1,8
  13538. 40540    RETVAL(I)=EIGHT(I)
  13539.     GOTO 35100
  13540. C
  13541. C
  13542. C
  13543. 40550    I2=I1
  13544.     I1=0
  13545.     GOTO 40530
  13546. C
  13547. C
  13548. C
  13549. C ********************************
  13550. C ******* ERROR PROCESSING *******
  13551. C ********************************
  13552. 99000    CONTINUE
  13553.     IV=LEND-NONBLK+1
  13554.     CALL VWRT(LINE(NONBLK),IV)
  13555. C    WRITE (0,99010) (LINE(I),I=NONBLK,LEND)
  13556. C99010    FORMAT (1X,80(A1,\))
  13557.     RETCD=4
  13558. 99097    LASTOP=0
  13559. 99099    RETURN
  13560.     END
  13561. c -h- pget.for    Tue Sep  2 10:58:55 1986    
  13562.     SUBROUTINE PGET(CMDLIN,ICODE,IRTN)
  13563.     Include aparms.inc
  13564. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  13565. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  13566. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  13567. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  13568. C FROM THE DISK BASED FILE HERE.
  13569.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  13570. c    INTEGER*4 VNLT
  13571.         Integer*4 IDRO,IDCL
  13572.     CHARACTER*1 FORM2(128),FORM3(110),NMSH(80)
  13573.         Character*127 Form2c
  13574.         Equivalence(Form2(1),Form2c)
  13575.         REAL*8 R8S
  13576.     Integer*4 i4s
  13577.     equivalence(r8s,form3(1))
  13578.     equivalence(i4s,form3(1))
  13579.         INTEGER*4 IBIN
  13580.     COMMON/NMSH/NMSH
  13581.     REAL*8 XVBLS(1,1)
  13582. c    INTEGER KPYBAK
  13583. C ***<<<< RDD COMMON START >>>***
  13584.     InTeGer*4 RRWACT,RCLACT
  13585. C    COMMON/RCLACT/RRWACT,RCLACT
  13586.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  13587.      1  IDOL7,IDOL8
  13588. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  13589. C     1  IDOL7,IDOL8
  13590.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13591. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13592.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13593. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  13594. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  13595. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  13596.     InTeGer*4 KLVL
  13597. C    COMMON/KLVL/KLVL
  13598.     InTeGer*4 IOLVL,IGOLD
  13599. C    COMMON/IOLVL/IOLVL
  13600. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13601. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13602.     integer*4 idsptp,idol9,k3dfg,kcdelt,krdelt,kpag
  13603.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  13604.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  13605.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,idol9,
  13606.      3  k3dfg,kcdelt,krdelt,kpag
  13607. C ***<<< RDD COMMON END >>>***
  13608. CCC    InTeGer*4 IOLVL
  13609.     INTEGER*4 JVBLS(2,1,1)
  13610. CCC    COMMON/IOLVL/IOLVL
  13611. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  13612. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  13613.     DIMENSION FORM(128),FVLD(1,1)
  13614. c    CHARACTER*1 FVWRK,FVWRK2
  13615. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  13616. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  13617. C SO INITIALLY IGNORE.
  13618. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  13619. C
  13620. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  13621.  
  13622. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  13623. c    CHARACTER*1 LETA
  13624. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  13625. CCC    InTeGer*4 LLCMD,LLDSP
  13626. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  13627.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  13628.     COMMON/D2R/NRDSP,NCDSP
  13629.     InTeGer*4 TYPE(1,2),VLEN(9)
  13630.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  13631.     Real*8 VAVBLS(3,27)
  13632.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  13633.     REAL*8 XAC,ZAC
  13634.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  13635.     REAL*8 XXAC,XYAC
  13636.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  13637. C ***<<< XVXTCD COMMON START >>>***
  13638.     CHARACTER*1 OARRY(100)
  13639.     InTeGer*4 OSWIT,OCNTR
  13640. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  13641. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  13642.     InTeGer*4 IPS1,IPS2,MODFLG
  13643. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  13644.        InTeGer*4 XTCFG,IPSET,XTNCNT
  13645.        CHARACTER*1 XTNCMD(80)
  13646. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  13647. C VARY FLAG ITERATION COUNT
  13648.     INTEGER KALKIT
  13649. C    COMMON/VARYIT/KALKIT
  13650.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13651.     InTeGer*4 RCMODE,IRCE1,IRCE2
  13652. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13653. C     1  IRCE2
  13654. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  13655. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  13656. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  13657. C RCFGX ON.
  13658. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13659. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13660. C  AND VM INHIBITS. (SETS TO 1).
  13661.     INTEGER*4 FH
  13662. C FILE HANDLE FOR CONSOLE I/O (RAW)
  13663. C    COMMON/CONSFH/FH
  13664.     CHARACTER*1 ARGSTR(52,4)
  13665. C    COMMON/ARGSTR/ARGSTR
  13666.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  13667.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  13668.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  13669.      3  IRCE2,FH,ARGSTR
  13670. C ***<<< XVXTCD COMMON END >>>***
  13671. CCC    CHARACTER*1 ARGSTR(52,4)
  13672. CCC    COMMON/ARGSTR/ARGSTR
  13673. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  13674. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  13675. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  13676. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  13677. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  13678. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  13679.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  13680.     INTEGER*4 IIRO,IICO,INUMEM
  13681. C NEED SOME BIG VARIABLES FOR SAVING THE MAPPINGS
  13682.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  13683.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  13684. CCC    COMMON/KLVL/KLVL
  13685.     CHARACTER*1 DEFVB(12)
  13686.     COMMON/DEFVBX/DEFVB
  13687. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  13688. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  13689. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  13690. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  13691. C  AND VM INHIBITS. (SETS TO 1).
  13692. C
  13693. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  13694. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  13695. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  13696. C DISPLAY ACTUALLY USED FOR SCREEN.
  13697.     Integer*4 CWids(JIDcl)
  13698. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  13699. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  13700. C AS 20 NOT 75.
  13701.     REAL*8 DVS(JIDcl,JIDrw)
  13702.     INTEGER*4 LDVS(2,JIDcl,JIDrw)
  13703.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  13704.     CHARACTER*76 CFORM
  13705.     EQUIVALENCE(CFORM(1:1),FORM(1))
  13706.     COMMON /FVLDC/FVLD
  13707. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  13708. C 10 CHARACTERS PER ENTRY.
  13709.     COMMON/DSPCMN/DVS,CWIDS
  13710. C ***<<< NULETC COMMON START >>>***
  13711.     InTeGer*4 ICREF,IRREF
  13712. C    COMMON/MIRROR/ICREF,IRREF
  13713.     InTeGer*4 MODPUB,LIMODE
  13714. C    COMMON/MODPUB/MODPUB,LIMODE
  13715.     InTeGer*4 KLKC,KLKR
  13716.     REAL*8 AACP,AACQ
  13717. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  13718.     InTeGer*4 NCEL,NXINI
  13719. C    COMMON/NCEL/NCEL,NXINI
  13720.     CHARACTER*1 NAMARY(20,MRows)
  13721. C    COMMON/NMNMNM/NAMARY
  13722.     InTeGer*4 NULAST,LFVD
  13723. C    COMMON/NULXXX/NULAST,LFVD
  13724.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  13725.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  13726. C ***<<< NULETC COMMON END >>>***
  13727.     Character*1 Letr
  13728. CCC    InTeGer*4 ICREF,IRREF
  13729. CCC    COMMON/MIRROR/ICREF,IRREF
  13730. C ENCODE ICREF, IRREF AND CWIDS PAST TITLE IN FIRST LINE
  13731. C (THAT WAY, NOTHING BREAKS IN OTHER PGMS THAT USE THIS)
  13732. C
  13733. C PUT NUMBERS OUT TO FILE
  13734. C USES RELATIVE FORMS TO CURRENT POS.
  13735. C PD = PUT OURT DISPLAY SHEET. PP = PUT OUT PHYSICAL SHEET.
  13736. C ONLY WRITES PHYSICALLY PRESENT DATA.
  13737. C P/D RRR,CCC,FORMULA,VALID,FORMAT
  13738. C N IN 3RD CHR (PPN/PDN) SAVES NUMBERS, ELSE FORMULAS.
  13739.     ICODE=1
  13740.     CLOSE(4)
  13741. 7954    CALL UVT100(1,LLCMD,1)
  13742.     CALL UVT100(12,2,0)
  13743. C ASK FOR FILE NAME
  13744.     CALL VWRT('Enter Filename:',15)
  13745.     III=IOLVL
  13746. C    IF(III.EQ.5)III=0
  13747.     if(iii.ne.11)READ(III,7953,END=510,ERR=510)FORM2
  13748.     if(iii.eq.11)call vget(form2,128)
  13749. c7952    FORMAT(' Enter filename>\')
  13750. 7953    FORMAT(128A1)
  13751.     DO 6940 II=1,128
  13752.     ILN=129-II
  13753.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  13754.     FORM2(ILN)=char(0)
  13755. 6940    CONTINUE
  13756. 6941    CONTINUE
  13757. C ILN IS LENGTH OFLINE NOW.
  13758.     ILN=MIN0(ILN,127)
  13759.     FORM2(ILN+1)=char(0)
  13760.         IBIN=0
  13761.         IF(CMDLIN(2).EQ.'B'.OR.CMDLIN(2).EQ.'b')IBIN=1
  13762.     IF(IBIN.EQ.0)CALL WASSIG(4,FORM2)
  13763. C block=-1 is Absoft-specific Amiga hack to get record lengths encoded
  13764. C to allow variable length records to make sense.
  13765.         IF(IBIN.EQ.1)OPEN(UNIT=4,FILE=FORM2c,FORM='UNFORMATTED',
  13766.      1  ACCESS='SEQUENTIAL',STATUS='NEW',block=-1)
  13767. c use recl=128 instead of block=-1 for unix flavors
  13768. C NOW ENCODE COL WIDTHS AND ICREF/IRREF
  13769. C SO SAVE/RESTORE OF EXTENDED SHEETS DOESN'T GET
  13770. C MESSED UP.
  13771.     If(Ibin.eq.0)
  13772.      1  WRITE(CFORM(1:76),8850,ERR=8851)ICREF,IRREF,(CWIDS(III),
  13773.      1  III=1,20),DRWV,DCLV
  13774. 8850    FORMAT(24I3)
  13775.     DO 8855 III=1,80
  13776.     II=ICHAR(NMSH(III))
  13777.     IF(II.LT.32)II=32
  13778. 8855    NMSH(III)=CHAR(II)
  13779. 8851    CONTINUE
  13780.     IF(IBIN.EQ.0)WRITE(4,6951)NMSH,(FORM(II),II=1,76)
  13781.         IF(IBIN.EQ.1)WRITE(4,err=448)NMSH,ICREF,IRREF,
  13782.      1  (CWIDS(III),III=1,20),DRWV,DCLV
  13783. 6951    FORMAT(80A1,76A1)
  13784. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  13785.     CALL UVT100(1,LLCMD,1)
  13786.     CALL UVT100(12,2,0)
  13787.         MDXM=12000
  13788.         LDXM=12000
  13789.         IF(IBIN.EQ.1)GOTO 448
  13790.     CALL VWRT('Enter max. displ down to save or 0 for all>',43)
  13791.     III=IOLVL
  13792. C    IF(III.EQ.5)III=0
  13793.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LDXM
  13794.     if(iii.eq.11)call vgeti(ldxm)
  13795. 6950    FORMAT(80A1)
  13796. 7978    FORMAT(I7)
  13797.     CALL UVT100(1,LLCMD,1)
  13798.     CALL UVT100(12,2,0)
  13799.     CALL VWRT('Enter max. displcmt right to save or 0 for all>',47)
  13800.     III=IOLVL
  13801. C    IF(III.EQ.5)III=0
  13802.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MDXM
  13803.     if(iii.eq.11)call vgeti(mdxm)
  13804.     IF(MDXM.LE.0)MDXM=12000
  13805.     IF(LDXM.LE.0)LDXM=12000
  13806. 448     CONTINUE
  13807. C 12000 IS "AN ARBITRARILY LARGE NUMBER TO ASSURE THAT ALL VALID
  13808. C RANGES ARE SAVED". IT MUST BE SMALL ENOUGH TO ASSURE WE DON'T OVERFLOW AN
  13809. C INTEGER THOUGH.
  13810.     IF(CMDLIN(2).NE.'P'.and.CMDLIN(2).GT.' '.AND.IBIN.EQ.0)
  13811.      1   GOTO 7950
  13812. C TREAT "P" BY ITSELF AS A SAVE PP TYPE COMMAND (PUT PHYS)
  13813. C Could speed this by saving only what's been filled.
  13814. C RCLACT can be up to 301, RRWACT can be up to MCols
  13815. C since current cell may be outside this area, use scratch vbls
  13816. C to ensure all's well
  13817.     If(K3dfg.lt.0)Goto 8601
  13818. C write out special "flag" record to preserve 3D mapping
  13819. C information IF mapping is not disabled.
  13820.     Letr='F'
  13821.     if(ibin.eq.1)goto 8602
  13822.     WRITE(4,5403)LETR,k3dfg,KCDelt,KRDelt
  13823.     Goto 8603
  13824. 8602    Continue
  13825.     i4s=KRDelt
  13826.     WRITE(4)LETR,K3Dfg,KCDelt,
  13827.      1  (form3(ivv),ivv=1,110)
  13828. 8603    Continue
  13829. C fill in other rubbish as second part of record. 253 is byte for -3 next...
  13830.     Type(1,1)=(2)
  13831.     Form2(119)=char(253)
  13832.     If(Ibin.eq.0)
  13833.      1  WRITE(4,7956)FORM2(119),(FORM2(IV),IV=120,128),TYPE(1,1)
  13834.     If(Ibin.eq.1)
  13835.      1  WRITE(4)FORM2(119),(FORM2(IV),IV=120,128),TYPE(1,1)
  13836. C
  13837. 8601    Continue
  13838.     Irrw=max0(PCOL,RCLACT)
  13839.     Ircl=max0(PROW,RRWACT)
  13840. c    DO 7951 ICO=PCOL,301
  13841. c    DO 7951 IRO=PROW,60
  13842.     DO 7951 ICO=PCOL,Irrw
  13843.     DO 7951 IRO=PROW,Ircl
  13844. C GO DOWN AND RIGHT ONLY. ALLOW MIXING THIS WAY.
  13845. C    IRX=(ICO-1)*60+IRO
  13846.     CALL REFLEC(ICO,IRO,IRX)
  13847.     IDRO=IRO-PROW+1
  13848.     IDCL=ICO-PCOL+1
  13849.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7951
  13850. C FORM DISPLACEMENT LOCATORS
  13851.     CALL FVLDGT(IRO,ICO,FVLD(1,1))
  13852.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7951
  13853.     CALL WRKFIL(IRX,FORM,0)
  13854.     CALL CE2A(FORM,FORM2)
  13855.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  13856.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  13857.     CALL TYPGET(IRO,ICO,TYPE(1,1))
  13858.     IF(CMDLIN(3).NE.'N')GOTO 5402
  13859.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5402
  13860. C ALWAYS WRITE TEXT OUT EVEN IF SAVING NUMERICALLY
  13861. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  13862. C INTERNAL PROC TO PRINT NUMERIC VALUES AT 6400
  13863.     LETR='P'
  13864.     ASSIGN 5405 TO INUMEM
  13865. C    GOTO 6400
  13866. 6400    CONTINUE
  13867. C ASSUME LETR IS SET TO GOOD PREFIX LETTER ASCII VALUE
  13868.     CALL XVBLGT(IRO,ICO,XVBLS(1,1))
  13869.         IF(IBIN.EQ.1)GOTO 449
  13870.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5403)LETR,IDRO,IDCL,
  13871.      1  JVBLS(1,1,1)
  13872. 5403    FORMAT(1A1,I5,',',I5,',',I15)
  13873.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5404)LETR,IDRO,IDCL,
  13874.      1  XVBLS(1,1)
  13875.         GOTO 450
  13876. 449     CONTINUE
  13877.         R8S=XVBLS(1,1)
  13878.     WRITE(4,err=450)LETR,IDRO,IDCL,FORM3
  13879. 450     CONTINUE
  13880. 5404    FORMAT(1A1,I5,',',I5,',',D30.19)
  13881.     GOTO INUMEM,(5405,6406)
  13882. 5402    CONTINUE
  13883. C FIND END OF TEXT IN ARRAY
  13884.     IVVV=110
  13885.         If(Ibin.eq.1)goto 4331
  13886. C skip this truncation for binary saves
  13887.     DO 4330 IV=2,110
  13888.     IVVV=113-IV
  13889.     IF(ICHAR(FORM2(IVVV)).GT.32)GOTO 4331
  13890. 4330    CONTINUE
  13891. 4331    CONTINUE
  13892. C SAVE ON PPX IN EFFICIENT FORM.
  13893. C DON'T WRITE OUT TRAILING NULLS.
  13894. C ENSURE FORMAT HAS NO NULLS IN IT.
  13895.     DO 358 IV=120,128
  13896. 358    IF(ICHAR(FORM2(IV)).LT.32)FORM2(IV)=Char(32)
  13897.     IF(CMDLIN(3).EQ.'F')GOTO 6404
  13898. C PPF WILL SAVE FORMULAS ONLY
  13899. C PPA WILL SAVE FORMULAS AND VALUES (AS WILL PPc WHERE c IS
  13900. C ANY CHARACTER EXCEPT N.
  13901.     LETR='p'
  13902. C FLAG NUMERIC SAVE VIA LOWERCASE P HERE
  13903.     ASSIGN 6406 TO INUMEM
  13904. C GO WRITE FIRST LINE NUMERICALLY
  13905.     GOTO 6400
  13906. 6406    CONTINUE
  13907. C NOW HAVE NUMERIC LINE WRITTEN. WRITE THE SECOND LINE OF THE
  13908. C GROUP TO, SO AS NOT TO CONFUSE GRAPHICS PROGRAMS AND THE
  13909. C LIKE.
  13910.     III=JCHAR(FORM2(119))
  13911.     IF(IBIN.EQ.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13912.      1   TYPE(1,1)
  13913.     IF(IBIN.EQ.1)WRITE(4,err=6404)III,(FORM2(IV),IV=120,128),
  13914.      1   TYPE(1,1)
  13915. 6404    CONTINUE
  13916. C NOW WRITE OUT FORMULA RECORD.
  13917.     If(Ibin.eq.0)WRITE(4,7955)IDRO,IDCL,
  13918.      1   (FORM2(IV),IV=1,IVVV)
  13919.         Letr=char(80)
  13920.         If(Ibin.eq.1)Write(4,err=5405)Letr,idro,idcl,
  13921.      1   (form2(iv),iv=1,ivvv)
  13922. 5405    CONTINUE
  13923. C DUMP TO SERIAL FILE IN OUR OWN FORMAT, BUT ALL IN ASCII.
  13924. 7955    FORMAT('P',I5,',',I5,',',128A1)
  13925. C NOTE LONG RECORDS.
  13926.     III=JCHAR(FORM2(119))
  13927.     If(ibin.eq.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13928.      1  TYPE(1,1)
  13929.     If(Ibin.eq.1)WRITE(4,err=7951)III,(FORM2(IV),IV=120,128),
  13930.      1  TYPE(1,1)
  13931. 7956    FORMAT(I3,',',9A1,',',I5)
  13932. 7951    CONTINUE
  13933. 2751    CONTINUE
  13934. C
  13935. C NOW SAVE NRDSP AND NCDSP MAPPINGS TOO
  13936. C ONLY SAVE MAPPINGS IF 4TH COMMAND CHARACTER IS "M".
  13937. C ... THEY TAKE A LOT OF ROOM.
  13938.     IF (CMDLIN(4).NE.'M') GOTO 6541
  13939.     DO 6540 IRO=DROW,JIDcl
  13940.     DO 6540 ICO=DCOL,JIDrw
  13941.     IIRO=64000
  13942.     IICO=IIRO
  13943.     IIRO=IIRO+IRO
  13944.     IICO=IICO+ICO
  13945. C NOTE WE MAKE THESE NUMBERS LARGE SO GRAPHING PROGRAMS WON'T TRY
  13946. C TO READ THEM.
  13947. 6955    FORMAT('M',I5,',',I5,',',2I7)
  13948.         Letr='M'
  13949.         If(Ibin.eq.0)
  13950.      1   WRITE(4,6955,ERR=6541)IIRO,IICO,
  13951.      1   NRDSP(IRO,ICO),NCDSP(IRO,ICO)
  13952.         If(Ibin.eq.1)
  13953.      1   WRITE(4,ERR=6541)Letr,IIRO,IICO,
  13954.      1   NRDSP(IRO,ICO),NCDSP(IRO,ICO)
  13955. C WRITE A SPECIAL RECORD, FLAGGED BY 'M', TO SAVE A MAPPING CELL
  13956. C NEED A 2ND RECORD TOO; JUST SEND LAST ONE AGAIN.
  13957.     If(ibin.eq.0)WRITE(4,7956)III,(FORM2(IV),IV=120,128),
  13958.      1  TYPE(1,1)
  13959.     If(Ibin.eq.1)WRITE(4,err=6541)III,(FORM2(IV),IV=120,128),
  13960.      1  TYPE(1,1)
  13961. 6540    CONTINUE
  13962. 6541    CONTINUE
  13963.     CLOSE(4)
  13964.     GOTO 9990
  13965. 7950    IF(CMDLIN(2).NE.'D')GOTO 9990
  13966.     DO 7957 ICO=DCOL,JIDrw
  13967.     DO 7957 IRO=DROW,JIDcl
  13968.     IDRO=IRO-DROW+1
  13969.     IDCL=ICO-DCOL+1
  13970.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7957
  13971.     NR=NRDSP(IRO,ICO)
  13972.     NC=NCDSP(IRO,ICO)
  13973. C    IRX=(NC-1)*60+NR
  13974.     CALL REFLEC(NC,NR,IRX)
  13975.     CALL FVLDGT(NR,NC,FVLD(1,1))
  13976.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7957
  13977.     CALL WRKFIL(IRX,FORM,0)
  13978.     CALL CE2A(FORM,FORM2)
  13979.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  13980.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  13981.     IF(CMDLIN(3).NE.'N')GOTO 5412
  13982. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  13983.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5412
  13984. C WRITE LABELS EVEN IF NUMERIC SAVE
  13985.     CALL TYPGET(NR,NC,TYPE(1,1))
  13986.     CALL XVBLGT(NR,NC,XVBLS(1,1))
  13987.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5413)IDRO,IDCL,JVBLS(1,1,1)
  13988. 5413    FORMAT('P',I5,',',I5,',',I15)
  13989.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5414)IDRO,IDCL,XVBLS(1,1)
  13990. 5414    FORMAT('P',I5,',',I5,',',D30.19)
  13991.     GOTO 5415
  13992. 5412    CONTINUE
  13993.     WRITE(4,7958)IDRO,IDCL,(FORM2(IV),IV=1,110)
  13994. 5415    CONTINUE
  13995. 7958    FORMAT('D',I5,',',I5,',',128A1)
  13996.     DO 359 IV=120,128
  13997. 359    IF(FORM2(IV).LT.' ')FORM2(IV)=Char(32)
  13998.     III=JCHAR(FORM2(119))
  13999.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  14000. 7957    CONTINUE
  14001. C ALLOW SAVE AS NEEDED OF MAPPING
  14002.     GOTO 2751
  14003. C    CLOSE(4)
  14004. 9990    RETURN
  14005. 510    CONTINUE
  14006.     IRTN=1
  14007.     CLOSE(IOLVL)
  14008. c    CLOSE(11)
  14009. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  14010.     RETURN
  14011.     END
  14012. c -h- pgget.for    Tue Sep  2 10:58:55 1986    
  14013.     SUBROUTINE PGGET(CMDLIN,ICODE,IRTN)
  14014.     Include aparms.inc
  14015. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  14016. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  14017. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  14018. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  14019. C FROM THE DISK BASED FILE HERE.
  14020.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  14021. c    INTEGER*4 VNLT
  14022.     CHARACTER*1 LET1,FORM2(128),NMSH(80)
  14023.         Real*8 R8s
  14024.         Integer*4 I4s,I4t,i4ttt
  14025.     character*1 i4ttc(4)
  14026.     equivalence(i4ttt,i4ttc(1))
  14027.         Equivalence(R8s,form2(1)),(I4s,form2(1))
  14028. c        Equivalence (I4t,form2(3))
  14029.         Character*127 Form2c
  14030.         Equivalence(Form2(1),Form2c)
  14031.     COMMON/NMSH/NMSH
  14032.     REAL*8 XVBLS(1,1)
  14033. c    INTEGER KPYBAK
  14034. C ***<<<< RDD COMMON START >>>***
  14035.     InTeGer*4 RRWACT,RCLACT
  14036. C    COMMON/RCLACT/RRWACT,RCLACT
  14037.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  14038.      1  IDOL7,IDOL8
  14039. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  14040. C     1  IDOL7,IDOL8
  14041.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  14042. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14043.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14044. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14045. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  14046. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  14047.     InTeGer*4 KLVL
  14048. C    COMMON/KLVL/KLVL
  14049.     InTeGer*4 IOLVL,IGOLD
  14050. C    COMMON/IOLVL/IOLVL
  14051. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  14052. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  14053.     Integer*4 idsptp,idol9,k3dfg,kcdelt,krdelt,kpag
  14054.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14055.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14056.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,Idol9,
  14057.      3  K3dfg,kcdelt,krdelt,kpag
  14058. C ***<<< RDD COMMON END >>>***
  14059. CCC    InTeGer*4 IOLVL
  14060.     INTEGER*4 JVBLS(2,1,1)
  14061.     REAL*8 R8WK
  14062. CCC    COMMON/IOLVL/IOLVL
  14063. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  14064. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  14065.     DIMENSION FORM(128),FVLD(1,1)
  14066.     INTEGER*4 IRRW,ICCL
  14067. C USE BIG NUMBERS SO WE CAN SUBTRACT 64000 AND STILL NOT GET WRAPAROUND.
  14068. C (FOR SAVE/RESTORE OF MAP)
  14069.     CHARACTER*76 CFORM
  14070.     CHARACTER*35 CFORM2
  14071.     EQUIVALENCE(CFORM2(1:1),FORM2(1))
  14072.     EQUIVALENCE(CFORM(1:1),FORM(1))
  14073.     InTeGer*4 NDUM(24)
  14074. C ***<<< NULETC COMMON START >>>***
  14075.     InTeGer*4 ICREF,IRREF
  14076. C    COMMON/MIRROR/ICREF,IRREF
  14077.     InTeGer*4 MODPUB,LIMODE
  14078. C    COMMON/MODPUB/MODPUB,LIMODE
  14079.     InTeGer*4 KLKC,KLKR
  14080.     REAL*8 AACP,AACQ
  14081. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  14082.     InTeGer*4 NCEL,NXINI
  14083. C    COMMON/NCEL/NCEL,NXINI
  14084.     CHARACTER*1 NAMARY(20,MRows)
  14085. C    COMMON/NMNMNM/NAMARY
  14086.     InTeGer*4 NULAST,LFVD
  14087. C    COMMON/NULXXX/NULAST,LFVD
  14088.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  14089.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  14090. C ***<<< NULETC COMMON END >>>***
  14091. CCC    COMMON/MIRROR/ICREF,IRREF
  14092. c    CHARACTER*1 FVWRK,FVWRK2
  14093. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  14094. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  14095. C SO INITIALLY IGNORE.
  14096. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  14097. C
  14098. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  14099. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  14100. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14101. CCC    InTeGer*4 LLCMD,LLDSP
  14102. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  14103.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  14104.     EXTERNAL INDX
  14105.     COMMON/D2R/NRDSP,NCDSP
  14106.     InTeGer*4 TYPE(1,2),VLEN(9)
  14107.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  14108.     Real*8 VAVBLS(3,27)
  14109.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  14110.     REAL*8 XAC,ZAC
  14111.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  14112.     REAL*8 XXAC,XYAC
  14113.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  14114. C ***<<< XVXTCD COMMON START >>>***
  14115.     CHARACTER*1 OARRY(100)
  14116.     InTeGer*4 OSWIT,OCNTR
  14117. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  14118. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  14119.     InTeGer*4 IPS1,IPS2,MODFLG
  14120. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  14121.        InTeGer*4 XTCFG,IPSET,XTNCNT
  14122.        CHARACTER*1 XTNCMD(80)
  14123. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  14124. C VARY FLAG ITERATION COUNT
  14125.     INTEGER KALKIT
  14126. C    COMMON/VARYIT/KALKIT
  14127.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  14128.     InTeGer*4 RCMODE,IRCE1,IRCE2
  14129. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14130. C     1  IRCE2
  14131. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  14132. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  14133. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  14134. C RCFGX ON.
  14135. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  14136. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  14137. C  AND VM INHIBITS. (SETS TO 1).
  14138.     INTEGER*4 FH
  14139. C FILE HANDLE FOR CONSOLE I/O (RAW)
  14140. C    COMMON/CONSFH/FH
  14141.     CHARACTER*1 ARGSTR(52,4)
  14142. C    COMMON/ARGSTR/ARGSTR
  14143.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  14144.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  14145.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14146.      3  IRCE2,FH,ARGSTR
  14147. C ***<<< XVXTCD COMMON END >>>***
  14148. CCC    CHARACTER*1 ARGSTR(52,4)
  14149. CCC    COMMON/ARGSTR/ARGSTR
  14150. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  14151. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  14152. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  14153. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  14154. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  14155. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  14156.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  14157.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  14158.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  14159. CCC    COMMON/KLVL/KLVL
  14160.     CHARACTER*1 DEFVB(12)
  14161.     COMMON/DEFVBX/DEFVB
  14162. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  14163. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  14164. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  14165. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  14166. C  AND VM INHIBITS. (SETS TO 1).
  14167. C
  14168. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  14169. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  14170. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  14171. C DISPLAY ACTUALLY USED FOR SCREEN.
  14172.     Integer*4 CWids(JIDcl)
  14173. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  14174. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  14175. C AS 20 NOT 75.
  14176.     REAL*8 DVS(JIDcl,JIDrw)
  14177.     INTEGER*4 LDVS(2,JIDcl,JIDrw)
  14178.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  14179.     COMMON /FVLDC/FVLD
  14180. CCC    InTeGer*4 NCEL,NXINI
  14181. CCC    COMMON/NCEL/NCEL,NXINI
  14182. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  14183. C 10 CHARACTERS PER ENTRY.
  14184.     COMMON/DSPCMN/DVS,CWIDS
  14185. C
  14186. c7952    FORMAT(' Enter filename>\')
  14187. 7953    FORMAT(128A1)
  14188. 6950    FORMAT(80A1)
  14189. 7978    FORMAT(I7)
  14190. 7956    FORMAT(I3,1X,9A1,1X,I5)
  14191.     CLOSE(4)
  14192. 7960    CALL UVT100(1,LLCMD,1)
  14193.     CALL UVT100(12,2,0)
  14194. C GET FILE NAME
  14195.     call Vwrt('Enter Filename:',15)
  14196.     III=IOLVL
  14197. C    IF(III.EQ.5)III=0
  14198.     if(iii.ne.11)READ(III,7953,END=510,ERR=510)FORM2
  14199.     if(iii.eq.11)call vget(form2,128)
  14200.     DO 6940 II=1,128
  14201.     ILN=129-II
  14202.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  14203.     FORM2(ILN)=Char(0)
  14204. 6940    CONTINUE
  14205. 6941    CONTINUE
  14206. C ILN IS LENGTH OFLINE NOW.
  14207.     ILN=MIN0(127,ILN)
  14208.     FORM2(ILN+1)=Char(0)
  14209. C SPECIAL "FAST READ" MODE TO SET UP DATA AREAS ON GETTING OLD SHEETS...
  14210.     NXINI=1
  14211.     LDXM=INDX(FORM2,ICHAR('/'))
  14212. C IF FILE IS FILENAME/M WE WON'T DO IT FAST...
  14213.     IF(LDXM.LE.0.OR.LDXM.GE.ILN)GOTO 8400
  14214.     FORM2(LDXM)=Char(0)
  14215. C TERMINATE AFTER THE / AND SET NXINI TO 0 AGAIN
  14216.     NXINI=0
  14217. 8400    CONTINUE
  14218.         Ibin=0
  14219.         If(Cmdlin(2).eq.'B'.OR.cmdlin(2).eq.'b')Ibin=1
  14220.     If(Ibin.eq.0)CALL RASSIG(4,FORM2,kkkk)
  14221.     if(kkkk.ne.0)goto 7964
  14222. C BLOCK=-1 IS HACK TO READ ABSOFT UNFORMATTED BIN RECS AS VBL LEN
  14223.         If(Ibin.eq.1)Open(unit=4,file=form2c,form='Unformatted',
  14224.      1  access='SEQUENTIAL',status='OLD',block=-1)
  14225. c     1  access='SEQUENTIAL',status='OLD',recl=512)
  14226.         If(Ibin.eq.0)
  14227.      1  READ(4,6951,END=7964,ERR=7964)NMSH,FORM
  14228.         If(Ibin.eq.1)
  14229.      1  READ(4,END=7964,ERR=7107)NMSH,Ndum
  14230. 7107    Continue
  14231. 6951    FORMAT(80A1,76A1,56A1)
  14232. 6952    FORMAT(24I3)
  14233. C TRY TO DECODE ICREF,IRREF, CWIDS, AND DRWV,DCLV
  14234.     If(Ibin.eq.0)READ(CFORM(1:76),6952,ERR=6953)NDUM
  14235. C IF HERE, THE READ WAS OK (APPARENTLY)
  14236. C FILL IN DEFAULTS IF NOTHING BUT ZEROES REALLY WAS SEEN
  14237. C (OR JUST ALL SPACES)
  14238.     ICREF=NDUM(1)
  14239.     IF(ICREF.LE.0.OR.ICREF.GT.MCols)ICREF=10
  14240.     IRREF=NDUM(2)
  14241.     IF(IRREF.LE.0.OR.IRREF.GT.(MRows-1))IRREF=50
  14242. C SET UP CWIDS BUT DEFAULT TO 10 IF NO REAL INFO THERE
  14243. C leave 20 as number widths to save for standardizing format
  14244. C of output
  14245.     DO 6954 III=1,20
  14246.     IIVV=NDUM(III+2)
  14247.     IF(IIVV.LT.1.OR.IIVV.GT.100)IIVV=10
  14248.     CWIDS(III)=IIVV
  14249. 6954    CONTINUE
  14250. C RESTORE NUMBER ROWS AND COLS BEING DISPLAYED
  14251. C NOTE WE DO NOT RESTORE THE COMPLETE DISPLAY
  14252. C MAPPING; JUST THE WIDTHS AND NUMBERS OF DISPLAY
  14253. C COLUMNS, AND WE RESTORE THE EXTENDED MAP SO THAT
  14254. C SAVED SHEETS WILL NORMALLY GET BACK THE SAME EXTENDED
  14255. C ADDRESSING THAT HAD BEEN SET UP.
  14256.     DRWV=NDUM(23)
  14257.     IF(DRWV.LT.1.OR.DRWV.GT.JIDcl)DRWV=7
  14258.     DCLV=NDUM(24)
  14259.     IF(DCLV.LT.1.OR.DCLV.GT.JIDrw)DCLV=20
  14260. 6953    CONTINUE
  14261. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  14262.     CALL UVT100(1,LLCMD,1)
  14263.     CALL UVT100(12,2,0)
  14264.         mdxm=12000
  14265.         ldxm=12000
  14266.         mmdxm=1
  14267.         lldxm=1
  14268.         If(ibin.eq.1)Goto 662
  14269.     CALL VWRT('Enter max. displc. down to restore or 0 for all>',48)
  14270.     III=IOLVL
  14271. C    IF(III.EQ.5)III=0
  14272.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MDXM
  14273.     if(iii.eq.11)call vgeti(mdxm)
  14274.     CALL UVT100(1,LLCMD,1)
  14275.     CALL UVT100(12,2,0)
  14276.     CALL VWRT('Enter max. displc. right to restore or 0 for all>',
  14277.      1  49)
  14278.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LDXM
  14279.     if(iii.eq.11)call vgeti(ldxm)
  14280.     CALL UVT100(1,LLCMD,1)
  14281.     CALL UVT100(12,2,0)
  14282.     CALL VWRT('Enter min. displ. down (1 or more)>',35)
  14283.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)MMDXM
  14284.     if(iii.eq.11)call vgeti(mmdxm)
  14285.     CALL UVT100(1,LLCMD,1)
  14286.     CALL UVT100(12,2,0)
  14287.     CALL VWRT('Enter min displ. right (1 or more)>',35)
  14288.     if(iii.ne.11)READ(III,7978,END=510,ERR=510)LLDXM
  14289.     if(iii.eq.11)call vgeti(lldxm)
  14290. 662     Continue
  14291.     IF(MDXM.LE.0)MDXM=12000
  14292.     LLDXM=MAX0(1,LLDXM)
  14293.     MMDXM=MAX0(1,MMDXM)
  14294.     IF(LDXM.LE.0)LDXM=12000
  14295.     IF(CMDLIN(4).EQ.'+'.OR.CMDLIN(4).EQ.'-')RCFGX=1
  14296. C ENTER RECALC MANUAL MODE IF ADDING NUMBERS OR SUBT.
  14297. C FROM SAVED SHEET
  14298. C 12000 IS, AS ABOVE, JUST A "BIG" NUMBER.
  14299. 7961    CONTINUE
  14300.         If(Ibin.eq.0)
  14301.      1  READ(4,7962,END=7964,ERR=7964)LET1,IRRW,ICCL,(FORM2(IV),
  14302.      1  IV=1,110)
  14303.         If(Ibin.eq.1)
  14304.      1  READ(4,END=7964,ERR=7108)LET1,IRRW,ICCL,(FORM2(IV),
  14305.      1  IV=1,110)
  14306. 7962    FORMAT(A1,I5,1X,I5,1X,128A1)
  14307. 7108    Continue
  14308.         ivv=110
  14309.         If(Ibin.eq.1)Goto 4496
  14310.     DO 4497 IV=1,110
  14311.     IVV=111-IV
  14312.     IF(FORM2(IVV).GT.' ')GOTO 4496
  14313.     FORM2(IVV)=Char(0)
  14314. 4497    CONTINUE
  14315. 4496    CONTINUE
  14316. C ABOVE LOOP ENSURES THAT EXTRA PARTS OF BUFFER NOT IN SAVE FILE ARE
  14317. C ZEROED ON READIN.
  14318.         If(Ibin.eq.0)
  14319.      1  READ(4,7956,END=7964,ERR=7964)III,(FORM2(IV),IV=120,128),
  14320.      1  KKTYP
  14321.         If(Ibin.eq.1)
  14322.      1  READ(4,END=7964,ERR=7109)III,(FORM2(IV),IV=120,128),
  14323.      1  KKTYP
  14324. 7109    Continue
  14325.     FORM2(119)=Char(III)
  14326.     If(k3dfg.lt.0)goto 8602
  14327. C Handle F records (flags)
  14328.     If(Let1.ne.'F')goto 8602
  14329.     if(ibin.ne.0)goto 8603
  14330.     Read(form2c(1:15),8604,err=7961)I4S
  14331. c    DECODE(15,8604,FORM2(1),ERR=7961)I4S
  14332. 8604    FORMAT(I15)
  14333. 8603    Continue
  14334. C set all values together so if decode error occurs things will
  14335. C remain consistent.
  14336.     krdelt=i4s
  14337.     k3dfg=irrw
  14338.     kcdelt=iccl
  14339. C No further processing of flag records.
  14340.     GoTo 7961
  14341. 8602    Continue
  14342.     IF(LET1.EQ.'M')GOTO 6500
  14343. C M CODE MEANS WE'RE READING THE DISPLAY-TO-PHYSICAL MAP.
  14344. C GO HANDLE IT SPECIALLY, THEN RETURN. FLAGS RECORDS BY
  14345. C ADDING 64000 TO ROW AND COL NUMBERS TO AVOID GETTING
  14346. C GRAPHICS PROGRAMS MESSED UP.
  14347. C  NOTE THAT SAVING THE MAP WAS OPTIONAL AND IS NOT THE
  14348. C DO-NOTHING DEFAULT.
  14349.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  14350.     IF(JCHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  14351.     IF(IRRW.LE.0.OR.ICCL.LE.0)GOTO 9990
  14352.     IF(IRRW.GT.LDXM.OR.ICCL.GT.MDXM)GOTO 7961
  14353.     IF(IRRW.LT.LLDXM.OR.ICCL.LT.MMDXM) GOTO 7961
  14354. C PRODUCE NEW ADDRESSES IN PHYSICAL SHEET USING SAVED FILE'S ONES
  14355. C AND CURSOR LOCATION (SINCE WE SAVE/RESTORE RELATIVE TO CURSOR).
  14356. C THIS PROVIDES A SHEET PARTIAL SAVE / MERGE CAPABILITY.
  14357.     NR=IRRW+PROW-LLDXM
  14358.     NC=ICCL+PCOL-MMDXM
  14359.     IF(CMDLIN(2).NE.'D'.AND.LET1.NE.char(68))GOTO 7963
  14360.     IF(CMDLIN(2).EQ.'P'.or.ibin.eq.1)GOTO 7963
  14361. C GET DISPLAY VERSION...
  14362.     LRR=IRRW+DROW-LLDXM
  14363.     LCC=ICCL+DCOL-MMDXM
  14364.     LRR=MAX0(1,LRR)
  14365.     LCC=MAX0(1,LCC)
  14366.     IF(LRR.GT.DRWV.OR.LCC.GT.DCLV)GOTO 7961
  14367.     NR=NRDSP(LRR,LCC)
  14368.     NC=NCDSP(LRR,LCC)
  14369. 7963    CONTINUE
  14370. C LET1='p'WILL COME HERE TOO. HANDLE IT SINCE IT'S NUMERIC STUFF.
  14371. C    IRX=(NC-1)*60+NR
  14372.     CALL REFLEC(NC,NR,IRX)
  14373.     IF(NR.EQ.0.OR.NC.EQ.0)GOTO 7961
  14374.     FORM2(118)=CHAR(15)
  14375.     DO 7113 IVV=1,128
  14376. 7113    FORM(IVV)=FORM2(IVV)
  14377.     INRW=PROW
  14378.     INCL=PCOL
  14379.     JOUTR=1
  14380.     JOUTC=2
  14381. C A1 = OUT LOCATION FOR INPUT CELL NAMES
  14382.     JRTR=1
  14383.     JRTC=1
  14384.     IF(CMDLIN(3).EQ.'R')CALL RELVBL(FORM,FORM2,JOUTR,JOUTC,
  14385.      1  INRW,INCL,JRTR,JRTC)
  14386. C ALLOW RELOCATION ON LOADING SAVED SHEET IF DESIRED.
  14387.     CALL FVLDST(NR,NC,FORM2(119))
  14388. C    FVLD(NR,NC)=FORM2(119)
  14389.     CALL TYPSET(NR,NC,KKTYP)
  14390. C    TYPE(NR,NC)=KKTYP
  14391.     CALL CA2E(FORM2,FORM)
  14392.     IF(LET1.NE.'p')CALL WRKFIL(IRX,FORM,1)
  14393. C    WRITE(7'IRX)FORM2
  14394.     IF(LET1.NE.'p')GOTO 7961
  14395. C HAVE LOWERCASE 'p' NOW AS NUMERIC SAVE FLAG FOR THIS RECORD.
  14396.         if(Ibin.eq.1)xvbls(1,1)=r8s
  14397.         If(Ibin.eq.0)
  14398.      1  READ(CFORM2(1:35),6408,ERR=7961)XVBLS(1,1)
  14399. 6408    FORMAT(BN,D30.19)
  14400.         If(Cmdlin(4).ne.'-'.And.Cmdlin(4).ne.'+')Goto 982
  14401.     CALL XVBLGT(NR,NC,R8WK)
  14402.     IF(CMDLIN(4).EQ.'+')XVBLS(1,1)=XVBLS(1,1)+R8WK
  14403.     IF(CMDLIN(4).EQ.'-')XVBLS(1,1)=R8WK-XVBLS(1,1)
  14404. C IMPLEMENT ADDING AND SUBTRACTING SAVED SHEETS FROM CURRENT.
  14405. C GOES TO RECALC MANUAL MODE SINCE RECALC WOULD MESS UP
  14406. C VALUES; FORMULAS GET UPDATED FROM LAST-READ SHEET NORMALLY.
  14407. 982     Continue
  14408.     CALL XVBLST(NR,NC,XVBLS(1,1))
  14409.     GOTO 7961
  14410. 6500    CONTINUE
  14411. C HERE READ MAPPINGS
  14412.     IRRW=IRRW-64000
  14413.     ICCL=ICCL-64000
  14414. C RESTORE OFFSETS TO NORMAL RANGE
  14415.         If(Ibin.eq.0)
  14416.      1  READ(CFORM2(1:35),6501,ERR=7961)II,III
  14417.         If(Ibin.eq.1)ii=i4s
  14418.     if(Ibin.ne.1)goto 9510
  14419. c overcome alignment restrictions on sun etc...
  14420.     i4ttc(1)=form2(3)
  14421.     i4ttc(2)=form2(4)
  14422.     i4ttc(3)=form2(5)
  14423.     i4ttc(4)=form2(6)
  14424.     i4t=i4ttt
  14425. 9510    continue
  14426.         If(Ibin.eq.1)iii=i4t
  14427. 6501    FORMAT(2I7)
  14428.     NRDSP(IRRW,ICCL)=II
  14429.     NCDSP(IRRW,ICCL)=III
  14430. C GO BACK FOR MORE. INEFFICIENT STORAGE OF MAP BUT IT'S COMPACT
  14431. C CODE...
  14432.     GOTO 7961
  14433. 7964    CONTINUE
  14434.     CLOSE(4)
  14435. 9990    NXINI=0
  14436.     RETURN
  14437. 510    CONTINUE
  14438.     IRTN=1
  14439.     NXINI=0
  14440.     CLOSE(IOLVL)
  14441. c    CLOSE(11)
  14442. c    OPEN(5,FILE='CON:0/0/100/100/Analy Command')
  14443.     RETURN
  14444.     END
  14445. c -h- pmtx2.for    Tue Sep  2 10:58:55 1986    
  14446.     SUBROUTINE PMTX2(IRTCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  14447.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  14448.     CHARACTER*1 LINE(80)
  14449.     CALL GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  14450.      1  ID2B,RETCD)
  14451. C GET LOC OF MATRIX A (MUST BE SQUARE)
  14452.     IBGN=LSTCHR+1
  14453.     IF(RETCD.NE.0.OR.IMXX.LE.1)GOTO 1000
  14454.     IF(LINE(LSTCHR).NE.',')GOTO 300
  14455.     CALL GMTX(LINE,IBGN,LSTCHR,IDXA,IDXB,IDYA,
  14456.      1  IDYB,RETCD)
  14457. C GET LOC OF MATRIX X (RESULT).
  14458.     IBGN=LSTCHR+1
  14459.     IF(RETCD.NE.0.OR.IMXX.LE.2)GOTO 1000
  14460.     IF(LINE(LSTCHR).NE.',')GOTO 300
  14461.     CALL GMTX(LINE,IBGN,LSTCHR,IDBA,IDBB,IDCA,
  14462.      1  IDCB,RETCD)
  14463.     IBGN=LSTCHR+1
  14464. C GET LOC OF MATRIX B (AX=B), THE OTHER HALF OF OUR GIVENS
  14465. C IF WE FALL TO HERE, ALL LOOKS OK, SO LEAVE RETCD ALONE.
  14466. C HOWEVER IF ANY ERRS HAVE OCCURRED, RETCD IS ALREADY SET TO 3
  14467. C FOR ERROR...
  14468. 1000    RETURN
  14469. 300    CONTINUE
  14470.     RETCD=3
  14471.     RETURN
  14472.     END
  14473. c -h- postvl.for    Tue Sep  2 10:58:55 1986    
  14474.     SUBROUTINE POSTVL (RETCD)
  14475. C COPYRIGHT (C) 1983 GLENN EVERHART
  14476. C ALL RIGHTS RESERVED
  14477. C 60=MAX REAL ROWS
  14478. C 301=MAX REAL COLS
  14479. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  14480. C VBLS AND TYPE DIMENSIONED 60,301
  14481. C **************************************************
  14482. C *                                                *
  14483.  
  14484. C *      SUBROUTINE  POSTVL (RETCD)                *
  14485. C *                                                *
  14486. C **************************************************
  14487. C
  14488. C
  14489. C  CONVERTS POSTFIX EXPRESSIONS IN STACK 1 TO A VALUE
  14490. C
  14491. C
  14492. C    RETCD    MEANING
  14493. C
  14494. C    1    O.K.
  14495. C    2    ERROR
  14496. C
  14497. C POSTVL CALLS
  14498. C
  14499. C CALBIN    CALCULATES BINARY OPERATIONS
  14500. C CALUN     CALCULATES UNARY OPERATIONS
  14501. C ERRMSG    PRINTS OUT ERROR MESSAGES
  14502. C VAROUT    OUTPUTS THE VALUE OF A VARIABLE
  14503. C
  14504. C
  14505. C
  14506. C
  14507. C POSTVL IS CALLED BY CALC
  14508. C
  14509. C
  14510. C
  14511. C
  14512. C VARIABLE    USE
  14513. C _________ ___________________________
  14514. C
  14515. C    I,K     TEMPORARY VALUES
  14516. C
  14517. C    PT1     POINTS TO TOP ELEMENT IN STACK1
  14518. C
  14519. C    RETCD   RETURN CODE: 1=O.K., 2=ERROR
  14520. C
  14521. C    RETCD2  USED TO HOLD RETURN CODE WHEN CALLS TO
  14522. C            OTHER ROUTINES ARE MADE.
  14523. C
  14524. C    ST1PT   STACK 1 POINTER.
  14525. C
  14526. C    ST2PT   STACK 2 POINTER.
  14527. C
  14528. C    ST1TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 1
  14529. C
  14530. C    ST2TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 2
  14531. C
  14532. C    STACK1  HOLDS ORIGINAL POSTFIX EXPRESSION.
  14533. C
  14534. C    STACK2  USED TO EVALUATE EXPRESSION IN STACK1.
  14535. C
  14536. C    TYPE(27) HOLDS THE DATA TYPE FOR EACH OF THE VARIABLES.
  14537. C
  14538. C    AVBLS(100,27) HOLDS VALUES OF VARIABLES.
  14539. C    VBLS(8,60,301) HOLDS VALUE OF COMPLEXLY-NAMED VARIABLES. 1ST 27 ELEMENTS
  14540. C    ARE PLACE HOLDERS FOR AVBLS; ROUTINES THAT GENERATE DIMENSIONS ID1,ID2
  14541. C    FOR VBLS RETURN DIMENSIONS 1-27,1 FOR A-Z,%. THESE RESULT IN AVBLS
  14542. C    ARRAY BEING USED. VBLS ARRAY (MAX LENGTH 8 BYTES/VARIABLE) IS USED
  14543. C    FOR OTHER VARIABLES WHOSE NAMES ARE <ALPHA><ALPHA><NUM><NUM>
  14544. C    (WITH OPTION FOR ANY REASONABLE # OF ALPHAS AND NUMERICS BUT CLAMPED
  14545. C    AT 60,301 VALUES TO WORK CORRECTLY.)
  14546. C
  14547. C    VIEWSW   VIEW SWITCH:
  14548. C                0 = OFF
  14549. C                1 = DISPLAY COMMANDS
  14550. C                2 = DISPLAY VALUE OF EXPRESSIONS
  14551. C                3 = DISPLAY ALL
  14552. C
  14553. C
  14554. C
  14555. C    SUBROUTINE POSTVL (RETCD)
  14556. C
  14557.     InTeGer*4 LEVEL,NONBLK,LEND
  14558.     InTeGer*4 PT1
  14559.     InTeGer*4 VIEWSW,BASED
  14560.     InTeGer*4 RETCD,RETCD2,VLEN(9)
  14561.     InTeGer*4 TYPE(1,2)
  14562.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  14563.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  14564.     InTeGer*4 I,K
  14565. C
  14566.     CHARACTER*1 LINE(80)
  14567.     CHARACTER*1 STACK1(8,40), STACK2(8,40),AVBLS(24,27)
  14568.     Real*8 rstack1(40),rstack2(40)
  14569.     equivalence(rstack1(1),stack1(1,1))
  14570.     equivalence(rstack2(1),stack2(1,1))
  14571.     Real*8 VAVBLS(3,27)
  14572.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  14573.     CHARACTER*1 VBLS(8,1,1)
  14574. C
  14575.     COMMON /STACKx/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  14576.      ;           ST1LIM,ST2LIM
  14577.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  14578.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  14579. C
  14580. C
  14581.     RETCD=1
  14582. C
  14583. C
  14584. C IF THERE IS ONE ELEMENT IN STACK1 AND IT IS NOT
  14585. C A NUMBER, THE EXPRESSION IS ILLEGAL (GO TO 95).
  14586.     IF(ST1PT.EQ.2.AND.ST1TYP(1).GT.30)GO TO 95
  14587. C
  14588. C
  14589. 10    IF (ST1PT.GT.2) GOTO 40
  14590.     IF (ST1PT.EQ.1) GOTO 95
  14591. C
  14592. C
  14593. C ***************************************
  14594. C ****** ONLY 1 ELEMENT ON STACK 1 ******
  14595. C ***************************************
  14596.     K=VLEN(ST1TYP(ST1PT-1))
  14597. C
  14598. C
  14599. C COPY INTO VARIABLE %
  14600.     if(k.ne.8)goto 3223
  14601.     vavbls(1,27)=rstack1(1)
  14602.     goto 3222
  14603. c special case for real*8 since that's the most common
  14604. 3223    continue
  14605.     DO 20 I=1,K
  14606. 20    AVBLS(I,27)=STACK1(I,1)
  14607. 3222    continue
  14608.     CALL TYPSET(27,1,ST1TYP(1))
  14609. C    TYPE(27,1)=ST1TYP(1)
  14610. C
  14611. C
  14612. C OUTPUT VALUE OF %
  14613.     IF (VIEWSW.GT.1) CALL VAROUT(27,1)
  14614.     RETURN
  14615. C
  14616. C
  14617. C  MORE THAN ONE ELEMENT ON STACK1
  14618. 40    CONTINUE
  14619.     IF (ST1TYP(ST1PT-1).LE.30) GOTO 90
  14620.     IF (ST2PT.LE.ST2LIM) GOTO 45
  14621. C
  14622. C
  14623. C *** ERROR *** STACK 2 OVERFLOW
  14624.     CALL ERRMSG(9)
  14625. 43    RETCD=2
  14626.     RETURN
  14627. C
  14628. C
  14629. C
  14630. C
  14631. C ****************************************
  14632. C ****** OPERATOR SO PUT ON STACK 2 ******
  14633. C ****************************************
  14634. 45    ST2TYP(ST2PT)=ST1TYP(ST1PT-1)
  14635.     ST2PT=ST2PT+1
  14636.     ST1PT=ST1PT-1
  14637.     IF(ST1PT.EQ.1)GO TO 95
  14638.     GOTO 40
  14639. C
  14640. C
  14641. C
  14642. C
  14643. C
  14644. C *********************
  14645. C ****** OPERAND ******
  14646. C *********************
  14647. C
  14648. C FIRST BE SURE THAT THERE IS AN OPERATOR INVOLVED ON STACK 2
  14649. C (IF ONLY ONE ELEMENT IN STACK 1 YOU SHOULD NOT BE HERE).
  14650. 90    IF(ST2PT.NE.1)GO TO 110
  14651. C
  14652. C
  14653. C *** ERROR *** ILLLEGAL EXPRESSION
  14654. 95    CALL ERRMSG(8)
  14655.     GO TO 43
  14656. C
  14657. C
  14658. C
  14659. C
  14660. C ENTER HERE AFTER APPLYING AN OPERATOR TO A NUMBER
  14661. 100    IF (ST2PT.EQ.1) GOTO 10
  14662. 110    K=ST2TYP(ST2PT-1)
  14663. C
  14664. C IF A UNARY OPERATOR, GO TO 190
  14665.     IF ((K.GT.30.AND.K.LE.47).OR.K.EQ.111) GOTO 190
  14666. C
  14667. C
  14668. C IF A BINARY OPERATOR, GO TO 170
  14669.     IF (K.GE.110.AND.K.LE.117) GOTO 170
  14670.     IF(K.EQ.200)GO TO 170
  14671. C
  14672. C IF ELEMENT ON STACK2 AT ST2PT-1 IS AN OPERAND, APPLY CALBIN AGAIN
  14673.     IF(K.LE.30) GO TO 180
  14674.     STOP 110
  14675. C
  14676. C
  14677. C
  14678. C
  14679. C ***************************************************************
  14680. C ****** CALBIN CALCULATES THE BINARY VALUE OF AN OPERATOR ******
  14681. C ***************************************************************
  14682. C  UPON ENTRANCE:
  14683. C    OPERAND 1 IS IN STACK 1
  14684. C    OPERAND 2 IS IN STACK 2
  14685. C    OPERATOR IS BELOW OPERAND 2
  14686. C  UPON EXIT RESULT IS ON STACK 1
  14687. C
  14688. C    RETURN CODE    MEANING
  14689. C
  14690. C    1        O.K.
  14691. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  14692. C    3        ERROR ENCOUNTERED
  14693. C
  14694. C
  14695. 170    CONTINUE
  14696. C
  14697. C
  14698. C FIRST PUT OPERAND 2 ONTO STACK 2
  14699.     PT1=ST1PT-1
  14700.     ST2TYP(ST2PT)=ST1TYP(PT1)
  14701.     K=VLEN(ST2TYP(ST2PT))
  14702.     DO 175 I=1,K
  14703. 175    STACK2(I,ST2PT)=STACK1(I,PT1)
  14704.     ST1PT=ST1PT-1
  14705.     IF(ST1PT.EQ.1)GO TO 95
  14706.     ST2PT=ST2PT+1
  14707. C
  14708. C
  14709. C IF OPERAND 1 IS AN OPERATOR, PUT IT ON STACK 2 (GO TO 45)
  14710.     IF(ST1TYP(ST1PT-1).GT.30) GO TO 45
  14711. 180    CALL CALBIN (RETCD2)
  14712.     GOTO (100,1000,43), RETCD2
  14713.     STOP 180
  14714. C
  14715. C
  14716. C
  14717. C
  14718. C
  14719. C ********************************************************************
  14720. C ****** CALL CALUN TO CALCULATE THE VALUE OF A UNARY OPERATION ******
  14721. C ********************************************************************
  14722. C    OPERATOR IS IN STACK 2
  14723. C    OPERAND IS IN STACK 1
  14724. C    UPON EXIT, OPERATOR IS POPPED OFF STACK 2
  14725. C
  14726. C    RETURN CODE    MEANING
  14727. C
  14728. C    1        O.K.
  14729. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  14730. C    3        ERROR ENCOUNTERED
  14731. C
  14732. C
  14733. 190    CALL CALUN (RETCD2)
  14734.     GOTO(100,43),RETCD2
  14735.     STOP 190
  14736. C
  14737. C
  14738. 1000    RETURN
  14739.     END
  14740. c -h- prtcon.for    Tue Sep  2 10:58:55 1986    
  14741. C **********************************
  14742. C *                                *
  14743. C *    INTERNAL FUNCTION PRTCON    *
  14744. C *                                *
  14745. C **********************************
  14746. C CALLED BY MOUT ONLY
  14747. C CONVERTS 0 TO APPROPRIATE NUMBER FOR PRINTING WITH VECTOR DIGITS
  14748.     FUNCTION PRTCON(L1,IBASE)
  14749.     InTeGer*4 BASE(3)
  14750.     InTeGer*4 IBASE,K
  14751.     CHARACTER*1 L1,PRTCON,DIGITS(16,3)
  14752.     COMMON /DIGV/ DIGITS
  14753.     save base
  14754.     DATA BASE /10,8,16/
  14755.     PRTCON=L1
  14756.     IF(L1.EQ.char(0))PRTCON=CHAR(BASE(IBASE))
  14757.     K=ICHAR(PRTCON)
  14758.     PRTCON=DIGITS(K,IBASE)
  14759.     RETURN
  14760.     END
  14761. c -h- rassig.for    Tue Sep  2 10:58:55 1986    
  14762.     SUBROUTINE RASSIG(IUNIT,NAME,ierr)
  14763. C
  14764. C
  14765.     CHARACTER*1 NAME(50)
  14766.     InTeGer*4 IUNIT,ierr
  14767. C &&&& MS FTN 3.2
  14768.     LOGICAL LEXIST
  14769. C &&&&
  14770.     CHARACTER*20 WK
  14771.     CHARACTER*1 WK1(20)
  14772.     EQUIVALENCE(WK(1:1),WK1(1))
  14773. C JUST TRY AND NULL FILL A NAME TO USE.
  14774.     ierr=0
  14775.     DO 1 N=1,20
  14776.     WK1(N)=' '
  14777. 1    CONTINUE
  14778.     DO 2 N=1,20
  14779.     II=ICHAR(NAME(N))
  14780.     IF(II.LT.32)GOTO 3
  14781.     WK1(N)=CHAR(II)
  14782. C1    CONTINUE
  14783. 2    CONTINUE
  14784. 3    CONTINUE
  14785. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  14786. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  14787. C AVOID CRASHES IF THE FILE ISN'T THERE...
  14788. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  14789. C &&&&
  14790. C
  14791. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  14792. C
  14793.     INQUIRE(FILE=WK(1:20),EXIST=LEXIST)
  14794.     IF(LEXIST)GOTO 100
  14795. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  14796. C IF CREATE FAILS WE LOSE TOO...
  14797. c    CALL UVT100(1,1,1)
  14798. c    CALL SWRT('File not found. Attempting to create.',37)
  14799. c    OPEN(IUNIT,FILE=WK,STATUS='NEW',ACCESS='SEQUENTIAL',
  14800. c     1  FORM='FORMATTED')
  14801. c    CLOSE(IUNIT)
  14802. c
  14803. c On failure to open a file, create a window instead which
  14804. c can be its surrogate...
  14805.     ierr=1
  14806. c flag error if no file to read
  14807. c
  14808. c    Open(Iunit,file='con:200/100/400/60/RdErr' // wk,
  14809. c     1  Access='Sequential',form='Formatted')
  14810. cccc    Open(Iunit,file='/dev/tty',
  14811. cccc     1  Access='Sequential',form='Formatted')
  14812. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  14813. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  14814.     Goto 77
  14815. 100    CONTINUE
  14816. C &&&&
  14817. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  14818.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  14819.      1  FORM='FORMATTED')
  14820. 77    CONTINUE
  14821. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  14822. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  14823.     RETURN
  14824.     END
  14825. c -h- recalc.f40    Tue Sep  2 10:58:55 1986    
  14826.     SUBROUTINE RECALC
  14827. C COPYRIGHT (C) 1983,1984,1985,1986 GLENN EVERHART
  14828. C ALL RIGHTS RESERVED
  14829. C RECALCULATE COMMAND
  14830. C RECOMPUTE ALL ELEMENTS OF SPREADSHEET WHERE VALID.
  14831. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  14832. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  14833. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  14834. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  14835. C FROM THE DISK BASED FILE HERE.
  14836.     Include aparms.inc
  14837.     CHARACTER*1 FORM,FVLD
  14838. c    INTEGER*4 VNLT
  14839. C ***<<< XVXTCD COMMON START >>>***
  14840.     CHARACTER*1 OARRY(100)
  14841.     InTeGer*4 OSWIT,OCNTR
  14842. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  14843. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  14844.     InTeGer*4 IPS1,IPS2,MODFLG
  14845. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  14846.        InTeGer*4 XTCFG,IPSET,XTNCNT
  14847.        CHARACTER*1 XTNCMD(80)
  14848. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  14849. C VARY FLAG ITERATION COUNT
  14850.     INTEGER KALKIT
  14851. C    COMMON/VARYIT/KALKIT
  14852.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  14853.     InTeGer*4 RCMODE,IRCE1,IRCE2
  14854. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14855. C     1  IRCE2
  14856. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  14857. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  14858. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  14859. C RCFGX ON.
  14860. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  14861. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  14862. C  AND VM INHIBITS. (SETS TO 1).
  14863.     INTEGER*4 FH
  14864. C FILE HANDLE FOR CONSOLE I/O (RAW)
  14865. C    COMMON/CONSFH/FH
  14866.     CHARACTER*1 ARGSTR(52,4)
  14867. C    COMMON/ARGSTR/ARGSTR
  14868.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  14869.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  14870.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  14871.      3  IRCE2,FH,ARGSTR
  14872. C ***<<< XVXTCD COMMON END >>>***
  14873. CCCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  14874. CCCC     1  IRCE1,IRCE2
  14875. CCCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  14876. CCCC     1  IRCE1,IRCE2
  14877. C ***<<< KLSTO COMMON START >>>***
  14878.     InTeGer*4 DLFG
  14879. C    COMMON/DLFG/DLFG
  14880.     InTeGer*4 KDRW,KDCL
  14881. C    COMMON/DOT/KDRW,KDCL
  14882.     InTeGer*4 DTRENA
  14883. C    COMMON/DTRCMN/DTRENA
  14884.     REAL*8 EP,PV,FV
  14885.     DIMENSION EP(20)
  14886.     INTEGER*4 KIRR
  14887. C    COMMON/ERNPER/EP,PV,FV,KIRR
  14888.     InTeGer*4 LASTOP
  14889. C    COMMON/ERROR/LASTOP
  14890.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  14891. C    COMMON/FMTBFR/FMTDAT
  14892.     CHARACTER*1 EDNAM(16)
  14893. C    COMMON/EDNAM/EDNAM
  14894.     InTeGer*4 MFID(2),MFMOD(2)
  14895. C    COMMON/FRM/MFID,MFMOD
  14896.     InTeGer*4 JMVFG,JMVOLD
  14897. C    COMMON/FUBAR/JMVFG,JMVOLD
  14898.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  14899.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  14900. C ***<<< KLSTO COMMON END >>>***
  14901. CCC    InTeGer*4 DLFG
  14902. CCC    COMMON/DLFG/DLFG
  14903. C DLFG=1 IF D## FORMS HAVE BEEN SEEN, ELSE 0
  14904.     DIMENSION FORM(128),FVLD(1,1)
  14905.     COMMON/FVLDC/FVLD
  14906. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  14907. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  14908. C SO INITIALLY IGNORE.
  14909. C FVLD=-2 OR -3 = DISPLAY FORMULA
  14910. C FVLD=3 NUMERIC, COMPUTE ONCE THEN SET FVLD TO 2
  14911. C FVLD=2 NUMERIC CONSTANT, ALREADY COMPUTED... DO NOT RECOMPUTE.
  14912. C
  14913. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  14914. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  14915. C ***<<<< RDD COMMON START >>>***
  14916.     InTeGer*4 RRWACT,RCLACT
  14917. C    COMMON/RCLACT/RRWACT,RCLACT
  14918.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  14919.      1  IDOL7,IDOL8
  14920. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  14921. C     1  IDOL7,IDOL8
  14922.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  14923. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14924.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14925. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  14926. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  14927. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  14928.     InTeGer*4 KLVL
  14929. C    COMMON/KLVL/KLVL
  14930.     InTeGer*4 IOLVL,IGOLD
  14931. C    COMMON/IOLVL/IOLVL
  14932. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  14933. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  14934.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14935.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14936.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  14937.      3  k3dfg,kcdelt,krdelt,kpag
  14938. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  14939. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  14940. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  14941. C ***<<< RDD COMMON END >>>***
  14942. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14943. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  14944.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  14945.     COMMON/D2R/NRDSP,NCDSP
  14946.     InTeGer*4 TYPE(1,2),VLEN(9)
  14947.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  14948.     Real*8 VAVBLS(3,27)
  14949.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  14950. CCC    InTeGer*4 RRWACT,RCLACT
  14951. CCC    COMMON/RCLACT/RRWACT,RCLACT
  14952. CCC    InTeGer*4 KDRW,KDCL
  14953. CCC    COMMON /DOT/KDRW,KDCL
  14954.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  14955.     InTeGer*4 PRS,PCS,DRS,DCS
  14956.     Character*6 cwrk6
  14957.     PRS=PROW
  14958.     PCS=PCOL
  14959.     DRS=DROW
  14960.     DCS=DCOL
  14961.     IF(RCMODE.EQ.2)GOTO 5500
  14962. C THE FOLLOWING 2 LOOPS DEFINE ORDER OF CALCULATION.
  14963. C HERE THIS IS: OUTER LOOP ON ROWS (ACROSS), INNER LOOP ON COLUMNS (DOWN).
  14964. C NOTE THAT N2 DEFINES THE SHEET. SINCE 1 IS THE ACCUMULATORS, JUST GO THRU
  14965. C FOR THE SHEET, NOT THE AC'S.
  14966.     DO 1 N2=2,RCLACT
  14967.     IF(IDOL8.EQ.0)GOTO 8220
  14968. C VIEW HACK HERE
  14969. C DISPLAY ROW NUMBER FOLLOWED BY BARE CR DURING RECALC
  14970.     KKKK=13
  14971. C 13 IS ASCII CARRIAGE RETURN
  14972.     write(cwrk6,8221)n2
  14973.     call uvt100(1,llcmd,60)
  14974.     call vwrt(cwrk6,5)
  14975. c    REWIND 11
  14976. c    WRITE(11,8221)N2,KKKK
  14977. c    REWIND 11
  14978. 8221    FORMAT(I5,1A1)
  14979. 8220    CONTINUE
  14980.     N1=1
  14981. 220    CONTINUE
  14982. C    DO 2 N1=1,60
  14983. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  14984. C FASTER THAN STANDARD LOOP METHOD.
  14985. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  14986. C OF FVLDGT AND FVPEEK.
  14987. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  14988. CCCC COMMENT 2 LINES OUT WHEN FAST FVLDGT IS IN TO SPEED UP MORE...
  14989. CCCC EXTRA LOGIC IN FVPEEK DOESN'T USUALLY PAY FOR ITSELF...
  14990. CCC    CALL FVPEEK(N1,N2,NN1)
  14991. CCC    N1=NN1
  14992.     CALL FVLDGT(N1,N2,FVLD(1,1))
  14993.     IIFV=JCHAR(FVLD(1,1))
  14994.     IF (IIFV.LE.0) GOTO 2
  14995.     IRRX=(N2-1)*MCols+N1
  14996. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  14997. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  14998.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 2
  14999.     KDRW=N1
  15000.     KDCL=N2
  15001.     PROW=N1
  15002.     PCOL=N2
  15003. C SEE IF THIS PHYS COL HAS A DISPLAY COL. AND IF SO SET THAT UP.
  15004. C ONLY SET TO DISPLAYED LOCS HERE TO MINIMIZE SEARCH TIME.
  15005. C NEED THIS TO HANDLE D## FORMS...
  15006.     IF (DLFG.EQ.0)GOTO 95
  15007. C IF NEVER HAD A D## FORM FORGET LOOKING FOR DISPLAY LOCS.
  15008.     DO 20 M2=1,DCLV
  15009.     DO 10 M1=1,DRWV
  15010.     M1X=M1
  15011.     M2X=M2
  15012. C LOOK FOR DISPLAY COORDS EVEN IF IN HYPERSPACE
  15013. C WE FIND ONE IF INDEX FROM REFLECT IS SAME AS WHAT
  15014. C WE'RE LOOKING FOR...
  15015.     IF(NRDSP(M1,M2).EQ.N1.AND.NCDSP(M1,M2).EQ.N2)GOTO 9
  15016. 10    CONTINUE
  15017. 20    CONTINUE
  15018. 95    CONTINUE
  15019. C HERE IF CELL NOT DISPLAYED... SEE IF NEEDS DOING IN RI, RE MODES
  15020.     IF(RCMODE.LE.0)GOTO 9
  15021.     IF(PROW.NE.IRCE1.OR.PCOL.NE.IRCE2)GOTO 2
  15022. C SKIP UNLESS ENTER CELL.
  15023. 9    CONTINUE
  15024. C IF NO DISPLAY ROW, LEAVE AT LOW RIGHT...
  15025. C USE SAVED VALUES SO WE DON'T RELY ON DO LOOP INDEX AFTER LOOP END.
  15026.     DROW=M1X
  15027.     DCOL=M2X
  15028.     CALL WRKFIL(IRRX,FORM,0)
  15029. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  15030.     LFST=1
  15031. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  15032. C THEM UP A BIT.
  15033.     DO 56 N=1,109
  15034.     LLST=111-N
  15035.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 57
  15036.     FORM(LLST)=Char(0)
  15037. 56    CONTINUE
  15038. 57    CONTINUE
  15039.     FORM(LLST)=Char(0)
  15040.     FORM(111)=Char(0)
  15041. C    IF(ICHAR(FORM(118)).NE.15)GOTO 2
  15042. c ****&&&& experimental...
  15043. c &&&&&**** replace llst by llst-1
  15044. c    llst=max0(1,llst-1)
  15045.     CALL DOENTR(FORM,LFST,LLST)
  15046. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  15047. C    CALL FVLDGT(N1,N2,FVLD(1,1))
  15048.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  15049. 2    CONTINUE
  15050.     N1=N1+1
  15051.     IF(N1.LE.RRWACT)GOTO 220
  15052. 1    CONTINUE
  15053.     GOTO 5600
  15054. 5500    CONTINUE
  15055. C RCMODE=2 AND NOT RM MODE
  15056. C (IN RM MODE, RECALC IS NOT CALLED...)
  15057.     DO 1701 M2=1,DCLV
  15058.     IF(IDOL8.EQ.0)GOTO 8222
  15059. C VIEW HACK HERE
  15060. C DISPLAY ROW NUMBER FOLLOWED BY BARE CR DURING RECALC
  15061.     KKKK=13
  15062. C 13 IS ASCII CARRIAGE RETURN
  15063.     write(cwrk6,8221)n2
  15064.     call uvt100(1,llcmd,60)
  15065.     call vwrt(cwrk6,5)
  15066. C 13 IS ASCII CARRIAGE RETURN
  15067. c    REWIND 11
  15068. c    WRITE(11,8221)M2,KKKK
  15069. c    REWIND 11
  15070. 8222    CONTINUE
  15071.     KDRW=1
  15072.     KDCL=2
  15073.     DO 1702 M1=1,DRWV
  15074. C TO HANDLE DISPLAY WHEREVER IT MAY BE, FIND ID OF PHYS CELL AND
  15075. C CONVERT TO PHYS ROW, COL AGAIN REGARDLESS OF ALIAS...
  15076. C (NOTE CALC ORDER IS THEREFORE DISPLAY ORDER, NOT SHEET ORDER...)
  15077.     K=NRDSP(M1,M2)
  15078.     KK=NCDSP(M1,M2)
  15079.     CALL REFLEC(KK,K,IV1)
  15080.     NRC=IV1-1
  15081.     N1=MOD(NRC,MCols)+1
  15082.     N2=((NRC-N1+1)/MCols)+1
  15083. C COMPUTE PHYS ROW, COL FROM DISPLAY COORDINATES.
  15084. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  15085. C FASTER THAN STANDARD LOOP METHOD.
  15086. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  15087. C OF FVLDGT AND FVPEEK.
  15088. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  15089.     If (N1.gt.RRWACT.or.N2.Gt.RCLACT) GOTO 1702
  15090.     CALL FVLDGT(N1,N2,FVLD(1,1))
  15091.     IIFV=JCHAR(FVLD(1,1))
  15092.     IF (IIFV.LE.0) GOTO 1702
  15093. C FORGET THIS CELL IF NOT A COMPUTABLE ONE...
  15094.     IRRX=IV1
  15095. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  15096. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  15097.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 1702
  15098.     KDRW=N1
  15099.     KDCL=N2
  15100.     PROW=N1
  15101.     PCOL=N2
  15102.     DROW=M1
  15103.     DCOL=M2
  15104.     CALL WRKFIL(IRRX,FORM,0)
  15105. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  15106.     LFST=1
  15107. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  15108. C THEM UP A BIT.
  15109. C (ALSO GUARANTEE WE HAVE LOTS OF NULLS AT END TO TERMINATE INDEX ROUTINES)
  15110.     DO 756 N=1,109
  15111.     LLST=111-N
  15112.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 757
  15113.     FORM(LLST)=Char(0)
  15114. 756    CONTINUE
  15115. 757    CONTINUE
  15116.     FORM(LLST)=Char(0)
  15117.     FORM(111)=Char(0)
  15118. C CALL DOENTR TO DO THE ACTUAL COMPUTATION WORK...
  15119.     CALL DOENTR(FORM,LFST,LLST)
  15120. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  15121.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  15122. 1702    CONTINUE
  15123. 1701    CONTINUE
  15124. C END OF COMPUTATION OVER DISPLAYS
  15125. C    GOTO 5600
  15126. 5600    CONTINUE
  15127.     PROW=PRS
  15128.     PCOL=PCS
  15129.     DROW=DRS
  15130.     DCOL=DCOL
  15131. C FORCE FUNCTION WORKS ONCE ONLY.
  15132.     RCONE=0
  15133.     RCMODE=IABS(RCMODE)
  15134. C SET FOR TEMP. RECALC-ALL MODES TO RETURN TO NORMAL.
  15135.     IRCE1=0
  15136.     IRCE2=0
  15137.     RETURN
  15138.     END
  15139. c -h- reflect.f40    Tue Sep  2 10:58:55 1986    
  15140.     SUBROUTINE REFLEC(ID1,ID2,ID)
  15141. C FORM ID OUT OF ID1,ID2 BUT USING REFLECTED VALUES SO THAT
  15142. C RESULT ID IS ALWAYS IN PRIME AREA.
  15143.     Include aparms.inc
  15144.     InTeGer*4 ID,ID1,ID2,IDD1,IDD2
  15145. C ***<<< NULETC COMMON START >>>***
  15146.     InTeGer*4 ICREF,IRREF
  15147. C    COMMON/MIRROR/ICREF,IRREF
  15148.     InTeGer*4 MODPUB,LIMODE
  15149. C    COMMON/MODPUB/MODPUB,LIMODE
  15150.     InTeGer*4 KLKC,KLKR
  15151.     REAL*8 AACP,AACQ
  15152. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  15153.     InTeGer*4 NCEL,NXINI
  15154. C    COMMON/NCEL/NCEL,NXINI
  15155.     CHARACTER*1 NAMARY(20,MRows)
  15156. C    COMMON/NMNMNM/NAMARY
  15157.     InTeGer*4 NULAST,LFVD
  15158. C    COMMON/NULXXX/NULAST,LFVD
  15159.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  15160.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  15161. C ***<<< NULETC COMMON END >>>***
  15162. CCC    COMMON/MIRROR/ICREF,IRREF
  15163. C IN RECALC WE MOVE OVER PRIME AREA ONLY AND SEARCH FOR CELLS IN
  15164. C DISPLAY AREA THERE. THIS IMPLIES THAT WE DON'T FIND DISPLAY
  15165. C COORDS OF CELLS IN EXTENDED AREAS THERE.  THEREFORE THE RI AND RE
  15166. C MODES FAIL COMPLETELY THERE. SINCE WE WANT THE SYSTEM TO WORK IN
  15167. C A PREDICTABLE WAY, FORCE RECALC MODE (I.E., R OR RM MODES) THERE TO
  15168. C ALLOW CELLS TO BE COMPUTED.
  15169. C NOTE THAT IF WE ARE IN THE PRIME AREA AND ISSUE AN RE OR RI COMMAND,
  15170. C THAT MODE SHOULD STAY SET SO LONG AS WE STAY THERE SINCE THE RE OR
  15171. C RI MODES WILL INHIBIT COMPUTING OUTSIDE THAT AREA (AS LONG AS NOTHING
  15172. C REFLECTS INTO IT) SO THERE WILL BE NO REASON FOR THIS TO BE CALLED
  15173. C TO REFLECT SOMETHING BACK TO PRIME AREA UNTIL A R COMMAND IS GIVEN
  15174. C OR THE DISPLAY MOVES OFF THE EDGE OF THE PRIME 60 BY 301 AREA.
  15175. C
  15176. C ***<<< XVXTCD COMMON START >>>***
  15177.     CHARACTER*1 OARRY(100)
  15178.     InTeGer*4 OSWIT,OCNTR
  15179. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  15180. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  15181.     InTeGer*4 IPS1,IPS2,MODFLG
  15182. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  15183.        InTeGer*4 XTCFG,IPSET,XTNCNT
  15184.        CHARACTER*1 XTNCMD(80)
  15185. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  15186. C VARY FLAG ITERATION COUNT
  15187.     INTEGER KALKIT
  15188. C    COMMON/VARYIT/KALKIT
  15189.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  15190.     InTeGer*4 RCMODE,IRCE1,IRCE2
  15191. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  15192. C     1  IRCE2
  15193. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  15194. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  15195. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  15196. C RCFGX ON.
  15197. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  15198. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  15199. C  AND VM INHIBITS. (SETS TO 1).
  15200.     INTEGER*4 FH
  15201. C FILE HANDLE FOR CONSOLE I/O (RAW)
  15202. C    COMMON/CONSFH/FH
  15203.     CHARACTER*1 ARGSTR(52,4)
  15204. C    COMMON/ARGSTR/ARGSTR
  15205.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  15206.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  15207.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  15208.      3  IRCE2,FH,ARGSTR
  15209. C ***<<< XVXTCD COMMON END >>>***
  15210. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE
  15211. CCC    InTeGer*4 IRCE1,IRCE2
  15212. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,IRCE2
  15213.     IDD1=MAX0(ID1,1)
  15214.     IDD2=ID2
  15215. C ACCEPT TRICK CALLS WITH ID1=0 AS FROM GMSUBS, MTXEQU,
  15216. C AND MDST
  15217.     IF(ID1.LT.1)GOTO 2000
  15218. 4000    CONTINUE
  15219.     IF(IDD2.LE.MCols)GOTO 1000
  15220.     IDD2=IDD2-MCols
  15221.     IDD1=IDD1+IRREF
  15222. c    RCMODE=0
  15223. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  15224.     GOTO 4000
  15225. 1000    CONTINUE
  15226.     IF(IDD1.LE.MRows)GOTO 2000
  15227.     IDD1=IDD1-MRows+1
  15228.     IDD2=IDD2+ICREF
  15229. c    RCMODE=0
  15230. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  15231.     GOTO 4000
  15232. 2000    CONTINUE
  15233.     ID=(IDD1-1)*MCols+IDD2
  15234.     RETURN
  15235.     END
  15236. c -h- relvbl.for    Tue Sep  2 10:58:55 1986    
  15237.     SUBROUTINE RELVBL(LNIN,LNOUT,INRW,INCL,JOUTR,JOUTC,JRTR,JRTC)
  15238. C RELOCATE VARIABLES BELOW/RIGHT OF JRTR,JRTC INTO LNOUT FROM LNIN
  15239. C    PARAMETER CUP=1,ED=11,EL=12
  15240.     Include aparms.inc
  15241.     CHARACTER*1 NAME(4),NUMBER(6)
  15242.     CHARACTER*1 LNIN,LNOUT
  15243.     CHARACTER*6 NUMBR6
  15244.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  15245.     DIMENSION LNIN(128),LNOUT(128)
  15246. C ***<<<< RDD COMMON START >>>***
  15247.     InTeGer*4 RRWACT,RCLACT
  15248. C    COMMON/RCLACT/RRWACT,RCLACT
  15249.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  15250.      1  IDOL7,IDOL8
  15251. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  15252. C     1  IDOL7,IDOL8
  15253.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  15254. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  15255.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15256. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  15257. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  15258. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  15259.     InTeGer*4 KLVL
  15260. C    COMMON/KLVL/KLVL
  15261.     InTeGer*4 IOLVL,IGOLD
  15262. C    COMMON/IOLVL/IOLVL
  15263. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  15264.     Integer*4 K3dfg,kcdelt,krdelt,kpag,idol9,idsptp
  15265. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  15266.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  15267.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  15268.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,Idsptp,Idol9,
  15269.      3  k3dfg,kcdelt,krdelt,kpag
  15270. C ***<<< RDD COMMON END >>>***
  15271. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  15272. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  15273. C    LOGICAL*2 L63,L192,L255,L127,L128
  15274.     LOGICAL*4 L1,L2
  15275. C    InTeGer*4 I63,I192,I255,I127,I128
  15276.     InTeGer*4 I63,I192,I127
  15277.     InTeGer*4 I1,I2
  15278. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  15279.     EQUIVALENCE (I1,L1),(I2,L2)
  15280. C    EQUIVALENCE (L127,I127),(L128,I128)
  15281.     save i63,i192,i127
  15282. C    DATA I63/63/,I192/192/,I255/255/,I127/127/,I128/128/
  15283.     DATA I63/63/,I192/192/,I127/127/
  15284.     LI=1
  15285.     LO=1
  15286. C LI = INPUT LOCATION
  15287. C LO=OUTPUT LOCATION
  15288. 100    CONTINUE
  15289.     KSheet=0
  15290. C    IF(LNIN(LI).LT.'A'.OR.LNIN(LI).GT.'Z')GOTO 200
  15291.     LCC=ICHAR(LNIN(LI))
  15292. C IF WE HAVE 255,CODE,CODE THEN RELOCATE IN BINARY...
  15293.     IF(LCC.EQ.255)GOTO 500
  15294.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  15295. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  15296.     IL1=LI
  15297.     LE=110
  15298.     LSTC=LE
  15299.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  15300. C AVOID MESSING UP FUNCTION NAMES
  15301.     IF(ID2.EQ.1)IVLD=0
  15302. C    IF(ID2.EQ.1.AND.ID1.LE.27)IVLD=0
  15303.     IF(IVLD.EQ.0)GOTO 200
  15304. C FOUND VARIABLE. NOW GENERATE ASCII ANDSTUFF INTO OUTPUT.
  15305. C FIRST DON'T RELOCATE P## AND D## FORMS.
  15306.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  15307. C RELOCATE NORMAL VARIABLE HERE.
  15308. C
  15309. C THE NEW VARIABLE IS TO BE DIFFERENT ONLY IF (ID1,ID2) HAS
  15310. C ID1.GT.JRTR AND ID2.GT.JRTC
  15311.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 210
  15312.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 210
  15313. C OK, KNOW NOW THAT WE HAVE TO RELOCATE ALL.
  15314. C THEREFORE ADD THE DIFFERENCE BETWEEN DEST AND SRC TO BOTH
  15315. C AND CLAMP TO VALID DIMENSIONS.
  15316.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  15317.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  15318. 906    ID1=MAX0(ID1,1)
  15319.     ID2=MAX0(ID2,1)
  15320. C CAN UNPACK THIS STUFF ALL RIGHT IN EXTENDED WAYS.
  15321.     ID1=MIN0(MRC,ID1)
  15322.     ID2=MIN0(MRC,ID2)
  15323. 210    CONTINUE
  15324.     KSHEET=0
  15325.     IF(K3DFG.LE.2)GOTO 2221
  15326. C RENAME CELLS BY 3D NAMES. (NOTE FLAG TO DO THIS; USE FOR DISPLAYS)
  15327. C ID1 GETS REDUCED BY COL. DELTA AND ID2 BY ROW DELTA
  15328. C UNTIL ONE OR BOTH ARE LESS THAN THE DELTAS. THEN THE %NNNN IS TACKED ON
  15329. C THE END. THIS PERMITS USERS TO DECIDE WHETHER THEY WANT THINGS TRANSLATED
  15330. C TO SHEET NUMBER FORMAT OR NOT.
  15331.     IF(KCDELT.LE.0.AND.KRDELT.LE.0)GOTO 2221
  15332.     KRR1=MRC
  15333.     KCC1=MRC
  15334.     IF(KCDELT.GT.0)KCC1=(ID1-1)/KCDELT
  15335.     IF(KRDELT.GT.0)KRR1=(ID2-2)/KRDELT
  15336.     KSH=MIN0(KRR1,KCC1)
  15337.     IF(KSH.GE.(MRC-100))GOTO 2221
  15338. C IF BOTH DELTAS ARE ZERO DON'T TOUCH ANYTHING.
  15339.     KSHEET=MAX0(KSH,0)
  15340. C KSHEET NONZERO FLAGS WE MAKE THE MOD
  15341.     IF(ID1.LT.KSHEET*KCDELT)GOTO 2220
  15342.     IF((ID2-1).LT.KSHEET*KRDELT)GOTO 2220
  15343.     ID1=ID1-KSHEET*KCDELT
  15344.     ID2=ID2-KSHEET*KRDELT
  15345. c222    CONTINUE
  15346.     GOTO 2221
  15347. 2220    CONTINUE
  15348.     KSHEET=0
  15349. 2221    CONTINUE
  15350.     CALL IN2AS(ID1,NAME)
  15351. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  15352.     IL2=ID2-1
  15353.     WRITE(NUMBR6(1:6),1000)IL2
  15354. C    ENCODE(6,1000,NUMBER)IL2
  15355. 1000    FORMAT(I6)
  15356. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  15357. C THROW OUT SPACES AND COPY THE REST.
  15358.     LI=LSTC
  15359.     DO 202 N=1,4
  15360.     IF(Ichar(NAME(N)).LE.32)GOTO 202
  15361.     LNOUT(LO)=NAME(N)
  15362.     LO=LO+1
  15363.     IF(LO.GT.110)GOTO 300
  15364. 202    CONTINUE
  15365.     IF(IDOL1.GT.0)LNOUT(LO)=char(36)
  15366.     IF(IDOL1.GT.0.AND.LO.LE.109)LO=LO+1
  15367.     DO 203 N=1,6
  15368.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  15369. C IF 32 ISN'T SPACE, LOSE
  15370.     LNOUT(LO)=NUMBER(N)
  15371.     LO=LO+1
  15372.     IF(LO.GT.110)GOTO 300
  15373. 203    CONTINUE
  15374.     IF(IDOL2.EQ.0)GOTO 275
  15375.     LNOUT(LO)=Char(36)
  15376.     IF(LO.LE.109)LO=LO+1
  15377. 275    Continue
  15378.     IF(KSHEET.EQ.0)GOTO 300
  15379. C ADD SHEET NUMBER CRUFT IF CALLED FOR.
  15380.     LNOUT(LO)=Char(37)
  15381. C 37 IS % SIGN
  15382.     IF(LO.LE.109)LO=LO+1
  15383.     NUMBR6(1:6)='      '
  15384.     WRITE(NUMBR6(1:6),1000)KSHEET
  15385. C    ENCODE(6,1000,NUMBER)KSHEET
  15386.     DO 1203 N=1,6
  15387.     IF(Ichar(NUMBER(N)).LE.32)GOTO 1203
  15388. C IF 32 ISN'T ASCII SPACE, LOSE.
  15389.     LNOUT(LO)=NUMBER(N)
  15390.     LO=LO+1
  15391.     IF(LO.GT.110)GOTO 300
  15392. 1203    CONTINUE
  15393. C NOW HAVE THE FULL VALUE ENCODED, INCLUDING SHEET NUMBER IF APPROPRIATE.
  15394. c    IF(LO.LE.109)LO=LO+1
  15395.     GOTO 300
  15396. 250    CONTINUE
  15397. C JUST COPY DISPLAY FORMS.
  15398.     IL1=LSTC-1
  15399.     DO 251 N=LI,IL1
  15400.     LNOUT(LO)=LNIN(N)
  15401.     LO=LO+1
  15402.     IF(LO.GT.110)GOTO 300
  15403. 251    CONTINUE
  15404.     LI=LSTC
  15405. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  15406.     GOTO 300
  15407. 200    LNOUT(LO)=LNIN(LI)
  15408.     LO=LO+1
  15409.     LI=LI+1
  15410. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  15411. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  15412.     LO=MIN0(LO,110)
  15413.     DO 400 N=LO,110
  15414. 400    LNOUT(N)=char(0)
  15415.     DO 1 N=111,128
  15416. 1    LNOUT(N)=LNIN(N)
  15417. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  15418.     RETURN
  15419. 500    CONTINUE
  15420. C DECODE BY HAND...
  15421.     LNOUT(LO)=LNIN(LI)
  15422.     I1=ICHAR(LNIN(LI+1))
  15423.     I2=IMASK(I1,I192)
  15424. C    L2=L1.AND.L192
  15425.     I1=IMASK(I1,I63)
  15426. C    L1=L1.AND.L63
  15427. C DO MASKING TO GET BINARY COORDS
  15428.     ID1=I1
  15429.     I1=ICHAR(LNIN(LI+2))
  15430.     I1=IMASK(I1,I127)
  15431. C    L1=L1.AND.L127
  15432.     ID2=I2*2+I1
  15433. C NOW RELOCATE AND PUT BACK
  15434.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 510
  15435.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 510
  15436.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  15437.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  15438. C CLAMP RESULT TO MAX RANGES
  15439.     ID1=MAX0(ID1,1)
  15440.     ID2=MAX0(ID2,1)
  15441. C DO GENERAL REPACK IF ID1 OR ID2 ARE EXTENDED RANGE.
  15442.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 905
  15443. C leave 60, 301 literals here since this controls repacking
  15444. C    ID1=MIN0(60,ID1)
  15445. C    ID2=MIN0(301,ID2)
  15446. 510    CONTINUE
  15447. C RELOCATED, NOW REPACK AS NEW BINARY PATTERNS
  15448.     I1=ID1
  15449. C    L1=L1.AND.L63
  15450.     I1=IMASK(I1,I63)
  15451.     I2=ID2/2
  15452.     I2=IMASK(I2,I192)
  15453. C    L2=L2.AND.L192
  15454. C    L1=L1.OR.L2
  15455.     I1=I1+I2
  15456.     LNOUT(LO+1)=CHAR(I1)
  15457.     I2=ID2
  15458.     I2=IMASK(I2,I127)+128
  15459. C    L2=L2.AND.L127
  15460. C    L2=L2.OR.L128
  15461. C BE SURE AT LEAST 1 BIT IS SET
  15462.     LNOUT(LO+2)=CHAR(I2)
  15463.     LI=MIN0(109,LI+3)
  15464.     LO=MIN0(109,LO+3)    
  15465. C GO LOOK FOR MORE TO DECODE
  15466.     GOTO 300
  15467. 905    CONTINUE
  15468. C HERE SET UP FOR REENTRY INTO "NORMAL" DECODE
  15469.     LSTC=MIN0(109,LI+3)
  15470.     GOTO 906
  15471.     END
  15472. c -h- rnd.for    Tue Sep  2 10:58:55 1986    
  15473.     FUNCTION RND(DUM)
  15474. C GENERATE RANDOM NUMBER BY LINEAR CONGRUENCE IN BIG
  15475. C INTEGERS.
  15476.     REAL*4 R
  15477.     INTEGER*4 DUM
  15478.     INTEGER*4 I,II
  15479.     LOGICAL*4 L,LMSK
  15480.     REAL*8 XX
  15481.     EQUIVALENCE(I,L),(II,LMSK)
  15482.     I=DUM
  15483.     XX=I
  15484.     XX=XX*214013.0D0+2531011.0D0
  15485.     IF(XX.LT.0.)XX=1.0D0-XX
  15486.     XX=DMOD(XX,16777216.0D0)
  15487.     I=IDINT(XX)
  15488. C    I=I*214013+2531011
  15489. C USE MASKING TO ZOT THIS INTO NORMAL RANGE
  15490. C JUST USE MODULO...
  15491.     IF(I.LT.0)I=1-I
  15492.     IF(I.LT.0)I=0
  15493.     I=MOD(I,16777215)
  15494.     DUM=I
  15495. C RETURN RANDOM BETWEEN 0 AND 1.0
  15496. C PERIOD OF 2**24 MAX
  15497.     XX=I
  15498.     XX=XX/16777216.0
  15499.     R=SNGL(XX)
  15500.     RND=R
  15501.     RETURN
  15502.     END
  15503. c -h- rvboo.for    Tue Sep  2 10:58:55 1986    
  15504.     SUBROUTINE RVBOO(RETV,ID1,ID2)
  15505. C THIS ROUTINE ONLY COPIES ID1,ID2 INTO RETV ARRAY TO AVOID SOME
  15506. C BYTE-INTEGER CONVERSION PROBLEMS. THIS PACKING IS USED TO
  15507. C ACCESS VARIABLE LOCATION LATER.
  15508. c    character*8 retvl,rxx
  15509.     InTeGer*4 RETV,ID1,ID2
  15510.     DIMENSION RETV(2)
  15511. c    equivalence(rxx,retv(1))
  15512. c    rxx=retvl
  15513.     RETV(1)=ID1
  15514.     RETV(2)=ID2
  15515.     RETURN
  15516.     END
  15517. c -h- scmp.for    Tue Sep  2 10:58:55 1986    
  15518.     SUBROUTINE SCMP(LINA,LINB,LENM,ICODE)
  15519.     DIMENSION LINA(1),LINB(1)
  15520.     CHARACTER*1 LINA,LINB
  15521.     ICODE=1
  15522.     lenmm=lenm
  15523.     if(lenm.le.0.or.lenm.gt.255)lenmm=255
  15524.     DO 1 N=1,LENMM
  15525.     IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  15526. C ALLOW _ TO BE A WILDCARD.
  15527.     IF(LINA(N).EQ.'_'.OR.LINB(N).EQ.'_')GOTO 1
  15528.     IF(LINA(N).NE.LINB(N))ICODE=0
  15529.     IF(ICODE.NE.1)GOTO 2
  15530. 1    CONTINUE
  15531. 2    CONTINUE
  15532.     RETURN
  15533.     END
  15534. c -h- sed.for    Tue Sep  2 10:58:55 1986    
  15535.     SUBROUTINE SED(LCMD,LIN,LWRK,ARGSTR,XAC,LENGTH)
  15536.     CHARACTER*1 LIN(1),LWRK(1),ARGSTR(52,4)
  15537.     CHARACTER*1 LCMD(1),LSU(10)
  15538.     EXTERNAL INDX
  15539.     CHARACTER*10 LSU10
  15540.     EQUIVALENCE (LSU10(1:10),LSU(1))
  15541.     INTEGER*4 III
  15542.     REAL*8 XAC
  15543. C
  15544. C OPERATION:
  15545. C EDIT LIN TO LWRK, WITH LENGTH VARIABLE HOLDING INPUT
  15546. C LENGTH IN CHARACTERS. LCMD HOLDS COMMAND LINE, WHICH
  15547. C ULTIMATELY GETS EDITED STRING COPIED BACK INTO IT.
  15548. C
  15549. C EDITS:
  15550. C  CHARACTER AT IDELIM IS DELIMITER. REPLACE STRING IN 1ST
  15551. C INTERVAL BETWEEN DELIMITERS WITH SECOND.
  15552. C  HOWEVER:
  15553. C  &1 TO &4 GET CONTENTS (UP TO NULL) OF ARGSTR(X,1) TO (X,4)
  15554. C
  15555. C  &5 RETURNS XAC VALUE CONVERTED TO DECIMAL INTEGER AND
  15556. C  PRINTED.
  15557. C  &6 RETURNS XAC VALUE CONVERTED TO ASCII CODE (1 BYTE) AND
  15558. C  INSERTED.
  15559. C XAC ENTERS WITH CONTENTS OF ACCUMULATOR Z (TO AVOID TOO MUCH
  15560. C DIFFICULTY IN USING IT OWING TO THE UBIQUITY OF USE OF %).
  15561. C    WE ENTER JUST POINTING AT THE COMMAND LINE AFTER THE ENTER
  15562. C AND ITS SPACE. ASSUME 1ST CHARACTER IS OUR DELIMITER.
  15563.     DO 335 IV=1,80
  15564. 335    LWRK(IV)=Char(0)
  15565.     IDELIM=ICHAR(LCMD(1))
  15566.     ID2=INDX(LCMD(2),IDELIM)
  15567.     IF(ID2.GE.LENGTH)GOTO 100
  15568. C NOW HAVE 1ST STRING, OF NONZERO LENGTH
  15569. C FIND SECOND STRING NOW. EITHER MAY BE OF 0 LENGTH BUT
  15570. C BOTH MUST BE DEFINED BY A DELIMITER.
  15571.     ID3=INDX(LCMD(2+ID2),IDELIM)
  15572.     IF(ID3.GE.LENGTH)GOTO 100
  15573. C WELL, WE GOT IT SOMEHOW. NOW TRY AND EDIT THE JUNK IN.
  15574. C (NOTE WE WANT TO FILL ALL OF LENGTH)
  15575.     INLIN=1
  15576.     INWRK=1
  15577.     IVV=ID3+ID2+2
  15578.     DO 336 IV=IVV,LENGTH
  15579. 336    LCMD(IV)=Char(0)
  15580.     LSA=ID2-1
  15581.     LSB=ID3-1
  15582.     LSSB=2+ID2
  15583.     LZR=0
  15584.     DO 1 N=1,LENGTH
  15585.     IF(LSA.GT.0)GOTO 350
  15586. C ZERO LENGTH INITIAL STRING, SO ASSUME HE WANTS TO APPEND TO
  15587. C EXISTING STRING AT THE END.
  15588. C (HANDY FOR ADDING TO FORMULAE OR THE LIKE.)
  15589.     IF(Ichar(LIN(N)).EQ.0)GOTO 351
  15590. C JUST COPY THE INPUT FIRST AND GO OFF
  15591.     GOTO 2
  15592. 351    CONTINUE
  15593. C HERE WE HAVE THE TERMINAL NULL
  15594.     LZR=LZR+1
  15595. C ALLOW US TO PRETEND FOR ONCE THAT WE GOT A MATCH
  15596.     IF(LZR.EQ.1)GOTO 222
  15597.     GOTO 1
  15598. 350    CONTINUE
  15599.     IF(Ichar(LIN(INLIN)).EQ.0)GOTO 1
  15600.     CALL SSCMP(LIN(INLIN),LCMD(2),LSA,ICOD)
  15601.     IF(ICOD.EQ.0)GOTO 2
  15602. C HERE HAVE TO SUBSTITUTE
  15603. C PASS STRING TO SUBSTITUTE ON INPUT LINE FIRST.
  15604. 222    CONTINUE
  15605.     INLIN=INLIN+LSA
  15606. C ALLOW ZERO LENGTH SUBSTITUTE CHARACTER
  15607.     IF(LSB.LE.0)GOTO 1
  15608. C    DO 6 M=1,LSB
  15609.     M=1
  15610. 106    CONTINUE
  15611.     IF(LCMD(LSSB+M-1).EQ.'&')GOTO 7
  15612. 8    CONTINUE
  15613. C JUST COPY ONE CHARACTER OF THE SUBSTITUTE STRING IN HERE.
  15614.     LWRK(INWRK)=LCMD(LSSB+M-1)
  15615.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15616.     GOTO 6
  15617. 7    CONTINUE
  15618. C HANDLE & FORMS
  15619.     IF(LCMD(LSSB+M).LT.'1'.OR.LCMD(LSSB+M).GT.'6')GOTO 8
  15620. C REQUIRE ALL FORMS TO BE &1 THRU &6 TO BE DEALT WITH HERE.
  15621.     M=M+1
  15622.     IF(LCMD(LSSB+M-1).GT.'4')GOTO 10
  15623. C HERE JUST HANDLE ARGSTR SUBSTITUTIONS.
  15624.     II=ICHAR(LCMD(LSSB+M-1))
  15625.     II=II-48
  15626. C II IS NOW THE INDEX.
  15627.     DO 11 MM=1,52
  15628.     LWRK(INWRK)=ARGSTR(MM,II)
  15629.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15630.     IF(ARGSTR(MM,II).EQ.char(0))GOTO 12
  15631. 11    CONTINUE
  15632. 12    CONTINUE
  15633.     M=M+1
  15634. C PASS THE NUMBER OF THE &NUMBER FORM
  15635.     GOTO 6
  15636. 10    CONTINUE
  15637. C HANDLE ZAC FORMS
  15638.     M=M+1
  15639. C PASS THE DIGIT
  15640.     IF(LCMD(LSSB+M-2).EQ.'5')GOTO 14
  15641. C FILL IN ZAC AS AN INTEGER
  15642.     II=32
  15643.     IF(XAC.GE.1.AND.XAC.LT.256.)II=XAC
  15644. C ONLY HANDLE CONVERSION IF LEGAL
  15645.     LWRK(INWRK)=CHAR(II)
  15646.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15647.     GOTO 6
  15648. 14    CONTINUE
  15649. C HANDLE NUMERIC CONVERSION HERE
  15650.     LSU(1)=char(0)
  15651.     III=0
  15652.     IF(DABS(XAC).LT.9999999.)III=IDINT(XAC)
  15653.     WRITE(LSU10(1:10),15,ERR=22)III
  15654. C    ENCODE(10,15,LSU,ERR=22)III
  15655. 15    FORMAT(I9)
  15656. 22    DO 16 MK=1,10
  15657.     IF(Ichar(LSU(MK)).EQ.0)GOTO 6
  15658.     IF(LSU(MK).EQ.' ')GOTO 16
  15659.     LWRK(INWRK)=LSU(MK)
  15660.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15661. 16    CONTINUE
  15662. 6    CONTINUE
  15663.     M=M+1
  15664.     IF(M.LE.LSB)GOTO 106
  15665.     GOTO 1
  15666. 2    CONTINUE
  15667. C HERE JUST ANOTHER CHARACTER TO MOVE, DO THE MOVE.
  15668.     LWRK(INWRK)=LIN(INLIN)
  15669.     IF(INLIN.LT.LENGTH)INLIN=INLIN+1
  15670.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  15671. 1    CONTINUE
  15672. C COPY BACK OUT TO CMDLIN AFTER FIXUP
  15673.     IF(INWRK.GE.LENGTH)GOTO 3
  15674.     DO 4 N=INWRK,LENGTH
  15675. 4    LWRK(N)=char(0)
  15676. 3    CONTINUE
  15677. C REPLACE COMMAND LINE WITH EDITED STRING FOR ENTRY NOW.
  15678.     DO 5 N=1,LENGTH
  15679. 5    LCMD(N)=LWRK(N)
  15680. 100    CONTINUE
  15681.     RETURN
  15682.     END
  15683. c -h- sign.for    Tue Sep  2 10:58:55 1986    
  15684.     REAL *8 FUNCTION SIGN(VAR)
  15685.     REAL*8 VAR
  15686. C ALWAYS RETURN 1. OR -1. FOR THIS PROGRAM ... NEVER 0.
  15687.     SIGN=1.
  15688.     IF(VAR.LT.0.)SIGN=-1.
  15689.     RETURN
  15690.     END
  15691. c -h- slend.for    Tue Sep  2 10:58:55 1986    
  15692.     SUBROUTINE SLEND(RETCD)
  15693. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  15694. C ALL RIGHTS RESERVED
  15695. C 60=MAX REAL ROWS
  15696. C 301=MAX REAL COLS
  15697. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  15698. C VBLS AND TYPE DIMENSIONED 60,301
  15699. C **************************************************
  15700. C *                                                *
  15701. C *         SUBROUTINE   SLEND(RETCD)              *
  15702. C *                                                *
  15703. C **************************************************
  15704. C
  15705. C
  15706. C
  15707. C SETS VALUE OF LEND, POINTER TO LAST NON-BLANK CHARACTER
  15708. C IN LINE(80)
  15709. C
  15710. C
  15711. C
  15712. C
  15713. C RETCD VALUE       MEANING
  15714. C
  15715. C    1            NORMAL RETURN
  15716. C    2            ALL BLANKS
  15717. C
  15718. C
  15719. C
  15720. C   SLEND IS CALLED BY CALC
  15721. C
  15722. C VARIABLE    USE
  15723. C
  15724. C  BLANK      ' '
  15725. C    I        INDEXES CHARACTERS IN LINE(80).
  15726. C  LEND       UPON EXIT, POINTS TO THE LAST NON-
  15727. C             BLANK IN LINE(80).
  15728. C  LINE(80)   HOLDS COMMAND LINE.
  15729. C  RETCD      RETURN CODE.  1=NORMAL, 2=ALL BLANKS
  15730. C
  15731. C
  15732. C
  15733. C    SUBROUTINE SLEND(RETCD)
  15734.     InTeGer*4 LEVEL,NONBLK,LEND
  15735.     InTeGer*4 VIEWSW,BASED,RETCD
  15736. C
  15737.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  15738.     CHARACTER*1 LINE(80)
  15739. C
  15740.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  15741.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  15742. C
  15743. C
  15744. C
  15745. C
  15746.     RETCD=1
  15747.     DO 100 I=1,80
  15748.     IF(LINE(81-I).NE.BLANK)GO TO 200
  15749. 100    CONTINUE
  15750.     RETCD=2
  15751.     RETURN
  15752. 200    LEND=81-I
  15753.     RETURN
  15754.     END
  15755. c -h- sscmp.for    Tue Sep  2 10:58:55 1986    
  15756.     SUBROUTINE SSCMP(LINA,LINB,LENM,ICODE)
  15757.     DIMENSION LINA(1),LINB(1)
  15758.     CHARACTER*1 LINA,LINB
  15759.     ICODE=1
  15760.     DO 1 N=1,LENM
  15761. c    IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  15762.     IF(ICHAR(LINA(N)).NE.ICHAR(LINB(N)))ICODE=0
  15763.     IF(ICODE.NE.1)GOTO 2
  15764. 1    CONTINUE
  15765. 2    CONTINUE
  15766.     RETURN
  15767.     END
  15768. c -h- sstr.for    Tue Sep  2 10:58:55 1986    
  15769.     SUBROUTINE SSTR(CMDLIN,LA,N,LE,FORM)
  15770.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  15771.     InTeGer*4 LA,N,LE
  15772.     InTeGer*4 VLEN(9),TYPE(1,2)
  15773.     CHARACTER*1 AVBLS(24,27)
  15774.     Real*8 VAVBLS(3,27)
  15775.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  15776.     REAL*8 XVBLS(1,1),XX,VP,TMP
  15777.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  15778.     NI=N
  15779. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  15780. C MUST PASS _@ CHARS TO GET VARIABLE
  15781.     LAA=LA+2
  15782.     LEE=LE
  15783.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  15784.     IF(IVLD.LE.0)GOTO 990
  15785. C    XX=XVBLS(I1,I2)
  15786.     CALL XVBLGT(I1,I2,XX)
  15787.     VP=128.D0**7
  15788.     DO 1 NN=1,8
  15789.     TMP=DINT(XX/VP)
  15790.     NBF(NN)=CHAR(IDINT(TMP))
  15791.     XX=XX-(VP*TMP)
  15792.     VP=DINT(VP/128.D0)
  15793.     IF(VP.EQ.0.0D0)VP=1.0D0
  15794. 1    CONTINUE
  15795. C NOW NBF HAS 8 BYTES OF DATA CORRESPONDING TO DE-HASHED
  15796. C STRING. COPY TO FORM.
  15797.     NL=NI
  15798.     DO 2 NN=1,8
  15799.     FORM(NL)=NBF(NN)
  15800.     IF(ICHAR(NBF(NN)).GE.32)NL=NL+1
  15801. 2    CONTINUE
  15802. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  15803. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  15804. C AND LSTC IS NEXT CHAR AFTER VARIABLE ON CMDLIN
  15805. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  15806. C AND MOVE CMDLIN DOWN.
  15807.     N=NL-1
  15808.     LA=LSTC-1
  15809.     CMDLIN(LA)=FORM(N)
  15810. C HOPE ALL'S WELL NOW...
  15811.     RETURN
  15812. 990    FORM(N)=CMDLIN(N)
  15813.     RETURN
  15814.     END
  15815. c -h- strcmp.for    Tue Sep  2 10:58:55 1986    
  15816.     SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  15817. C COPYRIGHT (C) 1983 GLENN EVERHART
  15818. C ALL RIGHTS RESERVED
  15819. C 60=MAX REAL ROWS
  15820. C 301=MAX REAL COLS
  15821. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  15822. C VBLS AND TYPE DIMENSIONED 60,301
  15823. C **************************************************
  15824. C *                                                *
  15825. C *   SUBROUTINE STRCMP(NAME,LENGTH,RETCD)         *
  15826. C *                                                *
  15827. C **************************************************
  15828. C
  15829. C
  15830. C  STRCMP LOOKS PAST BLANKS FOR THE NAME HELD BY NAME(1),...,NAME(LENGTH)
  15831. C  THE RETURN CODE RETCD INDICATES SUCCESS OR FAILURE:
  15832. C
  15833. C    1=MATCH
  15834. C    2=FAILURE
  15835. C
  15836. C  UPON EXIT, COMMON VARIABLE NONBLK
  15837. C         IF SUCCESSFUL, POINTS TO ONE BEYOND THE LAST CHARACTER SCANNED
  15838. C                 FOR MATCH
  15839. C         IF FAILURE, UNCHANGED
  15840. C
  15841. C
  15842. C
  15843. C  MODIFICATION CLASSES: M2
  15844. C
  15845. C
  15846. C
  15847. C  STRCMP CALLS GETNNB TO GET THE NEXT NON-BLANK FROM LINE(80)
  15848. C
  15849. C  STRCMP IS CALLED BY CMND
  15850. C
  15851. C
  15852. C
  15853. C
  15854. C VARIABLE       USE
  15855. C
  15856. C   I2        INDEXES NAME(LENGTH).
  15857. C   IS        HOLDS VALUE OF NONBLANK IN CASE AN ERROR OCCURS
  15858. C             AND IT IS NECESSARY TO RESTORE THE VALUE.
  15859. C   LENGTH    HOLDS THE LENGTH OF VECTOR NAME.
  15860. C   NONBLK    POINTER FOR COMMAND LINE HELD BY LINE(80).
  15861. C   RETCD     HOLDS RETURN CODE.  1=MATCH,  2=FAILURE
  15862. C
  15863. C
  15864. C
  15865. C
  15866. C    SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  15867.     InTeGer*4 LENGTH
  15868.     InTeGer*4 LEVEL,NONBLK,LEND
  15869.     InTeGer*4  RETCD,VIEWSW,BASED
  15870. C
  15871.     CHARACTER*1  LINE(80),NAME(LENGTH)
  15872.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  15873. C
  15874.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  15875.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  15876. C
  15877. C UPON ENTRANCE, NONBLK POINTS TO THE FIRST CHARACTER
  15878. C IN NAME, COMPARE LOOKS PAST THIS TO THE NEXT CHARACTER
  15879. C SINCE CMND HAS ALREADY IDENTIFIED THAT FIRST CHARACTER
  15880. C IN THE COMMAND NAME (AFTER THE ASTERISK).
  15881.     IS=NONBLK
  15882.     CALL GETNNB(IPT,RETCD)
  15883.     GO TO (10,999),RETCD
  15884. C ON EXIT NONBLK POINTS TO LAST CHARACTER IN NAME
  15885. C
  15886. C
  15887. 10    DO 100 I2=1,LENGTH
  15888.     CALL GETNNB(IPT,RETCD)
  15889.     GO TO (20,999),RETCD
  15890.     STOP 20
  15891. 20    NONBLK=IPT
  15892.     IF(NAME(I2).NE.LINE(NONBLK))GOTO 999
  15893. 100    CONTINUE
  15894.     RETCD=1
  15895.     RETURN
  15896. C
  15897. C
  15898. C NO MATCH
  15899. 999    RETCD=2
  15900. C IF ERROR, RESTORE VALUE OF NONBLK
  15901.     NONBLK=IS
  15902.     RETURN
  15903.     END
  15904. c -h- svbl.for    Tue Sep  2 10:58:55 1986    
  15905.     SUBROUTINE SVBL(CMDLIN,LA,N,LE,FORM)
  15906.     Include aparms.inc
  15907.     InTeGer*4 VLEN(9),TYPE(1,2)
  15908.     CHARACTER*1 AVBLS(24,27)
  15909.     Real*8 VAVBLS(3,27)
  15910.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  15911.     REAL*8 XVBLS(1,1),XX,XY,xmr,xmc
  15912.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  15913.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  15914.     CHARACTER*3 NBF3
  15915.     EQUIVALENCE(NBF3(1:1),NBF(5))
  15916.     InTeGer*4 LA,N,LE,I1,I2,J1,J2
  15917.     NI=N
  15918.     xmr=Mrows
  15919.     xmc=Mcols
  15920. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  15921.     LAA=LA+2
  15922. C MUST PASS _# CHARS
  15923.     LEE=LE
  15924.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  15925.     IF(IVLD.LE.0)GOTO 990
  15926.     LAA=LSTC+1
  15927. C ACCEPT ANY DELIMITER
  15928.     LEE=LE
  15929.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,J1,J2,IVLD)
  15930.     IF(IVLD.LE.0)GOTO 990
  15931. C    XX=XVBLS(I1,I2)
  15932.     CALL XVBLGT(I1,I2,XX)
  15933. C XX IS COL #
  15934. C    XY=XVBLS(J1,J2)-1.0
  15935.     CALL XVBLGT(J1,J2,XY)
  15936.     IF(XX.LE.(0.9D0).OR.XX.GT.XMR)GOTO 990
  15937.     IF(XY.LE.(0.9D0).OR.XY.GT.XMC)GOTO 990
  15938.     IC=XX
  15939.     CALL IN2AS(IC,NBF)
  15940.     IR=XY
  15941.     WRITE(NBF3(1:3),300)IR
  15942. C    ENCODE(3,300,NBF(5))IR
  15943. 300    FORMAT(I3)
  15944.     NL=NI
  15945. C FILL IN DECODED VARIABLE NAME, ZOTTING OUT EXTRA SPACES.
  15946.     DO 400 NN=1,7
  15947. C 47 IS ASCII VALUE FOR 0 CHARACTER
  15948. C ALPHAS ARE ALSO ALL HIGHER.
  15949.     IF(ICHAR(NBF(NN)).LE.40)GOTO 400
  15950.     FORM(NL)=NBF(NN)
  15951.     NL=NL+1
  15952. 400    CONTINUE
  15953. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  15954. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  15955. C AND LSTC IS NEXT CHAR AFTER 2ND VARIABLE ON CMDLIN
  15956. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  15957. C AND MOVE CMDLIN DOWN.
  15958.     N=NL
  15959.     LE=LE-LSTC+NL
  15960.     LA=LSTC
  15961. C    DO 401 M=N,LE
  15962. C    CMDLIN(M)=CMDLIN(M+LSTC-NL)
  15963. C401    CONTINUE
  15964. C HOPE ALL'S WELL NOW...
  15965.     RETURN
  15966. 990    CONTINUE
  15967.     FORM(N)=CMDLIN(N)
  15968.     RETURN
  15969.     END
  15970. c -h- swrt.for    Tue Sep  2 10:58:55 1986    
  15971. C
  15972. C SWRT - WRITE VARIABLE LENGTH STRING TO SCREEN WITHOUT
  15973. C RECORD TERMINATION.
  15974. C COPYRIGHT GLENN C EVERHART 1984
  15975. C ALL RIGHTS RESERVED
  15976. C *** Don't use for normal Amiga stuff, but have available in case
  15977. C *** it should be handy someplace...
  15978. C
  15979. C
  15980. ccc    SUBROUTINE SWRT(STRING,LENGTH)
  15981. ccc    CHARACTER*1 STRING(127)
  15982. ccc    INTEGER LENGTH
  15983. cccC DUMP OUT ALL WE CAN..
  15984. ccc    CHARACTER*9 SFM
  15985. ccc    CHARACTER*1 SFMX(9)
  15986. ccc    CHARACTER*3 SNM
  15987. ccc    EQUIVALENCE(SNM,SFMX(2))
  15988. ccc    EQUIVALENCE (SFMX(1),SFM)
  15989. cccC HERE ARE THE BUILT IN FORMATS. NOTE WE FILL IN THE
  15990. cccC REPEAT COUNT AT RUNTIME FOR THE TEXT TO BE WRITTEN.
  15991. cccC NOTE ALSO THAT THE 1ST CHAR IS A # SIGN TO SHOW UP PROBLEMS.
  15992. cccC FORMATS ARE (nnnA1,\)
  15993. cccC COMPRISING 13 CHARACTERS IN ALL.
  15994. ccc    DATA SFM/'(001A1,\)'/
  15995. cccC NOTE WE JUST FILL IN THE LENGTH AND WRITE TO SCREEN USING
  15996. cccC SFM AS A RUNTIME FORMAT.
  15997. cccC
  15998. ccc    IF(LENGTH.LE.0)RETURN
  15999. ccc    WRITE(SNM,1)LENGTH
  16000. ccc1    FORMAT(BZ,I3)
  16001. cccC WRITE ON UNIT 6 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  16002. cccC (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  16003. ccc    WRITE(11,SFM)(STRING(II),II=1,LENGTH)
  16004. ccc    RETURN
  16005. ccc    END
  16006.     subroutine vget(buf,len)
  16007.     character*1 buf(132),cbf(132)
  16008.     integer*4 len,ii,i
  16009. C Read buf up to len from console
  16010.     do 2 i=1,128
  16011.     cbf(i)=char(0)
  16012. 2    continue
  16013.     call getttl(cbf)
  16014. c    call cmdmun(cbf)
  16015.     ii=min0(len,132)
  16016.     ii=max0(len,1)
  16017. C reads console into large buffer, returns n chars of it.
  16018.     do 1 i=1,ii
  16019.     buf(i)=cbf(i)
  16020. 1    Continue
  16021.     return
  16022.     end
  16023.     subroutine vgeti(iii)
  16024. C get integer from command line
  16025.     integer*4 iii
  16026.     character*132 buf
  16027.     call vget(buf,20)
  16028.     read(buf,1000,err=999)iii
  16029. 1000    format(i7)
  16030.     return
  16031. 999    Continue
  16032.     iii=0
  16033.     return
  16034.     end
  16035.     SUBROUTINE VWRT(STRING,LENGTH)
  16036. C ***<<<< RDD COMMON START >>>***
  16037.     InTeGer*4 RRWACT,RCLACT
  16038. C    COMMON/RCLACT/RRWACT,RCLACT
  16039.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16040.      1  IDOL7,IDOL8
  16041. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16042. C     1  IDOL7,IDOL8
  16043.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16044. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16045.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16046. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16047. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16048. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16049.     InTeGer*4 KLVL
  16050. C    COMMON/KLVL/KLVL
  16051.     InTeGer*4 IOLVL,IGOLD
  16052. C    COMMON/IOLVL/IOLVL
  16053. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16054. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16055.     Integer*4 IDSPTP,Idol9
  16056.     integer*4 k3dfg,kcdelt,krdelt,kpag
  16057.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16058.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16059.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  16060.      3  k3dfg,kcdelt,krdelt,kpag
  16061. C ***<<< RDD COMMON END >>>***
  16062. C VWRT is like SWRT but writes to lun 11 window instead.
  16063.     CHARACTER*1 STRING(127)
  16064.     INTEGER LENGTH
  16065. C DUMP OUT ALL WE CAN..
  16066.     IF(LENGTH.LE.0)RETURN
  16067. C WRITE ON UNIT 11 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  16068. C (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  16069. c    REWIND 11
  16070. c    call uvt100(1,LLDSP,1)
  16071.     call swrt(string,length)
  16072. c    WRITE(11,777)(STRING(II),II=1,LENGTH)
  16073. c    REWIND 11
  16074. 777    format(1X,127A1)
  16075.     RETURN
  16076.     END
  16077.  
  16078. C *************** AnalyO.Ftn ##########################################
  16079. c -h- acini1.fnw    Fri Aug 22 12:55:08 1986    
  16080. C PORTACALC MAIN PROGRAM
  16081. C SPREAD SHEET DRIVER PROGRAM
  16082. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  16083. C ALL RIGHTS RESERVED
  16084. C MAX SHEET DIMS ARE 60 BY 300 (301 SINCE ACCUMULATORS ARE A PSEUDO ROW)
  16085. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  16086. C SCREEN.
  16087.     SUBROUTINE INITA1(KMAP,KWID,ICODE)
  16088. C
  16089.     Include aparms.inc
  16090.     InTeGer*4 PRL(6)
  16091. c        CHARACTER*1 NOWRAP ( 2 )
  16092.     CHARACTER*1 FORM,FVLD
  16093. c    INTEGER*4 VNLT
  16094. c    EXTERNAL LCWRQQ
  16095.     DIMENSION FORM(128),FVLD(1,1)
  16096. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  16097. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  16098. C SO INITIALLY IGNORE.
  16099. C ***<<<< RDD COMMON START >>>***
  16100.     InTeGer*4 RRWACT,RCLACT
  16101. C    COMMON/RCLACT/RRWACT,RCLACT
  16102.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16103.      1  IDOL7,IDOL8
  16104. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16105. C     1  IDOL7,IDOL8
  16106.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16107. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16108.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16109. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16110. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16111. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16112.     InTeGer*4 KLVL
  16113. C    COMMON/KLVL/KLVL
  16114.     InTeGer*4 IOLVL,IGOLD
  16115. C    COMMON/IOLVL/IOLVL
  16116. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16117. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16118.     Integer*4 IDSPTP,Idol9
  16119.     integer*4 k3dfg,kcdelt,krdelt,kpag
  16120.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16121.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16122.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  16123.      3  k3dfg,kcdelt,krdelt,kpag
  16124. C ***<<< RDD COMMON END >>>***
  16125. CCC    InTeGer*4 RRWACT,RCLACT
  16126. CCC    COMMON/RCLACT/RRWACT,RCLACT
  16127. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16128. CCC     1  IDOL7,IDOL8
  16129. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16130. CCC     1  IDOL7,IDOL8
  16131. CCC    InTeGer*4 LLCMD,LLDSP
  16132. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16133. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16134.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  16135.     COMMON/D2R/NRDSP,NCDSP
  16136. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16137. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16138. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16139. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16140. c    CHARACTER*1 FORM2(4)
  16141. C ***<<< XVXTCD COMMON START >>>***
  16142.     CHARACTER*1 OARRY(100)
  16143.     InTeGer*4 OSWIT,OCNTR
  16144. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  16145. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16146.     InTeGer*4 IPS1,IPS2,MODFLG
  16147. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16148.        InTeGer*4 XTCFG,IPSET,XTNCNT
  16149.        CHARACTER*1 XTNCMD(80)
  16150. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16151. C VARY FLAG ITERATION COUNT
  16152.     INTEGER KALKIT
  16153. C    COMMON/VARYIT/KALKIT
  16154.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  16155.     InTeGer*4 RCMODE,IRCE1,IRCE2
  16156. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16157. C     1  IRCE2
  16158. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16159. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16160. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16161. C RCFGX ON.
  16162. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16163. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16164. C  AND VM INHIBITS. (SETS TO 1).
  16165.     INTEGER*4 FH
  16166. C FILE HANDLE FOR CONSOLE I/O (RAW)
  16167. C    COMMON/CONSFH/FH
  16168.     CHARACTER*1 ARGSTR(52,4)
  16169. C    COMMON/ARGSTR/ARGSTR
  16170.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  16171.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  16172.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16173.      3  IRCE2,FH,ARGSTR
  16174. C ***<<< XVXTCD COMMON END >>>***
  16175. CCC    InTeGer*4 OSWIT,OCNTR
  16176. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  16177. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16178.     InTeGer*4 TYPE(1,2),VLEN(9)
  16179. CCC    InTeGer*4 KLVL
  16180. CCC    COMMON/KLVL/KLVL
  16181. CCC    InTeGer*4 IOLVL
  16182. CCC    COMMON/IOLVL/IOLVL
  16183. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16184. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16185.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  16186.     Real*8 VAVBLS(3,27)
  16187.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  16188.     REAL*8 XXV(1,1)
  16189.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  16190.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  16191. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  16192.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  16193.     CHARACTER*12 CDVFMT
  16194.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  16195.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  16196.     COMMON/DEFVBX/DVFMT
  16197.     CHARACTER*1 NMSH(80)
  16198.     CHARACTER*80 NMSH80
  16199.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  16200.     COMMON/NMSH/NMSH
  16201. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  16202. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16203. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  16204. CCC       CHARACTER*1 XTNCMD(80)
  16205. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16206. C VARY FLAG ITERATION COUNT
  16207. CCC    INTEGER KALKIT
  16208. CCC    COMMON/VARYIT/KALKIT
  16209. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  16210. CCC    InTeGer*4 RCONE,RCMODE,IRCE1,IRCE2
  16211. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  16212. CCC     1  IRCE1,IRCE2
  16213. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16214. C RCFGX FLAGS WHETHER TO DO AUTO RECALC
  16215. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED
  16216.     Integer*4 CWids(JIDcl)
  16217. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY.
  16218. c    INTEGER*4 I4TMP
  16219. C ***<<< NULETC COMMON START >>>***
  16220.     InTeGer*4 ICREF,IRREF
  16221. C    COMMON/MIRROR/ICREF,IRREF
  16222.     InTeGer*4 MODPUB,LIMODE
  16223. C    COMMON/MODPUB/MODPUB,LIMODE
  16224.     InTeGer*4 KLKC,KLKR
  16225.     REAL*8 AACP,AACQ
  16226. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  16227.     InTeGer*4 NCEL,NXINI
  16228. C    COMMON/NCEL/NCEL,NXINI
  16229.     CHARACTER*1 NAMARY(20,MRows)
  16230. C    COMMON/NMNMNM/NAMARY
  16231.     InTeGer*4 NULAST,LFVD
  16232. C    COMMON/NULXXX/NULAST,LFVD
  16233.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  16234.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  16235. C ***<<< NULETC COMMON END >>>***
  16236.     external cgetsz !$pragma C(cgetsz)
  16237.     integer*4 curszx,curszy,kbdin
  16238.     common/curspr/curszx,curszy,kbdin
  16239. CCC    InTeGer*4 ICREF,IRREF
  16240. CCC    COMMON/MIRROR/ICREF,IRREF
  16241. C SETS NUMBER OF COLS TO ADD ON ROW OVERFLOW, ROWS TO ADD ON COL OVERFLOW
  16242. C FOR CELL ALIASING.
  16243.     REAL*8 DVS(JIDcl,JIDrw)
  16244.     COMMON /FVLDC/FVLD
  16245. C FOLLOWING SUPPORT VVARY OVERLAY:
  16246.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  16247.     LOGICAL*4 LEXIST
  16248.     InTeGer*4 QCAC(2),QCENT(8),ACV(8)
  16249.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  16250.     COMMON/DSPCMN/DVS,CWIDS
  16251.     CHARACTER*1 CHR
  16252.     character*20 fwt
  16253.     EQUIVALENCE(FWT(1:1),CHR)
  16254. C DISABLE FLOATING EXCEPTIONS
  16255. C    CALL LCWRQQ(IFCW)
  16256. C (MOVED LCWRQQ CALL TO MAIN)
  16257.     IDOL7=1
  16258. C ENABLE SCROLLING INITIALLY
  16259. c    call block2
  16260. C ZERO "SAVED DISPLAY VALUES" FIRST...
  16261.     DO 35 N=1,JIDrw
  16262.     DO 35 NN=1,JIDcl
  16263. 35    DVS(NN,N)=0.
  16264.     MODFLG=1
  16265.     CALL TTYINI
  16266. C INITIALLY IN NON ANSI MODE. STILL USE ANSI DRIVER FOR INPUT CONTROLS.
  16267. C NOW SET UP OTHER COMMON INFO (USED TO BE A BLOCK DATA...NOW CHANGED.)
  16268. C SETUP INITIAL DISPLAY LIMITS ACTUALLY USED.
  16269.     RRWACT=1
  16270.     K3DFG=0
  16271.     KCDELT=0
  16272.     KRDELT=0
  16273.     RCLACT=1
  16274.     IOLVL=11
  16275. c Set rather small sheet to allow for use on non-interlace screen
  16276. c initially
  16277.     DRWV=7
  16278.     DCLV=17
  16279.     LLCMD=20
  16280.     LLDSP=21
  16281.     If(Idsptp.ne.1)goto 4866
  16282.     DRWV=7
  16283.     DCLV=42
  16284.     LLCMD=45
  16285.     LLDSP=46
  16286. c Interlace dimensions for main window display
  16287. 4866    Continue
  16288. c set up according to window size (curses version)
  16289. c ttyini should get the size of actual screen window from initscr adn newwin(0,0,0,0)
  16290. c to create a new window. The initial curscr window gives size of the initial window.
  16291. c These routines should also set keypad, cbreak mode, etc. to ensure that chars coming
  16292. c in as function keys get returned in kbdin variable so they can be interpreted.
  16293. c    call cgetsz(icck,irrk)
  16294. c    curszx=icck
  16295. c    curszy=irrk-4
  16296. c    dclv=curszy-4
  16297. c    if(dclv.lt.6)dclv=6
  16298. c    llcmd=dclv+3
  16299. c    lldsp=llcmd+1
  16300. c    drwv=(curszx/10)-1
  16301. c set up at 10 charts/col
  16302. c    if(drwv.lt.1)drwv=1
  16303.     ICREF=10
  16304.     IRREF=50
  16305. C SET INCREMENTS TO 1/6 OF TOTAL FOR STARTERS.
  16306.     KLVL=1
  16307.     KALKIT=0
  16308.     IRCE1=0
  16309.     IRCE2=0
  16310.     RCMODE=2
  16311.     ICODE=0
  16312.     idol3=0
  16313.     idol4=0
  16314.     idol5=20000
  16315.     idol6=20000
  16316.     Idol8=1
  16317.     RCFGX=0
  16318.     FORMFG=0
  16319. C      CALL GETADR ( PRL, NOWRAP )
  16320.       PRL ( 2 ) = 2
  16321. c    OPEN(6,FILE='CON:',STATUS='NEW',FORM='FORMATTED')
  16322.     If(Idsptp.eq.1)goto 4867
  16323. c Non interlace (640 x 200) screen
  16324. c    OPEN(11,FILE='CON:20/169/550/30/Analy Command Inputs',
  16325. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  16326.     Goto 4868
  16327. 4867    Continue
  16328. c Interlace
  16329. c    OPEN(11,FILE='CON:20/369/550/30/Analy Command Inputs',
  16330. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  16331. 4868    Continue
  16332. c    OPEN(18,FILE='CON:20/210/450/30/Analy Cmd Prompts',
  16333. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  16334. C LOOK FOR 'ACINIT.PRM' INITIALIZER FILE. IF ONE FOUND, READ IT.
  16335. C IF NOT, ASK AT CONSOLE FOR SINGLE/DBL PRECISION AND INITIAL VIDEO MODE
  16336.     IVV=11
  16337. C SET UP AS THOUGH WE HAD AN @ACINIT.PRM AT STARTUP AND
  16338. C ALLOW IT TO GO THRU NORMALLY...
  16339.     INQUIRE(FILE='ACINIT.PRM',EXIST=LEXIST)
  16340.     IF(.NOT.LEXIST)GOTO 6003
  16341.     OPEN(3,FILE='ACINIT.PRM',STATUS='OLD',FORM='FORMATTED')
  16342. C    CALL RASSIG(3,'ACINIT.PRM')
  16343.     IVV=3
  16344.     IOLVL=3
  16345. c    GOTO 6403
  16346. 6003    CONTINUE
  16347. C    OPEN(5,FILE='CON:',STATUS='OLD',FORM='FORMATTED')
  16348. C OPEN EITHER CONSOLE OR INIT FILE AT FIRST...
  16349. 6403    CONTINUE
  16350. 6005    FORMAT(80A1)
  16351. C For AMIGA always use "BIOS MODE" so we can have special windowing
  16352. C code in place of the Fortran I/O. Fortran console I/O will be done
  16353. C using LUN 11 in a CON: window, but most normal spreadsheet
  16354. C operations will take place in a special window over which we will have
  16355. C finer grained control...
  16356. C
  16357.     CALL SWSET(1)
  16358.     MODFLG=1
  16359. 6008    CONTINUE
  16360. C SETS UP FOR USING ROM BIOS DIRECTLY FOR EVERYTHING...
  16361. C COULD THEN USE E.G. NEWKEY TO DO KEYBOARD CMDS.
  16362.     GOTO 6002
  16363. 6006    CONTINUE
  16364. C ERROR ON INPUT HERE... JUST FORGET IT.
  16365.     CLOSE(3)
  16366.     IOLVL=11
  16367. 6002    Continue
  16368.     call uvt100(18,0,0)
  16369. C
  16370. C SET UP THE SCREEN (ERASE, ETC.)
  16371. c erase screen first
  16372.     CALL UVT100(1,5,10)
  16373.     CALL UVT100(11,2,0)
  16374. c position cursor to r5c10
  16375.     CALL UVT100(1,5,12)
  16376. C ZERO THE VARIABLES TO START OFF WITH.
  16377.     DO 2070 KK=1,24
  16378.     DO 2070 KKK=1,27
  16379. 2070    AVBLS(KK,KKK)=char(0)
  16380. C SET UP WORK ARRAY BITMAP
  16381.     CALL WRKFIL(1,FORM,2)
  16382. c set reverse video title
  16383.     CALL UVT100(13,7,0)
  16384.     CALL SWRT('AnalytiCalc/RIM-Amiga',22)
  16385.     CALL UVT100(1,6,14)
  16386.     CALL SWRT('V27-03C',7)
  16387.     CALL UVT100(13,0,0)
  16388.     CALL UVT100(1,8,8)
  16389.     CALL SWRT(' ...The Analyst`s Tool',22)
  16390.     CALL UVT100(1,9,5)
  16391. C original name was VisiKluge, then ViziKluge, then PortaCalc, then 
  16392. C AnalyCalc, then AnalytiCalc.
  16393.     CALL SWRT('Copyright (C) 1982-1991 Glenn & Mary Everhart',45)
  16394.     CALL UVT100(1,11,1)
  16395.     call swrt('Donation of $10.00 asked if you use this program',
  16396.      1  48)
  16397. C NOW GET ON WITH USEFUL WORK.
  16398.       PRL ( 2 ) = 1
  16399.       PRL ( 3 ) = 0
  16400. c set ansi mode...
  16401.       CALL UVT100 ( 18 ,0,0)
  16402.     Call uvt100(1,13,1)
  16403.     KWID=10
  16404.     KMAP=1
  16405.     RETURN
  16406.     END
  16407. c -h- acini2.for    Fri Aug 22 12:55:25 1986    
  16408. C PORTACALC MAIN PROGRAM
  16409. C SPREAD SHEET DRIVER PROGRAM
  16410. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  16411. C ALL RIGHTS RESERVED
  16412. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  16413. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  16414. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  16415. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  16416. C FROM THE DISK BASED FILE HERE.
  16417.     SUBROUTINE INITA2(KMAP,KWID,ICODE,IKONS)
  16418. C
  16419.     Include aparms.inc
  16420. c        CHARACTER*1 NOWRAP ( 2 )
  16421.     CHARACTER*1 FORM,FVLD
  16422. c    INTEGER*4 VNLT
  16423. c    INTEGER IFCW
  16424. C    EXTERNAL LCWRQQ
  16425.     DIMENSION FORM(128),FVLD(1,1)
  16426. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  16427. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  16428. C SO INITIALLY IGNORE.
  16429. C
  16430. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  16431. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  16432. C ***<<<< RDD COMMON START >>>***
  16433.     InTeGer*4 RRWACT,RCLACT
  16434. C    COMMON/RCLACT/RRWACT,RCLACT
  16435.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16436.      1  IDOL7,IDOL8
  16437. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16438. C     1  IDOL7,IDOL8
  16439.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16440. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16441.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16442. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16443. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16444. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16445.     InTeGer*4 KLVL
  16446. C    COMMON/KLVL/KLVL
  16447.     InTeGer*4 IOLVL,IGOLD
  16448. C    COMMON/IOLVL/IOLVL
  16449. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16450. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16451.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16452.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16453.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  16454.      3  k3dfg,kcdelt,krdelt,kpag
  16455. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16456. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16457. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  16458. C ***<<< RDD COMMON END >>>***
  16459. CCC    InTeGer*4 RRWACT,RCLACT
  16460. CCC    COMMON/RCLACT/RRWACT,RCLACT
  16461. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16462. CCC     1  IDOL7,IDOL8
  16463. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16464. CCC     1  IDOL7,IDOL8
  16465. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16466. CCC    InTeGer*4 LLCMD,LLDSP
  16467. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16468.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  16469.     COMMON/D2R/NRDSP,NCDSP
  16470. C ***<<< NULETC COMMON START >>>***
  16471.     InTeGer*4 ICREF,IRREF
  16472. C    COMMON/MIRROR/ICREF,IRREF
  16473.     InTeGer*4 MODPUB,LIMODE
  16474. C    COMMON/MODPUB/MODPUB,LIMODE
  16475.     InTeGer*4 KLKC,KLKR
  16476.     REAL*8 AACP,AACQ
  16477. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  16478.     InTeGer*4 NCEL,NXINI
  16479. C    COMMON/NCEL/NCEL,NXINI
  16480.     CHARACTER*1 NAMARY(20,MRows)
  16481. C    COMMON/NMNMNM/NAMARY
  16482.     InTeGer*4 NULAST,LFVD
  16483. C    COMMON/NULXXX/NULAST,LFVD
  16484.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  16485.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  16486. C ***<<< NULETC COMMON END >>>***
  16487. CCC    InTeGer*4 ICREF,IRREF
  16488. CCC    COMMON/MIRROR/ICREF,IRREF
  16489. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16490. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16491. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16492. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16493. c    CHARACTER*1 FORM2(4)
  16494. C ***<<< XVXTCD COMMON START >>>***
  16495.     CHARACTER*1 OARRY(100)
  16496.     InTeGer*4 OSWIT,OCNTR
  16497. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  16498. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16499.     InTeGer*4 IPS1,IPS2,MODFLG
  16500. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16501.        InTeGer*4 XTCFG,IPSET,XTNCNT
  16502.        CHARACTER*1 XTNCMD(80)
  16503. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16504. C VARY FLAG ITERATION COUNT
  16505.     INTEGER KALKIT
  16506. C    COMMON/VARYIT/KALKIT
  16507.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  16508.     InTeGer*4 RCMODE,IRCE1,IRCE2
  16509. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16510. C     1  IRCE2
  16511. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16512. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16513. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16514. C RCFGX ON.
  16515. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16516. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16517. C  AND VM INHIBITS. (SETS TO 1).
  16518.     INTEGER*4 FH
  16519. C FILE HANDLE FOR CONSOLE I/O (RAW)
  16520. C    COMMON/CONSFH/FH
  16521.     CHARACTER*1 ARGSTR(52,4)
  16522. C    COMMON/ARGSTR/ARGSTR
  16523.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  16524.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  16525.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16526.      3  IRCE2,FH,ARGSTR
  16527. C ***<<< XVXTCD COMMON END >>>***
  16528. CCC    InTeGer*4 OSWIT,OCNTR
  16529. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  16530. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16531.     InTeGer*4 TYPE(1,2),VLEN(9)
  16532. CCC    InTeGer*4 KLVL
  16533. CCC    COMMON/KLVL/KLVL
  16534. CCC    InTeGer*4 IOLVL
  16535. CCC    COMMON/IOLVL/IOLVL
  16536. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16537. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16538.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  16539.     Real*8 VAVBLS(3,27)
  16540.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  16541.     REAL*8 XXV(1,1)
  16542.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  16543.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  16544. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  16545.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  16546.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  16547.     CHARACTER*12 CDVFMT
  16548.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  16549.     COMMON/DEFVBX/DVFMT
  16550.     CHARACTER*1 NMSH(80)
  16551.     CHARACTER*80 NMSH80
  16552.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  16553.     COMMON/NMSH/NMSH
  16554. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  16555. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16556. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  16557. CCC       CHARACTER*1 XTNCMD(80)
  16558. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16559. C VARY FLAG ITERATION COUNT
  16560. CCC    INTEGER KALKIT
  16561. CCC    COMMON/VARYIT/KALKIT
  16562. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  16563. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  16564. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16565. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16566. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16567. C RCFGX ON.
  16568. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16569. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16570. C  AND VM INHIBITS. (SETS TO 1).
  16571. C
  16572. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  16573. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  16574. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  16575. C DISPLAY ACTUALLY USED FOR SCREEN.
  16576.     Integer*4 CWids(JIDcl)
  16577. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  16578. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  16579. C AS 20 NOT 75.
  16580. c    INTEGER*4 I4TMP
  16581.     REAL*8 DVS(JIDcl,JIDrw)
  16582.     COMMON /FVLDC/FVLD
  16583. C FOLLOWING SUPPORT VVARY OVERLAY:
  16584.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  16585.     InTeGer*4 QCAC(2),QCENT(8),ACV(8)
  16586.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  16587. C BITMAP
  16588. C    CHARACTER*1 IBITMP
  16589. C    DIMENSION IBITMP(2258)
  16590. C    COMMON/INITD/IBITMP
  16591. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  16592. C 10 CHARACTERS PER ENTRY.
  16593.     COMMON/DSPCMN/DVS,CWIDS
  16594. c    character*35 fwt
  16595. C ***<<< KLSTO COMMON START >>>***
  16596.     InTeGer*4 DLFG
  16597. C    COMMON/DLFG/DLFG
  16598.     InTeGer*4 KDRW,KDCL
  16599. C    COMMON/DOT/KDRW,KDCL
  16600.     InTeGer*4 DTRENA
  16601. C    COMMON/DTRCMN/DTRENA
  16602.     REAL*8 EP,PV,FV
  16603.     DIMENSION EP(20)
  16604.     INTEGER*4 KIRR
  16605. C    COMMON/ERNPER/EP,PV,FV,KIRR
  16606.     InTeGer*4 LASTOP
  16607. C    COMMON/ERROR/LASTOP
  16608.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  16609. C    COMMON/FMTBFR/FMTDAT
  16610.     CHARACTER*1 EDNAM(16)
  16611. C    COMMON/EDNAM/EDNAM
  16612.     InTeGer*4 MFID(2),MFMOD(2)
  16613. C    COMMON/FRM/MFID,MFMOD
  16614.     InTeGer*4 JMVFG,JMVOLD
  16615. C    COMMON/FUBAR/JMVFG,JMVOLD
  16616.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  16617.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  16618. C ***<<< KLSTO COMMON END >>>***
  16619. CCC    CHARACTER*1 EDNAM(16)
  16620. CCC    COMMON/EDNAM/EDNAM
  16621.     CHARACTER*1 EDNINI(4)
  16622.     save ednini
  16623.     DATA EDNINI/'E','D','I','T'/
  16624. C    DATA NOWRAP / "24,0 /
  16625. C
  16626.     DO 2900 III=1,16
  16627. 2900    EDNAM(III)=' '
  16628.     DO 2901 III=1,4
  16629. 2901    EDNAM(III)=EDNINI(III)
  16630.     IF(IKONS.EQ.0)GOTO 3000
  16631. 3002    CONTINUE
  16632.     CALL UVT100(1,1,1)
  16633.     CALL VWRT('Alter Widths or Mapping Y/N:',28)
  16634.     ILL=IOLVL
  16635. C    IF(ILL.EQ.5)ILL=0
  16636.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16637.     if(ill.eq.11)call vget(form,4)
  16638.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3000
  16639.     CALL VWRT('Enter NEW Global Column Width 1-120:',36)
  16640. C ALTER MAPPING DESIRED
  16641.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)KWID
  16642.     if(ill.eq.11)call vgeti(kwid)
  16643. 3004    FORMAT(I3)
  16644.     IF(KWID.LT.1.OR.KWID.GT.120)KWID=10
  16645.     CALL VWRT('Enter length of display in lines (nominally 24):',48)
  16646.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)III
  16647.     if(ill.eq.11)call vgeti(iii)
  16648.     IF(III.LE.4.OR.III.GT.999)III=24
  16649. C RESET DISPLAY SIZE IN S COMMAND QUESTIONS AS NEEDED.
  16650.     LLDSP=III
  16651.     LLCMD=III-1
  16652.     CALL VWRT('Change annotate editor from "EDIT" [Y/N]:',41)
  16653.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16654.     if(ill.eq.11)call vget(form,4)
  16655.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3031
  16656.     CALL VWRT('Give desired edit command:',26)
  16657.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)EDNAM
  16658.     if(ill.eq.11)call vget(ednam,16)
  16659.     EDNAM(16)=' '
  16660. C ENSURE THERE'S A SPACE AT END OF EDITOR NAME
  16661. 3031    CONTINUE
  16662.     CALL VWRT('Modify Extended Area Remap Y/N: ',31)
  16663.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16664.     if(ill.eq.11)call vget(form,4)
  16665.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3502
  16666.     CALL VWRT('# cols to move over on row overflow:',36)
  16667.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)ICREF
  16668.     if(ill.eq.11)call vgeti(icref)
  16669.     IF(ICREF.GT.MCols)ICREF=10
  16670.     IF(ICREF.LT.0)ICREF=10
  16671.     CALL VWRT('# rows to move down on col overflow:',34)
  16672.     if(ill.ne.11)READ(ILL,3004,END=5600,ERR=5600)IRREF
  16673.     if(ill.eq.11)call vgeti(irref)
  16674.     IF(IRREF.GT.(MRows-1))IRREF=50
  16675.     IF(IRREF.LT.0)IRREF=50
  16676. C FORCE THE RESULTS TO MAKE SENSE. 0 TO 60 ON COLS, 0-300 ON ROWS.
  16677. C IF USER BOTHERS TO READ MANUALS THIS WILL BE EXPLAINED.
  16678. 3502    CONTINUE
  16679.     CALL VWRT('Reset Display to Upper Left of Sheet Y/N:',40)
  16680.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16681.     if(ill.eq.11)call vget(form,4)
  16682.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')KMAP=0
  16683. 3006    FORMAT(80A1,50A1)
  16684. 3000    CONTINUE
  16685.     RETURN
  16686. 5600    CONTINUE
  16687.     IOLVL=11
  16688.     CLOSE(3)
  16689. c    Rewind 11
  16690. c    CLOSE(11)
  16691. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command',
  16692. c     1  STATUS='OLD',FORM='FORMATTED')
  16693.     RETURN
  16694.     END
  16695. c -h- acini3.for    Fri Aug 22 12:55:39 1986    
  16696. C PORTACALC MAIN PROGRAM
  16697. C SPREAD SHEET DRIVER PROGRAM
  16698. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  16699. C ALL RIGHTS RESERVED
  16700. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  16701. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  16702. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  16703. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  16704. C FROM THE DISK BASED FILE HERE.
  16705.     SUBROUTINE INITB(KMAP,KWID,ICODE)
  16706. C
  16707.     Include aparms.inc
  16708. c        CHARACTER*1 NOWRAP ( 2 )
  16709.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  16710. c    INTEGER*4 VNLT
  16711. c    INTEGER IFCW
  16712. C    EXTERNAL LCWRQQ
  16713.     DIMENSION FORM(128),FVLD(1,1)
  16714. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  16715. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  16716. C SO INITIALLY IGNORE.
  16717. C
  16718. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  16719. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  16720. C ***<<<< RDD COMMON START >>>***
  16721.     InTeGer*4 RRWACT,RCLACT
  16722. C    COMMON/RCLACT/RRWACT,RCLACT
  16723.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16724.      1  IDOL7,IDOL8
  16725. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16726. C     1  IDOL7,IDOL8
  16727.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  16728. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16729.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16730. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16731. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16732. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16733.     InTeGer*4 KLVL
  16734. C    COMMON/KLVL/KLVL
  16735.     InTeGer*4 IOLVL,IGOLD
  16736. C    COMMON/IOLVL/IOLVL
  16737. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16738. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16739.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16740.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16741.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  16742.      3  k3dfg,kcdelt,krdelt,kpag
  16743. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  16744. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  16745. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  16746. C ***<<< RDD COMMON END >>>***
  16747. CCC    InTeGer*4 RRWACT,RCLACT
  16748. CCC    COMMON/RCLACT/RRWACT,RCLACT
  16749. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  16750. CCC     1  IDOL7,IDOL8
  16751. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  16752. CCC     1  IDOL7,IDOL8
  16753. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16754. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  16755.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  16756.     COMMON/D2R/NRDSP,NCDSP
  16757. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16758. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  16759. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  16760. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  16761. c    CHARACTER*1 FORM2(4)
  16762. C ***<<< XVXTCD COMMON START >>>***
  16763.     CHARACTER*1 OARRY(100)
  16764.     InTeGer*4 OSWIT,OCNTR
  16765. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  16766. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16767.     InTeGer*4 IPS1,IPS2,MODFLG
  16768. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16769.        InTeGer*4 XTCFG,IPSET,XTNCNT
  16770.        CHARACTER*1 XTNCMD(80)
  16771. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16772. C VARY FLAG ITERATION COUNT
  16773.     INTEGER KALKIT
  16774. C    COMMON/VARYIT/KALKIT
  16775.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  16776.     InTeGer*4 RCMODE,IRCE1,IRCE2
  16777. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16778. C     1  IRCE2
  16779. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16780. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16781. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16782. C RCFGX ON.
  16783. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16784. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16785. C  AND VM INHIBITS. (SETS TO 1).
  16786.     INTEGER*4 FH
  16787. C FILE HANDLE FOR CONSOLE I/O (RAW)
  16788. C    COMMON/CONSFH/FH
  16789.     CHARACTER*1 ARGSTR(52,4)
  16790. C    COMMON/ARGSTR/ARGSTR
  16791.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  16792.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  16793.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  16794.      3  IRCE2,FH,ARGSTR
  16795. C ***<<< XVXTCD COMMON END >>>***
  16796. CCC    InTeGer*4 OSWIT,OCNTR
  16797.  
  16798. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  16799. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  16800.     InTeGer*4 TYPE(1,2),VLEN(9)
  16801. CCC    InTeGer*4 KLVL
  16802. CCC    COMMON/KLVL/KLVL
  16803. CCC    InTeGer*4 IOLVL
  16804. CCC    COMMON/IOLVL/IOLVL
  16805. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  16806. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  16807.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  16808.     Real*8 VAVBLS(3,27)
  16809.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  16810.     REAL*8 XXV(1,1)
  16811.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  16812.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  16813. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  16814.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  16815.     CHARACTER*12 CDVFMT
  16816.     EQUIVALENCE(DEFFMT(1),DVFMT(2))
  16817.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  16818.     COMMON/DEFVBX/DVFMT
  16819.     CHARACTER*1 NMSH(80)
  16820.     CHARACTER*80 NMSH80
  16821.     EQUIVALENCE(NMSH80(1:1),FORM(1))
  16822.     COMMON/NMSH/NMSH
  16823. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  16824. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  16825. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  16826. CCC       CHARACTER*1 XTNCMD(80)
  16827. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  16828. C VARY FLAG ITERATION COUNT
  16829. CCC    INTEGER KALKIT
  16830. CCC    COMMON/VARYIT/KALKIT
  16831. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  16832. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  16833. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  16834. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  16835. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  16836. C RCFGX ON.
  16837. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  16838. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  16839. C  AND VM INHIBITS. (SETS TO 1).
  16840. C
  16841. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  16842. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  16843. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  16844. C DISPLAY ACTUALLY USED FOR SCREEN.
  16845.     Integer*4 CWids(JIDcl)
  16846. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  16847. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  16848. C AS 20 NOT 75.
  16849. c    INTEGER*4 I4TMP
  16850.     REAL*8 DVS(JIDcl,JIDrw)
  16851.     COMMON /FVLDC/FVLD
  16852. C FOLLOWING SUPPORT VVARY OVERLAY:
  16853.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  16854.     InTeGer*4 QCAC(2),QCENT(8),ACV(8)
  16855.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  16856. C BITMAP
  16857. C    CHARACTER*1 IBITMP
  16858. C    DIMENSION IBITMP(2258)
  16859. C    COMMON/INITD/IBITMP
  16860. C    CHARACTER*1 DFMTS(10,JIDcl,JIDrw)
  16861. C 10 CHARACTERS PER ENTRY.
  16862.     COMMON/DSPCMN/DVS,CWIDS
  16863.     character*35 fwt
  16864. C    DATA NOWRAP / "24,0 /
  16865. C
  16866.     idol5=20000
  16867.     idol6=20000
  16868. C INITIALLY SET JRCL TO 301 = NO. OF ROWS TO BE IN WORK FILE
  16869.     JRCL=MRows
  16870.     PZAP=0
  16871.     XTCFG=0
  16872.     IPSET=0
  16873. C ZERO BITMAP
  16874. C    DO 36 N1=1,2258
  16875. C36    IBITMP(N1)=0
  16876. c    LINIZZ=0
  16877.     kswmem=0
  16878.     CALL UVT100(1,14,1)
  16879.     CALL VWRT('Enter NEW floating format default Y/N:',38)
  16880.     ILL=IOLVL
  16881. C    IF(ILL.EQ.5)ILL=0
  16882.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16883.     if(ill.eq.11)call vget(form,4)
  16884.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3589
  16885. C ENTER NEW DEFAULT.
  16886. 6888    CALL UVT100(1,14,1)
  16887.     CALL UVT100(12,2,0)
  16888. C LINE NOW ERASED... GET NEW FORMAT
  16889.     CALL VWRT('Enter new format. Suggest F10.2>',32)
  16890.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16891.     if(ill.eq.11)call vget(form,16)
  16892. C NOW HAVE HIS DESIRED FORMAT. COPY INTO THE DEFAULT ARRAY.
  16893. C DEFFMT IS THAT.
  16894.     DO 3591 N1=1,10
  16895.     KKK=ICHAR(FORM(N1))
  16896.     KKK=MAX0(32,KKK)
  16897. C ASSUME NMSH COMPLETELY INIT'D
  16898. 3591    DEFFMT(N1)=Char(KKK)
  16899. c    dvfmt(1)='('
  16900. c    dvfmt(12)=')'
  16901. C CHECK ITS LEGALITY BY TRYING TO USE IT ONCE.
  16902.     XX=3.14159
  16903.     WRITE(NMSH80(1:80),DVFMT,ERR=6888)XX
  16904. C    ENCODE(78,DVFMT,NMSH,ERR=6888)XX
  16905. C IF IT FAILS, PROGRAM WILL CRASH AND FILE WON'T GET CLOBBERED.
  16906. 3589    CONTINUE
  16907.     CALL UVT100(1,15,1)
  16908.     CALL VWRT('Title for Spreadsheet {` to ask sizes}:',39)
  16909.     ILL=IOLVL
  16910. C    IF(ILL.EQ.5)ILL=0
  16911.     if(ill.ne.11)READ(ILL,3006,END=5600,ERR=5600)FORM
  16912.     if(ill.eq.11)call vget(form,120)
  16913. 3006    FORMAT(80A1,50A1)
  16914. c If title starts with ` ask for sizes and reprompt title. Else set
  16915. c defaults up.
  16916.     if(form(1).ne.'`')goto 5306
  16917.     kswmem=1
  16918.     call uvt100(1,19,1)
  16919.     call vwrt('Software virtual memory sizes will be asked',43)
  16920.     goto 3589
  16921. 5306    continue
  16922.     IF(ICHAR(FORM(1)).LE.32.AND.ICHAR(FORM(2)).LE.32) GOTO 3008
  16923. C COPY TITLE UNLESS IT'S OLD
  16924.     DO 3007 KKK=1,80
  16925. 3007    NMSH(KKK)=FORM(KKK)
  16926. C THAT WAY JUST C.R. LEAVES IN OLD TITLE.
  16927. 3008    CONTINUE
  16928. C ****** IF S OPTION GIVEN THEN ICODE=-2
  16929. C THEREFORE, DON'T ASK DISK SIZE ETC, BUT ALLOW RESET OF TITLE
  16930. C AND DEFAULT FORMATS.
  16931.     IF(ICODE.EQ.-2) GOTO 7831
  16932. C ******
  16933.     kr=40
  16934.     kc=22
  16935.     ipgmod=0
  16936.     lpgmod=0
  16937.     ipgmax=1
  16938.     lpgmxf=1
  16939.     if(kswmem.eq.0) goto 5307
  16940.     CALL UVT100(1,16,1)
  16941.     CALL VWRT('Give Max Rows to be used:',25)
  16942.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)KR
  16943.     if(ill.eq.11)call vgeti(kr)
  16944.     IF(KR.LE.0)KR=MRows
  16945.     CALL UVT100(1,17,1)
  16946.     CALL VWRT('Give Max Cols to be used:',25)
  16947.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)KC
  16948.     if(ill.eq.11)call vgeti(kc)
  16949.     IF(KC.LE.0)KC=MCols
  16950. C    KKK=(KR-1)*60+KC
  16951. C ALLOW REPLIES IN ANY RANGE AND REFLECT BACK TO PRIME RANGE
  16952. C NOTE WE WANT A CELL ADDRESS HERE FOR THE END CELL...
  16953.     CALL REFLEC(KR,KC,KKK)
  16954.     XKKKK=KR*KC
  16955.     XKDF=XKKKK/64.
  16956.     XKDN=XKKKK/100.
  16957. C COMPUTED ABOVE THE MIN # OF K FOR DISK FILES
  16958.     CALL UVT100(1,18,1)
  16959.     write(fwt(1:12),2058)xkdn
  16960. 2058    format(F9.0)
  16961.     CALL SWRT('Min=',4)
  16962.     call swrt(fwt(1:12),9)
  16963.     write(fwt,2058)xkdf
  16964.     call swrt(' K Value file ',14)
  16965.     CALL SWRT(fwt(1:12),9)
  16966.     CALL SWRT(' K Formula file',15)
  16967. c    WRITE(0,2058)XKDN,XKDF
  16968. c2058    FORMAT(' Mins=',F9.0' K Value file, ',F9.0,' K Formula file',\)
  16969. C KKK IS MAX INDEX TO BE USED HERE.
  16970.     CALL UVT100(1,21,1)
  16971.     CALL VWRT('Give Value File size, K:',24)
  16972.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)IPGMAX
  16973.     if(ill.eq.11)call vgeti(ipgmax)
  16974. 7202    FORMAT(I6)
  16975.     IPGMOD=KKK
  16976.     IF(IPGMAX.LT.0)IPGMOD=0
  16977.     IPGMAX=IABS(IPGMAX)
  16978.     IF(IPGMAX.GT.2512)IPGMAX=1
  16979.     CALL UVT100(1,22,1)
  16980.     CALL VWRT('Give Formula File size, K:',26)
  16981.     if(ill.ne.11)READ(ILL,7202,END=5600,ERR=5600)LPGMXF
  16982.     if(ill.eq.11)call vgeti(lpgmxf)
  16983.     LPGMOD=KKK
  16984.     IF(LPGMXF.LT.0)LPGMOD=0
  16985.     LPGMXF=IABS(LPGMXF)
  16986. C IF NUMBERS ARE ENTERED NEGATIVE, SET MODE TO "SLOW, FILE-SPACE
  16987. C CONSERVING" PACKING, SCATTERING PAGES ACROSS FILE.
  16988.     IF(LPGMXF.GT.4096)LPGMXF=(IPGMAX*3)/2
  16989. 5307    Continue
  16990. C NULL TERMINATE ALL FORMAT STRINGS.
  16991. C SET MAX WIDTH FOR PRINT TO DIMENSION OF THE BUFFER. NOTE THIS IS THE
  16992. C USUAL HARDWARE MAXIMUM SO WE DON'T WORRY TOO MUCH ABOUT IT. NOTE
  16993. C BILL TABOR'S PROGRAM TO PRINT PASTE-ABLE VERSIONS OF THE SHEET FROM
  16994. C SAVE FILES EXISTS, SO WE NEEDN'T WORRY TOO MUCH EITHER ABOUT USING
  16995. C DISPLAY FOR DOUBLE DUTY.
  16996.     MXL=132
  16997. C INITIALIZE WORK STORAGE FOR FORMULAS AND VARIABLES
  16998.     CALL WSSET
  16999. 7831    CONTINUE
  17000. C SET DEFAULT WIDTHS OF COLUMNS TO 10. MAY BE ALTERED BELOW FOR DIFFERENT
  17001. C DEFAULT IF DESIRED.
  17002.     DO 16 N1=1,JIDcl
  17003.     CWIDS(N1)=KWID
  17004. 16    CONTINUE
  17005. C
  17006. C NOW SET UP NRDSP, NCDSP
  17007.     IF(KMAP.EQ.0)GOTO 3009
  17008. C SET UP MAPPING NOW FOR INITIALLY UPPER LEFT CORNER OF PHYS SHEET IN DISPLAY SHT.
  17009.     DO 5 N1=1,JIDcl
  17010.     DO 5 N2=1,JIDrw
  17011. C INITIALLY WE DISPLAY THE UPPER LEFT PART OF THE SYSTEM.
  17012. C ESTABLISH ASSOCIATION INITIALLY THEREFORE OF DISPLAY TO UPPER
  17013. C LEFT OF PHYSICAL SHEET.
  17014.     NRDSP(N1,N2)=N1
  17015.     NCDSP(N1,N2)=N2+1
  17016.     DVS(N1,N2)=.00000031
  17017. 5    CONTINUE
  17018. C FOR S OPTION USE SECRET -4 CODE TO RESET SHEET. STILL NEEDS WORK
  17019. C IN PORTACALC PC.
  17020.     IF(ICODE.EQ.-4)CALL WRKFIL(1,FORM,2)
  17021. 3009    IF(ICODE.EQ.-4)GOTO 1
  17022. C43    CALL UVT100(1,21,1)
  17023.     KZPPD=0
  17024.     CMDLIN(1)=Char(0)
  17025.     IOLDFL=0
  17026. C3017    FORMAT(Q,80A1,80A1)
  17027.     MXL=1
  17028.     CMDLIN(MXL+1)=Char(0)
  17029. 3572    FORMAT(I6)
  17030.     CALL UVT100(13,0,0)
  17031. C  SET UP RANDOM FILE AS NEEDED FOR SHEET
  17032. C EACH RECORD HAS:
  17033. C CHARS 1-110    FORMULAS
  17034. C CHARS 120-128    DISPLAY FORMAT (INITIALLY F9.2)
  17035. C CHAR 119    VALID FLAG (ALLOWS HANDLING READS.)
  17036. C    values: -3, -2: Numeric-only text (or special chars)
  17037. C         -1    : Alphanumeric text
  17038. C          0    : Uninitialized
  17039. C          1    : Alphanumeric formula
  17040. C         +2    : Number or pure numeric formula with value calculated
  17041. C         +3    : Number or pure numeric formula, value not yet computed
  17042. C CHAR 118    MAGIC NUMBER 15 (CHECKS ALL WELL)
  17043. C READ A RECORD, IF ERROR, CREATE EMPTY FILE.
  17044. C    IF(IOLDFL.EQ.0)GOTO 1
  17045. CC IF IOLDFL NONZERO IT MEANS USER CLAIMS THERE EXISTS A FILE. IF 0 IT'S NEW.
  17046. CC HERE IT'S OLD SO LET'S BE SURE IT REALLY IS OK.
  17047. 1    CONTINUE
  17048. C HIT EOF OR ERROR. MUST BE A NEW FILE. THEREFORE ZERO IT TO OUR NEEDS.
  17049. C AT THIS POINT WE ARE CREATING A NEW FILE AND NEED TO ZERO IT.
  17050. C
  17051.     DO 3 N=1,128
  17052.     FORM(N)=Char(0)
  17053. 3    CONTINUE
  17054.     DO 3592 N=1,9
  17055. C SET UP DEFAULT FORMAT
  17056. 3592    FORM(119+N)=DEFFMT(N)
  17057.     FORM(118)=CHAR(15)
  17058.     FORM(1)='0'
  17059.     FORM(2)='.'
  17060. C CREATE NULL FILE INITIALLY BY RESETTING ALL.
  17061.     JRRCL=MCols*JRCL
  17062.     KZPPD=1
  17063. C
  17064. 2    CONTINUE
  17065. C COMMON POINT WITH FILE PREPARED.
  17066.     PCOL=2
  17067.     PROW=1
  17068.     DCOL=1
  17069.     DROW=1
  17070.     RETURN
  17071. 5600    CONTINUE
  17072. C ERROR ON READ FROM IOLVL HANDLED HERE.
  17073. C    REWIND 5
  17074.     Rewind 11
  17075. c    CLOSE(11)
  17076. c    OPEN(11,FILE='CON:0/150/500/49/Analy Command',
  17077. c     1  STATUS='OLD',FORM='FORMATTED')
  17078.     CLOSE(3)
  17079.     IOLVL=11
  17080.     RETURN
  17081.     END
  17082. c -h- block.for    Fri Aug 22 12:58:14 1986    
  17083.     SUBROUTINE BLOCK
  17084. C    BLOCK DATA
  17085. C COPYRIGHT (C) 1983 GLENN EVERHART
  17086. C ALL RIGHTS RESERVED
  17087. C 18060 = 60*301
  17088. C 18033=18060-27
  17089. C 60=MAX REAL ROWS
  17090. C 301=MAX REAL COLS
  17091. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  17092. C VBLS AND TYPE DIMENSIONED 60,301
  17093.     Include aparms.inc
  17094. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  17095. C   +                                                +
  17096. C   +            CALC    VERSION  X01-06             +
  17097. C   +                                                +
  17098. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  17099. C
  17100. C
  17101. C *******************************************************
  17102. C *                                                     *
  17103. C *            BLOCK  DATA  MODULE                      *
  17104. C *                                                     *
  17105. C *******************************************************
  17106. C
  17107. C
  17108. C COMMON AREAS ARE INITIALIZED BY THIS MODULE.
  17109. C FAKEUP FOR MICROSOFT WHICH HAS NO BLOCK DATA.
  17110. C DO IT ALL VIA LOOPS...
  17111. C
  17112. C
  17113. C MODIFIED 18-MAY-1981 P.B. SET % TO VERSION 6
  17114. C
  17115. C
  17116. C
  17117. C   VARIABLE      USE
  17118. C
  17119. C  ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC CHARACTERS
  17120. C               OR THE CHARACTER %.
  17121. C  BASED     HOLDS DEFAULT BASE.
  17122. C  BLANK        ' '
  17123. C  COMMA        ','
  17124. C  DIGITS(16,3) HOLDS DECIMAL, OCTAL, AND HEXADECIMAL DIGITS. THE
  17125. C               SECOND SUBSCRIPT IS
  17126. C                     1 FOR DECIMAL
  17127. C                     2 FOR OCTAL
  17128. C                     3 FOR HEXADECIMAL
  17129. C  DTBL1(9,9,8) CONTROLS THE DECISION PROCESS WHEN EVALUATING A
  17130. C               BINARY OPERATION. SEE BELOW FOR DETAILS.
  17131. C  EQ           '='
  17132. C  ITCNTV(6)    INDEXED BY LEVEL. 0 INDICATES THAT NO ITERATION ON THE
  17133. C               INDIRECT COMMAND FILE IS TO TAKE PLACE. IF POSITIVE, IT
  17134. C               HOLDS THE INDEX INTO VBLS AND REPRESENTS THE VARIABLE
  17135. C               USED TO CONTROL ITERATION.
  17136. C  LINE(80)     COMMAND INPUT LINE
  17137. C  LPAR         '('
  17138. C  RPAR         ')'
  17139. C  ST1LIM       HOLDS THE SIZE OF STACK 1 (ALWAYS CONSTANT)
  17140. C  ST2LIM       HOLDS THE SIZE OF STACK 2 (ALWAYS CONSTANT)
  17141. C  ST1PT        POINTS TO THE TOP OF STACK 1 (CHANGES AS STACK IS USED)
  17142. C  ST2PT        POINTS TO THE TOP OF STACK 2 (CHANGES AS STACK IS USED)
  17143. C  ST1TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 1
  17144. C  ST2TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 2
  17145. C  STACK1(20,40)   UTILITY STACKS USED WHEN EVALUATING EXPRESSIONS. THE FIRST
  17146. C  STACK2(20,40)   SUBSCRIPT CONTROLS INDEXING ACROSS THE BYTES OF A SINGLE
  17147. C                   VARIABLE. THE SECOND SUBSCRIPT CONTROLS STACK ELEMENTS.
  17148. C  TYPE(27)         HOLDS THE DATA TYPES FOR EACH OF THE 27 VARIABLES. SEE
  17149. C                   CODES.FTN FOR THE POSSIBLE VALUES.
  17150. C  VIEWSW           VIEW SWITCH
  17151. C                    0 = OUTPUT ERROR MESSAGES
  17152. C                    1 = OUTPUT ERROR MESSAGES AND FILE COMMAND LINES
  17153. C                    2 = OUTPUT ERROR MESSAGES AND VALUE OF EXPRESSIONS
  17154. C                        EVALUATED.
  17155. C                    3 = OUTPUT EVERYTHING
  17156. C  VLEN(9)      INDEXED BY DATA TYPE. GIVES THE NUMBER OF BYTES USED
  17157. C               BY THAT DATA TYPE.
  17158. C  AVBLS(20,27)      HOLDS THE VALUES OF THE 27 LEGAL VARIABLES.(ACCUMULATORS)
  17159. C  VBLS(8,60,301)    HOLDS VALUES OF ALL VARIABLES
  17160. C
  17161. C
  17162. C
  17163. C    CONSTANTS ARE STORED IN VBLS ACCORDING TO THEIR TYPE:
  17164. C
  17165. C
  17166. C
  17167. C <----------- MULTIPLE PRECISION (M10, M8, M16) ------------------------->
  17168. C !                        <------------- DECIMAL AND REAL --------------->
  17169. C !                        !                      <-- INTEGER HEX OCTAL -->
  17170. C !                                               !             ---> ASCII <---
  17171. C !                        !                      !                        !
  17172. C
  17173. C -------------     -------------------------------------------------------
  17174. C !     !     !     !     !     !     !     !     !     !     !     !     !
  17175. C ! 20  !  19 ! ... !  9  !  8  !  7  !  6  !  5  !  4  !  3  !  2  !  1  !
  17176. C !     !     !     !     !     !     !     !     !     !     !     !     !
  17177. C -------------     -------------------------------------------------------
  17178. C
  17179. C
  17180. C NOTE: BYTE 20 HOLDS THE SIGN FOR MULTIPLE PRECISION NUMBERS.
  17181. C       0 = POSITIVE, 1 = NEGATIVE
  17182. C
  17183. C
  17184. C
  17185. C
  17186. C
  17187. C    BLOCK DATA
  17188.     InTeGer*4 LEVEL,NONBLK,LEND
  17189.     InTeGer*4 LASTOP
  17190.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  17191.     InTeGer*4 TYPE(1,2)
  17192.     InTeGer*4 VIEWSW,BASED,VLEN(9),BVLEN(9)
  17193.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  17194.     InTeGer*4 ITCNTV(6)
  17195. C
  17196.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ,LINE(80)
  17197.     CHARACTER*1 BOMMA,BBLANK,BRPAR,BLPAR,BEQ
  17198.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  17199.     CHARACTER*1 AVBLS(24,27),BLPHA(27)
  17200.     Real*8 VAVBLS(3,27)
  17201.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  17202.     CHARACTER*1 VBLS(8,1,1)
  17203. C ***<<< XVXTCD COMMON START >>>***
  17204.     CHARACTER*1 OARRY(100)
  17205.     InTeGer*4 OSWIT,OCNTR
  17206. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  17207. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  17208.     InTeGer*4 IC1POS,IC2POS,MODFLG
  17209. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  17210.        InTeGer*4 XTCFG,IPSET,XTNCNT
  17211.        CHARACTER*1 XTNCMD(80)
  17212. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17213. C VARY FLAG ITERATION COUNT
  17214.     INTEGER KALKIT
  17215. C    COMMON/VARYIT/KALKIT
  17216.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17217.     InTeGer*4 RCMODE,IRCE1,IRCE2
  17218. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17219. C     1  IRCE2
  17220. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  17221. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  17222. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  17223. C RCFGX ON.
  17224. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  17225. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  17226. C  AND VM INHIBITS. (SETS TO 1).
  17227.     INTEGER*4 FH
  17228. C FILE HANDLE FOR CONSOLE I/O (RAW)
  17229. C    COMMON/CONSFH/FH
  17230.     CHARACTER*1 ARGSTR(52,4)
  17231. C    COMMON/ARGSTR/ARGSTR
  17232.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  17233.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  17234.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17235.      3  IRCE2,FH,ARGSTR
  17236. C ***<<< XVXTCD COMMON END >>>***
  17237. CCC    InTeGer*4 IC1POS,IC2POS
  17238. CCC    COMMON/ICPOS/IC1POS,IC2POS
  17239.     CHARACTER*1 DTBL1(9,9,8)
  17240. CC BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  17241. C MOVED TABLE TO WRKFIL WHERE IT IS OVERLAIN BY A BUFFER DURING OPERATION
  17242. C AND JUST INITIALIZES DTBL1 AT STARTUP. THIS SHOULD ESSENTIALLY REMOVE DATA
  17243. C SPACE PENALTY FOR THIS HUGE ARRAY. NOTE IT'D BE SMALLER IF THERE WEREN'T
  17244. C SO MANY SUPPORTED DATA TYPES IN CALC.
  17245. C    InTeGer*4 BTBL(9,9,8)
  17246. C    InTeGer*4 BTBL1(9,9)
  17247. C    InTeGer*4 BTBL2(9,9),BTBL3(9,9),BTBL4(9,9),BTBL5(9,9)
  17248. C    InTeGer*4 BTBL6(9,9),BTBL7(9,9),BTBL8(9,9)
  17249. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  17250. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  17251. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  17252. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  17253.     CHARACTER*1 DIGITS(16,3),BIGITS(16,3)
  17254. C
  17255. C OARRY WILL BE USED TO HOLD OUTPUT VARIABLE IF OSWIT IS NONZERO
  17256. CCC    InTeGer*4 OSWIT
  17257. C OCNTR MAY HOLD BYTES VALID IN OARRY (UP TO 100, NO MORE...)
  17258. CCC    InTeGer*4 OCNTR
  17259. CCC    CHARACTER*1 OARRY(100)
  17260. C
  17261. C ILINE IS PROGRAMMABLE LINE INPUT (I.E., NOT FROM CONSOLE)
  17262.     CHARACTER*1 ILINE(106)
  17263.     InTeGer*4 ILNFG
  17264.     InTeGer*4 ILNCT
  17265.     COMMON /ILN/ILNFG,ILNCT,ILINE
  17266. C ILINE IS PRESENT IF ILNFG <> 0 AND ILNCT HAS # BYTES IN IT.
  17267. CCC    COMMON /OAR/OSWIT,OCNTR,OARRY
  17268.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  17269.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  17270.     COMMON /STACKx/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  17271.      ;         ST1LIM,ST2LIM
  17272.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  17273.     COMMON /DECIDE/ DTBL1
  17274.     COMMON /DIGV/ DIGITS
  17275. C ***<<< KLSTO COMMON START >>>***
  17276.     InTeGer*4 DLFG
  17277. C    COMMON/DLFG/DLFG
  17278.     InTeGer*4 KDRW,KDCL
  17279. C    COMMON/DOT/KDRW,KDCL
  17280.     InTeGer*4 DTRENA
  17281. C    COMMON/DTRCMN/DTRENA
  17282.     REAL*8 EP,PV,FV
  17283.     DIMENSION EP(20)
  17284.     INTEGER*4 KIRR
  17285. C    COMMON/ERNPER/EP,PV,FV,KIRR
  17286. c    InTeGer*4 LASTOP
  17287. C    COMMON/ERROR/LASTOP
  17288.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  17289. C    COMMON/FMTBFR/FMTDAT
  17290.     CHARACTER*1 EDNAM(16)
  17291. C    COMMON/EDNAM/EDNAM
  17292.     InTeGer*4 MFID(2),MFMOD(2)
  17293. C    COMMON/FRM/MFID,MFMOD
  17294.     InTeGer*4 JMVFG,JMVOLD
  17295. C    COMMON/FUBAR/JMVFG,JMVOLD
  17296.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  17297.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  17298. C ***<<< KLSTO COMMON END >>>***
  17299. CCC    COMMON /ERROR/ LASTOP
  17300.     COMMON/ITERA/ ITCNTV
  17301.     CHARACTER*1 DVFMT(12),BVFMT(12)
  17302.     COMMON/DEFVBX/DVFMT
  17303. C SUPPORT VVARY OVERLAY WITH INITIAL VARY DATA:
  17304.     REAL*8 QAC(26),QDERIV(8),QDEL(8),QOLDVV,oldx,olda
  17305.     InTeGer*4 QCAC(2),QCENT(8),ACV(8)
  17306.     COMMON/VRYDAT/QAC,QDERIV,QDEL,QCAC,QCENT,QOLDVV,oldx,olda,ACV
  17307. C INITIAL DEFAULT FORMAT FOR NUMERICS
  17308.     DATA BVFMT/'(','F','9','.','2',' ',
  17309.      1  ' ',' ',' ',' ',' ',')'/
  17310. C
  17311. C    DATA BIEWSW/2/
  17312. C    DATA ITCNTV/6*0/
  17313.     DATA BLPHA/'A','B','C','D','E','F','G','H','I','J','K','L','M',
  17314.      ;       'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','%'/
  17315.     DATA BIGITS/'1','2','3','4','5','6','7','8','9',
  17316.      1  '0','0','0','0','0','0','0',
  17317.      ;       '1','2','3','4','5','6','7',
  17318.      1  '0','0','0','0','0','0','0','0','0',
  17319.      ;  '1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','0'/
  17320.     DATA BOMMA/','/,BBLANK/' '/,BRPAR/')'/,BLPAR/'('/,BEQ/'='/
  17321. C
  17322. C
  17323. C DEFAULT BASE IS 10
  17324. C    DATA BASED/10/
  17325. C
  17326. C
  17327. C STACKS ARE CURRENTLY SET AT 40 ELEMENTS DEEP
  17328. C    DATA ST1LIM/40/, ST2LIM/40/
  17329. C
  17330. C
  17331. C
  17332. C    DEFAULT TYPES
  17333. C    A,B,C,D,E,F,G,H  =  DECIMAL
  17334. C    I,J,K,L,M,N      =  INTEGER (BASE10)
  17335. C    O,P,Q,R,S,T,U,V,W,X,Y,Z  =  DECIMAL
  17336. C
  17337. C  % AS INTEGER TO HOLD CALC VERSION NUMBER
  17338. C
  17339. C    DATA TYPE/8*2,6*4,12*2,4,1*2/
  17340. c modify type array so ac's i-n are reals
  17341. C    DATA TYPE/8*2,6*2,12*2,2,1*2/
  17342. C
  17343. C
  17344. C GIVE VERSION # BY VALUE IN %
  17345. C
  17346. c don't bother with this; by the time user gets into calc,
  17347. c % already is clobbered most times, so no need for it.
  17348. c    DATA AVBLS(1,27)/6/
  17349. c    DATA AVBLS(2,27)/0/,AVBLS(3,27)/0/,AVBLS(4,27)/0/
  17350. C
  17351. C
  17352. C
  17353. C
  17354. C SPECIFY THE LENGTH USED BY EACH DATA TYPE
  17355.     DATA BVLEN/1,8,4,4,8,8,8,4,8/
  17356. C
  17357. C NOTE ALL LENGTHS 8 OR LESS SINCE MULTIPLE PRECISION THINGS SNIPPED OUT
  17358. C
  17359. C  DECISION TABLE FOR PERFORMING BINARY OPERATIONS
  17360. C
  17361. C  DTBL1(OPERAND2,OPERAND1,INDEX)
  17362. C
  17363. C  WHERE:                    OPERATOR:
  17364. C  INDEX=1    MODIFY CODE FOR OPERAND 1    */+-
  17365. C     2    MODIFY CODE FOR OPERAND 2    */+-
  17366. C     3    FUNCTION VALUE TYPE        */+-
  17367. C     4    OPERATOR CLASS            */+-
  17368. C
  17369. C     5    MODIFY CODE FOR OPERAND 1    **
  17370. C     6    MODIFY CODE FOR OPERAND 2    **
  17371. C     7    FUNCTION VALUE TYPE        **
  17372. C     8    OPERATOR CLASS            **
  17373. C
  17374. C
  17375. C  WHERE TYPE CODES (MODIFY CODES) ARE:
  17376. C    0    NO CHANGE
  17377. C    1    CONVERT TO ASCII
  17378. C    2    CONVERT TO DECIMAL
  17379. C    3    CONVERT TO HEXADECIMAL
  17380. C    4    CONVERT TO INTEGER
  17381. C    5    CONVERT TO M10
  17382. C    6    CONVERT TO M8
  17383. C    7    CONVERT TO M16
  17384. C    8    CONVERT TO OCTAL
  17385. C    9    CONVERT TO REAL
  17386. C
  17387. C  FOR */+- FUNCTION VALUE TYPES AND OPERATOR CLASS ARE PRESENTLY
  17388. C  IDENTICAL
  17389. C
  17390. C  FOR **  OPERATOR CLASSES FOLLOW:
  17391. C
  17392. C     CODE    OPERATOR CLASS
  17393. C    1    REAL**REAL
  17394. C    2    REAL**INTEGER
  17395. C    3    INTEGER**REAL
  17396. C    4    INTEGER**REAL
  17397. C    5    M8**INTEGER
  17398. C    6    M10**INTEGER
  17399. C    7    M16**INTEGER
  17400. C
  17401. C
  17402. C
  17403. C    DATA BTBL1 /4,2,3,4,5,6,7,8,9,
  17404. C     1  9*0,0,2,0,0,3*7,0,9,0,2,0,0,5,5,7,0,9,0,2,7,0,0,0,7,0,9,
  17405. C     2  0,2,7,5,5,0,7,0,9,0,2,6*0,9,0,2,3,0,5,6,7,0,9,0,2,7*0/
  17406. C    DATA BTBL2/
  17407. C     3  4,8*0,2,0,6*2,0,3,3*0,7,7,3*0,4,4*0,5,3*0,5,0,7,5,0,5,0,5,0,
  17408. C     4  6,0,7,5,3*0,6,0,7,2,4*7,0,7,0,8,8*0,9,0,6*9,0/
  17409. C    DATA BTBL3/4,2,3,4,5,6,7,8,9,
  17410. C     5  9*2,3,2,3,3,3*7,3,9,4,2,3,4,5,5,7,4,9,5,2,7,3*5,7,5,9,
  17411. C     6  6,2,7,5,5,6,7,6,9,7,2,6*7,9,8,2,3,4,5,6,7,8,9,9,2,7*9/
  17412. C    DATA BTBL4/
  17413. C     7  4,2,3,4,5,6,7,8,9,9*2,3,2,3,3,3*7,3,9,4,2,3,4,5,5,7,4,9,
  17414. C     8  5,2,7,5,5,5,7,5,9,6,2,7,5,5,6,7,6,9,7,2,6*7,9,8,2,3,4,5,6,7,8,9,
  17415. C     9  9,2,7*9/
  17416. C    DATA BTBL5/4,2,3,6*4,9*0,9*0,9*0,0,9,6*0,9,0,9,6*0,9,0,9,6*0,9,
  17417. C     1  9*0,9*0/
  17418. C    DATA BTBL6/4,3*0,3*9,4,0,4,3*0,3*9,0,0,4,3*0,3*9,2*0,4,3*0,3*9,
  17419. C     2  2*0,4,3*0,3*4,2*0,4,3*0,3*4,2*0,4,3*0,3*4,2*0,4,3*0,3*9,2*0,
  17420. C     3  4,3*0,3*9,2*0/
  17421. C        DATA BTBL7/4,2,3,6*4,9*2,9*3,9*4,5,9,6*5,9,6,9,6,6,5,6,7,6,9,
  17422. C     4  7,9,6*7,9,9*8,9*9/
  17423. C    DATA BTBL8/4,1,4,4,3,3,3,4,3,2,1,2,2,3*1,2,1,4,3,4,4,3*3,
  17424. C     5  4,3,4,3,4,4,3*3,4,3,6,1,6*6,1,5,1,6*5,1,7,1,6*7,1,4,3,4,4,3*3,
  17425. C     6  4,3,2,1,2,2,3*1,2,1/
  17426. C
  17427. C HERE COPY LOCAL DATA INTO THE COMMONS.
  17428. C SINCE MOST ARRAYS AND THINGS ARE SMALL, WE JUST DO IT WITH REGULAR FORTRAN.
  17429. C THE BTBL ARRAY IS HANDLED IN WRKFIL WHERE THERE'S A BIG ENOUGH ARRAY FOR
  17430. C SCRATCH SPACE TO HOLD THE INITIAL DATA; WRKFIL IS CALLED BY WSSET WITH
  17431. C "SECRET CODE" TO INIT DTBL1 FROM THE ARRAY AND DOES SO ONCE ONLY.
  17432.     VIEWSW=0
  17433.     LEVEL=1
  17434.     LASTOP=0
  17435.     BASED=10
  17436.     COMMA=BOMMA
  17437.     BLANK=BBLANK
  17438.     RPAR=BRPAR
  17439.     LPAR=BLPAR
  17440.     EQ=BEQ
  17441.     DO 1 N=1,6
  17442.     ITCNTV(N)=0
  17443. 1    CONTINUE
  17444.     DO 2 N=1,27
  17445.     DO 12 NN=1,20
  17446. 12    AVBLS(NN,N)=Char(0)
  17447. 2    ALPHA(N)=BLPHA(N)
  17448.     ST1LIM=40
  17449.     ST2LIM=40
  17450. C THIS IS DONE IN WRKFIL SINCE THERE'S A BIG LOCAL ARRAY THERE
  17451. C WE CAN KEEP EQUIVALENCED TO THIS ONE...
  17452. C    DO 3 N2=1,9
  17453. C    DO 3 N1=1,9
  17454. C    DTBL1(N1,N2,2)=BTBL2(N1,N2)
  17455. C    DTBL1(N1,N2,3)=BTBL3(N1,N2)
  17456. C    DTBL1(N1,N2,4)=BTBL4(N1,N2)
  17457. C    DTBL1(N1,N2,5)=BTBL5(N1,N2)
  17458. C    DTBL1(N1,N2,6)=BTBL6(N1,N2)
  17459. C    DTBL1(N1,N2,7)=BTBL7(N1,N2)
  17460. C    DTBL1(N1,N2,8)=BTBL8(N1,N2)
  17461. C3    DTBL1(N1,N2,1)=BTBL1(N1,N2)
  17462.     DO 4 N=1,9
  17463.     VLEN(N)=BVLEN(N)
  17464. 4    CONTINUE
  17465.     DO 5 N2=1,3
  17466.     DO 5 N1=1,16
  17467.     DIGITS(N1,N2)=BIGITS(N1,N2)
  17468. 5    CONTINUE
  17469. C SET UP DEFAULT DISPLAY FORMAT (INCLUDES "(" AND ")" CHARS WHICH
  17470. C ***MUST*** BE THERE FOR MAIN PGM TO WORK).
  17471.     DO 17 N=1,12
  17472.     DVFMT(N)=BVFMT(N)
  17473. 17    Continue
  17474.     DO 15 N=1,26
  17475.     QAC(N)=0.
  17476. 15    CONTINUE
  17477.     DO 18 N=1,8
  17478.     QDERIV(N)=1.
  17479.     ACV(N)=0
  17480.     QDEL(N)=0.
  17481.     QCENT(N)=0
  17482. 18    CONTINUE
  17483.     QOLDVV=1.
  17484.     QCAC(1)=1
  17485.     OSWIT=0
  17486.     OCNTR=0
  17487.     ILNFG=0
  17488.     ILNCT=0
  17489.     IC1POS=0
  17490.     IC2POS=0
  17491.     RETURN
  17492.     END
  17493. c -h- dtrcmd.for    Fri Aug 22 13:04:33 1986    
  17494. C DATATRIEVE INTERFACE FUNCTIONS
  17495. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  17496. C
  17497. C THIS IS THE NON-DTR VERSION with dummy entry points for
  17498. C the DTR functions BUT supplying the new non-DTR functions
  17499. c completely.
  17500.     SUBROUTINE DTRCMD(LINE)
  17501.     Include aparms.inc
  17502.     CHARACTER*1 LINE(80)
  17503.     CHARACTER*70 LINEC
  17504. C    EQUIVALENCE(LINEC(1:1),LINE(1))
  17505. C    INCLUDE VKLUGPRM.FTN''
  17506. C COPYRIGHT (C) 1983 GLENN EVERHART
  17507.     INTEGER RETCD
  17508. C
  17509. C DEFINE FILE AREAS FOR MAPPING FILES...
  17510. C ONE INPUT FILE, TO BE ACCESSED AS A RANDOM ACCESS FILE OF 128 BYTE
  17511. C RECORDS OF DATA IF RANDOM, OR AS A FORMULA FILE IF SEQUENTIAL, AND
  17512. C ONE OUTPUT FILE TO BE WRITTEN THE SAME WAY. INPUT FILE CAN BE
  17513. C INPUT - ONLY OR READ/WRITE.
  17514. C
  17515. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  17516. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  17517. C
  17518. C MFIOPN =    0    IF NOT OPEN
  17519. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  17520. C        2    IF OPEN READ ONLY, RANDOM
  17521. C        3    IF OPEN READ/WRITE, RANDOM.
  17522. C
  17523. C MFOOPN =    0    IF NOT OPEN
  17524. C        1    IF OPEN WRITE SEQUENTIAL
  17525. C        2    IF OPEN WRITE RANDOM
  17526. C
  17527. C OTHER OPTIONS DON'T MAKE SENSE.
  17528. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  17529. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  17530. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  17531. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  17532.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  17533.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  17534.  
  17535.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  17536.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  17537.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  17538. C
  17539. C
  17540.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  17541.     Real*8 VAVBLS(3,27)
  17542.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  17543.     InTeGer*4 TYPE(1,2),VLEN(9)
  17544.     REAL*8 XAC,XVBLS(1,1)
  17545.     REAL*8 TAC,UAC,VAC,WAC,YAC
  17546.     REAL*8 TMP
  17547.     INTEGER*4 JVBLS(2,1,1)
  17548.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  17549.     EQUIVALENCE(XAC,AVBLS(1,27))
  17550.     EQUIVALENCE(TAC,AVBLS(1,20))
  17551.     EQUIVALENCE(UAC,AVBLS(1,21))
  17552.     EQUIVALENCE(VAC,AVBLS(1,22))
  17553.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  17554.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  17555.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  17556. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  17557. CCC    CHARACTER*1 XTNCMD(80)
  17558. C ***<<<< RDD COMMON START >>>***
  17559.     InTeGer*4 RRWACT,RCLACT
  17560. C    COMMON/RCLACT/RRWACT,RCLACT
  17561.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  17562.      1  IDOL7,IDOL8
  17563. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  17564. C     1  IDOL7,IDOL8
  17565.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  17566. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17567.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17568. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  17569. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  17570. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  17571.     InTeGer*4 KLVL
  17572. C    COMMON/KLVL/KLVL
  17573.     InTeGer*4 IOLVL,IGOLD
  17574. C    COMMON/IOLVL/IOLVL
  17575. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  17576. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  17577.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17578.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17579.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  17580.      3  k3dfg,kcdelt,krdelt,kpag
  17581. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  17582. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  17583. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  17584. C ***<<< RDD COMMON END >>>***
  17585. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17586. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  17587. CCC    InTeGer*4 RRWACT,RCLACT
  17588. CCC    COMMON/RCLACT/RRWACT,RCLACT
  17589. C ***<<< XVXTCD COMMON START >>>***
  17590.     CHARACTER*1 OARRY(100)
  17591.     InTeGer*4 OSWIT,OCNTR
  17592. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  17593. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  17594.     InTeGer*4 IPS1,IPS2,MODFLG
  17595. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  17596.        InTeGer*4 XTCFG,IPSET,XTNCNT
  17597.        CHARACTER*1 XTNCMD(80)
  17598. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17599. C VARY FLAG ITERATION COUNT
  17600.     INTEGER KALKIT
  17601. C    COMMON/VARYIT/KALKIT
  17602.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17603.     InTeGer*4 RCMODE,IRCE1,IRCE2
  17604. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17605. C     1  IRCE2
  17606. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  17607. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  17608. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  17609. C RCFGX ON.
  17610. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  17611. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  17612. C  AND VM INHIBITS. (SETS TO 1).
  17613.     INTEGER*4 FH
  17614. C FILE HANDLE FOR CONSOLE I/O (RAW)
  17615. C    COMMON/CONSFH/FH
  17616.     CHARACTER*1 ARGSTR(52,4)
  17617. C    COMMON/ARGSTR/ARGSTR
  17618.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  17619.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  17620.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  17621.      3  IRCE2,FH,ARGSTR
  17622. C ***<<< XVXTCD COMMON END >>>***
  17623. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  17624. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  17625. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  17626. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  17627. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  17628. C (IMPLEMENT FOR VAX ONLY)
  17629. CCC    INTEGER KALKIT
  17630. CCC    COMMON/VARYIT/KALKIT
  17631. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  17632. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  17633. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17634. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  17635.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  17636.     COMMON/D2R/NRDSP,NCDSP
  17637. C ***<<< KLSTO COMMON START >>>***
  17638.     InTeGer*4 DLFG
  17639. C    COMMON/DLFG/DLFG
  17640.     InTeGer*4 KDRW,KDCL
  17641. C    COMMON/DOT/KDRW,KDCL
  17642.     InTeGer*4 DTRENA
  17643. C    COMMON/DTRCMN/DTRENA
  17644.     REAL*8 EP,PV,FV
  17645.     DIMENSION EP(20)
  17646.     INTEGER*4 KIRR
  17647. C    COMMON/ERNPER/EP,PV,FV,KIRR
  17648.     InTeGer*4 LASTOP
  17649. C    COMMON/ERROR/LASTOP
  17650.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  17651. C    COMMON/FMTBFR/FMTDAT
  17652.     CHARACTER*1 EDNAM(16)
  17653. C    COMMON/EDNAM/EDNAM
  17654.     InTeGer*4 MFID(2),MFMOD(2)
  17655. C    COMMON/FRM/MFID,MFMOD
  17656.     InTeGer*4 JMVFG,JMVOLD
  17657. C    COMMON/FUBAR/JMVFG,JMVOLD
  17658.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  17659.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  17660. C ***<<< KLSTO COMMON END >>>***
  17661. CCC    InTeGer*4 DTRENA
  17662. CCC    COMMON/DTRCMN/DTRENA
  17663.     CHARACTER *1 LINECL(82)
  17664. C    CHARACTER*70 LINEC
  17665.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  17666. C    CHARACTER*80 SCRBUF
  17667.     CHARACTER*1 LBUF(128)
  17668.     CHARACTER*1 MBUF(128)
  17669.     CHARACTER*110 CLBUF,CMBUF
  17670.     CHARACTER*50 CCLBUF,CCMBUF
  17671.     CHARACTER*11 C11LBF
  17672. C    EQUIVALENCE(C11LBF(1:1),CLBUF(1:1))
  17673.     EQUIVALENCE(CLBUF(1:1),CCLBUF(1:1),LBUF(1),C11LBF(1:1)),
  17674.      1  (CMBUF(1:1),CCMBUF(1:1),MBUF(1))
  17675. C    EQUIVALENCE(CLBUF,LBUF(1)),(CMBUF,MBUF(1))
  17676. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  17677.     CHARACTER*9 FMTB
  17678.     EQUIVALENCE (FMTB(1:1),LBUF(120))
  17679. c    CHARACTER*11 FMTBF
  17680. c    CHARACTER*1 IFVLD
  17681. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  17682. ccc    DO 3332 N=1,80
  17683. ccc    NN=81-N
  17684. ccc    IF(ICHAR(LINE(NN)).GT.32)GOTO 3333
  17685. ccc    LINE(NN)=CHAR(0)
  17686. ccc3332    CONTINUE
  17687. ccc3333    CONTINUE
  17688. C SPACE FILL ENTIRE ARRAY
  17689.     DO 3334 N=1,82
  17690. 3334    LINECL(N)=CHAR(32)
  17691.     RETCD=1
  17692. C HANDLE DTRCMD FUNCTIONS. LINE ARRAY PASSED IN HERE
  17693. C STARTS AFTER THE "DTR" SO WE CAN DECODE IT.
  17694. C EXECUTE DTR COMMAND
  17695. C  DTRCMD (COMMAND) GIVES DTR COMMAND FACILITY AT COMMAND
  17696. C LEVEL.
  17697. C ALLOW DTRIMM COMMAND TO USE DTR IMMEDIATE TERMINAL
  17698. C INTERFACE. THE REST CAN USE SAME COMMAND NAMES AS AFTER
  17699. C THE "DB" IN *U DBXXXX COMMANDS.
  17700. 500    CONTINUE
  17701. C ENABLE/DISABLE FOR DTR FUNCTIONS
  17702. C SETTING DTRENA TO -1 IMPLIES DISABLE FUNCTIONS
  17703.     CALL SCMP(LINE,'ENA',3,ICODE)
  17704.     IF(ICODE.NE.1)GOTO 600
  17705.     DTRENA=1
  17706.     GOTO 9999
  17707. 600    CONTINUE
  17708.     CALL SCMP(LINE,'DIS',3,ICODE)
  17709.     IF(ICODE.NE.1)GOTO 700
  17710.     DTRENA=-1
  17711.     GOTO 9999
  17712. 700    CONTINUE
  17713.     CALL SCMP(LINE,'OPINS',5,ICODE)
  17714. C OPEN INPUT SEQUENTIAL
  17715.     IF(ICODE.NE.1)GOTO 3800
  17716. C DTROPINS RANGE FILENAME
  17717.     IBGN=6
  17718.     IVLD=0
  17719.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17720.     IF(IVLD.EQ.3)GOTO 9990
  17721.     LINE(LSTCH+25)=CHAR(0)
  17722.     OPEN(UNIT=MFILUN,FILE=LINE(LSTCH),ACCESS='SEQUENTIAL',
  17723.      1  STATUS='OLD',IOSTAT=IVVV)
  17724.     IF(IVVV.NE.0)GOTO 9990
  17725.     MFIOPN=1
  17726.     GOTO 9999
  17727. 3800    CONTINUE
  17728.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  17729. C OPEN IN RANDOM READ
  17730.     IF(ICODE.NE.1)GOTO 3900
  17731.     KK=2
  17732.     GOTO 3910
  17733. 3900    CONTINUE
  17734.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  17735. C OPEN IN RANDOM UPDATE
  17736.     IF(ICODE.NE.1)GOTO 3950
  17737.     KK=3
  17738. 3910    CONTINUE
  17739. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  17740.     IBGN=7
  17741.     IVLD=0
  17742.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  17743.     IF(IVLD.EQ.3)GOTO 9990
  17744. C *******
  17745. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17746.     DO 5601 NN=1,50
  17747. 5601    MBUF(NN)=' '
  17748.     DO 5602 NN=1,25
  17749. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  17750. C    LINE(LSTCH+25)=0
  17751. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  17752. C    OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='BINARY',
  17753. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='OLD',
  17754. C     1  RECL=128,BLOCKSIZE=128,ERR=9990)
  17755.     OPEN(UNIT=MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17756.      1  STATUS='OLD',FORM='UNFORMATTED',RECL=128,
  17757.      1  IOSTAT=IVVV)
  17758.     IF(IVVV.NE.0)GOTO 9990
  17759.     MFIOPN=KK
  17760.     GOTO 9999
  17761. 3950    CONTINUE
  17762.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  17763. C OPEN OUTPUT SEQUENTIAL
  17764.     IF(ICODE.NE.1)GOTO 4000
  17765.     IBGN=7
  17766.     IVLD=0
  17767.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17768.     IF(IVLD.EQ.3)GOTO 9990
  17769. C *******
  17770. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17771. C    LINE(LSTCH+25)=0
  17772.     DO 5603 NN=1,50
  17773. 5603    MBUF(NN)=' '
  17774.     DO 5604 NN=1,25
  17775. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  17776.     OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='SEQUENTIAL',
  17777.      1  STATUS='NEW',IOSTAT=IVVV,recl=512)
  17778.     IF(IVVV.NE.0)GOTO 9990
  17779.     MFOOPN=1
  17780.     GOTO 9999
  17781. 4000    CONTINUE
  17782.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  17783. C OPEN OUTPUT RANDOM
  17784.     IF(ICODE.NE.1)GOTO 4100
  17785.     IBGN=7
  17786.     IVLD=0
  17787.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  17788.     IF(IVLD.EQ.3)GOTO 9990
  17789. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  17790. C *******
  17791. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  17792.     DO 5605 NN=1,50
  17793. 5605    MBUF(NN)=' '
  17794.     DO 5606 NN=1,25
  17795. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  17796. C    LINE(LSTCH+25)=0
  17797. C    OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  17798. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='NEW',
  17799. C     1  RECL=128,ERR=9990)
  17800.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='DIRECT',
  17801.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  17802.      2  IOSTAT=IVVV)
  17803.     IF(IVVV.NE.0)GOTO 9990
  17804.     MFOOPN=2
  17805.     GOTO 9999
  17806. 4100    CONTINUE
  17807.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  17808. C CLOSE OUTPUT 
  17809.     IF(ICODE.NE.1)GOTO 4200
  17810.     CLOSE(UNIT=MFOLUN)
  17811.     MFOOPN=0
  17812.     GOTO 9999
  17813. 4200    CONTINUE
  17814.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  17815. C CLOSE INPUT 
  17816.     IF(ICODE.NE.1)GOTO 4300
  17817.     CLOSE(UNIT=MFILUN)
  17818.     MFIOPN=0
  17819.     GOTO 9999
  17820. 4300    CONTINUE
  17821.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  17822. C ENABLE OUTPUT 
  17823.     IF(ICODE.NE.1)GOTO 4400
  17824.     MFOFLG=1
  17825.     GOTO 9999
  17826. 4400    CONTINUE
  17827.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  17828. C ENABLE INPUT 
  17829.     IF(ICODE.NE.1)GOTO 4500
  17830.     MFIFLG=1
  17831.     GOTO 9999
  17832. 4500    CONTINUE
  17833.     CALL SCMP(LINE,'DISINP',6,ICODE)
  17834. C DISABLE INPUT 
  17835.     IF(ICODE.NE.1)GOTO 4510
  17836.     MFIFLG=0
  17837.     GOTO 9999
  17838. 4510    CONTINUE
  17839.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  17840. C DISABLE OUTPUT
  17841.     IF(ICODE.NE.1)GOTO 4520
  17842.     MFOFLG=0
  17843.     GOTO 9999
  17844. 4520    CONTINUE
  17845.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  17846. C ENABLE INPUT FORCE
  17847. C COMMAND
  17848. C DTREDTINP RANGE
  17849. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17850. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17851. C IT OUT AGAIN.
  17852.     IF(ICODE.NE.1)GOTO 4600
  17853. C FORCE ENABLE OF READIN DURING THIS
  17854.     MFIFLG=1
  17855.     MFOFLG=1
  17856. C ENABLE OUTPUT TOO.
  17857.     IBGN=7
  17858.     IVLD=0
  17859.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17860.     IF(IVLD.EQ.3)GOTO 9990
  17861.     DO 4550 N1=IXRL,IXRH
  17862.     DO 4550 N2=IXCL,IXCH
  17863.     CALL REFLEC(N2,N1,IRX)
  17864. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17865.     CALL FVLDST(N1,N2,Char(255))
  17866.     CALL WRKFIL(IRX,LBUF,0)
  17867.     CALL WRKFIL(IRX,LBUF,1)
  17868. 4550    CONTINUE
  17869.     MFIFLG=0
  17870.     MFOFLG=0
  17871.     GOTO 9999
  17872. 4600    CONTINUE
  17873.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  17874. C FORMAT/WRITE OUTPUT
  17875. C COMMAND
  17876. C DTRFMTOUT RANGE
  17877. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  17878. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  17879. C IT OUT AGAIN.
  17880.     IF(ICODE.NE.1)GOTO 4630
  17881.     IVLFG=1
  17882.     GOTO 4740
  17883. 4630    CONTINUE
  17884.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  17885.     IF(ICODE.NE.1)GOTO 4700
  17886. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  17887.     IVFLG=2
  17888. C    GOTO 4740
  17889. 4740    CONTINUE
  17890. C FORCE ENABLE OF READIN DURING THIS
  17891.     MFIFLG=1
  17892.     MFOFLG=1
  17893. C ENABLE OUTPUT TOO.
  17894.     IBGN=7
  17895.     IVLD=0
  17896.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17897.     IF(IVLD.EQ.3)GOTO 9990
  17898.     DO 4650 N1=IXRL,IXRH
  17899.     DO 4650 N2=IXCL,IXCH
  17900. C FIND INDEX FOR WRKFIL
  17901.     CALL REFLEC(N2,N1,IRX)
  17902. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  17903.     CALL XVBLGT(N1,N2,TMP)
  17904. C TMP IS REAL*8 SCRATCH
  17905.     CALL FVLDST(N1,N2,Char(255))
  17906.     CALL WRKFIL(IRX,LBUF,0)
  17907. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  17908. C NOW GRAB THE VALUE AND SAVE IT...
  17909. C FIRST MOVE THE FORMAT DOWN
  17910. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  17911.     DO 4651 N=1,9
  17912.     LBUF(N+1)=LBUF(N+119)
  17913. 4651    CONTINUE
  17914.     LBUF(1)='('
  17915.     LBUF(11)=')'
  17916. c    LBUF(12)=CHAR(0)
  17917. C CHANGE TO USE CHAR VERSION OF LBUF
  17918. C *******
  17919. C FORMAT NOW LIVES IN LOW PART OF LBUF
  17920. C D25.17 FORMAT WOULD DO FOR WRITE
  17921. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF(1:11),ERR=4652)TMP
  17922.     IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF,ERR=4652)TMP
  17923.     IF(IVLFG.EQ.2)WRITE(LINEC(1:70),4658,ERR=4652)TMP
  17924. 4658    FORMAT(D25.17)
  17925. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  17926. C USE DISPLAY FORMAT.
  17927. 4652    CONTINUE
  17928.     KK=1
  17929.     DO 4653 N=1,110
  17930. 4653    LBUF(N)=CHAR(0)
  17931.     DO 4654 N=1,60
  17932. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  17933.     KKK=JCHAR(LINECL(N))
  17934.     IF(KKK.LE.32)GOTO 4654
  17935.     LBUF(KK)=LINECL(N)
  17936.     KK=KK+1
  17937. 4654    CONTINUE
  17938.     CALL WRKFIL(IRX,LBUF,1)
  17939. 4650    CONTINUE
  17940.     MFIFLG=0
  17941.     MFOFLG=0
  17942.     GOTO 9999
  17943. 4700    CONTINUE
  17944.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  17945.     IF(ICODE.NE.1)GOTO 4800
  17946. C DBCMPFRM V1:V2
  17947. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  17948.     IBGN=7
  17949.     IVLD=0
  17950. C USE GMTX TO GET CELL ADDRESSES.
  17951.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  17952.     IF(IVLD.EQ.3)GOTO 9990
  17953. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  17954.     CALL REFLEC(IXCL,IXRL,IRXL)
  17955.     CALL REFLEC(IXCH,IXRH,IRXH)
  17956.     IF(LINE(LSTCH).NE.',')GOTO 4780
  17957.     IBGN=LSTCH+1
  17958.     IVLD=0
  17959.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  17960.     IF(IVLD.EQ.3)GOTO 4780
  17961. C GET THE LENGTHS NOW
  17962.     CALL XVBLGT(IYRL,IYCL,TMP)
  17963.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17964.     LBUFL=TMP
  17965.     CALL XVBLGT(IYRH,IYCH,TMP)
  17966.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  17967.     MBUFL=TMP
  17968. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  17969. C COMPARISONS BASED ON THAT.
  17970.     GOTO 4770
  17971. 4780    CONTINUE
  17972. C GET INDEX OF EACH ELEMENT...
  17973.     CALL WRKFIL(IRXL,LBUF,0)
  17974.     CALL WRKFIL(IRXH,MBUF,0)
  17975. C LOAD THE 2 FORMULAS.
  17976. C NOW FIND THE ENDS...
  17977.     DO 4750 N=1,110
  17978.     NN=111-N
  17979.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  17980. 4750    CONTINUE
  17981. 4751    LBUFL=NN
  17982.     DO 4760 N=1,110
  17983.     NN=111-N
  17984.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  17985. 4760    CONTINUE
  17986. 4761    MBUFL=NN
  17987. 4770    CONTINUE
  17988. c find index pos'n by hand...
  17989.     KK=LBUFL-MBUFL+1
  17990.     DO 4776 NN=1,KK
  17991.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  17992.     NNN=MBUFL-1
  17993.     DO 4777 N=1,NNN
  17994.     IVVV=NN+N
  17995.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  17996. 4777    CONTINUE
  17997. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  17998. C SINCE NN IS WHAT WE NEED, GO USE IT.
  17999.     GOTO 4779
  18000. 4778    CONTINUE
  18001. 4776    CONTINUE
  18002. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  18003. C
  18004.     NN=0
  18005. 4779    CONTINUE
  18006. C NN IS LOCATION OF SUBSTRING NOW
  18007. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  18008. C NN IS LOCATION OF SUBSTRING NOW
  18009.     XAC=NN
  18010. C RETURN RESULT IN % ACCUMULATOR.
  18011.     WAC=0.
  18012.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  18013.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  18014. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  18015. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  18016. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  18017.     GOTO 9999
  18018. 4800    CONTINUE
  18019.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  18020.     IF(ICODE.NE.1)GOTO 4900
  18021. C DBLENFRM V1:V2
  18022. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  18023.     IBGN=7
  18024.     IVLD=0
  18025. C USE GMTX TO GET CELL ADDRESSES.
  18026.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18027.     IF(IVLD.EQ.3)GOTO 9990
  18028. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  18029.     CALL REFLEC(IXCL,IXRL,IRXL)
  18030. C GET INDEX OF EACH ELEMENT...
  18031.     CALL WRKFIL(IRXL,LBUF,0)
  18032. C LOAD THE FORMULA.
  18033. C NOW FIND THE END...
  18034.     DO 4850 N=1,110
  18035.     NN=111-N
  18036.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  18037. 4850    CONTINUE
  18038. 4851    LBUFL=NN
  18039.     TMP=LBUFL
  18040.     XAC=TMP
  18041. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  18042.     NN=0
  18043. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  18044.     CALL FVLDGT(IXRH,IXCH,NN)
  18045.     IF(NN.EQ.0)GOTO 9999
  18046.     CALL XVBLST(IXRH,IXCH,TMP)
  18047.     GOTO 9999
  18048. 4900    CONTINUE
  18049.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  18050.     IF(ICODE.NE.1)GOTO 5000
  18051. C TRIM FORMULA
  18052. C DTRTRMFRM INCELL:OUTCELL,START:END
  18053. C RETURNS TRIMMED FORMULA TO CELL.
  18054.     IBGN=7
  18055.     IVLD=0
  18056. C USE GMTX TO GET CELL ADDRESSES.
  18057.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  18058.     IF(IVLD.EQ.3)GOTO 9990
  18059. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  18060.     CALL REFLEC(IXCL,IXRL,IRXL)
  18061. C GET INDEX OF EACH ELEMENT...
  18062.     CALL REFLEC(IXCH,IXRH,IRXH)
  18063.     CALL WRKFIL(IRXL,LBUF,0)
  18064.     LO=LSTCHR+1
  18065.     LHI=LSTCHR+21
  18066.     LSTCHR=LHI
  18067.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18068.     IF(IVLD.EQ.0)GOTO 9990
  18069.     CALL XVBLGT(JD1,JD2,TMP)
  18070.     LOCHR=1
  18071.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  18072. C LOCHR = START CHAR
  18073.     LO=LSTCHR+1
  18074.     LHI=LSTCHR+21
  18075.     LSTCHR=LHI
  18076.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18077.     IF(IVLD.EQ.0)GOTO 9990
  18078.     CALL XVBLGT(JD1,JD2,TMP)
  18079.     LHICHR=110
  18080.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  18081. C LHICHR IS END CHARACTER
  18082. C NOW ALL ARGS ARE COLLECTED.
  18083. C (IGNORE WHAT WAS DELIMITER...)
  18084. C COPY DESIRED STUFF TO MBUF
  18085.     N=1
  18086.     DO 4910 NN=1,110
  18087.     MBUF(NN)=CHAR(0)
  18088.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  18089.     MBUF(N)=LBUF(NN)
  18090.     N=N+1
  18091. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  18092. 4910    CONTINUE
  18093.     DO 4911 NN=111,128
  18094. 4911    MBUF(NN)=LBUF(NN)
  18095.     CALL WRKFIL(IRXH,MBUF,1)
  18096. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  18097. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  18098.     GOTO 9999
  18099. 5000    CONTINUE
  18100.     GOTO 9999
  18101. 9990    RETCD=3
  18102. C ERROR RETURN
  18103. 9999    RETURN
  18104.     END
  18105. c -h- dtrfct.for    Fri Aug 22 13:05:02 1986    
  18106. C DATATRIEVE INTERFACE FUNCTIONS
  18107. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  18108. C COPYRIGHT 1986 GCE
  18109.     SUBROUTINE DTRFCT(LINE,RETCD)
  18110.     InTeGer*4 RETCD
  18111.     Include aparms.inc
  18112.     CHARACTER*1 LINE(80)
  18113.     CHARACTER *1 LINECL(82)
  18114.     CHARACTER*62 LINEC
  18115.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  18116. C
  18117. C
  18118. C DEFINE FILE AREAS FOR MAPPING FILES...
  18119. C
  18120. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  18121. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  18122. C
  18123. C MFIOPN =    0    IF NOT OPEN
  18124. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  18125. C        2    IF OPEN READ ONLY, RANDOM
  18126. C        3    IF OPEN READ/WRITE, RANDOM.
  18127. C
  18128. C MFOOPN =    0    IF NOT OPEN
  18129. C        1    IF OPEN WRITE SEQUENTIAL
  18130. C        2    IF OPEN WRITE RANDOM
  18131. C
  18132. C OTHER OPTIONS DON'T MAKE SENSE.
  18133. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  18134. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  18135. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  18136. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  18137.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  18138.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  18139.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  18140.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  18141.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  18142. C
  18143. C
  18144. C    INCLUDE VKLUGPRM.FTN''
  18145. C COPYRIGHT (C) 1983 GLENN EVERHART
  18146. C PERMISSION IS GIVEN TO ANYONE TO USE, DISTRIBUTE, OR COPY THIS
  18147. C PROGRAM FREELY BUT NOT TO SELL IT COMMERICALLY.
  18148.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  18149.     Real*8 VAVBLS(3,27)
  18150.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  18151.     InTeGer*4 TYPE(1,2),VLEN(9)
  18152.     REAL*8 XAC,XVBLS(1,1)
  18153.     REAL*8 TAC,UAC,VAC,WAC,YAC
  18154.     REAL*8 TMP
  18155.     INTEGER*4 JVBLS(2,1,1)
  18156.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  18157.     EQUIVALENCE(XAC,AVBLS(1,27))
  18158.     EQUIVALENCE(TAC,AVBLS(1,20))
  18159.     EQUIVALENCE(UAC,AVBLS(1,21))
  18160.     EQUIVALENCE(VAC,AVBLS(1,22))
  18161.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  18162.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  18163.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  18164. C ***<<<< RDD COMMON START >>>***
  18165.     InTeGer*4 RRWACT,RCLACT
  18166. C    COMMON/RCLACT/RRWACT,RCLACT
  18167.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  18168.      1  IDOL7,IDOL8
  18169. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  18170. C     1  IDOL7,IDOL8
  18171.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  18172. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  18173.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18174. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  18175. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  18176. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  18177.     InTeGer*4 KLVL
  18178. C    COMMON/KLVL/KLVL
  18179.     InTeGer*4 IOLVL,IGOLD
  18180. C    COMMON/IOLVL/IOLVL
  18181. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  18182. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  18183.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18184.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18185.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  18186.      3  k3dfg,kcdelt,krdelt,kpag
  18187. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  18188. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  18189. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  18190. C ***<<< RDD COMMON END >>>***
  18191. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  18192. CCC    CHARACTER*1 XTNCMD(80)
  18193. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  18194. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  18195. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  18196. CCC    InTeGer*4 RRWACT,RCLACT
  18197. CCC    COMMON/RCLACT/RRWACT,RCLACT
  18198. C ***<<< XVXTCD COMMON START >>>***
  18199.     CHARACTER*1 OARRY(100)
  18200.     InTeGer*4 OSWIT,OCNTR
  18201. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  18202. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  18203.     InTeGer*4 IPS1,IPS2,MODFLG
  18204. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  18205.        InTeGer*4 XTCFG,IPSET,XTNCNT
  18206.        CHARACTER*1 XTNCMD(80)
  18207. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  18208. C VARY FLAG ITERATION COUNT
  18209.     INTEGER KALKIT
  18210. C    COMMON/VARYIT/KALKIT
  18211.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  18212.     InTeGer*4 RCMODE,IRCE1,IRCE2
  18213. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18214. C     1  IRCE2
  18215. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  18216. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  18217. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  18218. C RCFGX ON.
  18219. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  18220. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  18221. C  AND VM INHIBITS. (SETS TO 1).
  18222.     INTEGER*4 FH
  18223. C FILE HANDLE FOR CONSOLE I/O (RAW)
  18224. C    COMMON/CONSFH/FH
  18225.     CHARACTER*1 ARGSTR(52,4)
  18226. C    COMMON/ARGSTR/ARGSTR
  18227.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  18228.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  18229.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  18230.      3  IRCE2,FH,ARGSTR
  18231. C ***<<< XVXTCD COMMON END >>>***
  18232. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  18233. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  18234. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  18235. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  18236. C (IMPLEMENT FOR VAX ONLY)
  18237.     INTEGER IVVV
  18238. CCC    COMMON/VARYIT/KALKIT
  18239. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  18240. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  18241. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  18242. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  18243.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  18244.     COMMON/D2R/NRDSP,NCDSP
  18245. C ***<<< KLSTO COMMON START >>>***
  18246.     InTeGer*4 DLFG
  18247. C    COMMON/DLFG/DLFG
  18248.     InTeGer*4 KDRW,KDCL
  18249. C    COMMON/DOT/KDRW,KDCL
  18250.     InTeGer*4 DTRENA
  18251. C    COMMON/DTRCMN/DTRENA
  18252.     REAL*8 EP,PV,FV
  18253.     DIMENSION EP(20)
  18254.     INTEGER*4 KIRR
  18255. C    COMMON/ERNPER/EP,PV,FV,KIRR
  18256.     InTeGer*4 LASTOP
  18257. C    COMMON/ERROR/LASTOP
  18258.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  18259. C    COMMON/FMTBFR/FMTDAT
  18260.     CHARACTER*1 EDNAM(16)
  18261. C    COMMON/EDNAM/EDNAM
  18262.     InTeGer*4 MFID(2),MFMOD(2)
  18263. C    COMMON/FRM/MFID,MFMOD
  18264.     InTeGer*4 JMVFG,JMVOLD
  18265. C    COMMON/FUBAR/JMVFG,JMVOLD
  18266.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  18267.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  18268. C ***<<< KLSTO COMMON END >>>***
  18269. CCC    InTeGer*4 DTRENA
  18270. CCC    COMMON/DTRCMN/DTRENA
  18271. C    CHARACTER*70 LINEC
  18272.     CHARACTER*1 LBUF(128)
  18273.     CHARACTER*1 MBUF(128)
  18274.     CHARACTER*110 CLBUF,CMBUF
  18275. C    EQUIVALENCE(CLBUF(1:1),LBUF(1)),(CMBUF(1:1),MBUF(1))
  18276.     CHARACTER*50 CCMBUF
  18277.     CHARACTER*11 C11LBF
  18278.     EQUIVALENCE(CCMBUF(1:1),CMBUF(1:1),MBUF(1)),
  18279.      1  (C11LBF(1:1),CLBUF(1:1),LBUF(1))
  18280. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  18281. c    CHARACTER*1 IFVLD
  18282.     RETCD=1
  18283.     IF(DTRENA.LT.0)GOTO 9999
  18284. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  18285. ccc    DO 3332 N=1,76
  18286. ccc    NN=77-N
  18287. ccc    IF(JCHAR(LINE(NN)).GT.32)GOTO 3333
  18288. ccc    LINE(NN)=CHAR(0)
  18289. ccc3332    CONTINUE
  18290. ccc3333    CONTINUE
  18291. C SPACE FILL ENTIRE ARRAY
  18292.     DO 3334 N=1,82
  18293. 3334    LINECL(N)=CHAR(32)
  18294.     RETCD=1
  18295. C HANDLE *U DBXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  18296. C STARTS AFTER THE "DB" SO WE CAN DECODE IT.
  18297. C *U DBCMD (COMMAND) PASSES COMMAND TO DTR FOR ACTION
  18298. C  HOWEVER THIS DOES NOT RETURN A VALUE. USE FOR
  18299. C  SETUP PURPOSES ONLY.
  18300. C
  18301. C NO NEED TO INCLUDE ABILITY TO STORE COMMANDS IN CELLS
  18302. C FOR EDITING SINCE {CELL CONSTRUCT PROVIDES THIS ALREADY.
  18303. C (AND AT COMMAND LEVEL THE __{CELL CONSTRUCT DOES ALSO.)
  18304. 500    CONTINUE
  18305.     CALL SCMP(LINE,'OPINS',5,ICODE)
  18306. C OPEN INPUT SEQUENTIAL
  18307.     IF(ICODE.NE.1)GOTO 3800
  18308. C DTROPINS RANGE FILENAME
  18309.     IBGN=6
  18310.     IVLD=0
  18311.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  18312.     IF(IVLD.EQ.3)GOTO 9990
  18313. C    LINE(LSTCH+25)=CHAR(0)
  18314.     DO 5601 NN=1,50
  18315. 5601    MBUF(NN)=' '
  18316.     DO 5602 NN=1,25
  18317. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  18318.     OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  18319.      1  STATUS='OLD',IOSTAT=IVVV,recl=512)
  18320.     IF(IVVV.NE.0)GOTO 9990
  18321.     MFIOPN=1
  18322.     GOTO 9999
  18323. 3800    CONTINUE
  18324.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  18325. C OPEN IN RANDOM READ
  18326.     IF(ICODE.NE.1)GOTO 3900
  18327.     KK=2
  18328.     GOTO 3910
  18329. 3900    CONTINUE
  18330.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  18331. C OPEN IN RANDOM UPDATE
  18332.     IF(ICODE.NE.1)GOTO 3950
  18333.     KK=3
  18334. 3910    CONTINUE
  18335. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  18336.  
  18337.     IBGN=7
  18338.     IVLD=0
  18339.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  18340.     IF(IVLD.EQ.3)GOTO 9990
  18341. C    LINE(LSTCH+25)=0
  18342.     DO 5603 NN=1,50
  18343. 5603    MBUF(NN)=' '
  18344.     DO 5604 NN=1,25
  18345. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  18346. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  18347.     OPEN(MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  18348.      1  FORM='UNFORMATTED',RECL=128
  18349.      2  ,STATUS='OLD',IOSTAT=IVVV)
  18350.     IF(IVVV.NE.0)GOTO 9990
  18351.     MFIOPN=KK
  18352.     GOTO 9999
  18353. 3950    CONTINUE
  18354.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  18355. C OPEN OUTPUT SEQUENTIAL
  18356.     IF(ICODE.NE.1)GOTO 4000
  18357.     IBGN=7
  18358.     IVLD=0
  18359.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  18360.     IF(IVLD.EQ.3)GOTO 9990
  18361.     DO 5605 NN=1,50
  18362. 5605    MBUF(NN)=' '
  18363.     DO 5606 NN=1,25
  18364. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  18365.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  18366.      1  recl=512,STATUS='NEW',IOSTAT=IVVV)
  18367.     IF(IVVV.NE.0)GOTO 9990
  18368.     MFOOPN=1
  18369.     GOTO 9999
  18370. 4000    CONTINUE
  18371.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  18372. C OPEN OUTPUT RANDOM
  18373.     IF(ICODE.NE.1)GOTO 4100
  18374.     IBGN=7
  18375.     IVLD=0
  18376.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  18377.     IF(IVLD.EQ.3)GOTO 9990
  18378. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  18379. C    LINE(LSTCH+25)=0
  18380.     DO 5607 NN=1,50
  18381. 5607    MBUF(NN)=' '
  18382.     DO 5608 NN=1,25
  18383. 5608    MBUF(NN)=LINE(LSTCH+NN-1)
  18384.     OPEN(MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  18385.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  18386.      2  IOSTAT=IVVV)
  18387.     IF(IVVV.NE.0)GOTO 9990
  18388.     MFOOPN=2
  18389.     GOTO 9999
  18390. 4100    CONTINUE
  18391.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  18392. C CLOSE OUTPUT 
  18393.     IF(ICODE.NE.1)GOTO 4200
  18394.     CLOSE(UNIT=MFOLUN)
  18395.     MFOOPN=0
  18396.     GOTO 9999
  18397. 4200    CONTINUE
  18398.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  18399. C CLOSE INPUT 
  18400.     IF(ICODE.NE.1)GOTO 4300
  18401.     CLOSE(UNIT=MFILUN)
  18402.     MFIOPN=0
  18403.     GOTO 9999
  18404. 4300    CONTINUE
  18405.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  18406. C ENABLE OUTPUT 
  18407.     IF(ICODE.NE.1)GOTO 4400
  18408.     MFOFLG=1
  18409.     GOTO 9999
  18410. 4400    CONTINUE
  18411.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  18412. C ENABLE INPUT 
  18413.     IF(ICODE.NE.1)GOTO 4500
  18414.     MFIFLG=1
  18415.     GOTO 9999
  18416. 4500    CONTINUE
  18417.     CALL SCMP(LINE,'DISINP',6,ICODE)
  18418. C DISABLE INPUT 
  18419.     IF(ICODE.NE.1)GOTO 4510
  18420.     MFIFLG=0
  18421.     GOTO 9999
  18422. 4510    CONTINUE
  18423.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  18424. C DISABLE OUTPUT
  18425.     IF(ICODE.NE.1)GOTO 4520
  18426.     MFOFLG=0
  18427.     GOTO 9999
  18428. 4520    CONTINUE
  18429.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  18430. C ENABLE INPUT FORCE
  18431. C COMMAND
  18432. C DTREDTINP RANGE
  18433. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  18434. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  18435. C IT OUT AGAIN.
  18436.     IF(ICODE.NE.1)GOTO 4600
  18437. C FORCE ENABLE OF READIN DURING THIS
  18438.     MFIFLG=1
  18439.     MFOFLG=1
  18440. C ENABLE OUTPUT TOO.
  18441.     IBGN=7
  18442.     IVLD=0
  18443.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18444.     IF(IVLD.EQ.3)GOTO 9990
  18445.     DO 4550 N1=IXRL,IXRH
  18446.     DO 4550 N2=IXCL,IXCH
  18447.     CALL REFLEC(N2,N1,IRX)
  18448. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  18449.     CALL FVLDST(N1,N2,Char(255))
  18450.     CALL WRKFIL(IRX,LBUF,0)
  18451.     CALL WRKFIL(IRX,LBUF,1)
  18452. 4550    CONTINUE
  18453.     MFIFLG=0
  18454.     MFOFLG=0
  18455.     GOTO 9999
  18456. 4600    CONTINUE
  18457.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  18458. C FORMAT/WRITE OUTPUT
  18459. C COMMAND
  18460. C DTRFMTOUT RANGE
  18461. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  18462. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  18463. C IT OUT AGAIN.
  18464.     IF(ICODE.NE.1)GOTO 4630
  18465.     IVLFG=1
  18466.     GOTO 4740
  18467. 4630    CONTINUE
  18468.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  18469.     IF(ICODE.NE.1)GOTO 4700
  18470. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  18471.     IVFLG=2
  18472. C    GOTO 4740
  18473. 4740    CONTINUE
  18474. C FORCE ENABLE OF READIN DURING THIS
  18475.     MFIFLG=1
  18476.     MFOFLG=1
  18477. C ENABLE OUTPUT TOO.
  18478.     IBGN=7
  18479.     IVLD=0
  18480.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18481.     IF(IVLD.EQ.3)GOTO 9990
  18482.     DO 4650 N1=IXRL,IXRH
  18483.     DO 4650 N2=IXCL,IXCH
  18484. C FIND INDEX FOR WRKFIL
  18485.     CALL REFLEC(N2,N1,IRX)
  18486. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  18487.     CALL XVBLGT(N1,N2,TMP)
  18488. C TMP IS REAL*8 SCRATCH
  18489.     CALL FVLDST(N1,N2,Char(255))
  18490.     CALL WRKFIL(IRX,LBUF,0)
  18491. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  18492. C NOW GRAB THE VALUE AND SAVE IT...
  18493. C FIRST MOVE THE FORMAT DOWN
  18494. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  18495.     DO 4651 N=1,9
  18496.     LBUF(N+1)=LBUF(N+119)
  18497. 4651    CONTINUE
  18498.     LBUF(1)='('
  18499.     LBUF(11)=')'
  18500. c    LBUF(12)=0
  18501. C FORMAT NOW LIVES IN LOW PART OF LBUF
  18502. C D25.17 FORMAT WOULD DO FOR WRITE
  18503. C NEED CHAR VBL FOR FORMAT EQUIV'D TO LOW 12 CHARS OF LBUF
  18504. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF(1:11),ERR=4652)TMP
  18505.     IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF,ERR=4652)TMP
  18506.     IF(IVLFG.EQ.2)WRITE(LINEC(1:62),4658,ERR=4652)TMP
  18507. 4658    FORMAT(D25.17)
  18508. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  18509. C USE DISPLAY FORMAT.
  18510. 4652    CONTINUE
  18511.     KK=1
  18512.     DO 4653 N=1,110
  18513. 4653    LBUF(N)=CHAR(0)
  18514.     DO 4654 N=1,60
  18515. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  18516.     KKK=JCHAR(LINECL(N))
  18517.     IF(KKK.LE.32)GOTO 4654
  18518.     LBUF(KK)=LINECL(N)
  18519.     KK=KK+1
  18520. 4654    CONTINUE
  18521.     CALL WRKFIL(IRX,LBUF,1)
  18522. 4650    CONTINUE
  18523.     MFIFLG=0
  18524.     MFOFLG=0
  18525.     GOTO 9999
  18526. 4700    CONTINUE
  18527.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  18528.     IF(ICODE.NE.1)GOTO 4800
  18529. C DBCMPFRM V1:V2
  18530. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  18531.     IBGN=7
  18532.     IVLD=0
  18533.     LSTCH=78
  18534. C USE GMTX TO GET CELL ADDRESSES.
  18535.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18536.     IF(IVLD.EQ.3)GOTO 9990
  18537. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  18538.     CALL REFLEC(IXCL,IXRL,IRXL)
  18539.     CALL REFLEC(IXCH,IXRH,IRXH)
  18540.     IF(LINE(LSTCH).NE.',')GOTO 4780
  18541.     IBGN=LSTCH+1
  18542.     IVLD=0
  18543.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  18544.     IF(IVLD.EQ.3)GOTO 4780
  18545. C GET THE LENGTHS NOW
  18546.     CALL XVBLGT(IYRL,IYCL,TMP)
  18547.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  18548.     LBUFL=TMP
  18549.     CALL XVBLGT(IYRH,IYCH,TMP)
  18550.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  18551.     MBUFL=TMP
  18552. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  18553. C COMPARISONS BASED ON THAT.
  18554.     GOTO 4770
  18555. 4780    CONTINUE
  18556. C GET INDEX OF EACH ELEMENT...
  18557.     CALL WRKFIL(IRXL,LBUF,0)
  18558.     CALL WRKFIL(IRXH,MBUF,0)
  18559. C LOAD THE 2 FORMULAS.
  18560. C NOW FIND THE ENDS...
  18561.     DO 4750 N=1,110
  18562.     NN=111-N
  18563.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  18564. 4750    CONTINUE
  18565. 4751    LBUFL=NN
  18566.     DO 4760 N=1,110
  18567.     NN=111-N
  18568.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  18569. 4760    CONTINUE
  18570. 4761    MBUFL=NN
  18571. 4770    CONTINUE
  18572. c find index pos'n by hand...
  18573.     KK=LBUFL-MBUFL+1
  18574.     DO 4776 NN=1,KK
  18575.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  18576.     NNN=MBUFL-1
  18577.     DO 4777 N=1,NNN
  18578.     IVVV=NN+N
  18579.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  18580. 4777    CONTINUE
  18581. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  18582. C SINCE NN IS WHAT WE NEED, GO USE IT.
  18583.     GOTO 4779
  18584. 4778    CONTINUE
  18585. 4776    CONTINUE
  18586. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  18587. C
  18588.     NN=0
  18589. 4779    CONTINUE
  18590. C NN IS LOCATION OF SUBSTRING NOW
  18591. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  18592.     XAC=NN
  18593. C RETURN RESULT IN % ACCUMULATOR.
  18594.     WAC=0.
  18595.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  18596.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  18597. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  18598. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  18599. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  18600.     GOTO 9999
  18601. 4800    CONTINUE
  18602.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  18603.     IF(ICODE.NE.1)GOTO 4900
  18604. C DBLENFRM V1:V2
  18605. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  18606.     IBGN=7
  18607.     IVLD=0
  18608. C USE GMTX TO GET CELL ADDRESSES.
  18609.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  18610.     IF(IVLD.EQ.3)GOTO 9990
  18611.     CALL REFLEC(IXCL,IXRL,IRXL)
  18612. C GET INDEX OF EACH ELEMENT...
  18613.     CALL WRKFIL(IRXL,LBUF,0)
  18614. C LOAD THE FORMULA.
  18615. C NOW FIND THE END...
  18616.     DO 4850 N=1,110
  18617.     NN=111-N
  18618.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  18619. 4850    CONTINUE
  18620. 4851    LBUFL=NN
  18621.     TMP=LBUFL
  18622.     XAC=TMP
  18623. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  18624.     NN=0
  18625. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  18626.     CALL FVLDGT(IXRH,IXCH,NN)
  18627.     IF(NN.EQ.0)GOTO 9999
  18628.     CALL XVBLST(IXRH,IXCH,TMP)
  18629.     GOTO 9999
  18630. 4900    CONTINUE
  18631.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  18632.     IF(ICODE.NE.1)GOTO 5000
  18633. C TRIM FORMULA
  18634. C DTRTRMFRM INCELL:OUTCELL,START:END
  18635. C RETURNS TRIMMED FORMULA TO CELL.
  18636.     IBGN=7
  18637.     IVLD=0
  18638. C USE GMTX TO GET CELL ADDRESSES.
  18639.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  18640.     IF(IVLD.EQ.3)GOTO 9990
  18641. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  18642.     CALL REFLEC(IXCL,IXRL,IRXL)
  18643. C GET INDEX OF EACH ELEMENT...
  18644.     CALL REFLEC(IXCH,IXRH,IRXH)
  18645.     CALL WRKFIL(IRXL,LBUF,0)
  18646.     LO=LSTCHR+1
  18647.     LHI=LSTCHR+21
  18648.     LSTCHR=LHI
  18649.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18650.     IF(IVLD.EQ.0)GOTO 9990
  18651.     CALL XVBLGT(JD1,JD2,TMP)
  18652.     LOCHR=1
  18653.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  18654. C LOCHR = START CHAR
  18655.     LO=LSTCHR+1
  18656.     LHI=LSTCHR+21
  18657.     LSTCHR=LHI
  18658.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  18659.     IF(IVLD.EQ.0)GOTO 9990
  18660.     CALL XVBLGT(JD1,JD2,TMP)
  18661.     LHICHR=110
  18662.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  18663. C LHICHR IS END CHARACTER
  18664. C NOW ALL ARGS ARE COLLECTED.
  18665. C (IGNORE WHAT WAS DELIMITER...)
  18666. C COPY DESIRED STUFF TO MBUF
  18667.     N=1
  18668.     DO 4910 NN=1,110
  18669.     MBUF(NN)=CHAR(0)
  18670.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  18671.     MBUF(N)=LBUF(NN)
  18672.     N=N+1
  18673. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  18674. 4910    CONTINUE
  18675.     DO 4911 NN=111,128
  18676. 4911    MBUF(NN)=LBUF(NN)
  18677.     CALL WRKFIL(IRXH,MBUF,1)
  18678. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  18679. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  18680.     GOTO 9999
  18681. 5000    CONTINUE
  18682.     GOTO 9999
  18683. 9990    RETCD=3
  18684. C ERROR RETURN
  18685. 9999    RETURN
  18686.     END
  18687. c -h- fft.ftn    Fri Aug 22 13:08:56 1986    
  18688. C  
  18689. C-----------------------------------------------------------------------
  18690. C SUBROUTINE: FOUREA
  18691. C PERFORMS COOLEY-TUKEY FAST FOURIER TRANSFORM
  18692. C-----------------------------------------------------------------------
  18693. C  
  18694.       SUBROUTINE FOUREA(ID1,ID2,IC,IR,IVN,ISI)
  18695. C ID1,ID2 = COORDS OF FIRST CELL. IC AND IR ARE 0, OR 1
  18696. C ONLY ONE OF IC, IR MAY BE NONZERO. (FLAGS HORIZ/VERTICAL
  18697. C DATA AREA)
  18698. C  
  18699. C THE COOLEY-TUKEY FAST FOURIER TRANSFORM IN ANSI FORTRAN
  18700. C  
  18701. C DATA IS A ONE-DIMENSIONAL COMPLEX ARRAY WHOSE LENGTH, N, IS A
  18702. C POWER OF TWO.  ISI IS +1 FOR AN INVERSE TRANSFORM AND -1 FOR A
  18703. C FORWARD TRANSFORM.  TRANSFORM VALUES ARE RETURNED IN THE INPUT
  18704. C ARRAY, REPLACING THE INPUT.
  18705. C TRANSFORM(J)=SUM(DATA(I)*W**((I-1)*(J-1))), WHERE I AND J RUN
  18706. C FROM 1 TO N AND W = EXP (ISI*2*PI*SQRT(-1)/N).  PROGRAM ALSO
  18707. C COMPUTES INVERSE TRANSFORM, FOR WHICH THE DEFINING EXPRESSION
  18708. C IS INVTR(J)=(1/N)*SUM(DATA(I)*W**((I-1)*(J-1))).
  18709. C RUNNING TIME IS PROPORTIONAL TO N*LOG2(N), RATHER THAN TO THE
  18710. C CLASSICAL N**2.
  18711. C AFTER PROGRAM BY BRENNER, JUNE 1967. THIS IS A VERY SHORT VERSION
  18712. C OF THE FFT AND IS INTENDED MAINLY FOR DEMONSTRATION. PROGRAMS
  18713. C ARE AVAILABLE IN THIS COLLECTION WHICH RUN FASTER AND ARE NOT
  18714. C RESTRICTED TO POWERS OF 2 OR TO ONE-DIMENSIONAL ARRAYS.
  18715. C SEE -- IEEE TRANS AUDIO (JUNE 1967), SPECIAL ISSUE ON FFT.
  18716. C  
  18717. C ASSUMES THAT FIRST N/2 ELEMENTS ARE REAL, SECOND COMPLEX...
  18718. C STORES DATA THAT WAY ALSO...
  18719. C
  18720. C      COMPLEX DATA(1)
  18721. C      COMPLEX TEMP, W
  18722. C MAKE THIS A REAL FFT, NOT COMPLEX...
  18723.     REAL*8 DATA(1),TEMP,W,TEMP2,TEMPI,WI
  18724.     InTeGer*4 ID1,ID2,IC,IR,IVN,N
  18725. C SET UP STMT FUNCTIONS...
  18726.     ID1F(K)=ID1+IC*(K-1)
  18727.     ID2F(K)=ID2+IR*(K-1)
  18728.     N=IVN
  18729. C  
  18730. C CHECK FOR POWER OF TWO UP TO 14
  18731. C  
  18732. C INITIALLY SAY ALL OK
  18733.       NN = 1
  18734.       DO 10 I=1,14
  18735.         M = I
  18736.         NN = NN*2
  18737.         IF (NN.EQ.N) GO TO 20
  18738.     IF(NN.GT.N)GOTO 11
  18739.   10  CONTINUE
  18740. 11    CONTINUE
  18741.     N=NN/2
  18742. C USE NEXT SMALLER POWER OF 2 ARRAY...
  18743. C    RETURN
  18744. C HERE BEGINNETH ACTUAL WORK.
  18745. C SET UP DATA COORDS ON THE FLY. NORMALLY I,J RUN IN RANGE 1 TO N
  18746. C SO WHERE K=(I OR J) (I.E., ONE OF THE TWO) WE USE A RELATION
  18747. C ID1V=ID1+IC*(K-1) AND ID2V=ID2+IR*(K-1). WE USE STMT FUNCTIONS
  18748. C ID1F AND ID2F FOR THIS.
  18749.   20  CONTINUE
  18750.     NOV2=N/2
  18751. C  
  18752. C      PI = 4.*ATAN(1.)
  18753.     PI=3.14159265358979323846264
  18754.       FN = NOV2
  18755. C  
  18756. C THIS SECTION PUTS DATA IN BIT-REVERSED ORDER
  18757. C  
  18758.       J = 1
  18759.       DO 80 I=1,NOV2
  18760. C  
  18761. C AT THIS POINT, I AND J ARE A BIT REVERSED PAIR (EXCEPT FOR THE
  18762. C DISPLACEMENT OF +1)
  18763. C  
  18764.     IF(I.GE.J)GOTO 40
  18765. C  
  18766. C EXCHANGE DATA(I) WITH DATA(J) IF I.LT.J.
  18767. C  
  18768.  30    CONTINUE
  18769. C EXCHANGE DATA(J), DATA(I)
  18770.     CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  18771.     CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  18772.     CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  18773.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  18774. C FLIP BOTH REAL AND COMPLEX PARTS OF DATA
  18775.     CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMP)
  18776.     CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  18777.     CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  18778.     CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP)
  18779. C  30    TEMP = DATA(J)
  18780. C        DATA(J) = DATA(I)
  18781. C        DATA(I) = TEMP
  18782. C  
  18783. C IMPLEMENT J=J+1, BIT-REVERSED COUNTER
  18784. C  
  18785.   40    M = NOV2/2
  18786.   50    IF (J.LE.M) GOTO 70
  18787.   60    J = J - M
  18788.         M = (M+1)/2
  18789.         GO TO 50
  18790.   70    J = J + M
  18791.   80  CONTINUE
  18792. C  
  18793. C NOW COMPUTE THE BUTTERFLIES
  18794. C  
  18795.       MMAX = 1
  18796.   90  IF (MMAX.GE.NOV2)GOTO 130
  18797.  100  ISTEP = 2*MMAX
  18798.       DO 120 M=1,MMAX
  18799.         THETA = PI*FLOAT(ISI*(M-1))/FLOAT(MMAX)
  18800.      W = COS(THETA)
  18801.         WI = SIN(THETA)
  18802. C        W = CMPLX(COS(THETA),SIN(THETA))
  18803.         DO 110 I=M,NOV2,ISTEP
  18804.           J = I + MMAX
  18805. C GET REAL AND IMAG HALVES OF NUMBER...
  18806.       CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  18807.       CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMPI)
  18808. C DO COMPLEX MULTIPLICATION BY HAND TO AVOID LARGE RUNTIME SYSTEM
  18809. C ROUTINE INCLUSION.
  18810.       TEMP2=W*TEMP-WI*TEMPI
  18811.       TEMPI=WI*TEMP+W*TEMPI
  18812.     TEMP=TEMP2
  18813. C          TEMP = W*DATA(J)
  18814. C          DATA(J) = DATA(I) - TEMP
  18815. C          DATA(I) = DATA(I) + TEMP
  18816.        CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  18817.        TEMP2=DATA(1)+TEMP
  18818.        DATA(1)=DATA(1) - TEMP
  18819.        CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  18820.        CALL XVBLST(ID1F(I),ID2F(I),TEMP2)
  18821. C COMPLEX PART
  18822.        CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  18823.        TEMP2=DATA(1)+TEMPI
  18824.        DATA(1)=DATA(1) - TEMPI
  18825.        CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  18826.        CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP2)
  18827.  110    CONTINUE
  18828.  120  CONTINUE
  18829.       MMAX = ISTEP
  18830.       GO TO 90
  18831.   130  IF (ISI.LT.0) GOTO 160
  18832. C  
  18833. C FOR INV TRANS -- ISI=1 -- MULTIPLY OUTPUT BY 1/N
  18834. C  
  18835.  140  DO 150 I=1,N
  18836. C        DATA(I) = DATA(I)/FN
  18837.     CALL XVBLGT(ID1F(I),ID2F(I),TEMP)
  18838.     TEMP=TEMP/FN
  18839.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  18840.  150  CONTINUE
  18841.  160  RETURN
  18842.       END
  18843. c -h- help.for    Fri Aug 22 13:20:10 1986    
  18844.     SUBROUTINE HELP(LVL)
  18845. C PRINT HELP INFO ON SCREEN USING FIRST 22 LINES. ASSUME XQTCMD INVALIDATES
  18846. C THE DISPLAY.
  18847. C COPYRIGHT (C) 1983 GLENN AND MARY EVERHART
  18848.     CHARACTER*1 FORM(128)
  18849.     CALL UVT100(18,0,0)
  18850.     CALL UVT100(11,2,0)
  18851.     CALL UVT100(1,1,1)
  18852. C COPYRIGHT (C) 1983 GLENN and MARY EVERHART
  18853. C All Rights Reserved
  18854. C
  18855. C NEW PC HELP FILE
  18856. C DESIGNED TO BE SMALLER THAN OLD VERSION. READS FILES OFF DISK
  18857. C BY SKIPPING N*24 LINES AND DISPLAYING 24 LINES, WHERE N=LVL
  18858. C ASSUME HELP FILE ON DISK LOGGED CURRENTLY
  18859.     CLOSE(3)
  18860. c for now, assume help file lives on same disk as our default.
  18861.     IXXX=0
  18862.     OPEN(3,FILE='PCCHELP.HLP',STATUS='OLD',ACCESS='DIRECT',
  18863.      1  FORM='UNFORMATTED',RECL=128,IOSTAT=IXXX)
  18864. C try on dk: if we can't find it in default.
  18865.     If(IXXX.LE.0)goto 2772
  18866.     Close(3)
  18867.     OPEN(3,FILE='DK:PCCHELP.HLP',STATUS='OLD',ACCESS='DIRECT',
  18868.      1  FORM='UNFORMATTED',RECL=128,IOSTAT=IXXX)
  18869.     IF(IXXX.GT.0)RETURN
  18870. 2772    Continue
  18871. C RETURN IF HELP FILE IS MISSING...
  18872. C USE A FIXED HELP FILE FOR MULTISCREEN HELP. LOWER OVERHEAD,...
  18873.     NSKP=LVL*24
  18874. C NOW READ IN THE DATA, WRITE TO SCREEN.
  18875.     KKL=NSKP+1
  18876.     KKH=NSKP+23
  18877. C JUST GO DIRECTLY TO THE DESIRED SCREENFUL OF INFO.
  18878.     DO 7640 KKK=KKL,KKH
  18879.     READ(3,REC=KKK,ERR=7642)FORM
  18880. c use fortran writes here normally since we want the crlf stuff they imply
  18881. c always write 24 lines to scroll all else off...
  18882.     IVVV=78
  18883. C FIND END OF LINE AND ONLY EMIT CHARACTERS TO THAT; DON'T WASTE
  18884. C TIME DRAWING SPACES ON THE SCREEN.
  18885.     DO 772 IV=1,78
  18886.     IVVV=79-IV
  18887.     IF(ICHAR(FORM(IVVV)).GT.32)GOTO 773
  18888. 772    CONTINUE
  18889. 773    CONTINUE
  18890. c for curses must only emit LF since CR erases the text. Here emit
  18891. c both.
  18892.     FORM(IVVV+1)=Char(13)
  18893.     FORM(IVVV+2)=Char(10)
  18894.     IVVV=IVVV+2
  18895.     CALL SWRT(FORM,IVVV)
  18896. C    WRITE(11,7643)(FORM(IV),IV=1,IVVV)
  18897. C NOTE WE HAVE LUN 6 OPENED AS CON: IN THE MAIN PROGRAM TO GIVE AN
  18898. C INDEPENDENT TERMINAL OUTPUT CHANNEL. HOPEFULLY THIS PREVENTS SOME
  18899. C SCREWUPS DUE TO USING LUN 0 FOR BOTH CONSOLE INPUT AND OUTPUT; END OF
  18900. C RECORDS OUGHT TO BE INDEPENDENT THIS WAY (I HOPE).
  18901. C7643    FORMAT(1X,82A1,4A1)
  18902. 7640    CONTINUE
  18903. 7642    CONTINUE
  18904.     CLOSE(3)
  18905. c don't do this in unix vers since CR screws up output
  18906. c (curses assumes it means erase line)
  18907.     FORM(1)=char(13)
  18908.     CALL SWRT(FORM,1)
  18909.     RETURN
  18910.     END
  18911. c -h- linfit.for    Fri Aug 22 13:23:55 1986    
  18912. C LINE FITTING SUBROUTINE WITH ERROR MEASURE RETURN ALSO.
  18913.     SUBROUTINE LINFIT(ID1X,ID2X,IRCOL,ID1,ID2,N,A,B,DEL,RR)
  18914.     InTeGer*4 ID1X,ID2X,IRCOL,ID1,ID2,N
  18915.     REAL*8 A,B,DEL,XY,SX2,SX,SY,RR
  18916.     InTeGer*4 IC,IR,KK,KKK,I
  18917.     REAL*8 XI,YI,SY2,EN,WRK
  18918. C FIT LINE TO EQUALLY SPACED POINTS...
  18919. C Y=BX+A
  18920.     SY2=0.
  18921.     EN=N
  18922.     XY=0.
  18923.     SX2=0.
  18924.     SX=0.
  18925.     SY=0.
  18926.     IC=IRCOL
  18927.     IR=1-IRCOL
  18928. C IRCOL IS 0 OR 1 FOR ACROSS OR DOWN
  18929.     DO 10 I=1,N
  18930. C IF ID1X < 0 THEN FORM IT HERE AS ID1+I-1
  18931.     IF (ID1X.GT.0)GOTO 20
  18932. C FORM XI
  18933.     XI=I
  18934.     GOTO 30
  18935. 20    CONTINUE
  18936. C INPUT XI
  18937.     KK=ID1X+IC*(I-1)
  18938.     KKK=ID2X+IR*(I-1)
  18939.     CALL XVBLGT(KK,KKK,XI)
  18940. 30    CONTINUE
  18941. C GET YI IN ANY CASE...
  18942.     KK=ID1+IC*(I-1)
  18943.     KKK=ID2+IR*(I-1)
  18944.     CALL XVBLGT(KK,KKK,YI)
  18945.     XY=XY+XI*YI
  18946. C FORM SUMS NEEDED TO FIT LINE...
  18947.     SX2=SX2+XI*XI
  18948.     SX=SX+XI
  18949.     SY=SY+YI
  18950.     SY2=SY2+YI*YI
  18951. 10    CONTINUE
  18952. C NOW GET SLOPE
  18953.     WRK=((XY-(SX*SY)/EN)/(SX2-(SX*SX)/EN))
  18954.     B=WRK
  18955. C THEN INTERCEPT
  18956.     WRK=(SY/EN)-B*(SX/EN)
  18957.     A=WRK
  18958.     WRK=DSQRT((SY2-(A*SY+B*XY))/EN)
  18959.     DEL=WRK
  18960. C DEL = ERROR OF FIT
  18961.     RR=(EN*XY-SX*SY)/DSQRT((EN*SX2-SX*SX)*(EN*SY2-SY*SY))
  18962. C RR IS CORRELATION COEFFICIENT
  18963.     RETURN
  18964.     END
  18965. c -h- list.for    Fri Aug 22 13:24:14 1986    
  18966.     SUBROUTINE LIST
  18967. C COPYRIGHT (C) 1983 GLENN EVERHART
  18968. C ALL RIGHTS RESERVED
  18969. C 60=MAX REAL ROWS
  18970. C 301=MAX REAL COLS
  18971. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  18972. C VBLS AND TYPE DIMENSIONED 60,301
  18973. C **************************************************
  18974. C *                                                *
  18975. C *              SUBROUTINE  LIST                  *
  18976. C *                                                *
  18977. C **************************************************
  18978. C
  18979. C
  18980. C LISTS THE LEGAL CALC COMMANDS AND GIVES A BRIEF
  18981. C DESCRIPTION OF THEIR FUNCTION.
  18982. C
  18983. C LIST IS CALLED BY CALC
  18984. C
  18985. C    SUBROUTINE LIST
  18986. C
  18987. C
  18988. C NOTE WE USE FORTRAN WRITE HERE SINCE IT SHOULD ONLY HAPPEN IN CALC MODE.
  18989. c    rewind 11
  18990. c    WRITE (11,20)
  18991. c    WRITE (11,30)
  18992. c    rewind 11
  18993.     Call vwrt(char(13)//char(10),2)
  18994.     Call vwrt(
  18995.      1  'Cmds= @file-do file;*C-Comment;*E-exit;*R-Read con',50)
  18996.     Call vwrt(char(13)//char(10),2)
  18997.     Call Vwrt(
  18998.      1  '*S-stop;*V n(bet.0,3)-View Ctl - Higher=see more',48)
  18999.     RETURN
  19000. c20    FORMAT (' CMDS= @FILE-DO FILE;*C-COMMENT;*E-EXIT;*R-READ CON')
  19001. c30    FORMAT (' *S-STOP;*V n(bet.0,3)-VIEW CTL- HIGHER=SEE MORE')
  19002.     END
  19003. c -h- wsset.f40    Fri Aug 22 13:43:11 1986    
  19004.         SUBROUTINE WSSET
  19005. C WORK SHEET MANAGMENT ROUTINES
  19006. C HANDLE SPREADSHEET "IN MEMORY" STORAGE
  19007. C COPYRIGHT (C) GLENN AND MARY EVERHART 1983,1984
  19008. C
  19009. C ALL RIGHTS RESERVED
  19010. C
  19011. C WSSET - INITIALIZE STORAGE TO START CONDITIONS
  19012. C EXPECT IMPLEMENTATION TO USE A COMMON BITMAP AND PROVIDE A VARIABLE
  19013. C NCEL TO TELL HOW MANY CELLS ARE IN USE
  19014. C NEXT BITMAPS IMPLEMENT FVLD
  19015.     Include aparms.inc
  19016.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  19017.     CHARACTER*1 FVXX(IMPS3)
  19018.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(IMP2S))
  19019.     EQUIVALENCE (FV4(1),FVXX(IMP3S))
  19020.         Common/FVLDM/FVXX
  19021. c        COMMON/FVLDM/FV1,FV2,FV4
  19022. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  19023. C TYPES OF AC'S STORAGE:
  19024.         CHARACTER*1 ITYP(IMP1S)
  19025.         InTeGer*4 IATYP(27),LINTGR
  19026.         COMMON/TYP/IATYP,ITYP,LINTGR
  19027.         CHARACTER*1 LBITS(8)
  19028.         COMMON/BITS/LBITS
  19029. C ***<<<< RDD COMMON START >>>***
  19030.     InTeGer*4 RRWACT,RCLACT
  19031. C    COMMON/RCLACT/RRWACT,RCLACT
  19032.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  19033.      1  IDOL7,IDOL8
  19034. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  19035. C     1  IDOL7,IDOL8
  19036.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19037. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19038.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19039. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19040. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19041. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  19042.     InTeGer*4 KLVL
  19043. C    COMMON/KLVL/KLVL
  19044.     InTeGer*4 IOLVL,IGOLD
  19045. C    COMMON/IOLVL/IOLVL
  19046. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  19047. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  19048.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19049.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19050.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  19051.      3  k3dfg,kcdelt,krdelt,kpag
  19052. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19053. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19054. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  19055. C ***<<< RDD COMMON END >>>***
  19056. CCC        InTeGer*4 IPGMAX,LPGMXF
  19057. CCC        COMMON/FILEMX/IPGMAX,LPGMXF
  19058. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19059. C USE LUN 7 FOR FORMULAS, 9 FOR VALUES FILE IF NEEDED...
  19060. C
  19061. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  19062. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  19063. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  19064. C AREAS WITH DATA.
  19065. C ***<<< KLSTO COMMON START >>>***
  19066.     InTeGer*4 DLFG
  19067. C    COMMON/DLFG/DLFG
  19068.     InTeGer*4 KDRW,KDCL
  19069. C    COMMON/DOT/KDRW,KDCL
  19070.     InTeGer*4 DTRENA
  19071. C    COMMON/DTRCMN/DTRENA
  19072.     REAL*8 EP,PV,FV
  19073.     DIMENSION EP(20)
  19074.     INTEGER*4 KIRR
  19075. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19076.     InTeGer*4 LASTOP
  19077. C    COMMON/ERROR/LASTOP
  19078.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  19079. C    COMMON/FMTBFR/FMTDAT
  19080.     CHARACTER*1 EDNAM(16)
  19081. C    COMMON/EDNAM/EDNAM
  19082.     InTeGer*4 MFID(2),MFMOD(2)
  19083. C    COMMON/FRM/MFID,MFMOD
  19084.     InTeGer*4 JMVFG,JMVOLD
  19085. C    COMMON/FUBAR/JMVFG,JMVOLD
  19086.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19087.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19088. C ***<<< KLSTO COMMON END >>>***
  19089. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  19090. CCC        COMMON/FMTBFR/FMTDAT
  19091.         CHARACTER*1 DVF(12),DFMT(10)
  19092.         EQUIVALENCE(DVF(2),DFMT(1))
  19093.         COMMON/DEFVBX/DVF
  19094. CCC    InTeGer*4 DLFG
  19095. CCC    COMMON/DLFG/DLFG
  19096. C DLFG IS NONZERO IF ANY D## FORMS HAVE BEEN SEEN
  19097.         InTeGer*4 MPAG(2),MPMOD
  19098.         InTeGer*2 LVALBF(5,MVal)
  19099.     DIMENSION MPMOD(2)
  19100.         COMMON/VB/MPAG,LVALBF,MPMOD
  19101.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  19102.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  19103. CCC    InTeGer*4 MFID(2)
  19104. C        InTeGer*4 MFID,IFID(8,MFrm)
  19105. C        CHARACTER*1 LFID(16,MFrm)
  19106. C        EQUIVALENCE(IFID(1,1),LFID(1,1))
  19107. CCC        COMMON/FRM/MFID,MFMOD
  19108. C        COMMON/FRM/MFID,IFID
  19109. C
  19110. C ***<<< NULETC COMMON START >>>***
  19111.     InTeGer*4 ICREF,IRREF
  19112. C    COMMON/MIRROR/ICREF,IRREF
  19113.     InTeGer*4 MODPUB,LIMODE
  19114. C    COMMON/MODPUB/MODPUB,LIMODE
  19115.     InTeGer*4 KLKC,KLKR
  19116.     REAL*8 AACP,AACQ
  19117. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  19118.     InTeGer*4 NCEL,NXINI
  19119. C    COMMON/NCEL/NCEL,NXINI
  19120.     CHARACTER*1 NAMARY(20,MRows)
  19121. C    COMMON/NMNMNM/NAMARY
  19122.     InTeGer*4 NULAST,LFVD
  19123. C    COMMON/NULXXX/NULAST,LFVD
  19124.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  19125.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  19126. C ***<<< NULETC COMMON END >>>***
  19127. CCC        COMMON /NCEL/NCEL,NXINI
  19128.     LINTGR=0
  19129.     MPMOD(1)=0
  19130.     MPMOD(2)=0
  19131.     MFMOD(1)=0
  19132.     MFMOD(2)=0
  19133.     DLFG=0
  19134.         IBP=1
  19135. C INITIALIZE ADDRESSES FOR FVLDSG/FVLDGT
  19136. C    CALL FVGO(FV1,LBITS)
  19137.         DO 2 N=1,9
  19138. 2       FMTDAT(N,1)=DFMT(N)
  19139.         DO 3 N=2,IFmtbk
  19140.         DO 3 NN=1,9
  19141. 3       FMTDAT(NN,N)=CHAR(0)
  19142.         DO 1 N=1,8
  19143.     NN=128/IBP
  19144.         LBITS(N)=CHAR(NN)
  19145. 1       IBP=IBP+IBP
  19146.         DO 4 N=1,IMP1S
  19147. C CLEAR BITMAPS NOW
  19148.         FV1(N)=CHAR(0)
  19149.         FV2(N)=CHAR(0)
  19150.         FV4(N)=CHAR(0)
  19151. 4       ITYP(N)=CHAR(0)
  19152. C OPEN THE WORK FILES SO WE DON'T NEED TO LATER...
  19153. C LUN 7 IS FORMULAS; LUN 9 IS VALUES
  19154. C HOWEVER, IF IPGMAX IS LESS THAN 800/205 (INDICATING ENTIRE FILE
  19155. C FITS IN MEMORY) DON'T OPEN LUN 9 AND IF LPGMXF IS < 2048/64, LIKEWISE
  19156. C FOR LUN 7.
  19157. C INITIALLY CLOSE FILES IN CASE THEY WERE OPEN...
  19158.         CLOSE(7,STATUS='DELETE')
  19159.         CLOSE(13,STATUS='DELETE')
  19160. C NOW OPEN THEM AS RANDOM ACCESS FILES.
  19161.         NBK=IPGMAX*2
  19162. C KEEP VALUE PAGES IN 500 BYTE UNITS, NOT 512 BYTE UNITS, TO COME
  19163. C OUT EVEN...
  19164.         IF(IPGMAX.GT.(MVal/100))OPEN(13,
  19165.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  19166.      3  RECL=500,STATUS='NEW')
  19167.         NBK=LPGMXF*2
  19168.         IF(LPGMXF.GT.(MFro64))OPEN(7,
  19169.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  19170.      3  RECL=512,STATUS='NEW')
  19171. C SET NOTHING IN MEMORY YET
  19172.         MFID(1)=0
  19173.     MFID(2)=0
  19174.         MPAG(1)=0
  19175.     MPAG(2)=0
  19176. C MARK BUFFER 1 AS IN MEMORY AND AS LAST-ACCESSED (SO WE FIRST ATTEMPT TO
  19177. C OVERWRITE BUFFER 2 TO GET STARTED.)
  19178.     MFLAST=1
  19179.     MFBASE=0
  19180.     MVLAST=1
  19181.     MVBASE=0
  19182. C ZERO MEMORY BUFFER AND FILES
  19183. C ACTUALLY MARK WITH -1 SO THAT WE CAN TELL WHEN WE HIT A VIRGIN
  19184. C AREA.
  19185.     KKKKK=-1
  19186.     if(mvalx10.ge.mrcx8)kkkkk=0
  19187. c    if(mval*10.ge.mrc*8)kkkkk=0
  19188.         DO 9 N=1,MVal
  19189.         DO 9 M=1,5
  19190. 9       LVALBF(M,N)=KKKKK
  19191.         NPG=(IPGMAX*2)
  19192.         IF(IPGMAX.LE.(MVal/100))GOTO 11
  19193.         DO 10 N=1,NPG
  19194. 10      WRITE(13,REC=N,ERR=11)((LVALBF(K,KKK),K=1,5),KKK=1,50)
  19195. 11      CONTINUE
  19196.     CALL WRKFIL(0,0,50)
  19197. C        DO 12 N=1,2048
  19198. C        DO 12 M=1,8
  19199. C12      IFID(M,N)=0
  19200. C     NPG=LPGMXF*2
  19201. C        IF(LPGMXF.LE.(2048/64))GOTO 14
  19202. C        DO 13 N=1,NPG
  19203. C13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  19204. 14      CONTINUE
  19205. C SET ALL AC'S TO TYPE FLOATING...
  19206.         DO 8 N=1,27
  19207. 8       IATYP(N)=2
  19208. C TYPE 2 IS REALS (DEFAULT)
  19209.         NCEL=0
  19210.     NXINI=0
  19211.         RETURN
  19212.         END
  19213. c -h- wtbini.f40    Fri Aug 22 13:43:29 1986    
  19214. C WORK FORMULA TABLE INITIALIZE FOR DTBL1 COMMON
  19215. C COPYRIGHT (C) GLENN AND MARY EVERHART 1985
  19216. C ALL RIGHTS RESERVED
  19217.     SUBROUTINE WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,
  19218.      1  BTBL6,BTBL7,BTBL8)
  19219.     Include aparms.inc
  19220.     CHARACTER*1 DTBL1(9,9,8)
  19221. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  19222.     Integer*4 LPGMXF
  19223. C    InTeGer*2 BTBL(6,6,8)
  19224. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  19225. C NO NEED TO WASTE IT.
  19226.     InTeGer*2 IFID(8,MFrm)
  19227. C    CHARACTER*1 LFID(16,MFrm)
  19228. C    EQUIVALENCE(LFID(1,1),IFID(1,1))
  19229. C    EQUIVALENCE(IFID(1,1),BTBL(1,1,1))
  19230.     InTeGer*2 BTBL1(6,6)
  19231.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  19232.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  19233. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  19234. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  19235. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  19236. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  19237.     COMMON /DECIDE/ DTBL1
  19238. C ZERO THE FILE NOW
  19239.     NPG=LPGMXF*2
  19240.         IF(LPGMXF.LE.(MFro64))GOTO 14
  19241.         DO 13 N=1,NPG
  19242. 13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  19243. 14      CONTINUE
  19244.     RETURN
  19245.     END
  19246. c -h- wkdy.for    Fri Aug 22 13:44:33 1986    
  19247.     SUBROUTINE WKDY(JULLO,JULHI,NDAYS)
  19248. C GIVEN START AND END JULIAN DATE, FIGURE OUT HOW MANY WEEK DAYS
  19249. C THERE ARE BETWEEN THEM.
  19250.     JL=JULLO
  19251.     JH=JULHI
  19252.     IF(JL.LE.JH)GOTO 10
  19253.     JL=JULHI
  19254.     JH=JULLO
  19255. 10    CONTINUE
  19256.     IDL=(JH-JL)/7
  19257. C GET NUMBER OF WEEKS BETWEEN DAYS, 5 WORKDAYS PER WHOLE WEEK.
  19258.     IWDY=IDL*5
  19259. C ADD 3 SO THAT MODULO OF SUNDAY IS 0, NOT WED.
  19260.     IDOR=JH-JL-7*(IDL)
  19261.     IF(IDOR.NE.0)IDOR=5
  19262. C IDOR IS ORIGINAL # DAYS DIFFERENCE, CORRECTED FOR WHOLE
  19263. C WEEKS ALREADY ALLOWED.
  19264.     LD=JL+3
  19265.     LD=MOD(LD,7)
  19266.     LH=JH+3
  19267.     LH=MOD(LH,7)
  19268. C NOW HAVE DAY OF WEEK START,END. FIND WORK DAYS THAT WEEK (M-F ONLY)
  19269.     IKLU=0
  19270.     IK2=1
  19271.     IF(LD.LT.1)IK2=0
  19272.     IF(LD.LT.1)LD=1
  19273.     IF(LD.GT.5)LD=5
  19274. C FOR HIGH END OF RANGE IF THE END DATE IS SUNDAY SUBTRACT ONE DAY
  19275. C FROM THE DAYS SO WE OMIT THE MONDAY FROM THE RANGE...
  19276.     IF(LH.LT.1)IKLU=IK2
  19277.     IF(LH.LT.1)LH=1
  19278.     IF(LH.GT.5)LH=5
  19279. C LH = DAY ENDED ON, LD=START DAY, FORCED INTO WORK WEEK.
  19280.     IF (LH.GT.LD)IWDY=IWDY+LH-LD-IKLU
  19281.     IF (LH.LE.LD)IWDY=IWDY+IDOR-(LD-LH)-IKLU
  19282. C GIVES DAYS BETWEEN 2 DATES JUST LIKE JULIAN DATE SUBTRACTION FOR
  19283. C CALENDAR DATES.
  19284.     NDAYS=IWDY
  19285.     RETURN
  19286.     END
  19287. c -h- wrkint.for    Fri Aug 22 13:44:46 1986    
  19288.     SUBROUTINE WRKINT(JULLO,NWDY,JULHI)
  19289. C GETS JULLO = START DATE AND NWDY = NO. WORKDAYS (M-F) TO ADD AND
  19290. C FINDS JULHI = END JULIAN DATE, CONSTRAINED TO BE IN MONDAY TO
  19291. C FRIDAY RANGE.
  19292. C MUST ADD 3 BECAUSE THAT'S THE BIAS OF OUR JULIAN DATE BASE.
  19293.     IDJL=MOD(JULLO+3,7)
  19294. C IDJL = DAY CODE OF START DATE
  19295.     NWWK=NWDY/5
  19296.     JL=JULLO
  19297.     IF(IDJL.LT.1)JL=JL+1
  19298.     IF(IDJL.GT.5)JL=JL+2
  19299. C BUMP START INTERVAL...
  19300.     NWDD=NWDY-5*NWWK
  19301.     JL=JL+NWWK*7+NWDD
  19302.     IDJL=MOD(JL+3,7)
  19303.     IF(IDJL.LT.1)JL=JL+1
  19304.     IF(IDJL.GT.5)JL=JL+2
  19305. C FORCE OUTPUT DATE TO BE WITHIN WORKWEEK
  19306.     JULHI=JL
  19307.     RETURN
  19308.     END
  19309. C ****************** AnalyTZ.Ftn ########################################3
  19310. c -h- test.for    Fri Aug 22 13:35:58 1986    
  19311.     SUBROUTINE TEST(LOGTYP,FLAG,V1,V2)
  19312.     InTeGer*4 FLAG
  19313.     REAL*8 V1,V2
  19314.     FLAG=0
  19315.     IF(LOGTYP.EQ.1.AND.V1.GT.V2)FLAG=1
  19316.     IF(LOGTYP.EQ.2.AND.V1.LT.V2)FLAG=1
  19317.     IF(LOGTYP.EQ.3.AND.V1.EQ.V2)FLAG=1
  19318.     IF(LOGTYP.EQ.4.AND.V1.NE.V2)FLAG=1
  19319.     IF(LOGTYP.EQ.5.AND.V1.GE.V2)FLAG=1
  19320.     IF(LOGTYP.EQ.6.AND.V1.LE.V2)FLAG=1
  19321. C TEST LOGICAL RELATIONS FOR IF STATEMENT, FLAG=1 IF TRUE, 0 ELSE.
  19322.     RETURN
  19323.     END
  19324. c -h- ttydei.for    Fri Aug 22 13:35:58 1986    
  19325.     SUBROUTINE TTYDEI
  19326.     INCLUDE DOS.INC
  19327.     INTEGER *4 MODE
  19328.     integer*4 amiga
  19329.     external amiga
  19330. cc    Integer*4 cwrite
  19331. cc    external cmove,cattron,cread !$pragma C(cmove,cattron,cread)
  19332. cc    external ccleareol,cclear,crefresh !$pragma C(ccleareol,cclear,crefresh)
  19333. cc    external cattroff,cclose,copen !$pragma C(cattroff,cclose,copen)
  19334. cc    external cwrite !$pragma C(cwrite)
  19335. c    External cread,cwrite,cclose
  19336. C ***<<< XVXTCD COMMON START >>>***
  19337.     CHARACTER*1 OARRY(100)
  19338.     InTeGer*4 OSWIT,OCNTR
  19339. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  19340. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  19341.     InTeGer*4 IPS1,IPS2,MODFLG
  19342. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  19343.        InTeGer*4 XTCFG,IPSET,XTNCNT
  19344.        CHARACTER*1 XTNCMD(80)
  19345. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  19346. C VARY FLAG ITERATION COUNT
  19347.     INTEGER KALKIT
  19348. C    COMMON/VARYIT/KALKIT
  19349.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  19350.     InTeGer*4 RCMODE,IRCE1,IRCE2
  19351. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19352. C     1  IRCE2
  19353. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  19354. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  19355. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  19356. C RCFGX ON.
  19357. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  19358. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  19359. C  AND VM INHIBITS. (SETS TO 1).
  19360.     INTEGER*4 FH
  19361. C FILE HANDLE FOR CONSOLE I/O (RAW)
  19362. C    COMMON/CONSFH/FH
  19363. cc    integer*4 curszx,curszy,kbdin
  19364. cc    common/curspr/curszx,curszy,kbdin
  19365.     CHARACTER*1 ARGSTR(52,4)
  19366. C    COMMON/ARGSTR/ARGSTR
  19367.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  19368.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  19369.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19370.      3  IRCE2,FH,ARGSTR
  19371. C ***<<< XVXTCD COMMON END >>>***
  19372. CCC    COMMON/CONSFH/FH
  19373. ccc    If (FH.ne.0)Call cclose(FH)
  19374.     If(FH.ne.0)call Amiga(Close,FH)
  19375.     RETURN
  19376.     END
  19377. c -h- ttyini.for    Fri Aug 22 13:35:58 1986    
  19378.     SUBROUTINE TTYINI
  19379. C PERFORM INITS ON UNIT 5. NORMALLY EITHER DO NOTHING OR
  19380. C REPLACE WITH SOMETHING THAT WORKS FOR YOUR SYSTEM. TYPICAL
  19381. C ACTIONS:
  19382. C  SET THE TERMINAL NOT TO WRAP AROUND
  19383. C  ATTACH TERMINAL SO TYPE-AHEAD WORKS
  19384. C  SET UP TERMINAL TO MUNGE AROUND THE ESCAPE SEQUENCES TO ALLOW
  19385. C  SPECIAL FUNCTION AND/OR ARROW KEYS TO WORK.
  19386. C ULTIMATELY USE WRITE OF UNIT 0 TO DUMP OUT SOME USEFUL ESCAPE SEQS.
  19387. C TO DEFINE FUNCTION KEYS A LA VT100 (SORT OF).
  19388.     INCLUDE DOS.INC
  19389.     CHARACTER*40 NAME
  19390.     INTEGER *4 MODE
  19391.     Integer*4 Amiga
  19392.     External Amiga
  19393. cc    Integer*4 cwrite,copen,cclose
  19394. cc    external cmove,cattron,cread !$pragma C(cmove,cattron,cread)
  19395. cc    external ccleareol,cclear,crefresh !$pragma C(ccleareol,cclear,crefresh)
  19396. cc    external cattroff,cclose,copen !$pragma C(cattroff,cclose,copen)
  19397. cc    external cwrite !$pragma C(cwrite)
  19398. C ***<<< XVXTCD COMMON START >>>***
  19399.     integer*4 curszx,curszy,kbdin
  19400.     common/curspr/curszx,curszy,kbdin
  19401.     CHARACTER*1 OARRY(100)
  19402.     InTeGer*4 OSWIT,OCNTR
  19403. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  19404. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  19405.     InTeGer*4 IPS1,IPS2,MODFLG
  19406. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  19407.        InTeGer*4 XTCFG,IPSET,XTNCNT
  19408.        CHARACTER*1 XTNCMD(80)
  19409. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  19410. C VARY FLAG ITERATION COUNT
  19411.     INTEGER KALKIT
  19412. C    COMMON/VARYIT/KALKIT
  19413.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  19414.     InTeGer*4 RCMODE,IRCE1,IRCE2
  19415. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19416. C     1  IRCE2
  19417. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  19418. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  19419. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  19420. C RCFGX ON.
  19421. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  19422. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  19423. C  AND VM INHIBITS. (SETS TO 1).
  19424.     INTEGER*4 FH
  19425. C FILE HANDLE FOR CONSOLE I/O (RAW)
  19426. C    COMMON/CONSFH/FH
  19427.     CHARACTER*1 ARGSTR(52,4)
  19428. C    COMMON/ARGSTR/ARGSTR
  19429.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  19430.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  19431.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  19432.      3  IRCE2,FH,ARGSTR
  19433. C ***<<< XVXTCD COMMON END >>>***
  19434. C ***<<<< RDD COMMON START >>>***
  19435.     InTeGer*4 RRWACT,RCLACT
  19436. C    COMMON/RCLACT/RRWACT,RCLACT
  19437.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  19438.      1  IDOL7,IDOL8
  19439. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  19440. C     1  IDOL7,IDOL8
  19441.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19442. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19443.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19444. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19445. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19446. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  19447.     InTeGer*4 KLVL
  19448. C    COMMON/KLVL/KLVL
  19449.     InTeGer*4 IOLVL,IGOLD
  19450. C    COMMON/IOLVL/IOLVL
  19451. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  19452. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  19453.     Integer*4 IDSPTP,Idol9
  19454.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19455.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19456.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  19457.      3  k3dfg,kcdelt,krdelt,kpag
  19458. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19459. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19460. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9
  19461. C ***<<< RDD COMMON END >>>***
  19462. CCC    COMMON/CONSFH/FH
  19463. c Resize initial windows so all fit on NON interlace screen
  19464.     If(IDSPTP.NE.1)NAME=
  19465.      1  "RAW:0/0/639/199/AnalytiCalc-AMIGA" // CHAR(0)
  19466.     IF(IDSPTP.EQ.1)NAME=
  19467.      1  "RAW:0/0/639/399/AnalytiCalc-AMIGA" // CHAR(0)
  19468. c        NAME=  'AnalytiCalc-Amiga' // CHAR(0)
  19469.     MODE=MODE_NEWFILE
  19470. c    FH=copen(%REF(NAME),%val(1),%ref(MODE))
  19471.     FH=AMIGA(Open,name,mode)
  19472.     RETURN
  19473.     END
  19474. c -h- typget.for    Fri Aug 22 13:35:58 1986    
  19475.         SUBROUTINE TYPGET(ID1,ID2,IVAL)
  19476.     Include aparms.inc
  19477. C
  19478. C TYPGET - GET TYPE(60,301) ARRAY WORDS BACK
  19479. C RETURN TYPE(ID1,ID2) IN IVAL, BUT NOT REALLY...
  19480. C NEXT BITMAPS IMPLEMENT FVLD
  19481.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  19482.     CHARACTER*1 FVXX(IMPs3)
  19483.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  19484.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  19485.         Common/FVLDM/FVXX
  19486. c        COMMON/FVLDM/FV1,FV2,FV4
  19487.         CHARACTER*1 LBITS(8)
  19488.         COMMON/BITS/LBITS
  19489. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  19490. C TYPES OF AC'S STORAGE:
  19491.     LOGICAL*4 LB1,LB2
  19492.     InTeGer*4 KB1,KB2
  19493.     EQUIVALENCE(LB1,KB1),(LB2,KB2)
  19494.         CHARACTER*1 ITYP(IMP1S)
  19495.         InTeGer*4 IATYP(27),LINTGR
  19496.         COMMON/TYP/IATYP,ITYP,LINTGR
  19497. C ***<<< NULETC COMMON START >>>***
  19498.     InTeGer*4 ICREF,IRREF
  19499. C    COMMON/MIRROR/ICREF,IRREF
  19500.     InTeGer*4 MODPUB,LIMODE
  19501. C    COMMON/MODPUB/MODPUB,LIMODE
  19502.     InTeGer*4 KLKC,KLKR
  19503.     REAL*8 AACP,AACQ
  19504. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  19505.     InTeGer*4 NCEL,NXINI
  19506. C    COMMON/NCEL/NCEL,NXINI
  19507.     CHARACTER*1 NAMARY(20,MRows)
  19508. C    COMMON/NMNMNM/NAMARY
  19509.     InTeGer*4 NULAST,LFVD
  19510. C    COMMON/NULXXX/NULAST,LFVD
  19511.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  19512.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  19513. C ***<<< NULETC COMMON END >>>***
  19514. CCC    InTeGer*4 ICREF,IRREF
  19515. CCC    COMMON/MIRROR/ICREF,IRREF
  19516. C
  19517. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  19518. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  19519. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  19520. C AREAS WITH DATA.
  19521. C ***<<< KLSTO COMMON START >>>***
  19522.     InTeGer*4 DLFG
  19523. C    COMMON/DLFG/DLFG
  19524.     InTeGer*4 KDRW,KDCL
  19525. C    COMMON/DOT/KDRW,KDCL
  19526.     InTeGer*4 DTRENA
  19527. C    COMMON/DTRCMN/DTRENA
  19528.     REAL*8 EP,PV,FV
  19529.     DIMENSION EP(20)
  19530.     INTEGER*4 KIRR
  19531. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19532.     InTeGer*4 LASTOP
  19533. C    COMMON/ERROR/LASTOP
  19534.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  19535. C    COMMON/FMTBFR/FMTDAT
  19536.     CHARACTER*1 EDNAM(16)
  19537. C    COMMON/EDNAM/EDNAM
  19538.     InTeGer*4 MFID(2),MFMOD(2)
  19539. C    COMMON/FRM/MFID,MFMOD
  19540.     InTeGer*4 JMVFG,JMVOLD
  19541. C    COMMON/FUBAR/JMVFG,JMVOLD
  19542.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19543.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19544. C ***<<< KLSTO COMMON END >>>***
  19545. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  19546. CCC        COMMON/FMTBFR/FMTDAT
  19547.         CHARACTER*1 ITST,ITST2
  19548.     LOGICAL*4 LTST,LTST2
  19549.     InTeGer*4 KTST,KTST2
  19550.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  19551.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  19552.         IF(ID1.LE.27.AND.ID2.LE.1)GOTO 1000
  19553.     IVAL=2
  19554.     IF(LINTGR.EQ.0)RETURN
  19555.     CALL FVLDGT(ID1,ID2,ITST)
  19556.     IF(ICHAR(ITST).EQ.0)GOTO 500
  19557. C        ID=(ID2-1)*60+ID1
  19558.     CALL REFLEC(ID2,ID1,ID)
  19559.         IBT=(ID-1)/8
  19560.     KB1=ID-1
  19561.     KB2=7
  19562.     LB1=LB1.AND.LB2
  19563.     IBIT=KB1+1
  19564. C        IBIT=((ID-1).AND.7)+1
  19565.     KTST=ICHAR(ITYP(IBT))
  19566.     KTST2=ICHAR(LBITS(IBIT))
  19567.     LTST=LTST.AND.LTST2
  19568. C        ITST=CHAR(ICHAR(ITYP(IBT)).AND.ICHAR(LBITS(IBIT)))
  19569. 500     IVAL=2
  19570.         IF(KTST.NE.0)IVAL=4
  19571.         RETURN
  19572. 1000    CONTINUE
  19573. C AN AC. RETURN FULL TYPE WORD
  19574.         IVAL=IATYP(ID1)
  19575.         RETURN
  19576.         END
  19577. c -h- typset.for    Fri Aug 22 13:35:58 1986    
  19578.         SUBROUTINE TYPSET(ID1,ID2,IVAL)
  19579. C
  19580. C TYPSET - STORE IVAL IN TYPE(60,301) ARRAY
  19581. C NEXT BITMAPS IMPLEMENT FVLD
  19582.     Include aparms.inc
  19583.         CHARACTER*1 FV1(IMP1S),FV2(IMP1S),FV4(IMP1S)
  19584.     CHARACTER*1 FVXX(Imps3)
  19585.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  19586.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  19587.         Common/FVLDM/FVXX
  19588. c        COMMON/FVLDM/FV1,FV2,FV4
  19589.         CHARACTER*1 LBITS(8)
  19590.         COMMON/BITS/LBITS
  19591. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  19592. C TYPES OF AC'S STORAGE:
  19593.     LOGICAL*4 LTST,LTST2,LTST3,LT1,LT2
  19594.     InTeGer*4 KTST,KTST2,KTST3,KT1,KT2
  19595.     EQUIVALENCE(LT1,KT1),(LT2,KT2)
  19596.         CHARACTER*1 ITYP(IMP1S)
  19597.         InTeGer*4 IATYP(27),LINTGR
  19598.         COMMON/TYP/IATYP,ITYP,LINTGR
  19599. C ***<<< NULETC COMMON START >>>***
  19600.     InTeGer*4 ICREF,IRREF
  19601. C    COMMON/MIRROR/ICREF,IRREF
  19602.     InTeGer*4 MODPUB,LIMODE
  19603. C    COMMON/MODPUB/MODPUB,LIMODE
  19604.     InTeGer*4 KLKC,KLKR
  19605.     REAL*8 AACP,AACQ
  19606. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  19607.     InTeGer*4 NCEL,NXINI
  19608. C    COMMON/NCEL/NCEL,NXINI
  19609.     CHARACTER*1 NAMARY(20,MRows)
  19610. C    COMMON/NMNMNM/NAMARY
  19611.     InTeGer*4 NULAST,LFVD
  19612. C    COMMON/NULXXX/NULAST,LFVD
  19613.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  19614.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  19615. C ***<<< NULETC COMMON END >>>***
  19616. CCC    InTeGer*4 ICREF,IRREF
  19617. CCC    COMMON/MIRROR/ICREF,IRREF
  19618. C
  19619. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  19620. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  19621. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  19622. C AREAS WITH DATA.
  19623. C ***<<< KLSTO COMMON START >>>***
  19624.     InTeGer*4 DLFG
  19625. C    COMMON/DLFG/DLFG
  19626.     InTeGer*4 KDRW,KDCL
  19627. C    COMMON/DOT/KDRW,KDCL
  19628.     InTeGer*4 DTRENA
  19629. C    COMMON/DTRCMN/DTRENA
  19630.     REAL*8 EP,PV,FV
  19631.     DIMENSION EP(20)
  19632.     INTEGER*4 KIRR
  19633. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19634.     InTeGer*4 LASTOP
  19635. C    COMMON/ERROR/LASTOP
  19636.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  19637. C    COMMON/FMTBFR/FMTDAT
  19638.     CHARACTER*1 EDNAM(16)
  19639. C    COMMON/EDNAM/EDNAM
  19640.     InTeGer*4 MFID(2),MFMOD(2)
  19641. C    COMMON/FRM/MFID,MFMOD
  19642.     InTeGer*4 JMVFG,JMVOLD
  19643. C    COMMON/FUBAR/JMVFG,JMVOLD
  19644.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19645.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19646. C ***<<< KLSTO COMMON END >>>***
  19647. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  19648. CCC        COMMON/FMTBFR/FMTDAT
  19649.         CHARACTER*1 ITST,ITST2,ITST3
  19650.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  19651.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  19652.     EQUIVALENCE(KTST3,ITST3),(KTST3,LTST3)
  19653.     IF(ID2.EQ.1.AND.ID1.LE.27)GOTO 2000
  19654. C KEEP TRACK OF WHEN WE START TO SET INTEGER TYPE
  19655.     IF(LINTGR.EQ.0.AND.IABS(IVAL).EQ.2)RETURN
  19656. C FOR SIMPLICITY SET FLAG ON 1ST NONFLOATING TYPE AND
  19657. C START KEEPING EXACT TRACK THEN ONLY.
  19658.     LINTGR=1
  19659. C        ID=(ID2-1)*60+ID1
  19660.     CALL REFLEC(ID2,ID1,ID)
  19661.         IBT=(ID-1)/8
  19662.     KT1=ID-1
  19663.     KT2=7
  19664.     LT1=LT1.AND.LT2
  19665.     IBIT=KT1+1
  19666. C        IBIT=((ID-1).AND.7)+1
  19667.     KTST2=ICHAR(LBITS(IBIT))
  19668.     KTST3=KTST2
  19669.     LTST2=.NOT.LTST2
  19670. C        ITST2=.NOT.LBITS(IBIT)
  19671.     KTST=ICHAR(ITYP(IBT))
  19672.     LTST2=LTST.AND.LTST2
  19673. C        ITST2=ITYP(IBT).AND.ITST2
  19674.     LTST=LTST.OR.LTST3
  19675.     ITST=CHAR(KTST)
  19676.     ITST2=CHAR(KTST2)
  19677. C        ITST=ITYP(IBT).OR.LBITS(IBIT)
  19678.         ITYP(IBT)=ITST2
  19679.         IF(IVAL.NE.-2.AND.IVAL.NE.2)ITYP(IBT)=ITST
  19680.     RETURN
  19681. 2000    IATYP(ID1)=IVAL
  19682. C ACCUMULATORS JUST STORE NORMAL TYPE INTEGER.
  19683.         RETURN
  19684.         END
  19685. c -h- usrcmd.for    Fri Aug 22 13:36:30 1986    
  19686. c        interface to InTeGer*4 function system [c]
  19687. c     +          (string[reference])
  19688. c        character*1 string
  19689. c        end
  19690.     SUBROUTINE USRCMD(CMDLIN,ICODE,IGOTIT)
  19691. C --- FOR 320K AnalytiCalc only (to keep it able to fit on 256K
  19692. c     versions...)
  19693. c Add "annotation" commands via main force & awkwardness as follows:
  19694. c  1. ANN command will create a file named cell.ANN for the current
  19695. c     cell (or overwrite an old one) dynamically for up to 20 lines
  19696. c     of text, just firing up the command "EDIT namecell.ANN" so the user
  19697. c     gets to do full screen edits. THE "name" part of the files is
  19698. c     taken from the first 6 characters of the sheet name. If these
  19699. c     are not in the uppercase alpha range they will be ignored, however,
  19700. c     so it is a good idea for sheet titles to have recognizable initial
  19701. c     6 characters.
  19702. c  2. QUERY or ? command will display the name.ANN file if it exists
  19703. c     after setting cursor to top of screen and doing line erase
  19704. c     there.
  19705. c
  19706.     Include aparms.inc
  19707.     CHARACTER*81 CMDSTR
  19708.     CHARACTER*1 CMLN(80),CMLN2(84)
  19709. C    PARAMETER CUP=1,EL=12,ED=11,SGR=13
  19710.     InTeGer*4 IJUNK
  19711. c    InTeGer*4 SYSTEM
  19712. c    EXTERNAL SYSTEM
  19713.     EQUIVALENCE(CMLN2(5),CMLN(1),CMDSTR(1:1))
  19714. C    EQUIVALENCE(CMLN2(5),CMLN(1))
  19715. C DUMMY PLACE FOR USER COMMANDS TO PARSE CMDLIN AND HANDLE
  19716. C DEFINE VALUE AREA FOR SPREAD SHEET. MORE WILL BE NEEDED GENERALLY
  19717. C OUT OF COMMONS, BUT AT A MINIMUM, THIS WILL ALLOW SOME ACCESS TO
  19718. C USEFUL NUMBERS. LOOK IN XQTCMD FOR MORE...
  19719.     CHARACTER*1 AVBLS(24,27),WRK(128),VBLS(8,1,1)
  19720.     Real*8 VAVBLS(3,27)
  19721.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  19722.     InTeGer*4 TYPE(1,2),VLEN(9)
  19723.     LOGICAL*4 LEXIST
  19724.     CHARACTER*1 NMSH(80)
  19725.     COMMON/NMSH/NMSH
  19726. C ***<<<< RDD COMMON START >>>***
  19727.     InTeGer*4 RRWACT,RCLACT
  19728. C    COMMON/RCLACT/RRWACT,RCLACT
  19729.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  19730.      1  IDOL7,IDOL8
  19731. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  19732. C     1  IDOL7,IDOL8
  19733.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19734. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  19735.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19736. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  19737. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  19738. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  19739.     InTeGer*4 KLVL
  19740. C    COMMON/KLVL/KLVL
  19741.     InTeGer*4 IOLVL,IGOLD
  19742. C    COMMON/IOLVL/IOLVL
  19743. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  19744. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  19745.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19746.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19747.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  19748.      3  k3dfg,kcdelt,krdelt,kpag
  19749. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  19750. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  19751. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  19752. C ***<<< RDD COMMON END >>>***
  19753. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19754. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  19755.     REAL*8 XAC,XVBLS(1,1)
  19756.     REAL*8 TAC,UAC,VAC
  19757.     INTEGER*4 JVBLS(2,1,1)
  19758.     EQUIVALENCE(XAC,AVBLS(1,27))
  19759.     EQUIVALENCE(TAC,AVBLS(1,20))
  19760.     EQUIVALENCE(UAC,AVBLS(1,21))
  19761.     EQUIVALENCE(VAC,AVBLS(1,22))
  19762.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  19763.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  19764.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  19765. C    CHARACTER*1 FORM(4)
  19766.     CHARACTER*1 CELNAM(5)
  19767.     character*18 annam
  19768.     CHARACTER*1 annams(18)
  19769.     equivalence(annam(1:1),annams(1))
  19770.     CHARACTER*5 CELNM
  19771.     CHARACTER*5 CELRW
  19772.     EQUIVALENCE(CELNM(1:1),CELRW(1:1),CELNAM(1))
  19773. C    EQUIVALENCE(FORM(1),CELNAM(1))
  19774. C    EQUIVALENCE(CELRW,CELNAM(1))
  19775. C ***<<< KLSTO COMMON START >>>***
  19776.     InTeGer*4 DLFG
  19777. C    COMMON/DLFG/DLFG
  19778.     InTeGer*4 KDRW,KDCL
  19779. C    COMMON/DOT/KDRW,KDCL
  19780.     InTeGer*4 DTRENA
  19781. C    COMMON/DTRCMN/DTRENA
  19782.     REAL*8 EP,PV,FV
  19783.     DIMENSION EP(20)
  19784.     INTEGER*4 KIRR
  19785. C    COMMON/ERNPER/EP,PV,FV,KIRR
  19786.     InTeGer*4 LASTOP
  19787. C    COMMON/ERROR/LASTOP
  19788.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  19789. C    COMMON/FMTBFR/FMTDAT
  19790.     CHARACTER*1 EDNAM(16)
  19791. C    COMMON/EDNAM/EDNAM
  19792.     InTeGer*4 MFID(2),MFMOD(2)
  19793. C    COMMON/FRM/MFID,MFMOD
  19794.     InTeGer*4 JMVFG,JMVOLD
  19795. C    COMMON/FUBAR/JMVFG,JMVOLD
  19796.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  19797.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  19798. C ***<<< KLSTO COMMON END >>>***
  19799. CCC    CHARACTER*1 EDNAM(16)
  19800. CCC    common/ednam/ednam
  19801. c available parsing aid:
  19802. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  19803. c where line(ibgn... lend) is scanned. If variable found
  19804. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  19805. c variable found if any. lstchr is last char found+1...
  19806. C OTHER USEFUL ROUTINES IN THE SHEET:
  19807. C GN(LAST,LEND,NUMBER,LINE)
  19808. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  19809. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  19810. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  19811. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  19812. C  NUMERIC.
  19813. C INDEX(LINE,CHAR)
  19814. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  19815. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  19816. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  19817. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  19818. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  19819. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  19820. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  19821.     character*4 cijunk
  19822.     CHARACTER*1 CMDLIN(132)
  19823. C    INTEGER*4 ISTTS
  19824. C
  19825. C 16 MUST BE LENGTH OF EDNAM IN BYTES
  19826. C KEEP NAME "EDIT " IN DATA SO IT CAN BE BASHED IF NEEDED TO BE...
  19827. C INSERT CODE FOR ADDING A LIB$SPAWN CALL HERE TO PASS COMMANDS TO
  19828. C 75 IF THEY BEGIN WITH A $ CHARACTER.
  19829.     IGOTIT=0
  19830.     IF(CMDLIN(1).NE.'}'.AND.CMDLIN(1).NE.'$')GOTO 8990
  19831. C
  19832. CC HERE CALL EXECIT WITH THE COMMAND LINE AS AN ARGUMENT...
  19833.     DO 1000 NN=1,80
  19834. 1000    CMLN(NN)=CMDLIN(NN+1)
  19835.     CMLN(79)=Char(13)
  19836.     CMLN(80)=Char(0)
  19837.     DO 1002 NN=1,77
  19838.     N=78-NN
  19839.     IF(ICHAR(CMLN(N)).GT.32)GOTO 1004
  19840. 1002    CONTINUE
  19841. C FINDING END OF REAL STRING THIS WAY
  19842. 1004    CONTINUE
  19843.     CMLN(N+1)=char(0)
  19844. c was =13, not =0 above...
  19845. C ADD C.R., THEN NULL
  19846.     CMLN(N+2)=char(0)
  19847.     CMLN(N+3)=char(0)
  19848. C INSERT LENGTH COUNT AS 1ST BYTE OF CMD LENGTH
  19849. C PER DOS 2.0 MANUAL PG F-1
  19850. ccc    CMLN2(1)=CHAR(N+3)
  19851. ccc    CMLN2(2)='/'
  19852. ccc    CMLN2(3)='C'
  19853. ccc    CMLN2(4)=' '
  19854. CC ! ADD C.R. AFTER LINE
  19855. CC ABOVE, INSERT A CR AFTER CMD LINE
  19856. C USE SYSTEM CALL INSTEAD OF OLDER CALL WHICH USES NOW-UNSUPPORTED
  19857. C FORTRAN FEATURES IN MS-FORTRAN V3.3
  19858.     call xsystem(cmln2(5))
  19859. c    N=SYSTEM(CMLN2(5))
  19860. ccc    CALL EXECIT(CMLN2)
  19861. C ASSUME WE NEED A REDRAW AFTER THE SPAWN FINISHES
  19862. C EVENTUALLY FIGURE OUT HOW TO EXEC A ROUTINE THIS WAY, BUT JUST DUMMY OUT
  19863. C  AT FIRST.
  19864.     IF(CMDLIN(1).NE.'}')GOTO 2300
  19865. C IMPLEMENT WAIT ON } FORM...
  19866.     CALL UVT100(1,25,1)
  19867.     CALL VWRT('Push Return key to return to sheet>',35)
  19868.     call vget(cijunk,2)
  19869. c    READ(11,2400,END=2300,ERR=2300)IJUNK
  19870. 2400    FORMAT(2A1)
  19871. 2300    CONTINUE
  19872.     ICODE=2
  19873. C FLAG THE MAIN COMMAND PARSER WE HANDLED THE COMMAND
  19874.     IGOTIT=1
  19875. 8990    CONTINUE
  19876.     IF(CMDLIN(1).NE.'F'.OR.
  19877.      1     CMDLIN(2).NE.'I'.OR.
  19878.      2     CMDLIN(3).NE.'L') GOTO 9000
  19879.     IGOTIT=1
  19880.     ICODE=3
  19881.     CALL DTRCMD(CMDLIN(4))
  19882. C ALLOW EXTRA COMMANDS OUT OF VAX VERSION...
  19883. C
  19884. 9000    CONTINUE
  19885.     if(cmdlin(1).ne.'C'.or.
  19886.      1     cmdlin(2).ne.'M'.or.
  19887.      2     cmdlin(3).ne.'D') goto 9100
  19888.     igotit=1
  19889.     icode=6
  19890. C Allow anything beginning with CMD to activate the RIM interface
  19891. C via a separate routine, which is passed the rest of the command
  19892. C line.
  19893.         call rimcmd(cmdlin(4))
  19894.     goto 9300
  19895. 9100    continue
  19896.     IF(CMDLIN(1).NE.'A'.OR.CMDLIN(2).NE.'N')GOTO 9200
  19897. C ANNOTATE COMMAND SEEN
  19898.     IGOTIT=1
  19899.     ICODE=2
  19900.     DO 9001 N=1,80
  19901.     CMLN(N)=Char(32)
  19902. 9001    CONTINUE
  19903. C    CALL IN2AS(PROW,FORM)
  19904.     CALL REFLEC(PCOL,PROW,IRX)
  19905.     WRITE(CELRW(1:5),9002)IRX
  19906. 9002    FORMAT(I5.5)
  19907.     ICM=17
  19908.     DO 9040 N=1,3
  19909.     IXX=ICHAR(NMSH(N))
  19910.     IF(IXX.GT.96)IXX=IXX-32
  19911.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9040
  19912.     CMLN(ICM)=CHAR(IXX)
  19913.     ICM=ICM+1
  19914. 9040    CONTINUE
  19915.     ICM=ICM-1
  19916.     DO 9003 N=1,5
  19917.     CMLN(N+ICM)=CELNAM(N)
  19918. 9003    CONTINUE
  19919.     CMLN(ICM+6)='.'
  19920.     CMLN(ICM+7)='A'
  19921.     CMLN(ICM+8)='N'
  19922.     CMLN(ICM+9)='N'
  19923.     CMLN(ICM+10)=' '
  19924.     CMLN(80)=char(13)
  19925.     DO 9008 N=1,16
  19926.     CMLN(N)=EDNAM(N)
  19927. 9008    CONTINUE
  19928. C NOW HAVE "EDIT name.ANN"
  19929. c built... go fire it up for creation or modification of annotation...
  19930.     DO 9150 N=17,ICM+9
  19931.     IF(CMLN(N).EQ.' ')CMLN(N)='0'
  19932. 9150    CONTINUE
  19933.     DO 9162 NN=1,77
  19934.     N=78-NN
  19935.     IF(ICHAR(CMLN(N)).GT.32)GOTO 9164
  19936. 9162    CONTINUE
  19937. C FINDING END OF REAL STRING THIS WAY
  19938. 9164    CONTINUE
  19939.     CMLN(N+1)=Char(13)
  19940. C ADD C.R., THEN NULL
  19941.     CMLN(N+2)=Char(0)
  19942.     CMLN(N+3)=Char(0)
  19943.     call xSYSTEM(CMLN2(5))
  19944.     GOTO 9990
  19945. 9200    CONTINUE
  19946.     IF(CMDLIN(1).NE.'?'.AND.(CMDLIN(1).NE.'Q'.OR.CMDLIN(2)
  19947.      1  .NE.'U'.OR.CMDLIN(3).NE.'E')) GOTO 9300
  19948. C QUERY COMMAND SEEN
  19949.     IGOTIT=1
  19950.     ICODE=2
  19951.     DO 9237 N=1,18
  19952. 9237    ANNAMS(N)=CHAR(32)
  19953.     CALL REFLEC(PCOL,PROW,IRX)
  19954.     WRITE(CELRW(1:5),9002)IRX
  19955.     ICM=0
  19956.     do 9238 n=1,18
  19957.     annams(n)=char(32)
  19958. 9238    continue
  19959.     DO 9240 N=1,3
  19960. C NOTE ANNOTATION NAMES ARE DIFFERENT HERE FROM VAX...
  19961. C USE NAMnnnnn.ANN WHERE nnnnn IS CELL HASH AND "NAM" COMES
  19962. C FROM 1ST 3 CHARS OF SHEET TITLE.
  19963.     IXX=ICHAR(NMSH(N))
  19964.     IF(IXX.GT.96)IXX=IXX-32
  19965.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9240
  19966.     ICM=ICM+1
  19967.     ANNAMS(ICM)=CHAR(IXX)
  19968. 9240    CONTINUE
  19969.     DO 9241 N=1,5
  19970.     ANNAMS(ICM+N)=CELNAM(N)
  19971. 9241    CONTINUE
  19972.     ANNAMS(ICM+6)='.'
  19973.     ANNAMS(ICM+7)='A'
  19974.     ANNAMS(ICM+8)='N'
  19975.     ANNAMS(ICM+9)='N'
  19976.     DO 9250 N=1,18
  19977.     IF(ANNAMS(N).EQ.' ')ANNAMS(N)='0'
  19978. 9250    CONTINUE
  19979.     ANNAMS(ICM+10)=' '
  19980. C GO TO 9210 IF NO FILE
  19981.     INQUIRE (FILE=ANNAM,EXIST=LEXIST)
  19982.     IF(.NOT.LEXIST)GOTO 9210
  19983.     OPEN(UNIT=2,FILE=ANNAM,ACCESS='SEQUENTIAL',STATUS='OLD')
  19984.     DO 9030 N=1,20
  19985.     READ(2,9031,END=9032,ERR=9032)WRK
  19986. 9031    FORMAT(128A1)
  19987.     CALL UVT100(1,N+2,1)
  19988.     CALL UVT100(12,2,0)
  19989.     call swrt(wrk,79)
  19990. c    WRITE(6,9035)WRK
  19991. 9035    FORMAT(128A1)
  19992. 9030    CONTINUE
  19993. 9032    CONTINUE
  19994. C THIS DISPLAYS ALL THE ANNOTATION WE HAVE...
  19995.     CLOSE(UNIT=2)
  19996.     CALL UVT100(1,LLCMD,1)
  19997.     CALL UVT100(12,2,0)
  19998.     CALL VWRT('Push Return key to return to sheet>',35)
  19999.     call vget(cijunk,2)
  20000.     READ(11,2400,END=9990,ERR=9990)IJUNK
  20001.     GOTO 9990
  20002. 9210    CONTINUE
  20003.     ICODE=3
  20004.     CALL UVT100(1,LLDSP,1)
  20005.     call uvt100(12,2,0)
  20006.     CALL SWRT('No Annotation found on thic cell.',33)
  20007. c    WRITE(6,9211)
  20008. c9211    FORMAT(' No annotation found on this cell.')
  20009. 9300    CONTINUE
  20010. C
  20011. 9990    CONTINUE
  20012.     RETURN
  20013.     END
  20014. c -h- usrfct.for    Fri Aug 22 13:36:30 1986    
  20015. C USER FUNCTION ROUTINE
  20016. C GENERATES PARSING AND EXECUTION OF ROUTINE CALLS OF FORM
  20017. C  *U FNAME (ARGUMENTS)
  20018. C WHERE LINE (80 BYTES) CONTAINS COMMAND LINE AND ALL
  20019. C ARGUMENTS MAY BE PARSED.
  20020. C CALLED FROM CMND
  20021. C
  20022. C VAX VERSION: MOST MATRIX ROUTINES AVAILABLE
  20023. C BUT ASSUMES SUBSTANTIAL SPACE AVAILABLE.
  20024. C
  20025. c available parsing aid:
  20026. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  20027. c where line(ibgn... lend) is scanned. If variable found
  20028. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  20029. c variable found if any. lstchr is last char found+1...
  20030. C OTHER USEFUL ROUTINES IN THE SHEET:
  20031. C GN(LAST,LEND,NUMBER,LINE)
  20032. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  20033. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  20034. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  20035. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  20036. C  NUMERIC.
  20037. C INDEX(LINE,CHAR)
  20038. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  20039. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  20040. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  20041. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  20042. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  20043. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  20044. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  20045. C VARIABLE NAMES. SUPPLIED VERSION CALLS IDATE WHICH RETURNS
  20046. C SYSTEM DATE IN RSX OR VMS AS INTEGER DAY, MONTH, AND YEAR.
  20047. C  THIS RETURNS HERE IN AC T, U, AND V
  20048. C
  20049.     SUBROUTINE USRFCT(LINE,RETCD,WRK2)
  20050.     Include aparms.inc
  20051.     CHARACTER*1 LINE(80)
  20052.     INTEGER RETCD
  20053.     CHARACTER*1 AVBLS(24,27),WRK(128),VBLS(8,1,1)
  20054.     Real*8 VAVBLS(3,27)
  20055.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  20056.     CHARACTER*1 WRK2(128)
  20057.     InTeGer*4 TYPE(1,2),VLEN(9)
  20058.     EXTERNAL INDX
  20059.     REAL*8 XAC,XVBLS(1,1)
  20060.     REAL*8 TAC,UAC,VAC,WAC,YAC
  20061.     REAL*8 TMP,XXXX
  20062.     INTEGER*4 JVBLS(2,1,1)
  20063.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  20064.     EQUIVALENCE(XAC,AVBLS(1,27))
  20065.     EQUIVALENCE(TAC,AVBLS(1,20))
  20066.     EQUIVALENCE(UAC,AVBLS(1,21))
  20067.     EQUIVALENCE(VAC,AVBLS(1,22))
  20068.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  20069.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  20070.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  20071. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  20072. CCC    CHARACTER*1 XTNCMD(80)
  20073. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  20074. C ***<<<< RDD COMMON START >>>***
  20075.     InTeGer*4 RRWACT,RCLACT
  20076. C    COMMON/RCLACT/RRWACT,RCLACT
  20077.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  20078.      1  IDOL7,IDOL8
  20079. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  20080. C     1  IDOL7,IDOL8
  20081.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  20082. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  20083.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  20084. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  20085. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  20086. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  20087.     InTeGer*4 KLVL
  20088. C    COMMON/KLVL/KLVL
  20089.     InTeGer*4 IOLVL,IGOLD
  20090. C    COMMON/IOLVL/IOLVL
  20091. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  20092. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  20093.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  20094.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  20095.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  20096.      3  k3dfg,kcdelt,krdelt,kpag
  20097. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  20098. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  20099. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  20100. C ***<<< RDD COMMON END >>>***
  20101. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  20102. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  20103. CCC    InTeGer*4 RRWACT,RCLACT
  20104. CCC    COMMON/RCLACT/RRWACT,RCLACT
  20105. C ***<<< XVXTCD COMMON START >>>***
  20106.     CHARACTER*1 OARRY(100)
  20107.     InTeGer*4 OSWIT,OCNTR
  20108. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  20109. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  20110.     InTeGer*4 IPS1,IPS2,MODFLG
  20111. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  20112.        InTeGer*4 XTCFG,IPSET,XTNCNT
  20113.        CHARACTER*1 XTNCMD(80)
  20114. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  20115. C VARY FLAG ITERATION COUNT
  20116.     INTEGER KALKIT
  20117. C    COMMON/VARYIT/KALKIT
  20118.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  20119.     InTeGer*4 RCMODE,IRCE1,IRCE2
  20120.  
  20121. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20122. C     1  IRCE2
  20123. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  20124. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  20125. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  20126. C RCFGX ON.
  20127. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  20128. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  20129. C  AND VM INHIBITS. (SETS TO 1).
  20130.     INTEGER*4 FH
  20131. C FILE HANDLE FOR CONSOLE I/O (RAW)
  20132. C    COMMON/CONSFH/FH
  20133.     CHARACTER*1 ARGSTR(52,4)
  20134. C    COMMON/ARGSTR/ARGSTR
  20135.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  20136.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  20137.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  20138.      3  IRCE2,FH,ARGSTR
  20139. C ***<<< XVXTCD COMMON END >>>***
  20140. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  20141. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  20142. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  20143. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  20144. C (IMPLEMENT FOR VAX ONLY)
  20145. CCC    INTEGER KALKIT
  20146. CCC    COMMON/VARYIT/KALKIT
  20147. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  20148. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  20149. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  20150. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  20151.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  20152.     COMMON/D2R/NRDSP,NCDSP
  20153.     CHARACTER*1 FNAMS(6,24)
  20154. C FNAMS IS NAME OF FUNCTION CALLED.
  20155.     save fnams
  20156.     DATA FNAMS /'I','D','A','T','E','0',
  20157.      1  'M','T','X','E','Q','0',
  20158.      2  'M','O','V','E','V','0',
  20159.      3  'M','D','E','T','0','0',
  20160.      4  'M','P','R','O','D','0',
  20161.      5  'M','A','D','D','V','0','M','S','U','B','V','0',
  20162.      7  'M','M','P','Y','T','0','M','M','P','Y','C','0',
  20163.      9  'V','A','R','Y','0','0','X','Q','T','C','M','0',
  20164.      2  'S','T','R','V','L','0','H','E','R','E','0','0',
  20165.      4  'Y','R','M','O','D','0','J','D','A','T','E','0',
  20166.      6  'J','T','O','C','H','0','D','A','T','E','0','0',
  20167.      1  'W','K','D','Y','S','0','W','K','D','I','N','0',
  20168.      2  'F','F','T','F','W','0','F','F','T','R','V','0',
  20169.      3  'L','I','N','E','F','0','D','B','0','0','0','0',
  20170.      4  'S','T','0','0','0','0'/
  20171. C NULL TERMINATE ANY NAMES (ALLOWS 5 CHARACTERS)
  20172. C START LOOKING PAST THE *U
  20173. C  GET FUNCTION NAME AND GO TO PROCESS EACH FUNCTION SEPARATELY
  20174. C GET NONBLANK CHAR FOR FUNCTION NAME START
  20175. C NO-OP THE XQTCM FUNCTION FOR PDP11-OVERLAIN VERSIONS BY ZAPPING
  20176. C THE NAME SO IT CAN'T EVER BE CALLED.
  20177.     K=3
  20178. 30    IF(LINE(K).NE.' ')GOTO 40
  20179.     K=K+1
  20180.     IF(K.LT.60)GOTO 30
  20181. 40    CONTINUE
  20182. C UNCOMMENT THE DO 100 STMT IF DIM 2 OF FNAMS > 1
  20183.     N=1
  20184. C **** BE SURE THE 2ND BOUND ON N IS THE SAME AS THE DIMENSION OF
  20185. C ****  FNAMS   **************************
  20186. C    DO 7771 N=1,24
  20187. C    DO 7771 NN=1,6
  20188. C    IF(FNAMS(NN,N).EQ.'0')FNAMS(NN,N)=0
  20189. C7771    CONTINUE
  20190.     DO 100 N=1,24
  20191.     KF=N
  20192.     DO 110 NN=1,6
  20193. C CHECK FOR '0' IN FUNCTION NAME AND SKIP ON THAT... 48 IS ASCII /0/
  20194.     IF(LINE(K+NN-1).NE.FNAMS(NN,N).AND.ICHAR(FNAMS(NN,N)).NE.48)
  20195.      1  GOTO 100
  20196. 110    CONTINUE
  20197.     GOTO 200
  20198. 100    CONTINUE
  20199. C UNRECOGNIZED FUNCTION... IGNORE
  20200. 300    RETCD=3
  20201.     RETURN
  20202. 200    CONTINUE
  20203. C NOW HAVE FOUND FUNCTION IDENTIFIED BY KF. CALL IT AND ALLOW TO WORK
  20204.     GOTO (1100,1200,1300,1400,1500,1600,1700,1800,
  20205.      1  1900,2000,2100,2200,2300,2400,2500,2600,2700,
  20206.      2  2900,3000,3100,3200,3300,3400,3500),KF
  20207.     GOTO 300
  20208. 1100    CONTINUE
  20209. C IDATE FUNCTION
  20210. C RETURNS MONTH, DAY, YEAR IN AC'S T,U,V
  20211. C RETURN 4/1/85 (APRIL FOOLS DAY)
  20212. C    IDA=1
  20213. C    IMO=4
  20214. C    IYR=85
  20215. c    CALL IDATE(IMO,IDA,IYR)
  20216.     CALL DATE(IYR,IMO,IDA)
  20217. C CALL supplied GET-DATE FUNCTION AND HOPE IT'S OK
  20218.     TAC=IMO
  20219.     UAC=IDA
  20220.     IYR=IYR-1900
  20221.     VAC=IYR
  20222. C RETURN A FLOATING VALUE OF DATE FORM AS YYMMDD SO IT CAN BE
  20223. C USED FOR SORTING AND SIMILAR APPLICATIONS. COULD BE USED ALSO
  20224. C FOR INTERVALS IF A JULIAN DATE WERE RETURNED, BUT THIS WILL DO
  20225. C FOR COMPARISONS AND ORDERING.
  20226.     XAC=JULMDY(IYR,IMO,IDA)
  20227. C    XAC=VAC*10000.+TAC*100.+UAC
  20228.     RETURN
  20229. 1200    CONTINUE
  20230. C MATRIX EQUATION. NOTE WE MUST NOW START SCAN FOR ARGUMENTS...
  20231. C K+5 IS START OF ARG LIST. START AT K+6 TO ALLOW ( TO BE THERE...
  20232. C FORMAT DESIRED:
  20233. C  *U MTXEQ(A1:A2,X1:X2,B1:B2) GENERATING SOLUTION MATRIX X1:X2
  20234. C  FROM MATRICES A,B AND SOLVING EQUATION AX=B WHERE A IS AN N BY
  20235. C  N SQUARE MATRIX, AND X AND B ARE N BY M MATRICES.
  20236.     RETCD=1
  20237. C COLLECT ARGUMENTS. NOTE THAT VARSCN AND GN TRASH POINTERS PASSED
  20238. C TO THEM IN IBGN, LEND, SO MAKE UP EVERY TIME. USE VARSCN TO
  20239. C COLLECT POINTERS TO THE SHEET ARRAY FIRST OFF COMMAND LINE,
  20240. C THEN PROCESS IN OUR MAGICAL MYSTICAL ROUTINE...
  20241.     IBGN=K+6
  20242.     LEND=IBGN+20
  20243. C GET LOCATIONS OF MATRICES A, X, AND B (FOR AX=B EQN)
  20244. C A MUST BER N BY N, SQUARE. X,B ARE N BY M.
  20245.     CALL PMTX2(RETCD,3,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20246.      1   IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20247.     N=IABS(ID1B-ID1A)+1
  20248. C CHECK THAT MATRIX A IS SQUARE
  20249.     IF(N.NE.(IABS(ID2B-ID2A)+1))GOTO 300
  20250. C CHECK THAT MATRIX X AND B HAVE THE SAME DIMENSIONS
  20251.     IF((IDYA-IDXA).NE.(IDCA-IDBA))GOTO 300
  20252.     IF((IDYB-IDXB).NE.(IDCB-IDBB))GOTO 300
  20253.     M=IABS(IDYA-IDXA)+1
  20254. C CHECK THAT THE X AND B MATRIX DIMENSIONS ARE N BY M
  20255. C WHERE THE N IS THE SAME AS FOR THE A MATRIX
  20256.     NN=IABS(IDYB-IDXB)+1
  20257.     IF(NN.NE.N)GOTO 300
  20258. C NOW HAVE DIMENSIONS FOR ALL THIS STUFF...
  20259. C SINCE MTXEQU TRASHES ITS' B MATRIX, COPY IT INTO X MATRIX
  20260. C AND THEN CALL...
  20261.     DO 1210 NN=IDBA,IDCA
  20262.     DO 1210 MM=IDBB,IDCB
  20263.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  20264.     CALL XVBLST(NN-IDBA+IDXA,MM-IDBB+IDXB,XVBLS(1,1))
  20265. C    XVBLS(NN-IDBA+IDXA,MM-IDBB+IDXB)=XVBLS(NN,MM)
  20266. 1210    CONTINUE
  20267. C NOW ALL THE ARGUMENTS ARE SET UP... GO DO THE WORK.
  20268. C CALL UTILITY ROUTINE, THEN DONE...
  20269.     CALL MTXEQU(ID1A,ID2A,IDXA,IDXB,N,M,XAC)
  20270.     RETURN
  20271. 1300    CONTINUE
  20272. C MOVEV  MTX1 MTX2  MOVE MTX1 VALUES TO MTX2
  20273.     RETCD=1
  20274.     IBGN=K+6
  20275.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  20276.      1  IR2B,IC2B,KK,KK,KK,KK)
  20277. C CHECK FOR SAME SIZE MATRICES
  20278.     IF((IC1T-IC1B).NE.(IC2T-IC2B))GOTO 300
  20279.     IF((IR1T-IR1B).NE.(IR2T-IR2B))GOTO 300
  20280. C DO THE COPY HERE (EASIER THAN CALLING SOMETHING...)
  20281.     DO 1301 NN=IR1T,IR1B
  20282.     DO 1301 MM=IC1T,IC1B
  20283.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  20284.     CALL XVBLST(NN-IR1T+IR2T,MM-IC1T+IC2T,XVBLS(1,1))
  20285. C    XVBLS(NN-IR1T+IR2T,MM-IC1T+IC2T)=XVBLS(NN,MM)
  20286. 1301    CONTINUE
  20287.     RETURN
  20288. 1400    CONTINUE
  20289. C MDET  - DETERMINANT OF SQUARE MATRIX
  20290. C  1 ARGUMENT, VIZ., MATRIX COORDS
  20291.     RETCD=1
  20292. C ACCOUNT FOR "MDET" BEING 4 CHARS NOT 5
  20293.     IBGN=K+5
  20294.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  20295.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  20296. C CALL A DETERMINANT ROUTINE TO DO THE WORK
  20297. C NOTE IT CHECKS FOR SQUARE MATRIX INTERNALLY AND RETURNS 0 IF NOT
  20298. C SQUARE...
  20299.     CALL MDET(XVBLS,IR1T,IC1T,IR1B,IC1B,XAC)
  20300.     RETURN
  20301. 1500    CONTINUE
  20302. C MPROD A,B,C  C=A*B MATRIX WISE
  20303.     IBGN=K+6
  20304.     RETCD=1
  20305.     IMXX=3
  20306.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20307.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20308. C A=N BY M
  20309. C B=M BY L
  20310. C C=N BY L
  20311.     N=1+ID1B-ID1A
  20312.     M=1+ID2B-ID2A
  20313. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  20314.     L=1+IDYA-IDXA
  20315. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  20316. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  20317. C DIMENSIONS LOOK OK NOW SO DO THE WORK
  20318. C USE SLIGHTLY MODIFIED GMPRD
  20319.     CALL GMPRD(ID1A,ID2A,IDXA,IDXB,
  20320.      1  IDBA,IDBB,N,M,L)
  20321.     RETURN
  20322. 1600    CONTINUE
  20323. C MADDV A,B,C  C=A+B
  20324.     IMXX=3
  20325.     IBGN=K+6
  20326.     RETCD=1
  20327.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20328.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20329.     N=1+ID1B-ID1A
  20330.     M=1+ID2B-ID2A
  20331. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  20332. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  20333. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  20334. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  20335. C USE MODIFIED GMADD
  20336.     CALL GMADD(ID1A,ID2A,IDXA,IDXB,
  20337.      1  IDBA,IDBB,M,N)
  20338.     RETURN
  20339. 1700    CONTINUE
  20340. C MSUBV A,B,C  C=A-B
  20341.     IMXX=3
  20342.     IBGN=K+6
  20343.     RETCD=1
  20344.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20345.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20346.     N=1+ID1B-ID1A
  20347.     M=1+ID2B-ID2A
  20348. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  20349. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  20350. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  20351. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  20352.     CALL GMSUB(ID1A,ID2A,IDXA,IDXB,
  20353.      1  IDBA,IDBB,M,N)
  20354.     RETURN
  20355. 1800    CONTINUE
  20356. C MMPYT A,B,C  C=AT*B
  20357. C GET 3 MATRICES
  20358.     IMXX=3
  20359.     IBGN=K+6
  20360.     RETCD=1
  20361.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20362.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20363. C TRANSPOSE DIMENSIONS OF A...
  20364.     M=1+ID1B-ID1A
  20365.     N=1+ID2B-ID2A
  20366. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  20367.     L=1+IDYA-IDXA
  20368. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  20369. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  20370.     CALL GTPRD(ID1A,ID2A,IDXA,IDXB,
  20371.      1  IDBA,IDBB,N,M,L)
  20372.     RETURN
  20373. 1900    CONTINUE
  20374. C MMPYC A,B,K  B=A*K (K=CONSTANT)
  20375. C FOR MPY BY CONSTANT WE GET MATRICES IN ORDER A,C, THEN AC WITH CONST
  20376. C IN IT LAST...
  20377.     IBGN=K+6
  20378.     RETCD=1
  20379.     IMXX=2
  20380.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  20381.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  20382.     IF(LINE(IBGN-1).NE.',')GOTO 300
  20383.     LEND=IBGN+20
  20384.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,IDCA,IDCB,IVALID)
  20385.     IF(IVALID.EQ.0)GOTO 300
  20386. C NOW HAVE EVERYTHING OF ARGS... CHECK DIMENSIONS OF MATRICES....
  20387.     N=1+ID1B-ID1A
  20388.     M=1+ID2B-ID2A
  20389. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  20390. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  20391.     CALL XVBLGT(IDCA,IDCB,XXXX)
  20392.     DO 1901 NN=ID1A,ID1B
  20393.     DO 1901 MM=ID2A,ID2B
  20394.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  20395.     XVBLS(1,1)=XVBLS(1,1)*XXXX
  20396.     CALL XVBLST(NN-ID1A+IDXA,MM-ID2A+IDXB,XVBLS(1,1))
  20397. C    XVBLS(NN-ID1A+IDXA,MM-ID2A+IDXB)=XVBLS(NN,MM)
  20398. C     1    *XVBLS(IDCA,IDCB)
  20399. 1901    CONTINUE
  20400.     RETURN
  20401. C *U VARY X,A,W,I,P;Q;R;S;T
  20402. C  REPEATEDLY COMPUTE SHEET FOR I ITERATIONS (DEFAULTS TO 1
  20403. C  IF NONE GIVEN) AND VARY AC P,Q,R,S, T (POSITIONAL...WHATEVER
  20404. C  IS NAMED) UNTIL CONDITION THAT AC X (WHATEVER IS NAMED THERE)
  20405. C  IS MADE EQUAL TO AC A AS CLOSELY AS POSSIBLE. DOES MULTI-DIMENSIONAL
  20406. C  STEPPING SEARCH SAVING AC'S AND MODIFYING. ACTUALLY WILL HANDLE ANY
  20407. C  CELL. UP TO 8 DIMENSIONS PERMITTED (ARBITRARY LIMIT).
  20408. C  NOTE THAT RECALCULATE SPECIAL VARY FLAG WILL BE SET HERE IF
  20409. C  VARYING MORE THAN ONCE...
  20410. C  WILL VARY ONE OF THE AC'S IN THE LIST P,Q,R,S,T... BY INITIAL
  20411. C  FRACTION W (AN ARBITRARY "STEP SIZE" FRACTION) AND COMPUTE THE
  20412. C  GRADIENT OF (X-A) WRT THAT AC, THEN WILL REPLACE ALL AC'S AND
  20413. C  VARY THAT AC BY W * THE GRADIENT, MEANING THAT AS THE GRADIENT
  20414. C  DECREASES, THE VARIANCE DOES ALSO. LAST GRADIENTS ARE SAVED AND
  20415. C  USED AS INITIAL VARIANCES, SO THAT THE W FRACTION IS AN INITIAL
  20416. C  GUESS. HOWEVER IT ALSO IS A LIMIT SO NO STEP VARIES AN AC BY
  20417. C  MORE FRACTIONALLY THAN W.
  20418. C   ONCE THIS IS DONE ANOTHER ONE OF THE P,Q,R,S,T,... LIST IS
  20419. C  CHOSEN CIRCULARLY AND THE PROCESS REPEATS. THIS MAY CONTINUE
  20420. C  INDEFINITELY TO LOOK FOR CONVERGENCE.
  20421. C   NOTE THAT X AND A MAY BE ANY CELL AND NEED NOT BE ACCUMULATORS.
  20422. C  HOWEVER ALL OTHER CELLS TO VARY MUST BE AC'S AND MUST BE THE
  20423. C  INDEPENDENT VARIABLES. CALCULATIONS ELSEWHERE ON THE SHEET
  20424. C  (PERHAPS LATER IN THE SAME CELL...)MUST ESTABLISH DEPENDENT
  20425. C  VARIABLES OR BOUNDARY OR NORMALIZATION CONDITIONS.
  20426. 2000    CONTINUE
  20427.     RETCD=1
  20428. C SPLIT OFF THESE FUNCTIONS INTO A COMMON SUBROUTINE
  20429.     CALL VVARY(LINE,RETCD,K)
  20430.     RETURN
  20431. 2100    CONTINUE
  20432. C EXECUTE COMMAND. FILL IN COMMAND FROM GIVEN FUNCTION AND
  20433. C CALL XQTCMD TO DO IT. SETS UP NECESSARY VARIABLES FIRST.
  20434. C ASSUME THE COMMAND LINE MUST BE ALONE ON LINE AFTER THIS CALL...
  20435.     KK=1
  20436.     KKK=K+6
  20437.     DO 2101 NN=KKK,80
  20438.     XTNCMD(KK)=LINE(NN)
  20439.     IF(ICHAR(XTNCMD(KK)).LE.0)GOTO 2102
  20440.     KK=KK+1
  20441. 2101    CONTINUE
  20442. 2102    CONTINUE
  20443.     XTNCMD(KK+1)=char(0)
  20444.     XTNCMD(KK+2)=char(0)
  20445.     XTNCNT=KK
  20446.     XTCFG=1
  20447.     IPSET=1
  20448.     CALL XQTCMD(ICODE)
  20449.     RETURN
  20450. 2200    CONTINUE
  20451. C RETURN PACKED FORMULA STRING TO EXTRACT UP TO 8 CHARS OF
  20452. C FORMULA.
  20453. C START AT K+6
  20454.     XAC=0.
  20455.     IBGN=K+6
  20456.     IEND=IBGN+20
  20457.     CALL VARSCN(LINE,IBGN,IEND,LSTC,I1,I2,IVLD)
  20458.     IF(IVLD.LE.0)RETURN
  20459. C GET START, LENGTH NOW IN FORMULA...
  20460.     IBGN=LSTC+1
  20461.     IEND=IBGN+20
  20462.     CALL GN(IBGN,IEND,ISTART,LINE)
  20463.     IBGN=INDX(LINE,ICHAR(';'))
  20464. C LOOK FOR ';' CHAR AS START OF 2ND NUMBER
  20465.     IF(IBGN.GT.50.OR.ISTART.LE.0.OR.ISTART.GT.80)RETURN
  20466. C BUMP IBGN PAST THE ; CHAR
  20467.     IBGN=IBGN+1
  20468.     IEND=80
  20469.     CALL GN(IBGN,IEND,ILN,LINE)
  20470.     ILN=MIN0(ILN,8)
  20471.     IF(ILN.LE.0)RETURN
  20472. C READ IN FORMULA INTO WRK ARRAY
  20473. C    IRX=(I2-1)*60+I1
  20474.     CALL REFLEC(I2,I1,IRX)
  20475.     CALL WRKFIL(IRX,WRK2,0)
  20476.     CALL CE2A(WRK2,WRK)
  20477.     KZ=0
  20478.     DO 991 NN=1,ILN
  20479.     K=ICHAR(WRK(ISTART+NN-1))
  20480. C    K=K.AND.127
  20481.     IF(K.EQ.0)KZ=1
  20482.     IF(KZ.EQ.1)K=0
  20483. C STOP THE ENCODE ON SEEING ANY NULLS
  20484.     TMP=K
  20485.     XAC=XAC*128.D0+TMP
  20486. 991    CONTINUE
  20487. C XAC RETURNS WITH ENCODED VALUE.
  20488.     RETURN
  20489. 2300    CONTINUE
  20490. C RETURN PRESENT LOCATION IN THE MATRIX.
  20491.     TAC=PROW
  20492.     UAC=PCOL
  20493.     XAC=(PCOL-1)*MCols+PROW
  20494.     VAC=4*FORMFG+2*RCFGX+RCONE
  20495. C    VAC=(DROW-1)*20+DCOL
  20496. C RESULT IN % IS PHYS SHEET HASHCODE
  20497. C RESULT IN V ACCUMULATOR IS DISPLAY SHEET LOC HASHCODE
  20498. C T AND U ACCUMULATORS GET PHYS COL, ROW OFFSET.
  20499.     WAC=RRWACT
  20500.     YAC=RCLACT
  20501. C W AND Y GET LIMITS CURRENTLY USED
  20502.     RETURN
  20503. 2400    CONTINUE
  20504. C YRMOD
  20505.     RETCD=1
  20506.     IBGN=K+6
  20507.     LEND=IBGN+20
  20508.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20509.     IF(IVALID.EQ.0)GOTO 9300
  20510.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20511.     IBGN=LSTCHR+1
  20512.     LEND=IBGN+20
  20513.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20514.     IF(IVALID.EQ.0)GOTO 9300
  20515.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20516.     IBGN=LSTCHR+1
  20517.     LEND=IBGN+20
  20518.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  20519.     IF(IVALID.EQ.0)GOTO 9300
  20520. C
  20521. C V1, V2, V3 ARE YR, MONTH, DAY FOR RETURN OF JULIAN DATE
  20522. C
  20523.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20524.     IYR=XVBLS(1,1)
  20525.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20526.     IMO=XVBLS(1,1)
  20527.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  20528.     IDA=XVBLS(1,1)
  20529. C RETURN JULIAN DATE FROM Y, M, D GIVEN
  20530.     XAC=JULMDY(IYR,IMO,IDA)
  20531.     RETURN
  20532. 2500    CONTINUE
  20533. C JDATE
  20534.     RETCD=1
  20535.     IBGN=K+6
  20536.     LEND=IBGN+20
  20537. C GET V1 WHICH HAS VARIABLE WITH THE STRING IN IT
  20538.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20539.     IF(IVALID.EQ.0)GOTO 9300
  20540. C RETURN JULIAN DATE NOW AFTER FETCHING FORMULA.
  20541. C    IRX=(ID2A-1)*60+ID1A
  20542.     CALL REFLEC(ID2A,ID1A,IRX)
  20543.     CALL WRKFIL(IRX,WRK,0)
  20544.     XAC=JULIAN(WRK)
  20545.     RETURN
  20546. 2600    CONTINUE
  20547. C JTOCH
  20548.     RETCD=1
  20549.     IBGN=K+6
  20550.     LEND=IBGN+20
  20551. C V1 = JULIAN DATE
  20552. C V2 IS WHERE TO STORE ASCII DATE STRING AS FORMULA.
  20553.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20554.     IF(IVALID.EQ.0)GOTO 9300
  20555.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20556.     IBGN=LSTCHR+1
  20557.     LEND=IBGN+20
  20558.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20559.     IF(IVALID.EQ.0)GOTO 9300
  20560.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20561.     IJUL=XVBLS(1,1)
  20562. C    IRX=(ID2B-1)*60+ID1B
  20563.     CALL REFLEC(ID2B,ID1B,IRX)
  20564.     CALL WRKFIL(IRX,WRK,0)
  20565.     DO 2502 N=1,110
  20566. 2502    WRK(N)=char(0)
  20567.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  20568.     CALL WRKFIL(IRX,WRK,1)
  20569. C WRITE THE FORMULA BACK OUT
  20570.     TAC=IMO
  20571.     UAC=IDA
  20572.     VAC=IYR
  20573. C RETURN T,U,V AS M,D,Y ALSO
  20574.     RETURN
  20575. 2700    CONTINUE
  20576. C DATE
  20577.     RETCD=1
  20578.     IBGN=K+5
  20579.     LEND=IBGN+20
  20580.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20581.     IF(IVALID.EQ.0)GOTO 9300
  20582.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20583.     IBGN=LSTCHR+1
  20584.     LEND=IBGN+20
  20585.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20586.     IF(IVALID.EQ.0)GOTO 9300
  20587.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20588.     IBGN=LSTCHR+1
  20589.     LEND=IBGN+20
  20590.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  20591.     IF(IVALID.EQ.0)GOTO 9300
  20592.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20593.     IBGN=LSTCHR+1
  20594.     LEND=IBGN+20
  20595.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1D,ID2D,IVALID)
  20596.     IF(IVALID.EQ.0)GOTO 9300
  20597.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20598.     IYR=XVBLS(1,1)
  20599.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20600.     IMO=XVBLS(1,1)
  20601.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  20602.     IDA=XVBLS(1,1)
  20603. C    IRX=(ID2D-1)*60+ID1D
  20604.     CALL REFLEC(ID2D,ID1D,IRX)
  20605.     CALL WRKFIL(IRX,WRK,0)
  20606.     DO 2702 N=1,110
  20607. 2702    WRK(N)=char(0)
  20608.     IJUL=JULMDY(IYR,IMO,IDA)
  20609.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  20610.     CALL WRKFIL(IRX,WRK,1)
  20611.     GOTO 9300
  20612. 2900    CONTINUE
  20613.     RETCD=1
  20614. C WKDYS - GIVE WEEKDAYS (M-F) BETWEEN 2 JULIAN DATES THAT MUST
  20615. C BE IN CELLS.
  20616.     IBGN=K+6
  20617.     LEND=IBGN+20
  20618.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20619.     IF(IVALID.EQ.0)GOTO 9300
  20620.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20621.     IBGN=LSTCHR+1
  20622.     LEND=IBGN+20
  20623.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20624.     IF(IVALID.EQ.0)GOTO 9300
  20625.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20626.     IYR=XVBLS(1,1)
  20627.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20628.     IMO=XVBLS(1,1)
  20629. C IYR HOLDS START JULIAN DATE, IMO HOLDS END ONE
  20630.     CALL WKDY(IYR,IMO,IDA)
  20631. C IDA = NUMBER WORK DAYS BETWEEN THE DATES
  20632.     XAC=IDA
  20633. C RETURN DAYS
  20634.     GOTO 9300
  20635. 3000    CONTINUE
  20636.     RETCD=1
  20637. C WKDIN - GIVEN A JULIAN DATE AND A NUMBER WORKDAYS, RETURN THE
  20638. C ENDING JULIAN DATE AFTER THAT NUMBER JULIAN DAYS.
  20639.     IBGN=K+6
  20640.     LEND=IBGN+20
  20641.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20642.     IF(IVALID.EQ.0)GOTO 9300
  20643.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  20644.     IBGN=LSTCHR+1
  20645.     LEND=IBGN+20
  20646.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20647.     IF(IVALID.EQ.0)GOTO 9300
  20648.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  20649.     IYR=XVBLS(1,1)
  20650.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  20651.     IMO=XVBLS(1,1)
  20652. C IYR = START DATE, JULIAN. IMO = NUMBER DAYS. RETURN END DATE JULIAN.
  20653.     CALL WRKINT(IYR,IMO,IDA)
  20654. C IDA = RETURN JULIAN DATE
  20655.     XAC=IDA
  20656.     GOTO 9300
  20657. 3100    CONTINUE
  20658. C FFTFW
  20659.     ISI=1
  20660.     GOTO 3210
  20661. 3200    CONTINUE
  20662. C FFTRV
  20663.     ISI=-1
  20664. 3210    CONTINUE
  20665.     RETCD=1
  20666. C MERGED FFT CODE
  20667. C *U FFTFW V1:V2 DOES FFT OF RANGE GIVEN (1-DIM)
  20668. C DITTO FFTRV BUT ONE IS REVERSE AND ONE IS FORWARD FFT
  20669. C REAL*8 FFT ROUTINE USED.
  20670.     IBGN=K+6
  20671.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  20672.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  20673.     IC=0
  20674.     IR=1
  20675.     IF(IR1T.EQ.IR1B)GOTO 3220
  20676.     IC=1
  20677.     IR=0
  20678. 3220    CONTINUE
  20679.     KK=IABS(IR1T-IR1B)+1
  20680.     KKK=IABS(IC1T-IC1B)+1
  20681.     IV=MAX0(KK,KKK)
  20682. C IV = NO. POINTS.
  20683.     CALL FOUREA(IR1T,IC1T,IC,IR,IV,ISI)
  20684. C THAT'S ALL FOR FFT. REPLACES CELLS IN PLACE...
  20685.     GOTO 9300
  20686. 3300    CONTINUE
  20687. C LINEF
  20688. C *U LINEF VY1:VY2[,VX1:VX2]
  20689. C WHERE X COORDS CAN BE SKIPPED...
  20690.     IBGN=K+6
  20691.     RETCD=1
  20692. C JUST GET 2 MATRICES' VALUES. IF RETCD=3 ON RETURN, 2ND MATRIX MUST HAVE
  20693. C BEEN MISSING SO FLAG IT THAT WAY.
  20694.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  20695.      1  IR2B,IC2B,KK,KK,KK,KK)
  20696.     IF(RETCD.NE.1)IR2T=-1
  20697.     RETCD=1
  20698.     KK=IABS(IR1T-IR1B)+1
  20699.     KKK=IABS(IC1T-IC1B)+1
  20700.     IV=MAX0(KK,KKK)
  20701.     KK=0
  20702.     IF(IR1T.EQ.IR1B)GOTO 3320
  20703.     KK=1
  20704. 3320    CONTINUE
  20705.     CALL LINFIT(IR2T,IC2T,KK,IR1T,IC1T,IV,TAC,UAC,XAC,WAC)
  20706. C RETURN A VALUE IN T, B VALUE IN U, AND DEL VALUE IN %.
  20707. C FOR Y = A + BX
  20708. C W AC RETURNS CORRELATION COEFFICIENT.
  20709.     GOTO 9300
  20710. 3400    CONTINUE
  20711. C *U DBxxxx FUNCTIONS PARSED EXTERNALLY
  20712. C (SAVES MUCH SPACE AND EASES MODIFICATION...)
  20713.     RETCD=1
  20714.     CALL DTRFCT(LINE(K+2),RETCD)
  20715.     GOTO 9300
  20716. 3500    CONTINUE
  20717. C *U STxxxx FUNCTIONS
  20718.     RETCD=1
  20719. C K SHOULD BE SUBSCRIPT OF THE 'S' OF "ST" SO SKIP BY THE
  20720. C "ST" PART AND JUST PASS THE REST OF THE FUNCTION NAME AT THE
  20721. C START OF THE STRING...
  20722.     CALL SCIFCT(LINE(K+2),RETCD)
  20723. C HANDLE ALL *U STXXXX FUNCTIONS IN SEPARATE ROUTINE FOR EASE OF
  20724. C MOVING IT AROUND. (MIGHT EVEN GO BACK TO PDP11!)
  20725. C    GOTO 9300
  20726. 9300    RETURN
  20727.     END
  20728. c -h- scifct.fam
  20729. C SCIENTIFIC FUNCTION CALLER
  20730. C This version is a dummy placeholder.
  20731. C The SCIFCT subroutine exists to allow AnalytiCalc to call just
  20732. C about *ANY* Fortran callable routine.
  20733. C   The operation is to use a formula in AnalytiCalc which includes
  20734. c a call of form:
  20735. c  *U STxxxxxx range;range;range;range;range;...;range>outrange;outrange;outrange
  20736. c so that the "xxxxxx" part is the function name to be called.
  20737. c  input ranges are the parts of the sheet for input to the function; these
  20738. c are internally copied to a large array (defined here) which is a normal
  20739. c Fortran array. They are converted to integer*4 as needed if the function
  20740. c being called needs this. Once all conversion is done, the subroutine is
  20741. c called using an argument list built up by this call list. At the end,
  20742. c the output ranges are filled in from the internal Fortran array.
  20743. c   Because Fortran callable subroutines (e.g. those in the SSP) may pass
  20744. c their return arguments in ANY of their arguments, seeing a ; will increment
  20745. c the output range counter.
  20746. c
  20747. c To add more:
  20748. c  * Select desired sizes for work area (must be big enough to hold ALL
  20749. c  arguments used), max number of arguments per function, etc.
  20750. c  * Add new function name and characteristics to tables. Note that the
  20751. c  name, integer/float stuff for all args, which arg is first OUTPUT arg,
  20752. c  and map of output args, all are needed. Don't make first output arg
  20753. c  bigger than the max. number of args.
  20754. c  * Add another call and element in the computed GOTO for each function
  20755. c  desired.
  20756. c  * Build and enjoy.
  20757. c
  20758. c   Internally we need tables of
  20759. c      * Function names (up to 6 characters long per classical Fortran rules)
  20760. c      * Number of arguments needed per function
  20761. c      * Integer/real flags for arguments' data types
  20762. c      * First output argument number (user convenience and less error
  20763. c           prone than having to have a bunch of ;;;;'s to force the
  20764. c           outputrange to come from the right area
  20765. c      * Length of the Fortran array used for each input argument
  20766. c Note: Provision is made for "scratch array" arguments, but is a bit
  20767. c  crude. However, if extra space is needed, user can specify a larger
  20768. c  input area and the larger chunk of scratch space will be present.
  20769. c  Unused argument areas will generally be zeroed on each call.
  20770. c   It is perfectly reasonable to have input-only functions (e.g. plots)
  20771. c   or several subroutines called in sequence for a function.
  20772. c
  20773.     SUBROUTINE SCIFCT(LINE,RETCD)
  20774.     Integer BigSpc
  20775.     Parameter (BigSpc=256)
  20776.     Parameter (MaxArgs=10)
  20777.     Parameter (NFCT=3)
  20778. c NFCT is number of functions included in the list. Update the parameter
  20779. c and the tables together (please!)
  20780.     INTEGER RETCD
  20781.     Character*1 LINE(80)
  20782.     Real*8 ArgAry(BigSpc)
  20783.     INTEGER*4 IARGAR(2,BIGSPC)
  20784.     EQUIVALENCE(IARGAR(1,1),ARGARY(1))
  20785.     Integer*4 ArgCtr,IntPar
  20786.     Integer*4 ArgPtr(MaxArgs)
  20787.     Integer*4 NARGin(NFct)
  20788. c nargin is number input args needed.
  20789.     Integer*4 OutArg(MaxArgs,NFct)
  20790.     Integer*4 OutBgn(NFct)
  20791. c OutArg is 0 for no output, 1 for output area
  20792.     Integer*4 RevStr(MaxArgs,NFct)
  20793. c RevStr will be nonzero to reverse storage of arrays
  20794. c from normal row-first to column-first order.
  20795.     Integer*4 IsReal(MaxArgs,NFCT)
  20796. c
  20797. C Since there are some subs that need dummy argument scratch
  20798. c areas, encode IsReal as follows:
  20799. c  0 = Real
  20800. c  -1 = Integer
  20801. c  +nn = Use argument nn's VALUE (after grabbing it) for
  20802. c        size of area to allocate. Always allocate floats
  20803. c        since they're longer.
  20804. c
  20805. c Note: Due to the way the program allocates scratch array, the
  20806. c  arguments with size info for dummy arrays must be present
  20807. c  ahead of the scratch space arguments.
  20808. c
  20809. C Argument coordinate lists
  20810.     Integer*4 InCord(4,MaxArgs)
  20811. c    Integer*4 InType(MaxArgs)
  20812.     Integer*4 OutCor(4,MaxArgs)
  20813.     REAL*8 R8WRK
  20814.     INTEGER*4 I4WRK
  20815. c    Integer*4 OutTyp(MaxArgs)
  20816. c
  20817.     Character*6 WrkFnm
  20818.     Character*1 WFNm(6)
  20819.     Equivalence(WFNm(1),WrkFnm)
  20820. c    Integer*4 IniOut(NFCT)
  20821.     Integer*4 AryPtr
  20822.     Character*6 FName(NFCT)
  20823.     Character*1 FNameB(6,NFCT)
  20824.     Equivalence(Fname(1),FNameB(1,1))
  20825. c allows access of function names by byte, but data stmts to set up
  20826. c as full names...
  20827. c    This example has only 2 functions:
  20828. c  *U STDLLSQ   and
  20829. c  *U STCHISQ
  20830. c        from the Scientific Subroutine Package library...
  20831.     save fnameb,isreal,outbgn,outarg,nargin,revstr
  20832.     Data FnameB/
  20833.      1  'D','L','L','S','Q',0,
  20834.      2  'C','H','I','S','Q',0,
  20835.      3  'V','E','C','N','O','R' /
  20836.     DATA IsReal/
  20837.      1  0,0,-1,-1,-1,0,5,0,-1,0,
  20838.      2  0,-1,-1,0,-1,-1,2,3,0,0,
  20839.      3  0,-1,0,0,0,0,0,0,0,0  /
  20840.     DATA OutBgn/
  20841.      1  6,4,3 /
  20842.     DATA OutArg/
  20843.      1  0,0,0,0,0,1,0,0,1,1,
  20844.      2  0,0,0,1,1,1,0,0,0,0,
  20845.      3  0,0,1,0,0,0,0,0,0,0 /
  20846. c Note OutArg is just which output arguments are really
  20847. c output data. 1 means they are, 0 means they're not.
  20848. c
  20849. C NARGIN is min number input arguments that must be present.
  20850.     Data NARGin/10,8,3/
  20851.     Data RevStr/
  20852.      1  0,0,0,0,0,0,0,0,0,0,
  20853.      2  0,0,0,0,0,0,0,0,0,0,
  20854.      3  0,0,0,0,0,0,0,0,0,0/
  20855. C
  20856. C FIRST, before we spend a lot of effort grabbing arguments, make
  20857. c  sure we know about the function to be called. If we don't, just
  20858. c  return an error.
  20859.     KK=0
  20860.     DO 101 N=1,NFCT
  20861.     DO 110 NN=1,6
  20862.     IF(Ichar(FNAMEB(NN,N)).LE.0)GOTO 110
  20863.     IF(LINE(NN).NE.FNAMEB(NN,N)) GOTO 112
  20864. 110    CONTINUE
  20865. C WE FELL THRU AND FOUND THE NAME. SAVE ITS' INDEX.
  20866.     KK=N
  20867. 112    CONTINUE
  20868. 101    CONTINUE
  20869.     IF(KK.GT.0)GOTO 115
  20870. 114    RETCD=3
  20871.     RETURN
  20872. 115    CONTINUE
  20873.     NFUNCT=KK
  20874. c A little setup...
  20875.     ArgCtr=1
  20876.     IntPar=1
  20877. c integer "parity", used to pack integer args in work array
  20878.     Aryptr=1
  20879.     Do 1 n=1,MaxArgs
  20880.     Argptr(n)=1
  20881.     Do 11 nn=1,4
  20882.     InCord(nn,n)=0
  20883.     OutCor(nn,n)=0
  20884. 11    Continue
  20885. 1    CONTINUE
  20886.     DO 2 N=1,BigSpc
  20887.     ArgAry(N)=0.0D0
  20888. 2    Continue
  20889. C arrange for all uninitialized numbers to contain zeroes
  20890.     RETCD=1
  20891. C HANDLE *U STXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  20892. C STARTS AFTER THE "ST" SO WE CAN DECODE IT.
  20893. c if we can't get the function, return RETCD=3...
  20894. c
  20895. c Now grab the arguments and store them in InCord, Intype, OutCor, OutTyp
  20896.     K=INDXQ(LINE,32)
  20897. C FIND STUFF AFTER SPACE
  20898.     K=K+1
  20899.     NArg=1
  20900.     IBGN=1
  20901. 100    Continue
  20902.     LEND=IBGN+20
  20903. C GET LOC OF MATRIX A (MUST BE SQUARE)
  20904.     ID1B=0
  20905.     ID2B=0
  20906.     ID1A=0
  20907.     ID2A=0
  20908.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20909.     IF(IVALID.EQ.0)GOTO 300
  20910.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1000
  20911.     IBGN=LSTCHR+1
  20912.     LEND=IBGN+20
  20913.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20914.     IF(IVALID.EQ.0)GOTO 300
  20915. 1000    CONTINUE
  20916. C GMTX GETS ARGS FOR ONE RANGE
  20917.     InCord(1,NArg)=ID1A
  20918.     InCord(2,NArg)=ID2A
  20919.     INCord(3,NARG)=ID1B
  20920.     INCORD(4,NARG)=ID2B
  20921.     IBGN=LSTCHR+1
  20922.     NARG=NARG+1
  20923.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 100
  20924. C
  20925. 300    CONTINUE
  20926. C NOW HAVE ALL ARGS FOR INPUT COLLECTED
  20927.     INARGS=NARG
  20928.     If(INargs.lt.NARGin(NFunct)) GOTO 114
  20929. c Flag error if not enough input args presented.
  20930.     K=INDXQ(LINE,62)
  20931. C FIND STUFF AFTER > CHARACTER
  20932.     IF(K.EQ.0.OR.K.GT.70)GOTO 500
  20933. C MUST HAVE A > OR no outputs are present.
  20934. C This is perfectly legal; outputs like graphs or auxiliary
  20935. C files (unknown to rest of program) are possible too.
  20936.     K=K+1
  20937.     NArg=1
  20938.     IBGN=1
  20939. 400    Continue
  20940.     LEND=IBGN+20
  20941. C GET LOC OF MATRIX A (MUST BE SQUARE)
  20942.     ID1B=0
  20943.     ID2B=0
  20944.     ID1A=0
  20945.     ID2A=0
  20946. C TEST FOR NULL ARGUMENT (;; PAIR)
  20947.     IF(LINE(K+IBGN-1).EQ.';')GOTO 450
  20948.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  20949.     IF(IVALID.EQ.0)GOTO 500
  20950.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1500
  20951.     IBGN=LSTCHR+1
  20952.     LEND=IBGN+20
  20953.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  20954.     IF(IVALID.EQ.0)GOTO 500
  20955. 1500    CONTINUE
  20956.     IBGN=LSTCHR+1
  20957.     GOTO 455
  20958. 450    CONTINUE
  20959.     IBGN=IBGN+1
  20960.     LSTCHR=IBGN
  20961. C PASS ;
  20962. 455    CONTINUE
  20963. C GMTX GETS ARGS FOR ONE RANGE
  20964.     OUTCor(1,NArg)=ID1A
  20965.     OUTCor(2,NArg)=ID2A
  20966.     OUTCor(3,NARG)=ID1B
  20967.     OUTCor(4,NARG)=ID2B
  20968.     NARG=NARG+1
  20969.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 400
  20970. C    GOTO 500
  20971. C
  20972. 500    CONTINUE
  20973. C NOW HAVE OUTPUT ARGUMENT LIST COLLECTED
  20974. C BEGIN COLLECTING DATA
  20975.     NARG=1
  20976.     IntPar=1
  20977. 2000    CONTINUE
  20978.     IACNTR=ARGCTR
  20979. C  GET INPUT DATA INTO OUR BIG ARRAY
  20980.     IF(INCORD(1,NARG).LE.0)GOTO 3000
  20981.     ARGPTR(NARG)=ARGCTR
  20982.     IF(INCORD(3,NARG).NE.0)GOTO 2011
  20983. C SINGLE ARGUMENT; GRAB IT
  20984.     nn=incord(1,narg)
  20985.     mm=incord(2,narg)
  20986.     call typget(nn,mm,itype)
  20987.     If(Itype.ne.4) then
  20988.       CALL XVBLGT(NN,MM,R8WRK)
  20989.     Else
  20990.       Call JVBLGT(NN,MM,I4wrk)
  20991.       R8WRK=I4WRK
  20992.     End If
  20993. c    CALL XVBLGT(INCORD(1,NARG),INCORD(2,NARG),R8WRK)
  20994.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  20995.       INTPAR=1
  20996.       I4WRK=R8WRK
  20997.       IARGAR(IntPar,ARGCTR)=I4WRK
  20998.     ELSE
  20999.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21000.       IntPar=1
  21001. C if we last packed the second word of an integer, bump to next
  21002.       ARGARY(ARGCTR)=R8WRK
  21003.     END IF
  21004.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21005.     NARG=NARG+1
  21006.     GOTO 2000
  21007. 2011    CONTINUE
  21008. C 2-D AREA
  21009.     IntPar=1
  21010.     DO 2020 LNN=INCORD(1,NARG),INCORD(3,NARG)
  21011.     DO 2020 LMM=INCORD(2,NARG),INCORD(4,NARG)
  21012.     NN=LNN
  21013.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  21014.     MM=LMM
  21015.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  21016.     call typget(nn,mm,itype)
  21017.     If(Itype.ne.4) then
  21018.       CALL XVBLGT(NN,MM,R8WRK)
  21019.     Else
  21020.       Call JVBLGT(1,NN,MM,I4wrk)
  21021.       R8WRK=I4WRK
  21022.     End If
  21023.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  21024.       I4WRK=R8WRK
  21025.       IARGAR(IntPar,ARGCTR)=I4WRK
  21026.       IntPar=3-IntPar
  21027. c if IntPar is 1 make it 2; if it's 2, make it 1
  21028.     ELSE
  21029.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21030.       IntPar=1
  21031. C if we last packed the second word of an integer, bump to next
  21032.       ARGARY(ARGCTR)=R8WRK
  21033.     END IF
  21034.     If(IntPar.eq.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21035. 2020    CONTINUE
  21036.     NARG=NARG+1
  21037.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21038.     IntPar=1
  21039. C
  21040. C FIX UP DUMMY ARGUMENTS
  21041. C
  21042.     IF(ISREAL(NARG,NFUNCT).GT.0.AND.ISREAL(NARG,NFUNCT)
  21043.      1  .LE.MAXARGS) THEN
  21044. c If user allocated more space than the dummy calc, use bigger
  21045. c allocation. However, add a little more and check for array
  21046. c overflow.
  21047.       ARGCTR=MAX0(ARGCTR,IACNTR+IARGAR(1,ISREAL(NARG,NFUNCT)))
  21048.       ARGCTR=ARGCTR+30
  21049.       ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21050. C ADD A LITTLE FOR GOOD LUCK
  21051.     END IF
  21052.     GOTO 2000
  21053. 3000    CONTINUE
  21054. C NOW SHOULD BE READY TO CALL THIS STUFF...
  21055. C GENERATE CALLS LIKE THE TEMPLATES BELOW. NO NEED TO MODIFY
  21056. C THE FUNCTIONS, BUT WE DO NEED TO MESS WITH THIS STUFF BECAUSE
  21057. C I DON'T KNOW OFFHAND HOW TO DO A DYNAMIC CALLING LIST IN FORTRAN
  21058. C THAT'LL WORK ON STACK IMPLEMENTATIONS.
  21059. c
  21060. c Add more numbers to the list here to get more function calls.
  21061. c
  21062.     GOTO (4001,4002,4003),NFUNCT
  21063.     RETCD=3
  21064.     RETURN
  21065. c *************** BEGINNING OF CALLS ****************
  21066. 4001    CONTINUE
  21067. C DLLSQ FUNCTION.... 10 ARGS
  21068.     CALL DLLSQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  21069.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  21070.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)),
  21071.      3  ARGARY(ARGPTR(9)),ARGARY(ARGPTR(10)))
  21072.     GOTO 5000
  21073. 4002    CONTINUE
  21074. C CHISQ FUNCTION.... 8 ARGS
  21075.     CALL CHISQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  21076.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  21077.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)))
  21078.     GOTO 5000
  21079. 4003    CONTINUE
  21080. C Vector Norm function
  21081.     CALL VECNOR(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  21082.      1  ARGARY(ARGPTR(3)))
  21083. C Use this for debugging too...
  21084. c
  21085. c insert more function calls here... they all look alike except for
  21086. c function name.
  21087. c
  21088. c  It's also completely permissible to call several Fortran subroutines
  21089. c  in sequence here if it makes sense; it's up to the user. This code
  21090. c  just gives a way to call unmodified Fortran callable code and have
  21091. c  it make sense in the AnalytiCalc context. ANY Fortran callable code
  21092. c  is OK.
  21093. c
  21094. c *****************end of calls *****************
  21095. c
  21096. 5000    CONTINUE
  21097. C NOW GET ARGUMENTS BACK TO DUMP TO SHEET
  21098.     KARG=0
  21099.     DO 5100 NARG=OUTBGN(NFUNCT),MAXARGS
  21100.     KARG=KARG+1
  21101.     IF(OUTARG(NARG,NFUNCT).LE.0)GOTO 5100
  21102.     IF(OUTCOR(1,KARG).EQ.0)GOTO 5100
  21103. C +++
  21104.     ARGCTR=ARGPTR(NARG)
  21105.     IF(OUTCOR(3,KARG).NE.0)GOTO 6014
  21106. C SINGLE ARGUMENT; GRAB IT
  21107.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  21108.       I4WRK=IARGAR(1,ARGCTR)
  21109.       R8WRK=I4WRK
  21110.     ELSE
  21111.       R8WRK=ARGARY(ARGCTR)
  21112.     END IF
  21113.     nn=outcor(1,karg)
  21114.     mm=outcor(2,karg)
  21115.     Call typget(nn,mm,itype)
  21116.     If (Itype.ne.4) then
  21117.       CALL XVBLST(NN,MM,R8WRK)
  21118.     Else
  21119.       I4WRK=R8WRK
  21120.       CALL JVBLST(1,nn,mm,I4WRK)
  21121.     End If
  21122.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21123.     GOTO 5100
  21124. 6014    CONTINUE
  21125. C 2-D AREA
  21126.     DO 6020 LNN=OUTCOR(1,KARG),OUTCOR(3,KARG)
  21127.     DO 6020 LMM=OUTCOR(2,KARG),OUTCOR(4,KARG)
  21128.     NN=LNN
  21129.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  21130.     MM=LMM
  21131.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  21132.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  21133.       I4WRK=IARGAR(1,ARGCTR)
  21134.       R8WRK=I4WRK
  21135.     ELSE
  21136.       R8WRK=ARGARY(ARGCTR)
  21137.     END IF
  21138.     Call typget(nn,mm,itype)
  21139.     If (Itype.ne.4) then
  21140.       CALL XVBLST(NN,MM,R8WRK)
  21141.     Else
  21142.       I4WRK=R8WRK
  21143.       CALL JVBLST(1,nn,mm,I4WRK)
  21144.     End If
  21145. c    CALL XVBLST(NN,MM,R8WRK)
  21146.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  21147. 6020    CONTINUE
  21148. C +++
  21149. 5100    CONTINUE
  21150. C AT LAST, DONE
  21151.     RETURN
  21152.     END
  21153.     Subroutine VecNor(InRng,NVEC,Val)
  21154. C test subroutine
  21155. c Computes norm of input range, where NVEC is number of
  21156. c elements in the INRNG array.
  21157.     REAL*8 InRng
  21158.     Dimension InRng(1)
  21159.     Integer*4 NVEC
  21160.     Real*8 Val,X
  21161. C    VAL=0.0d0
  21162.     If(NVEC.LE.0)val=-1.0
  21163.     If(NVEC.LE.0)return
  21164. c return -1 if bad dimensions.
  21165.     X=0.0D0
  21166.     Do 1 n=1,nvec
  21167.     x=x+InRng(n)*InRng(n)
  21168. 1    Continue
  21169.     x=dsqrt(x)
  21170.     Val=X
  21171.     Return
  21172.     End
  21173. c -h- JunkDum.for
  21174. c completely dummy versions of dllsq and chisq
  21175. C REMOVE these if you want to use the real ones (from
  21176. c the SSP library)
  21177.     Subroutine DLLSQ(A,B,C,D,E,F,G,H,I,J)
  21178.     RETURN
  21179.     END
  21180.     SUBROUTINE CHISQ(A,B,C,D,E,F,G,H)
  21181.     RETURN
  21182.     END
  21183. c -h- uvtgen.for    Fri Aug 22 13:36:30 1986    
  21184. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  21185. C ALL RIGHTS RESERVED
  21186. C
  21187. C    VT100 VIDEO DISPLAY COMMAND PROGRAM. CALLING SEQUENCE IS
  21188. C    CALL UVT100(CMD,N1,N2THE MANDS IN
  21189. C    THE PARAMETER LIST BELOW, AND N1 AND N2 ARE OPTIONAL PARAMETERS
  21190. C    DEPENDING UPON CMD. SEE THE UVT100 USER'S MANUAL FOR MORE DETAILS.
  21191. C
  21192. C
  21193. C BLACK AND WHITE SCREEN MODULE FOR ANSI TERMINALS
  21194. C ALSO COLOR SCREEN MODULE.
  21195. C COMMANDS 20 AND 21 SWITCH: 20 SETS B+W, 21 SETS COLOR MODE
  21196. C
  21197. C THIS VERSION MODIFIED FOR USE WITH AnalytiCalc.
  21198. C  ENTRIES NOT USED ARE DELETED, AND ALSO CODE ADDED TO SUPPORT COLOR
  21199. C  CRT'S THAT ARE BASICALLY VT100-LIKE WITH EXTENSIONS, OR VT100'S OR
  21200. C  EMULATORS WITH AVO OPTION.
  21201. C
  21202. C  OPERATION:
  21203. C    ON B+W VT100'S (WITH ADVANCED VIDEO), THE SET GRAPHICS CODES
  21204. C WILL BE USED AS FOLLOWS:
  21205. C  ALTERNATE ROWS WILL BE DISPLAYED IN BOLD
  21206. C  (ROW 3 TO 22 ONLY HOWEVER; THE REST IS NOT MATH AREA)
  21207. C COMMAND AND DISPLAY ROWS (23 AND 24 NORMALLY) WILL BE BOLDED ALWAYS.
  21208. C
  21209. C  IN COLOR MODE:
  21210. C    ON ED, SET BACKGROUND COLOR TO DARK BLUE
  21211. C    ALTERNATE ROWS WILL BE SET TO YELLOW OR GREEN
  21212. C  COLUMN LABEL ROW, LABEL ROW, AND ROW LABELS, AND COMMAND PROMPTS,
  21213. C  IN A DIFFERENT COLOR FOR EACH. DETERMINED AND SET AT TIME OF
  21214. C  CALL TO CURSOR POSITION.
  21215. C
  21216. C    AUTHOR:    GLENN EVERHART
  21217. C
  21218.       SUBROUTINE UVT100 ( CMD, N1, N2 )
  21219.       IMPLICIT INTEGER ( A - Z )
  21220. c    Include aparms.inc
  21221. c      DIMENSION PRL ( 6 )
  21222. C NOTE WE DECLARE THESE VARIABLES USED IN PORTACALC. THEY ARE ALL IN
  21223. C COMMONS, SO WE ADD NOTHING TO LENGTH OF THIS PROGRAM BY ADDING THEM.
  21224.     CHARACTER*1 FVLD
  21225. cc    external cmove,cattron,cread !$pragma C(cmove,cattron,cread)
  21226. cc    external ccleareol,cclear,crefresh !$pragma C(ccleareol,cclear,crefresh)
  21227. cc    external cattroff,cclose,copen !$pragma C(cattroff,cclose,copen)
  21228. cc    external cwrite !$pragma C(cwrite)
  21229.     DIMENSION FVLD(1,1)
  21230.     COMMON /FVLDC/FVLD
  21231. C ***<<<< RDD COMMON START >>>***
  21232.     InTeGer*4 RRWACT,RCLACT
  21233. C    COMMON/RCLACT/RRWACT,RCLACT
  21234.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  21235.      1  IDOL7,IDOL8
  21236. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  21237. C     1  IDOL7,IDOL8
  21238.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  21239. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  21240.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21241. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21242. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21243. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  21244.     InTeGer*4 KLVL
  21245. C    COMMON/KLVL/KLVL
  21246.     InTeGer*4 IOLVL,IGOLD
  21247. C    COMMON/IOLVL/IOLVL
  21248. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  21249. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  21250.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21251.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21252.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  21253.      3  k3dfg,kcdelt,krdelt,kpag
  21254. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21255. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21256. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  21257. C ***<<< RDD COMMON END >>>***
  21258. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  21259. CCC    InTeGer*4 LLCMD,LLDSP
  21260. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  21261.     InTeGer*4 TYPE(1,2),VLEN(9)
  21262.     REAL*8 XVBLS(1,1)
  21263.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  21264.     Real*8 VAVBLS(3,27)
  21265.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  21266.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  21267.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  21268. C ICPOS COMMON HAS PHYS COORDS BEING DISPLAYED. MUST QUERY FVLD TO
  21269. C SEE WHETHER TO INTENSIFY THE FIELD FOR NEGATIVE...
  21270. C ***<<< XVXTCD COMMON START >>>***
  21271.     CHARACTER*1 OARRY(100)
  21272.     InTeGer*4 OSWIT,OCNTR
  21273. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  21274. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  21275.     InTeGer*4 IC1POS,IC2POS,MODFLG
  21276. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  21277.        InTeGer*4 XTCFG,IPSET,XTNCNT
  21278.        CHARACTER*1 XTNCMD(80)
  21279. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  21280. C VARY FLAG ITERATION COUNT
  21281.     INTEGER KALKIT
  21282. C    COMMON/VARYIT/KALKIT
  21283.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  21284.     InTeGer*4 RCMODE,IRCE1,IRCE2
  21285. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  21286. C     1  IRCE2
  21287. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  21288. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  21289. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  21290. C RCFGX ON.
  21291. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  21292. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  21293. C  AND VM INHIBITS. (SETS TO 1).
  21294.     INTEGER*4 FH
  21295. C FILE HANDLE FOR CONSOLE I/O (RAW)
  21296. C    COMMON/CONSFH/FH
  21297.     CHARACTER*1 ARGSTR(52,4)
  21298. C    COMMON/ARGSTR/ARGSTR
  21299.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  21300.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  21301.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  21302.      3  IRCE2,FH,ARGSTR
  21303. C ***<<< XVXTCD COMMON END >>>***
  21304. CCC    InTeGer*4 IC1POS,IC2POS,MODFLG
  21305. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  21306. C CONTROLS TO SET VARIOUS VISUAL ATTRIBUTES
  21307. C NORMAL, BOLD
  21308. cc    Integer*4 lasty,lastx
  21309. cc    common/lasts/lasty,lastx
  21310.     InTeGer*4 N222
  21311. c    CHARACTER*1 CLSV(8)
  21312. c        CHARACTER*1 ULIT(8)
  21313. c    CHARACTER*1 NORMIT(4)
  21314.     CHARACTER*1 OUTBUF(16)
  21315. C    CHARACTER*1 NORMIT(4),BOLDIT(8),OUTBUF(16),BOLDUL(10)
  21316.     CHARACTER*2 OBF3
  21317.     CHARACTER*3 OBF6
  21318.     EQUIVALENCE (OBF3,OUTBUF(3)),(OBF6,OUTBUF(6))
  21319.     InTeGer*4 COLSW
  21320. C COLOR SCHEME CODED DATA ABOVE...
  21321.     save n222,colsw
  21322.     DATA N222/0/
  21323.     DATA COLSW/0/
  21324. C LEAVE IN THE BOLDING FOR NEGATIVE NUMBERS
  21325. c    DATA NORMIT/'','[','0','m'/
  21326. c fill in initial escape character (27 decimal)
  21327. c for the unix version, we will assume that FH is a pointer to
  21328. c a window data structure set up in the C language routines that`
  21329. c do actual curses() handling. However, routine UVT100 will know
  21330. c some more curses since it handles text attributes and cursor
  21331. c positioning and the like.
  21332.       OUTBUF ( 1 ) = Char(27)
  21333.       DO 20000  I = 2, 16
  21334. c fill in spaces in out buffer (32 decimal = ascii space)
  21335.       OUTBUF ( I ) = Char(32)
  21336. 20000 CONTINUE
  21337. 20001 CONTINUE
  21338. C CMD 20 TURNS COLOR ON, 21 TURNS IT OFF.
  21339.       IF ( CMD .NE. 1) GOTO 20002
  21340. C CURSOR POSITION.
  21341. C SHIP OUT APPROPRIATE CHARACTERISTICS.
  21342.  
  21343. 7701    CONTINUE
  21344. 1754    CONTINUE
  21345. 1500    CONTINUE
  21346. 7711    CONTINUE
  21347.       OUTBUF ( 2 ) = '['
  21348.       IF (.NOT.( N1 .GT. 0 . AND . N1 .LE. (LLDSP+1) )) GOTO 20004
  21349. c Move the cursor to row N1 and column N2. Forget about column max
  21350. c checks; we might have a HUGE window.
  21351. ccc    lasty=n1-1
  21352. ccc    lastx=n2-1
  21353. c n1,n2 start as based at 1,1. unix uses zero based numbers so
  21354. c adjust here.
  21355. ccc       call cmove(FH,lasty,lastx)
  21356.        WRITE(OBF3(1:2),10,ERR=20004)N1
  21357. C      ENCODE ( 2, 10, OUTBUF ( 3 ) ) N1
  21358. 20004 CONTINUE
  21359.       OUTBUF ( 5 ) = ';'
  21360. C ALLOW WIDE DISPLAYS FOR MACHINES LIKE THE RAINBOW...
  21361. C NOTE: USES MSDOS FORTRAN V3.2 FEATURE OF  I3.3 FORMAT...
  21362.       IF (.NOT.( N2 .GT. 0 . AND . N2 .LT. 233)) GOTO 20006
  21363.        WRITE(OBF6(1:3),105,ERR=20006)N2
  21364. C      ENCODE ( 3, 105, OUTBUF ( 6 ) ) N2
  21365. C FIX THE ABOVE FOR 132 COLUMN MAX ON RAINBOW. NO NEED TO LIMIT TO 80 COLS ON
  21366. C MACHINES THAT CAN HANDLE 132 OR MORE, BUT IBM MAY GOOF UP UNLESS LIMIT IS
  21367. C IN EFFECT. (LOSE LOSE)
  21368.     IF(OUTBUF(4).EQ.' ')OUTBUF(4)='0'
  21369.     IF(OUTBUF(7).EQ.' ')OUTBUF(7)='0'
  21370.     IF(OUTBUF(3).EQ.' ')OUTBUF(3)='0'
  21371.     IF(OUTBUF(6).EQ.' ')OUTBUF(6)='0'
  21372. 20006 CONTINUE
  21373.       OUTBUF ( 9 ) = 'H'
  21374.       LEN = 9
  21375.       GOTO 20003
  21376. 20002 CONTINUE
  21377.       IF ( CMD .NE. 11 ) GOTO 20036
  21378. C ERASE DISPLAY
  21379. C ALWSAYS ERASE WHOLE DISPLAY HERE.
  21380.     OUTBUF(1)=27
  21381.     call swrt(outbuf,1)
  21382.     call swrt('[0;0H',5)
  21383.     call swrt(outbuf,1)
  21384.     call swrt('[2J',3)
  21385. ccc    call cclear(FH)
  21386.     RETURN
  21387. 20036 CONTINUE
  21388.       IF ( CMD .NE. 12 ) GOTO 20042
  21389. C ERASE LINE
  21390. C EITHER ERASE WHOLE LINE BY DOING CR FIRST, OR JUST END OF LINE
  21391. C IF HE USED CODE 2.
  21392. C CAN'T HANDLE ERASING START ONLY, BUT ANALYTICALC NEVER TRIES THIS.
  21393. C DO C.R. FIRST IF CALLED FOR
  21394. 22001    CONTINUE
  21395.     if(n1.EQ.2)goto 20044
  21396. cc just emit line
  21397.     outbuf(2)='['
  21398.     outbuf(3)='K'
  21399.     len=3
  21400. ccc    call ccleareol(FH)
  21401.     goto 20003
  21402. C ERASE ALL BY RETURN, ERASE SEQ
  21403. 20044    continue
  21404. c use lasty saved from any prior positioning call to position to correct row
  21405. ccc    call cmove(FH,lasty,0)
  21406. ccc    call ccleareol(FH)
  21407.     outbuf(1)=char(13)
  21408.     outbuf(2)=char(27)
  21409.     outbuf(3)='['
  21410.     outbuf(4)='K'
  21411.       LEN = 4
  21412.       GOTO 20003
  21413. 20042 CONTINUE
  21414.       IF ( CMD .NE. 13 ) GOTO 20048
  21415. C SET GRAPHICS RENDITION (7=REVERSE VIDEO, 0=NORMAL,4=UNDERSCORE,1=BOLD
  21416. C  5=BLINK) (PORTACALC CALLS WITH 0 OR 7 (VT100 W/O AVO))
  21417. C    IF(MODFLG.NE.1)GOTO 22002
  21418. 22002    CONTINUE
  21419.     OUTBUF(1)=27
  21420.     call swrt(outbuf,1)
  21421. c Set either reverse or normal video
  21422. ccc    IF(N1.EQ.7)CALL cattron(fh)
  21423. ccc    if(n1.ne.7)call cattroff(fh)
  21424. cccc always these use A_STANDOUT attribute or A_REVERSE to highlight.
  21425.     IF(N1.EQ.7)CALL SWRT('[7m',3)
  21426.     if(n1.ne.7)call swrt('[0m',3)
  21427.     return
  21428. 20048 CONTINUE
  21429. c      IF (.NOT.( CMD .EQ. 15 )) GOTO 20054
  21430. C SCS. IGNORE THIS ... NEVER REALLY USED.
  21431.     RETURN
  21432. 20003 CONTINUE
  21433. 20073 CONTINUE
  21434. C USE A FORTRAN WRITE SO THIS WILL WORK ON VAX OR PDP11 (OR WHATEVER...)
  21435. C  UNIT 6 MUST BE THE TERMINAL...
  21436. c After each operation, refresh the screen
  21437. ccc    call crefresh(FH)
  21438.     CALL SWRT(OUTBUF,LEN)
  21439. 10    FORMAT ( I2 )
  21440. 105    FORMAT(I3.3)
  21441.       RETURN
  21442.       END
  21443. c -h- varout.for    Fri Aug 22 13:37:17 1986    
  21444.     SUBROUTINE VAROUT (INDXX,IX2)
  21445. C COPYRIGHT (C) 1983 GLENN EVERHART
  21446. C ALL RIGHTS RESERVED
  21447. C 60=MAX REAL ROWS
  21448. C 301=MAX REAL COLS
  21449. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  21450. C VBLS AND TYPE DIMENSIONED 60,301
  21451. C
  21452. C **************************************************
  21453. C *                                                *
  21454. C *       SUBROUTINE   VAROUT                      *
  21455. C *                                                *
  21456. C **************************************************
  21457. C
  21458. C
  21459. C
  21460. C  OUTPUTS THE VALUE OF THE VARIABLE POINTED TO BY INDXX.
  21461. c modified version - multiple precision calls diked out - gce
  21462. C
  21463. C  ASCII     A1 FORMAT UNLESS THE ASCII VALUE IS LESS THAN 32.
  21464. C            IN SUCH CASES, 32 IS ADDED TO THE VALUE AND THE
  21465. C            CHARACTER IS OUTPUT  SO THAT IT IS PRECEDED BY THE
  21466. C            CHARACTER '^'.
  21467. C
  21468. C  DECIMAL   A COMPUTED F FORMAT.
  21469. C
  21470. C  HEXADECIMAL  LEADING ZEROES, "BASE 16" QUE.
  21471. C
  21472. C  INTEGER   I12 FORMAT
  21473. C
  21474. C  OCTAL     LEADING ZEROES, "BASE 8" QUE
  21475. C
  21476. C  REAL      D25.18 FORMAT
  21477. C
  21478. C
  21479. C  VAROUT CALLS
  21480. C
  21481. C ERRMSG   PRINTS OUT ERROR MESSAGES
  21482. C MOUT     OUTPUTS MULTIPLE PRECISION NUMBERS
  21483. C
  21484. C
  21485. C
  21486. C
  21487. C
  21488. C VAROUT IS CALLED BY CALC AND POSTVL
  21489. C
  21490. C
  21491. C
  21492. C  VARIABLE   USE
  21493. C
  21494. C  DEC        HOLDS NUMBER OF DIGITS TO THE RIGHT OF THE
  21495. C             DECIMAL POINT IN F FORMAT SPECIFICATION.
  21496. C  DFORM(11)  HOLDS FORMAT SPECIFICATION FOR F FORMAT
  21497. C             (OUTPUTTING VALUE OF VARIABLES WITH DECIMAL DATA TYPE).
  21498. C  DIGITS     HOLDS THE ASCII CHARACTERS FOR VARIOUS DIGITS.
  21499. C  EIGHT(8)   USED TO PICK OFF REAL*8 'S FROM VBLS.
  21500. C             ALSO HOLDS HEXADECIMAL DIGITS IF # IS DATA TYPE HEX.
  21501. C  FOUR(4)    USED TO PICK OFF INTEGER*4'S FROM VBLS.
  21502. C  I,K        HOLDS TEMPORARY VALUES.
  21503. C  I1         HOLDS THE FIRST DIGIT IN CREATING AN F FORMAT SPECIFICATION.
  21504. C  I2         HOLDS THE SECOND DIGIT IN CREATING AN F FORMAT SPEC.
  21505. C  INDXX      POINTS TO VARIABLE BEING OUTPUT.
  21506. C  IPT        POINTER FOR DFORM.
  21507. C  ISV        POINTER FOR VECTOR SIGN(2).
  21508. C  ITWO       TWO IS USED TO PICK OFF A BYTE OF THE INTEGER
  21509. C  TWO(2)     REPRESENTATION. THEN ITWO IS USED AS
  21510. C             THE VALUE. THIS IS DONE BECAUSE OTHERWISE
  21511. C             SOME COMPILERS WOULD FORCE A SIGN EXTEND.
  21512. C  L          TEMPORARY VALUES. POINTER FOR EIGHT(8).
  21513. C  LEVIN(11)  HOLDS PRINTABLE ASCII CHARACTERS WHICH REPRESENT
  21514. C             AN OCTAL NUMBER. EQUIVALENCED WITH EIGHT(8).
  21515. C  M1         HOLDS HIGH ORDER HEXADECIMAL DIGIT.
  21516. C  M2         HOLDS LOW ORDER HEXADECIMAL DIGIT.
  21517. C  MAG        HOLDS THE MAGNITUDE OF A REAL*8 NUMBER
  21518. C  P10        REAL*8 THAT HOLDS POWERS OF 10. (DECIMAL)
  21519. C  RETCD      HOLDS RETURN CODE FROM CALL TO MOUT.
  21520. C  RPAR       ')'
  21521. C  SIGN(2)    HOLDS PRINTABLE ASCII CHARACTERS FOR OUTPUTTING THE
  21522. C             SIGN OF A NUMBER.
  21523. C  STAR1      HOLDS A SINGLE CHARACTER.
  21524. C  VBLS(100,27)  HOLDS VALUE FOR EACH VARIABLE.
  21525. C  WIDTH      WIDTH SPECIFICATION FOR F FORMAT.
  21526. C
  21527. C
  21528. C
  21529. C    SUBROUTINE VAROUT (INDXX,IX2)
  21530. C
  21531. C NOTE THAT VAROUT IS USED TO DUMP ONLY VALUES FROM AVBLS, NOT
  21532. C VBLS (IX2=1 ALWAYS AT CALLS). THUS DON'T BOTHER TO PICK UP
  21533. C ANY FURTHER INFO FROM VBLS HERE.
  21534.     REAL*8 REAL,MAG,P10
  21535. C
  21536.     INTEGER*4 INT,L,K
  21537. C
  21538.     InTeGer*4 ITWO,INDXX
  21539.     InTeGer*4 TYPE(1,2),WIDTH,DEC,VLEN(9)
  21540. C
  21541.     CHARACTER*1 AVBLS(24,27),STAR1,EIGHT(8),FOUR(4)
  21542.     Real*8 VAVBLS(3,27)
  21543.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  21544.     CHARACTER*1 VBLS(8,1,1)
  21545.     CHARACTER*1 TWO(2)
  21546.     CHARACTER*1 DFORM(11),DIGITS(16,3),LEVIN(11)
  21547.     CHARACTER*11 DFORM1
  21548.     EQUIVALENCE(DFORM1(1:1),DFORM(1))
  21549.     CHARACTER*1 SIGN(2)
  21550.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  21551. C ***<<< XVXTCD COMMON START >>>***
  21552.     CHARACTER*1 OARRY(100)
  21553.     InTeGer*4 OSWIT,OCNTR
  21554. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  21555. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  21556.     InTeGer*4 IPS1,IPS2,MODFLG
  21557. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  21558.        InTeGer*4 XTCFG,IPSET,XTNCNT
  21559.        CHARACTER*1 XTNCMD(80)
  21560. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  21561. C VARY FLAG ITERATION COUNT
  21562.     INTEGER KALKIT
  21563. C    COMMON/VARYIT/KALKIT
  21564.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  21565.     InTeGer*4 RCMODE,IRCE1,IRCE2
  21566. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  21567. C     1  IRCE2
  21568. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  21569. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  21570. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  21571. C RCFGX ON.
  21572. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  21573. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  21574. C  AND VM INHIBITS. (SETS TO 1).
  21575.     INTEGER*4 FH
  21576. C FILE HANDLE FOR CONSOLE I/O (RAW)
  21577. C    COMMON/CONSFH/FH
  21578.     CHARACTER*1 ARGSTR(52,4)
  21579. C    COMMON/ARGSTR/ARGSTR
  21580.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  21581.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  21582.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  21583.      3  IRCE2,FH,ARGSTR
  21584. C ***<<< XVXTCD COMMON END >>>***
  21585. CCC    InTeGer*4 OSWIT,OCNTR
  21586. C NOTE: OSWIT NONZERO MEANS OUTPUT TO OARRY.
  21587. C OSWIT=2 MEANS NO ZEROING OF OARRY; NOTHING MUCH COMES OUT.
  21588. CCC    CHARACTER*1 OARRY(100)
  21589. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  21590. C
  21591.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  21592.     COMMON /DIGV/ DIGITS
  21593.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  21594.     Character*127 cwrk
  21595.     Character*2 crlf
  21596. C
  21597.     EQUIVALENCE (TWO,ITWO)
  21598.     EQUIVALENCE (REAL,EIGHT),(INT,FOUR),(EIGHT,LEVIN)
  21599. C
  21600.     save sign,dform,itwo
  21601.     DATA SIGN/' ','-'/
  21602.     DATA DFORM /'(', '1', 'X', ',', 'F', ' ', ' ', '.', ' ', ' ',
  21603.      ;  ')'/
  21604.     DATA ITWO/0/
  21605. C
  21606. C
  21607. C
  21608.     crlf=char(13)//char(10)
  21609.     CALL TYPGET(INDXX,IX2,K)
  21610. C    K=TYPE(INDXX,IX2)
  21611.     IF (K.GT.0) GOTO 10
  21612. C MODIFY TO ELIMINATE CALL TO ERRMSG HERE. JUST COMPLAIN LOCALLY.
  21613.     CALL SWRT('Invalid type argument',21)
  21614.     oarry(1)=char(13)
  21615.     oarry(2)=char(10)
  21616.     call swrt(oarry,2)
  21617. C    CALL ERRMSG (16)
  21618.     GOTO 10000
  21619. 10    GOTO (100,200,300,400,500,600,700,800,900),K
  21620.     STOP 10
  21621. C
  21622. C
  21623. C
  21624. C
  21625. C **************************************************
  21626. C **************        ASCII        ***************
  21627. C **************************************************
  21628. 100    STAR1=AVBLS(1,INDXX)
  21629.     IF(OSWIT.NE.0)GOTO 6006
  21630.     IF (ICHAR(STAR1).LT.32) GOTO 110
  21631. 102    Continue
  21632. c    Rewind 11
  21633.     call vwrt(star1,1)
  21634. c    WRITE (11,103) STAR1
  21635. c    Rewind 11
  21636. 103    FORMAT (1X,A1)
  21637.     RETURN
  21638. 110    STAR1=CHAR(ICHAR(STAR1)+32)
  21639. c    Rewind 11
  21640.     Call vwrt('^' // star1,2)
  21641. c    WRITE (11,112) STAR1
  21642. c    Rewind 11
  21643. 112    FORMAT (1X,'^',A1)
  21644.     RETURN
  21645. 6006    OARRY(1)=STAR1
  21646.     OCNTR=1
  21647.     RETURN
  21648. C
  21649. C
  21650. C
  21651. C
  21652. C
  21653. C **************************************************
  21654. C ****************  DECIMAL   **********************
  21655. C **************************************************
  21656. 200    CONTINUE
  21657. c    DO 208 I=1,8
  21658. c208    EIGHT(I)=AVBLS(I,INDXX)
  21659.     Real=vavbls(1,indxx)
  21660.     MAG=DABS(REAL)
  21661.     IF (MAG.LT.1.D0) GOTO 240
  21662. C
  21663. C
  21664. C COUNT THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  21665.     P10=1.D0
  21666.     DO 210 I=1,38
  21667.     P10=10.D0*P10
  21668.     IF (P10.GT.MAG) GOTO 212
  21669. 210    CONTINUE
  21670. C
  21671. C I COUNTS THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  21672.     I=39
  21673. 212    DEC=0
  21674.     WIDTH=17
  21675.     IF(I.GT.15)WIDTH=I+2
  21676.     IF(I.LE.15)DEC=15-I
  21677. C
  21678. C
  21679. C  CREATE PROPER FORMAT STATEMENT
  21680. 215    I1=WIDTH/10
  21681.     I2=WIDTH-I1*10
  21682.     IF (I2.EQ.0) I2=10
  21683.     DFORM(6)=DIGITS(I1,1)
  21684.     DFORM(7)=DIGITS(I2,1)
  21685.     I1=DEC/10
  21686.     I2=DEC-I1*10
  21687.     IF (I1.EQ.0) I1=10
  21688.     IF (I2.EQ.0) I2=10
  21689.     IPT=9
  21690.     IF (I1.EQ.0) GOTO 220
  21691.     DFORM(9)=DIGITS(I1,1)
  21692.     IPT=IPT+1
  21693. 220    DFORM(IPT)=DIGITS(I2,1)
  21694.     DFORM(IPT+1)=RPAR
  21695.     nnn=ipt+2
  21696.     if(nnn.ge.11)goto 223
  21697.     do 224 nnnn=nnn,11
  21698. 224    dform(nnnn)=' '
  21699. 223    continue
  21700. C
  21701. C
  21702. C
  21703. C
  21704. C  OUTPUT REAL USING NEWLY CREATED
  21705. C  FORMAT STATEMENT HELD BY DFORM
  21706.     IF(OSWIT.NE.0)GOTO 6009
  21707. c    Rewind 11
  21708.     write(cwrk,dform,err=10000)real
  21709.     call vwrt(crlf,2)
  21710.     call vwrt(cwrk,len(cwrk))
  21711. c    WRITE (11,DFORM,ERR=10000) REAL
  21712. c    Rewind 11
  21713.     GOTO 10000
  21714. 6009    CONTINUE
  21715.     IF(OSWIT.EQ.2) GOTO 6101
  21716.     IF(OSWIT.GT.3)GOTO 7101
  21717.     DO 6010 OCNTR=1,106
  21718. 6010    OARRY(OCNTR)=char(0)
  21719. 6101    CONTINUE
  21720. C FORGET THE ENCODE ... NEVER USED
  21721. C6101    ENCODE(100,DFORM,OARRY)REAL
  21722. 7101    OCNTR=100
  21723.     GOTO 10000
  21724. C
  21725. C
  21726. C  REAL LESS THAN 1.D0
  21727. 240    P10=1.D0
  21728.     DO 245 I=1,38
  21729.     P10=P10*.1D0
  21730.     IF (MAG.GE.P10) GOTO 250
  21731. 245    CONTINUE
  21732.     I=0
  21733. C
  21734. C I-1 REPRESENTS THE NUMBER OF LEADING ZEROS
  21735. 250    DEC=14+I
  21736.     WIDTH=DEC+3
  21737.     GOTO 215
  21738. C
  21739. C
  21740. C **************************************************
  21741. C *************  HEXADECIMAL  **********************
  21742. C **************************************************
  21743. C  HEXADECIMAL
  21744. 300    CONTINUE
  21745.     DO 302 I=1,4
  21746. 302    FOUR(I)=AVBLS(I,INDXX)
  21747.     ISV=1
  21748.     IF (INT.LT.0) ISV=2
  21749.     INT=IABS(INT)
  21750.     L=8
  21751.     DO 304 I=1,4
  21752. C PICK UP A VALUE, THEN USE InTeGer*4 EQUIVALENT
  21753. C TO WORK WITH SO SIGN DOESN'T GET EXTENED.
  21754.     TWO(1)=(FOUR(I))
  21755.     M1=ITWO/16
  21756.     M2=ITWO-M1*16
  21757.     IF(M1.EQ.0)M1=16
  21758.     IF(M2.EQ.0)M2=16
  21759.     EIGHT(L)=DIGITS(M2,3)
  21760.     L=L-1
  21761.     EIGHT(L)=DIGITS(M1,3)
  21762.     L=L-1
  21763. 304    CONTINUE
  21764.     IF(OSWIT.NE.0)GOTO 6011
  21765. c    Rewind 11
  21766.     write(cwrk,310,err=10000)sign(isv),eight
  21767.     call vwrt(crlf,2)
  21768.     Call vwrt(cwrk,len(cwrk))
  21769. c    WRITE (11,310,ERR=10000) SIGN(ISV), EIGHT
  21770. c    Rewind 11
  21771. 310    FORMAT (1X,1A1,8A1,2X,'(BASE 16)')
  21772.     GOTO 10000
  21773. 6011    CONTINUE
  21774.     IF(OSWIT.EQ.2)GOTO 6102
  21775.     IF(OSWIT.GT.3)GOTO 7102
  21776.     DO 6013 OCNTR=1,106
  21777. 6013    OARRY(OCNTR)=char(0)
  21778. 6102    CONTINUE
  21779. C FORGET UNUSED ENCODE
  21780. C6102    ENCODE(8,6012,OARRY)SIGN(ISV),EIGHT
  21781. 6012    FORMAT(A1,8A1)
  21782. 7102    OCNTR=9
  21783.     GOTO 10000
  21784. C
  21785. C
  21786. C **************************************************
  21787. C ***************   INTEGER   **********************
  21788. C **************************************************
  21789. 400    DO 404 I=1,4
  21790. 404    FOUR(I)=AVBLS(I,INDXX)
  21791.     IF(OSWIT.NE.0)GOTO 6014
  21792. c    Rewind 11
  21793.     Write(cwrk,410,err=10000)int
  21794.     call vwrt(crlf,2)
  21795.     call vwrt(cwrk,len(cwrk))
  21796. c    WRITE (11,410,ERR=10000) INT
  21797. c    Rewind 11
  21798. 410    FORMAT (1X,I12)
  21799.     GOTO 10000
  21800. 6014    CONTINUE
  21801.     IF(OSWIT.EQ.2)GOTO 6103
  21802.     IF(OSWIT.GT.3)GOTO 7104
  21803.     DO 6015 OCNTR=1,106
  21804. 6015    OARRY(OCNTR)=char(0)
  21805. 6103    CONTINUE
  21806. C6103    ENCODE(12,410,OARRY)INT
  21807. 7104    OCNTR=12
  21808.     GOTO 10000
  21809. C
  21810. C
  21811. C **************************************************
  21812. C ***********    MULTIPLE PRECISION   **************
  21813. C **************************************************
  21814. C  MULTIPLE PRECISION
  21815. C  M10
  21816. 500    CONTINUE
  21817. C
  21818. C  M8
  21819. 600    CONTINUE
  21820. C
  21821. C  M16
  21822. 700    continue
  21823. c700    CALL MOUT (INDXX,RETCD)
  21824.     GOTO 10000
  21825. C
  21826. C
  21827. C **************************************************
  21828. C ****************   OCTAL   ***********************
  21829. C **************************************************
  21830. C  OCTAL
  21831. 800    DO 804 I=1,4
  21832. 804    FOUR(I)=AVBLS(I,INDXX)
  21833.     ISV=1
  21834.     IF (INT.LT.0) ISV=2
  21835.     K=IABS(INT)
  21836.     DO 810 I=1,11
  21837.     L=K-K/8*8
  21838. C TAKE ABSOLUTE VALUE IN CASE FIRST IABS DIDN'T WORK ON -2**31
  21839.     L=IABS(L)
  21840.     IF(L.EQ.0)L=9
  21841.     LEVIN (12-I)=DIGITS(L,2)
  21842.     K=K/8
  21843. 810    CONTINUE
  21844.     IF(OSWIT.NE.0)GOTO 6016
  21845. c    Rewind 11
  21846.     write(cwrk,820,err=10000)sign(isv),levin
  21847.     call vwrt(crlf,2)
  21848.     call vwrt(cwrk,len(cwrk))
  21849. c    WRITE (11,820,ERR=10000) SIGN(ISV), LEVIN
  21850. c    Rewind 11
  21851. 820    FORMAT (1X,1A1,11A1,2X,'(BASE 8)')
  21852.     GOTO 10000
  21853. 6016    CONTINUE
  21854.     IF(OSWIT.EQ.2)GOTO 6100
  21855.     IF(OSWIT.GT.3)GOTO 7105
  21856.     DO 6018 OCNTR=1,106
  21857. 6018    OARRY(OCNTR)=char(0)
  21858. 6100    CONTINUE
  21859. C6100    ENCODE(12,6017,OARRY)SIGN(ISV),LEVIN
  21860. 6017    FORMAT(12A1)
  21861. 7105    OCNTR=12
  21862.     GOTO 10000
  21863. C
  21864. C
  21865. C
  21866. C
  21867. C
  21868. C **************************************************
  21869. C ***************    REAL    ***********************
  21870. C **************************************************
  21871. 900    Continue
  21872. c    DO 904 I=1,8
  21873. c904    EIGHT(I)=AVBLS(I,INDXX)
  21874.     Real=vavbls(1,indxx)
  21875.     IF(OSWIT.NE.0)GOTO 6019
  21876. c    Rewind 11
  21877.     write(cwrk,910,err=10000)real
  21878.     call vwrt(crlf,2)
  21879.     call vwrt(cwrk,len(cwrk))
  21880. c    WRITE (11,910,ERR=10000) REAL
  21881. c    Rewind 11
  21882. 910    FORMAT (1X,D25.18)
  21883.     GOTO 10000
  21884. 6019    CONTINUE
  21885.     IF (OSWIT.EQ.2)GOTO 6020
  21886.     IF(OSWIT.GT.3)GOTO 7106
  21887.     DO 6321 OCNTR=1,106
  21888. 6321    OARRY(OCNTR)=Char(0)
  21889. 6020    CONTINUE
  21890. C    ENCODE(28,6021,OARRY)REAL
  21891. 6021    FORMAT(D25.18)
  21892. 7106    OCNTR=28
  21893. 10000    RETURN
  21894.     END
  21895. c -h- vblget.for    Fri Aug 22 13:37:17 1986    
  21896.         SUBROUTINE VBLGET(ID1,ID2,ID3,IVAL)
  21897. C
  21898. C VBLGET - GET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  21899. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLGT TO GET
  21900. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  21901.         InTeGer*4 ID1,ID2,ID3
  21902.         CHARACTER*1 IVAL,LL(8)
  21903.         REAL*8 XX
  21904.         EQUIVALENCE(LL(1),XX)
  21905.         CALL XVBLGT(ID2,ID3,XX)
  21906.         IVAL=LL(ID1)
  21907.         RETURN
  21908.         END
  21909. c -h- vblset.for    Fri Aug 22 13:37:17 1986    
  21910.         SUBROUTINE VBLSET(ID1,ID2,ID3,IVAL)
  21911. C VBLSET - SET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  21912. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLST TO GET
  21913. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  21914.         InTeGer*4 ID1,ID2,ID3
  21915.         CHARACTER*1 IVAL,LL(8)
  21916.         REAL*8 XX
  21917.         EQUIVALENCE(LL(1),XX)
  21918. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONE WE WANT. THEN...
  21919.         CALL XVBLGT(ID2,ID3,XX)
  21920.         LL(ID1)=IVAL
  21921. C PUT BACK THE 8 BYTES.
  21922.         CALL XVBLST(ID2,ID3,XX)
  21923.         RETURN
  21924.         END
  21925. c -h- wassig.fdd    Fri Aug 22 13:44:20 1986    
  21926.     SUBROUTINE WASSIG(IUNIT,NAME)
  21927. C
  21928. C
  21929.     CHARACTER*1 NAME(50)
  21930.     InTeGer*4 IUNIT
  21931.     CHARACTER*20 WK
  21932.     CHARACTER*1 WK1(20)
  21933.     EQUIVALENCE(WK(1:1),WK1(1))
  21934. C JUST TRY AND NULL FILL A NAME TO USE.
  21935.     DO 1 N=1,20
  21936.     WK1(N)=' '
  21937. 1    CONTINUE
  21938.     DO 2 N=1,20
  21939.     II=ICHAR(NAME(N))
  21940.     IF(II.LT.32)GOTO 3
  21941.     WK1(N)=CHAR(II)
  21942. C1    CONTINUE
  21943. 2    CONTINUE
  21944. 3    OPEN(IUNIT,FILE=WK(1:20),STATUS='NEW',recl=512,
  21945.      1  ACCESS='SEQUENTIAL',FORM='FORMATTED')
  21946.     RETURN
  21947.     END
  21948. c -h- wrkfil.f40    Fri Aug 22 13:44:46 1986    
  21949.     SUBROUTINE WRKFIL(NREC,ARRAY,IFUNC)
  21950. C COPYRIGHT 1983 GLENN C.EVERHART
  21951. C ALL RIGHTS RESERVED
  21952. C WORKFILE PSEUDO-MAINTAINER
  21953. C
  21954. C THIS ROUTINE IS INTENDED TO PERMIT THE SCRATCH FILE OF
  21955. C PORTACALC TO BE DISPENSED WITH BY USING A LARGE IN-MEMORY
  21956. C ARRAY. A BITMAP WILL SET UP WHEN THE ELEMENT IS INIT'ED AND
  21957. C THE DEFAULT ELEMENT WILL BE COMPUTED AND RETURNED
  21958. C IF AN UNINITIALIZED ELEMENT IS USED.
  21959. C
  21960. c nrc was i*4. make it i*2 here
  21961.     Include aparms.inc
  21962.     INTEGER NRC
  21963. C    InTeGer*4 NRC2(2)
  21964. C    EQUIVALENCE(NRC2(1),NRC)
  21965. C RECORD NUMBER TO ACCESS
  21966.     INTEGER NREC
  21967.     CHARACTER*1 ARRAY(128)
  21968.     INTEGER IFUNC
  21969. C ***<<<< RDD COMMON START >>>***
  21970.     InTeGer*4 RRWACT,RCLACT
  21971. C    COMMON/RCLACT/RRWACT,RCLACT
  21972.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  21973.      1  IDOL7,IDOL8
  21974. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  21975. C     1  IDOL7,IDOL8
  21976.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  21977. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  21978.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21979. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21980. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21981. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  21982.     InTeGer*4 KLVL
  21983. C    COMMON/KLVL/KLVL
  21984.     InTeGer*4 IOLVL,IGOLD
  21985. C    COMMON/IOLVL/IOLVL
  21986. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  21987. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  21988.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21989.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21990.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  21991.      3  k3dfg,kcdelt,krdelt,kpag
  21992. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  21993. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  21994. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  21995. C ***<<< RDD COMMON END >>>***
  21996. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21997. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  21998. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  21999. C
  22000. C ***<<< NULETC COMMON START >>>***
  22001.     InTeGer*4 ICREF,IRREF
  22002. C    COMMON/MIRROR/ICREF,IRREF
  22003.     InTeGer*4 MODPUB,LIMODE
  22004. C    COMMON/MODPUB/MODPUB,LIMODE
  22005.     InTeGer*4 KLKC,KLKR
  22006.     REAL*8 AACP,AACQ
  22007. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  22008.     InTeGer*4 NCEL,NXINI
  22009. C    COMMON/NCEL/NCEL,NXINI
  22010.     CHARACTER*1 NAMARY(20,MRows)
  22011. C    COMMON/NMNMNM/NAMARY
  22012.     InTeGer*4 NULAST,LFVD
  22013. C    COMMON/NULXXX/NULAST,LFVD
  22014.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  22015.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  22016. C ***<<< NULETC COMMON END >>>***
  22017. CCC    InTeGer*4 NCEL,NXINI
  22018. CCC    COMMON/NCEL/NCEL,NXINI
  22019.     InTeGer*4 MFID(2),MFMOD(2)
  22020.     InTeGer*2 IFID(8,MFrm)
  22021.     COMMON/IFIDC/IFID
  22022. CCC    InTeGer*4 RRWACT,RCLACT
  22023. C MFLAST = 1 OR 2 FOR LAST BUFFER USED. MFBASE IS HOLDER FOR "BASE ADDR"
  22024. C IN ARRAY TO USE IN SCANS.
  22025.     InTeGer*4 MFLAST,MFBASE,MVBASE
  22026.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  22027. CCC    COMMON/RCLACT/RRWACT,RCLACT
  22028.     CHARACTER*1 LFID(16,MFrm)
  22029.     EQUIVALENCE(IFID(1,1),LFID(1,1))
  22030. C ***<<< KLSTO COMMON START >>>***
  22031.     InTeGer*4 DLFG
  22032. C    COMMON/DLFG/DLFG
  22033.     InTeGer*4 KDRW,KDCL
  22034. C    COMMON/DOT/KDRW,KDCL
  22035.     InTeGer*4 DTRENA
  22036. C    COMMON/DTRCMN/DTRENA
  22037.     REAL*8 EP,PV,FV
  22038.     DIMENSION EP(20)
  22039.     INTEGER*4 KIRR
  22040. C    COMMON/ERNPER/EP,PV,FV,KIRR
  22041.     InTeGer*4 LASTOP
  22042. C    COMMON/ERROR/LASTOP
  22043.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  22044. C    COMMON/FMTBFR/FMTDAT
  22045.     CHARACTER*1 EDNAM(16)
  22046. C    COMMON/EDNAM/EDNAM
  22047. c    InTeGer*4 MFID(2),MFMOD(2)
  22048. C    COMMON/FRM/MFID,MFMOD
  22049.     InTeGer*4 JMVFG,JMVOLD
  22050. C    COMMON/FUBAR/JMVFG,JMVOLD
  22051.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  22052.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  22053. C ***<<< KLSTO COMMON END >>>***
  22054. CCC    COMMON/FRM/MFID,MFMOD
  22055.     CHARACTER*1 LI,IBYTE
  22056. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  22057.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  22058.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  22059.     COMMON/DEFVBX/DVFMT
  22060. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  22061. C AREAS WITH DATA.)
  22062. CCC    CHARACTER*1 FMTDAT(9,Ifmtbk)
  22063. CCC    COMMON/FMTBFR/FMTDAT
  22064. C
  22065. C IFUNC SPECIFIES WHAT TO DO:
  22066. C    =0    READ INTO ARRAY
  22067. C    =1    WRITE FROM ARRAY INTO WRKARY
  22068. C    =2    INITIALIZE (JUST CLEARS BITMAP HERE)(OPEN)
  22069. C    =3    CLOSE (CLEARS BITMAP HERE)
  22070.     CHARACTER*1 DTBL1(9,9,8)
  22071. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  22072.     InTeGer*2 BTBL(6,6,8)
  22073. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  22074. C NO NEED TO WASTE IT.
  22075.     INTEGER DTBLIN
  22076. C DTBLIN FLAGS THAT DTBL1 WAS ALREADY INITED, SO ONLY DOES SO ONCE.
  22077.     EQUIVALENCE(LFID(1,1),BTBL(1,1,1))
  22078.     InTeGer*2 BTBL1(6,6)
  22079.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  22080.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  22081.     EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  22082.     EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  22083.     EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  22084.     EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  22085.     COMMON /DECIDE/ DTBL1
  22086.     save dtblin
  22087.     DATA DTBLIN/0/
  22088.     IF(IFUNC.NE.50)GOTO 34
  22089.     IF(DTBLIN.NE.0)RETURN
  22090.     DTBLIN=1
  22091. C FLAG WE DID THIS INITIALIZATION ONCE. SINCE BUFFER IS CLEARED WE MUST
  22092. C *** NOT *** DO IT AGAIN.
  22093. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  22094. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  22095. C CALL SEPARATE ROUTINE TO CLEAR OUT THIS STUFF ONE-TIME. OVERLAY SAME.
  22096. C NOTE LOTS OF SILLY ARGUMENTS TO SUBROUTINE SINCE MS FORTRAN DISALLOWS
  22097. C EQUIVALENCES TO DUMMY ARGUMENTS.
  22098. C note dtbl1 inits now in block2 routine
  22099.     CALL WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,BTBL6,
  22100.      1  BTBL7,BTBL8)
  22101. C
  22102. C14      CONTINUE
  22103. CC FILE IS NOW CLEARED
  22104.     RETURN
  22105. 34    IF(IFUNC.LT.0.OR.IFUNC.GT.3)RETURN
  22106.     JFUN=IFUNC+1
  22107.     GOTO (1000,2000,3000,4000),JFUN
  22108. 1000    CONTINUE
  22109. C READ
  22110.     CALL FVLDGT(NREC,1,IBYTE)
  22111.     IF(ICHAR(IBYTE).NE.0)GOTO 1001
  22112. C UNINITIALIZED ARRAY ELEMENT: SET IT UP.
  22113. C JUST LEAVES DUMMY CELL CONTENTS WHERE NOTHING IS REALLY INIT'D.
  22114.     DO 1003 N=1,128
  22115. 1003    ARRAY(N)=char(0)
  22116.     ARRAY(1)='P'
  22117.     ARRAY(2)='#'
  22118.     ARRAY(3)='0'
  22119.     ARRAY(5)='0'
  22120.     ARRAY(4)='#'
  22121.     ARRAY(118)=CHAR(15)
  22122. C NOTE ARRAY(119) (WHICH BECOMES FVLD) IS 0 TOO.
  22123.     DO 1004 N=1,9
  22124. 1004    ARRAY(N+119)=DEFFMT(N)
  22125. C RETURN THE DEFAULT FORMAT NOW.
  22126.     RETURN
  22127. 1001    CONTINUE
  22128. C HERE HAVE TO GET THE WHOLE THING REALLY
  22129.     DO 1053 N=1,128
  22130. 1053    ARRAY(N)=char(0)
  22131.     ARRAY(119)=IBYTE
  22132.     ARRAY(118)=CHAR(15)
  22133.     ARRAY(1)=char(48)
  22134. C LET ARRAY INITIALLY BE SET SENSIBLY..
  22135.     DO 1054 N=1,9
  22136. 1054    ARRAY(N+119)=DEFFMT(N)
  22137. C WE MAY MODIFY FORMAT LATER TOO...
  22138. C NOW HAVE A NON-DEFAULT ELEMENT TO READ... GO THROUGH SYMBOL TBL LOGIC
  22139. C FOR THESE, WE USE 16-BYTE "CELLS" WHICH HAVE THE FOLLOWING FORMAT:
  22140. C    ID    2 BYTES (CELL ADDRESS, MUST BE 1 OR MORE FOR VALID)
  22141. C    FLAG    1 BYTE  (TYPE OF CELL:
  22142. C                0 = UNUSED
  22143. C                1 = 1 OF 1 CELLS
  22144. C                2 = NONTERMINAL OF MORE THAN 1 CELL
  22145. C                3 = LAST OF >1 CELLS
  22146. C    FORMAT    1 BYTE  (INDEX OF FORMAT STRING FOR THIS CELL; FORMATS
  22147. C                ARE STORED RESIDENT, UP TO 76 OF THEM,
  22148. C                SET BY DF COMMAND.)
  22149. C    FORMULA    12 BYTES  (FORMULA TEXT)
  22150. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  22151. C    IPM=(LPGMXF*64/2048)+1
  22152. C    IBF=64
  22153. CC    IBF=(2048+31)/32
  22154. C IBF IS NO. OF ENTRIES IN A BUFFER. OF 512 BYTES
  22155. C    IBF=32
  22156.     IBF=(MFrm+31)/64
  22157. C    LLL=(LPGMXF)/IBF
  22158. C    LLL=LPGMXF
  22159. C IPM IS NO. PAGES MAX IN FILS
  22160. C 1024 bytes holds 64 entries at 16 bytes each
  22161. C (user specifies file in K)
  22162. C handle in 1024 units since we have 2 buffers
  22163.     IPM=LPGMXF*64/(MFrmo2)
  22164. C EACH BUFFER HAS 16KB (if mfrm=2048) SO MAX PAGES IS (FILE LENGTH)/16
  22165. C    IPM=LLL
  22166.     IF(IPM.LT.2)IPM=2
  22167. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  22168.     IHASH=NREC*9
  22169. C space out the entries. Was ihash=nrec but this is much faster
  22170. C for most sheets
  22171. C    JHASH=IMASK(IHASH,(MFrm-1))
  22172.     JHASH=MOD(IHASH,(MFrmo2))
  22173. C    JHASH=IMASK(IHASH,1023)
  22174. C    JHASH=MOD(IHASH,2048)
  22175.     IF(LPGMOD.NE.0)GOTO 5305
  22176. C    IPAG=(IHASH/2048)+1
  22177.     IPAG=(IHASH/(MFrmo2))+1
  22178.     IPAG=MOD(IPAG,IPM)+1
  22179.     GOTO 5306
  22180. 5305    CONTINUE
  22181. C SPEED OPTIMAL PACK
  22182.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  22183.     IPAG=FPG
  22184.     IPAG=MOD(IPAG,IPM)
  22185.     IPAG=IPAG+1
  22186. C    IPAG=1+(IHASH*IPM)/18060
  22187. 5306    CONTINUE
  22188. C HERE DECIDED IF PAGE IS WHAT WE NEED.
  22189. C
  22190. C    IF(IPAG.LE.0)IPAG=1
  22191. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  22192.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 853
  22193.     IF(MFID(1).NE.0)GOTO 852
  22194.     MFID(1)=IPAG
  22195.     GOTO 853
  22196. 852    IF(MFID(2).EQ.0)MFID(2)=IPAG
  22197. 853    CONTINUE
  22198.     IF(MFID(1).EQ.IPAG) GOTO 850
  22199.     IF(MFID(2).EQ.IPAG)GOTO 851
  22200.     GOTO 854
  22201. 850    CONTINUE
  22202. C PAGE 1 IS THE ONE WE NEED.
  22203.     MFLAST=1
  22204.     MFBASE=0
  22205.     GOTO 1400
  22206. 851    CONTINUE
  22207. C NEED SECOND PAGE
  22208.     MFLAST=2
  22209.     MFBASE=(MFrmo2)
  22210. C BASE IS HASFWAY ALONG FILE...
  22211.     GOTO 1400
  22212. 854    CONTINUE
  22213. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  22214. C MFLAST will be either 1 or 2; following logic swaps them.
  22215.     MFLAST=3-MFLAST
  22216.     MFBASE=(MFrmo2)-MFBASE
  22217. C SIMILAR LOGIC SAYS MFBAS4E IS EITHER 0 OR MFrmo2. INITIALIZED IN
  22218. C WSSET TO 0.
  22219. C NOTE THAT IF MFLAST=1,MBFN=1 AND IF MFLAST=2,NEW MFLAST=1
  22220. C THIS GIVES BUFFER TO REPLACE... (LRU)
  22221. C
  22222. C IF MFLAST=2 REPLACE BUFFER 1, ELSE REPLACE BUFFER 0
  22223. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  22224. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  22225. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  22226. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  22227. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  22228. C WIN.....
  22229.     IF(LPGMXF.LE.(MFro64))GOTO 1400
  22230. C    IF(LPGMXF.LE.(2048/64))GOTO 1400
  22231. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  22232. C    IBF=32
  22233. CC    IBF=(1024+31)/32
  22234. C    IF(IBF.LT.1)IBF=1
  22235. C IBF IS BLK FACTOR FOR ONE WRITE
  22236. C WRITE 512 BYTES AT A TIME.
  22237.     L=1+MFBASE
  22238.     LLBK=(MFID(MFLAST)-1)*IBF+1
  22239.     LHBK=MFID(MFLAST)*IBF
  22240.     DO 1170 N=LLBK,LHBK
  22241.     IF(MFMOD(MFLAST).EQ.0)GOTO 1170
  22242.     LL=L+(MFro64)-1
  22243.     WRITE(7,REC=N,ERR=1170)((IFID(K,KK),K=1,8),KK=L,LL)
  22244.     L=L+(MFro64)
  22245. 1170    CONTINUE
  22246. C NOW READ IN THE DATA
  22247.     MFMOD(MFLAST)=0
  22248. C MARK PAGE UNTOUCHED. READING DOES NOT ALTER DATA SO NO NEED
  22249. C TO WRITE OUT UNLESS MODIFIED.
  22250.     MFID(MFLAST)=IPAG
  22251.     L=1+MFBASE
  22252.     LLBK=(MFID(MFLAST)-1)*IBF+1
  22253.     LHBK=MFID(MFLAST)*IBF
  22254.     DO 1171 N=LLBK,LHBK
  22255.     LL=L+(MFro64)-1
  22256.     READ(7,REC=N,ERR=1171)((IFID(K,KK),K=1,8),KK=L,LL)
  22257.     L=L+(MFro64)
  22258. 1171    CONTINUE
  22259. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  22260. 1400    CONTINUE
  22261. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  22262. C BUFFER.
  22263.     IARSUB=1
  22264. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  22265. C FROM START...
  22266.     IFLAG=0
  22267.     IFMT=0
  22268.     DO 2500 NN=1,(MFrmo2)
  22269. c    N=MOD((NN+JHASH-1),(MFrmo2))
  22270.     N=MOD((NN+JHASH),(MFrmo2))
  22271.     N=N+1+MFBASE
  22272. C    N=IMASK((NN+JHASH-1),1023)+1+MFBASE
  22273.     KKKKK=IFID(1,N)
  22274.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 2505
  22275.     IF(KKKKK.NE.NREC)GOTO 2500
  22276.     IFLAG=ICHAR(LFID(3,N))
  22277.     IF(IFMT.EQ.0)IFMT=ICHAR(LFID(4,N))
  22278. C for the moment leave this in. LAter remove and change to 10
  22279. C bytes formula, 4 bytes cell ID.
  22280.     DO 2502 K=1,12
  22281.     LI=LFID(K+4,N)
  22282. C COPY FORMULA TEXT INTO ARRAY. END ON NULLS...
  22283.     IF(ICHAR(LI).LE.0)GOTO 2505
  22284.     ARRAY(IARSUB)=LI
  22285. c null out following characters since -1's could be misinterpreted as data
  22286.     array(iarsub+1)=char(0)
  22287.     array(iarsub+2)=char(0)
  22288.     IARSUB=IARSUB+1
  22289. 2502    CONTINUE
  22290.     IF(IFLAG.EQ.1.OR.IFLAG.EQ.3)GOTO 2505
  22291. 2500    CONTINUE
  22292. 2505    CONTINUE
  22293. C GET FORMAT NOW...
  22294.     IF(IFMT.LE.0)RETURN
  22295.     DO 2510 N=1,9
  22296. 2510    ARRAY(119+N)=FMTDAT(N,IFMT)
  22297.     GOTO 5000
  22298. 2000    CONTINUE
  22299. C WRITE
  22300. C NOW SET INIT'D BIT; WRITE ARRAY ELEMENT OUT.
  22301. C FIRST FIND FORMAT AREA OR SET IT UP.
  22302.     IFMT=0
  22303.     LFF=0
  22304. C FAKE OUT THE SAVING OF FVLD INFO IN THIS ARRAY TOO.
  22305. C THIS IS INCOMPLETE AND NO LITTLE OF A KLUDGE BUT THE CODE WILL
  22306. C GENERALLY SET THEM TOGETHER, AND THIS GUARANTEES THAT IF
  22307. C FURTHER SETS TRY TO SET FVLD TO ARRAY(119), THEY'LL WORK AS
  22308. C THEY SHOULD.
  22309. C HERE SET MAX ARRAY ELEMENTS USED
  22310. C EXPECT (ID2-1)*60+ID1
  22311. C ID1 IS 60 DIM, ID2 IS 301 DIM
  22312. C    NRC2(2)=0
  22313. C    NRC2(1)=NREC
  22314. C JUST EQUATE NRC TO NREC
  22315. C ALLOW LATER FOR OVER 32768 ELEMENTS... NO NEED TO JUST YET
  22316. C WHEN WE DO, REPLACE NRC2 STUFF (WHOSE PURPOSE IS TO AVOID
  22317. C SIGN EXTENSIONS).
  22318. C NEXT KEEP TRACK OF LOWER RIGHT CORNER OF AREA IN USE.
  22319.     NRC=NREC-1
  22320.     IRUSED=MOD(NRC,MCols)+1
  22321.     ICUSED=((NRC-IRUSED+1)/MCols)+1
  22322.     IF(ICUSED.GT.RCLACT)RCLACT=ICUSED
  22323.     IF(IRUSED.GT.RRWACT)RRWACT=IRUSED
  22324. C SET RRWACT, RCLACT
  22325.     IF(ICHAR(ARRAY(119)).NE.0)CALL FVLDST(NREC,1,ARRAY(119))
  22326.     DO 2011 N=1,Ifmtbk
  22327.     IF(ICHAR(FMTDAT(1,N)).LE.0.AND.LFF.EQ.0)LFF=N
  22328. C SAVE FIRST FREE FORMAT AREA IN CASE THIS IS A NEW FORMAT...
  22329.     DO 2010 M=1,9
  22330.     IF(ARRAY(M+119).NE.FMTDAT(M,N))GOTO 2011
  22331. 2010    CONTINUE
  22332.     IFMT=N
  22333.     GOTO 2012
  22334. 2011    CONTINUE
  22335. C ON FALL THROUGH, WE FOUND NOTHING FOR IT...
  22336. C USE HIS FORMAT UNLESS WE HAVE NO ROOM, IN WHICH CASE USE LAST AREA
  22337.     IF(LFF.EQ.0)LFF=Ifmtbk
  22338.     IFMT=LFF
  22339.     DO 2013 N=1,9
  22340. 2013    FMTDAT(N,LFF)=ARRAY(119+N)
  22341. C SAVE FORMAT DATA WE NOW POINT TO...
  22342. 2012    CONTINUE
  22343. C NOW THE HARDER PART... MUST WRITE THE ARRAY'S FORMULA TOO...
  22344. C    IPM=(LPGMXF*64/2048)+1
  22345.     IBF=(MFro64)
  22346. C    IBF=(2048+31)/32/2
  22347. C    LLL=(LPGMXF*2)/IBF
  22348. C    IPM=LLL
  22349.     IPM=LPGMXF*64/MFrmo2
  22350. C IPM = NO. PAGES IN FILE. LPGMXF/(LENGTH OF ONE MEM BUFFER IN K).
  22351.     IF(IPM.LT.2)IPM=2
  22352. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  22353.     IHASH=NREC*9
  22354. C space out entries to speed up work by reducing collisions in hash
  22355. C table. Generally speeds things up, though it will increase paging
  22356. C in paging mode. Paging mode is very rare however.
  22357. C    JHASH=IMASK(IHASH,1023)
  22358.     JHASH=MOD(IHASH,(MFrmo2))
  22359.     IF(LPGMOD.NE.0)GOTO 5307
  22360.     IPAG=(IHASH/(MFrmo2))+1
  22361.     IPAG=MOD(IPAG,IPM)+1
  22362.     GOTO 5308
  22363. 5307    CONTINUE
  22364. C SPEED OPTIMAL PACK
  22365.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  22366.     IPAG=FPG
  22367.     IPAG=MOD(IPAG,IPM)
  22368.     IPAG=IPAG+1
  22369. C    IPAG=1+(IHASH*IPM)/18060
  22370. 5308    CONTINUE
  22371. C ***
  22372. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  22373.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 953
  22374.     IF(MFID(1).NE.0)GOTO 952
  22375.     MFID(1)=IPAG
  22376.     GOTO 953
  22377. 952    IF(MFID(2).EQ.0)MFID(2)=IPAG
  22378. 953    CONTINUE
  22379.     IF(MFID(2).EQ.IPAG)GOTO 951
  22380.     IF(MFID(1).NE.IPAG) GOTO 954
  22381. 950    CONTINUE
  22382. C PAGE 1 IS THE ONE WE NEED.
  22383.     MFLAST=1
  22384.     MFBASE=0
  22385.     GOTO 2400
  22386. 951    CONTINUE
  22387. C NEED SECOND PAGE
  22388.     MFLAST=2
  22389.     MFBASE=(MFrmo2)
  22390. C BASE IS HASFWAY ALONG FILE...
  22391.     GOTO 2400
  22392. 954    CONTINUE
  22393. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  22394.     MFLAST=3-MFLAST
  22395.     MFBASE=(MFrmo2)-MFBASE
  22396. C ***
  22397. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  22398. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  22399. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  22400. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  22401. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  22402. C WIN.....
  22403.     IF(LPGMXF.LE.(MFro64))GOTO 2400
  22404. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  22405. C    IBF=(1024+31)/32
  22406. C    IBF=32
  22407. C IBF IS BLK FACTOR
  22408.     L=1+MFBASE
  22409.     LLBK=(MFID(MFLAST)-1)*IBF+1
  22410.     LHBK=MFID(MFLAST)*IBF
  22411.     DO 2170 N=LLBK,LHBK
  22412.     IF(MFMOD(MFLAST).EQ.0)GOTO 2170
  22413.     LL=L+(MFro64)-1
  22414.     WRITE(7,REC=N,ERR=2170)((IFID(K,KK),K=1,8),KK=L,LL)
  22415.     L=L+(MFro64)
  22416. 2170    CONTINUE
  22417. C NOW READ IN THE DATA
  22418. C MARK NEW PAGE TOUCHED SINCE WE WILL DO SO HERE
  22419. C    MFMOD=1
  22420.     MFID(MFLAST)=IPAG
  22421.     L=1+MFBASE
  22422.     LLBK=(MFID(MFLAST)-1)*IBF+1
  22423.     LHBK=MFID(MFLAST)*IBF
  22424.     DO 2171 N=LLBK,LHBK
  22425.     LL=L+(MFro64)-1
  22426.     READ(7,REC=N,ERR=2171)((IFID(K,KK),K=1,8),KK=L,LL)
  22427.     L=L+(MFro64)
  22428. 2171    CONTINUE
  22429. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  22430. 2400    CONTINUE
  22431. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  22432. C BUFFER.
  22433.     MFMOD(MFLAST)=1
  22434.     IARSUB=1
  22435. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  22436. C FROM START...
  22437. C OMIT THE ZEROING WHEN READING IN FROM FILE EXCEPT IN /MERGE MODE
  22438.     IF(NXINI.NE.0)GOTO 6233
  22439.     DO 1490 NN=1,(MFrmo2)
  22440.     N=MOD((NN+JHASH),(MFrmo2))+1+MFBASE
  22441. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  22442.     KKKKK=IFID(1,N)
  22443.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 6233
  22444. C SKIP ZEROING ONCE WE ENCOUNTER A VIRGIN CELL SINCE WE WOULD ALWAYS
  22445. C CLEAR TO NONVIRGIN STATUS AFTERWARDS.
  22446.     IF(KKKKK.NE.NREC)GOTO 1490
  22447. C ZERO OLD RECORDS OF THIS ONE...
  22448.     NCEL=NCEL-1
  22449.     IF(NCEL.LT.0)NCEL=0
  22450.     DO 1498 KK=1,8
  22451. 1498    IFID(KK,N)=0
  22452. 1490    CONTINUE
  22453. 6233    CONTINUE
  22454.     IFLAG=0
  22455.     DO 1500 NN=1,(MFrmo2)
  22456.     N=MOD((NN+JHASH),(MFrmo2))+1+MFBASE
  22457. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  22458.     KKKKK=IFID(1,N)
  22459.     IF(KKKKK.NE.-1.AND.KKKKK.NE.0
  22460.      1     .AND.KKKKK.NE.NREC)GOTO 1500
  22461. C FOUND A NULL NODE...
  22462. C FILL IT IN NOW.
  22463.     NCEL=NCEL+1
  22464.     IFID(1,N)=NREC
  22465.     IFLAG=1
  22466.     LFID(4,N)=CHAR(IFMT)
  22467.     LFID(3,N)=CHAR(IFLAG)
  22468. c zero new elements to ensure no extra -1's get handled as
  22469. c data. Important because they could be mistaken for cell codings now.
  22470.     do 4502 k=1,12
  22471. 4502    lfid(k+4,n)=CHAR(0)
  22472.     DO 1502 K=1,12
  22473.     LI=ARRAY(IARSUB)
  22474.     IF(ICHAR(LI).LE.0)GOTO 1505
  22475. C CHOP IT OFF AT 109 ALSO...
  22476.     IF(IARSUB.GT.109)GOTO 1560
  22477.     LFID(K+4,N)=LI
  22478.     IARSUB=IARSUB+1
  22479. 1502    CONTINUE
  22480. C NONTERMINAL COPY...NEED ANOTHER CELL. FIRST TEST FOR EXACT FIT,
  22481. C HOWEVER.
  22482.     IF(ICHAR(ARRAY(IARSUB)).LE.0)GOTO 1560
  22483.     IFLAG=2
  22484.     LFID(3,N)=CHAR(IFLAG)
  22485. C NOW GO GET MORE SPACE FOR NEXT NODE.
  22486. C NOTE IT COULD RUN OUT, BUT JUST PUNT THAT.
  22487.     GOTO 1500
  22488. 1560    CONTINUE
  22489.     IF(IFLAG.EQ.1)IFLAG=3
  22490.     LFID(3,N)=CHAR(IFLAG)
  22491. C SETS UP EITHER 1 OR 3 FOR TERMINAL NODES
  22492.     GOTO 1505
  22493. C ESCAPE FROM LOOP ON ENDS...
  22494. 1500    CONTINUE
  22495. C HERE WE RAN OUT OF ROOM. TOO BAD...CAN'T REALLY HELP IT OR
  22496. C DO MUCH. JUST FORGET IT.
  22497. C HOWEVER, PRINT A MESSAGE ON SCREEN AT LEAST...
  22498.     CALL UVT100(1,1,1)
  22499.     CALL SWRT('Formula file overflowed. Try larger file.',41)
  22500. 1505    CONTINUE
  22501. C DONE NOW.
  22502.     GOTO 5000
  22503. 3000    CONTINUE
  22504. C OPEN (CLR BITMAP)
  22505.     MFID(1)=0
  22506.     MFID(2)=0
  22507.     MFBASE=0
  22508.     MFLAST=1
  22509.     GOTO 5000
  22510. 4000    CONTINUE
  22511. C CLOSE (CLR BITMAP)
  22512.     CLOSE(7,STATUS='DELETE')
  22513.     MFBASE=0
  22514.     MFLAST=1
  22515.     MFID(1)=0
  22516.     MFID(2)=0
  22517. 5000    RETURN
  22518.     END
  22519. c -h- xvblgt.f40    Fri Aug 22 13:45:23 1986    
  22520.         SUBROUTINE XVBLGT(ID1,ID2,XX)
  22521. C
  22522. C XVBLGT - LOAD 8 BYTES GIVEN DIMENSIONS FOR GETTING THEM
  22523. C 2 DIM ARRAY, DIM'D (60,301)
  22524.     Include aparms.inc
  22525.         InTeGer*4 ID1,ID2
  22526.         REAL*8 XX
  22527.     InTeGer*4 TYPE(1,2),VLEN(9)
  22528.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1),VT(8)
  22529.     Real*8 VAVBLS(3,27)
  22530.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  22531.     REAL*8 XXV(1,1),XVT
  22532.     EQUIVALENCE(XVT,VT(1))
  22533.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  22534.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  22535.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  22536.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  22537. C ***<<<< RDD COMMON START >>>***
  22538.     InTeGer*4 RRWACT,RCLACT
  22539. C    COMMON/RCLACT/RRWACT,RCLACT
  22540.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  22541.      1  IDOL7,IDOL8
  22542. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  22543. C     1  IDOL7,IDOL8
  22544.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  22545. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  22546.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22547. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22548. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22549. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  22550.     InTeGer*4 KLVL
  22551. C    COMMON/KLVL/KLVL
  22552.     InTeGer*4 IOLVL,IGOLD
  22553. C    COMMON/IOLVL/IOLVL
  22554. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  22555. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  22556.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22557.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22558.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  22559.      3  k3dfg,kcdelt,krdelt,kpag
  22560. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22561. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22562. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  22563. C ***<<< RDD COMMON END >>>***
  22564. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22565. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22566. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22567. C NEXT BITMAPS IMPLEMENT FVLD
  22568.         CHARACTER*1 FV1(IMP1S),FV2(Imp1s),FV4(Imp1s)
  22569.     CHARACTER*1 FVXX(Imps3)
  22570.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  22571.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  22572.         Common/FVLDM/FVXX
  22573. c        COMMON/FVLDM/FV1,FV2,FV4
  22574.         CHARACTER*1 LBITS(8)
  22575.         COMMON/BITS/LBITS
  22576. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  22577. C TYPES OF AC'S STORAGE:
  22578.         CHARACTER*1 ITYP(Imp1s),LWK
  22579.         InTeGer*4 IATYP(27),iqnjq
  22580.     INTEGER*2 LL(4)
  22581.     REAL*8 XA
  22582.     EQUIVALENCE(LL(1),XA)
  22583.         COMMON/TYP/IATYP,ITYP,iqnjq
  22584. C ***<<< NULETC COMMON START >>>***
  22585.     InTeGer*4 ICREF,IRREF
  22586. C    COMMON/MIRROR/ICREF,IRREF
  22587.     InTeGer*4 MODPUB,LIMODE
  22588. C    COMMON/MODPUB/MODPUB,LIMODE
  22589.     InTeGer*4 KLKC,KLKR
  22590.     REAL*8 AACP,AACQ
  22591. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  22592.     InTeGer*4 NCEL,NXINI
  22593. C    COMMON/NCEL/NCEL,NXINI
  22594.     CHARACTER*1 NAMARY(20,MRows)
  22595. C    COMMON/NMNMNM/NAMARY
  22596.     InTeGer*4 NULAST,LFVD
  22597. C    COMMON/NULXXX/NULAST,LFVD
  22598.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  22599.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  22600. C ***<<< NULETC COMMON END >>>***
  22601. CCC    InTeGer*4 ICREF,IRREF
  22602. CCC    COMMON/MIRROR/ICREF,IRREF
  22603.         InTeGer*2 LVALBF(5,MVal)
  22604. C allow a real*8 array to be used if there is space enough in the
  22605. C lvalbf array to hold all cells.
  22606.     Real*8 xvls(1)
  22607.     Equivalence(xvls(1),lvalbf(1,1))
  22608.         InTeGer*4 MPAG(2),MPMOD(2)
  22609.         COMMON/VB/MPAG,LVALBF,MPMOD
  22610. C
  22611. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  22612. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  22613. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  22614. C AREAS WITH DATA.
  22615. C ***<<< KLSTO COMMON START >>>***
  22616.     InTeGer*4 DLFG
  22617. C    COMMON/DLFG/DLFG
  22618.     InTeGer*4 KDRW,KDCL
  22619. C    COMMON/DOT/KDRW,KDCL
  22620.     InTeGer*4 DTRENA
  22621. C    COMMON/DTRCMN/DTRENA
  22622.     REAL*8 EP,PV,FV
  22623.     DIMENSION EP(20)
  22624.     INTEGER*4 KIRR
  22625. C    COMMON/ERNPER/EP,PV,FV,KIRR
  22626.     InTeGer*4 LASTOP
  22627. C    COMMON/ERROR/LASTOP
  22628.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  22629. C    COMMON/FMTBFR/FMTDAT
  22630.     CHARACTER*1 EDNAM(16)
  22631. C    COMMON/EDNAM/EDNAM
  22632.     InTeGer*4 MFID(2),MFMOD(2)
  22633. C    COMMON/FRM/MFID,MFMOD
  22634.     InTeGer*4 JMVFG,JMVOLD
  22635. C    COMMON/FUBAR/JMVFG,JMVOLD
  22636.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  22637.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  22638. C ***<<< KLSTO COMMON END >>>***
  22639. CCC        CHARACTER*1 FMTDAT(9,Ifmtbk)
  22640. CCC        COMMON/FMTBFR/FMTDAT
  22641.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  22642. C AN ACCUMULATOR. GET IT.
  22643.     xvt=vavbls(1,id1)
  22644. c    DO 7801 IV=1,8
  22645. c7801    VT(IV)=AVBLS(IV,ID1)
  22646.     XX=XVT
  22647.     RETURN
  22648. 7800    CONTINUE
  22649. C FILTER OUT TOO-LARGE ID1, ID2 THAT ARE "REFLECTED" UP
  22650. C        ID=(ID2-1)*60+ID1
  22651.     CALL REFLEC(ID2,ID1,ID)
  22652.         XX=0.
  22653. C NOTE THAT HERE IF FVLD IS 0, THIS MEANS RESULT IS 0 REGARDLESS OF
  22654. C OTHER STUFF...RETURN 0 IMMEDIATELY.
  22655. C NOTE TRICK CALL WHICH SIGNALS ANY INITIALIZATION GETS EVALUATED.
  22656.     If(mvalx10.lt.mrcx8)goto 6802
  22657. c    if(mval*10.lt.mrc*8)goto 6802
  22658. C at this point we know the array is large enough to store ALL cells
  22659. c so use it that way for speed.
  22660.     XX=xvls(ID)
  22661.     Return
  22662. 6802    Continue
  22663.     CALL FVLDGT(ID,0,LWK)
  22664.     IF(ICHAR(LWK).EQ.0)RETURN
  22665. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  22666.     IBF=(MVal/100)
  22667. C ibf = blk factor
  22668. C    IBF=(800+49)/50/2
  22669. C    IF(IBF.LT.1)IBF=1
  22670. C
  22671.     LLL=(IPGMAX*2)/IBF
  22672.     IPM=LLL
  22673.     IF(IPM.LE.2)IPM=2
  22674.     IHASH=ID
  22675.         JHASH=MOD(IHASH,(MVlov2))+1
  22676.     IF(IPGMOD.NE.0)GOTO 3402
  22677.         IPAG=(IHASH/(MVlov2))+1
  22678.         IPAG=MOD(IPAG,IPM)+1
  22679.     GOTO 3403
  22680. 3402    CONTINUE
  22681. C SPEED-OPTIMIZING PACKING
  22682.     FPG=IPGMOD
  22683. C    IF(FPG.LE.0)FPG=FPG+65536.
  22684.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  22685.     IPAG=FPG
  22686.     IPAG=MOD(IPAG,IPM)
  22687.     IPAG=IPAG+1
  22688. C    IPAG=1+(IHASH*IPM)/18060
  22689. 3403    CONTINUE
  22690. C        IF(IPAG.LE.0)IPAG=1
  22691. C TAKE CARE OF EMPTY INITIAL BUFFER...
  22692.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 851
  22693.     IF(MPAG(1).NE.0)GOTO 850
  22694.     MPAG(1)=IPAG
  22695.     GOTO 851
  22696. 850    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  22697. 851    CONTINUE
  22698.     IF(MPAG(1).EQ.IPAG)GOTO 852
  22699.     IF(MPAG(2).NE.IPAG)GOTO 853
  22700. C MPAG(2)=IPAG
  22701.     MVLAST=2
  22702.     MVBASE=(MVlov2)
  22703.     GOTO 1000
  22704. 852    CONTINUE
  22705.     MVLAST=1
  22706.     MVBASE=0
  22707.     GOTO 1000
  22708. 853    CONTINUE
  22709. C SWITCH BUFFER USED LEAST RECENTLY
  22710.     MVLAST=3-MVLAST
  22711.     MVBASE=MVlov2-MVBASE
  22712. C
  22713. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  22714. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  22715. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  22716. C COMPILER AND MACHINE ALLOW.
  22717.     IF(IPGMAX.LE.(MVal/100))GOTO 1000
  22718. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  22719. C TO DISK AND BRING IN THE ONE DESIRED.
  22720. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  22721.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22722.         IRCHI=MPAG(MVLAST)*IBF
  22723.         L=1+MVBASE
  22724.         DO 500 N=IRCLO,IRCHI
  22725.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  22726.         LLL=L+(MVlo16)-1
  22727.         WRITE(13,REC=N,ERR=500)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  22728.         L=L+(MVlo16)
  22729. 500     CONTINUE
  22730.     MPMOD(MVLAST)=0
  22731. C MARK NEW PAGE UNMODIFIED IN THIS READ PROGRAM
  22732.         MPAG(MVLAST)=IPAG
  22733. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  22734.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22735.         IRCHI=MPAG(MVLAST)*IBF
  22736.         L=1+MVBASE
  22737.         DO 501 N=IRCLO,IRCHI
  22738.         LLL=L+(MVlo16)-1
  22739.         READ(13,REC=N,ERR=501)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  22740.         L=L+(MVlo16)
  22741. 501     CONTINUE
  22742. 1000    CONTINUE
  22743. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  22744. C SET THE VALUE INTO IT AS REQUIRED...
  22745. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  22746.         IH1=JHASH-1
  22747.         DO 2 MMN=JHASH,(MVlov2)
  22748.     N=MMN+MVBASE
  22749.     NN=N
  22750. C SKIP OUT IF WE SEE VIRGIN CELLS, LEAVING XX=0.
  22751.     KKKKK=LVALBF(1,N)
  22752.     IF(KKKKK.EQ.-1)GOTO 3332
  22753.         IF(KKKKK.EQ.ID)GOTO 4
  22754. 2       CONTINUE
  22755.         IF(IH1.LT.1)RETURN
  22756.         DO 3 MMN=1,IH1
  22757.     N=MMN+MVBASE
  22758. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  22759.     NN=N
  22760.     KKKKK=LVALBF(1,N)
  22761.     IF(KKKKK.EQ.-1)GOTO 3332
  22762.         IF(KKKKK.EQ.ID)GOTO 4
  22763. 3       CONTINUE
  22764. 3332    XX=0.0
  22765.         RETURN
  22766. C RETURN IF CAN'T FIND VALUE...TOO BAD
  22767. 4       CONTINUE
  22768. C GET VALUE AS 4 16-BIT WORDS
  22769.         DO 5 M=1,4
  22770. 5       LL(M)=LVALBF(M+1,NN)
  22771.         XX=XA
  22772.         RETURN
  22773.         END
  22774. c -h- xvblst.f40    Fri Aug 22 13:45:23 1986    
  22775.         SUBROUTINE XVBLST(ID1,ID2,XX)
  22776. C
  22777. C XVBLST - STORE 8 BYTES IN VARIABLES ARRAY
  22778. C GIVEN DIMENSIONS FOR LOCATING THEM
  22779.     Include aparms.inc
  22780.         InTeGer*4 ID1,ID2
  22781.     InTeGer*4 TYPE(1,2),VLEN(9)
  22782.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1),VT(8)
  22783.     Real*8 VAVBLS(3,27)
  22784.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  22785.     REAL*8 XVT
  22786.     EQUIVALENCE(VT(1),XVT)
  22787.     REAL*8 XXV(1,1)
  22788.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  22789.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  22790.         REAL*8 XX
  22791. C ***<<<< RDD COMMON START >>>***
  22792.     InTeGer*4 RRWACT,RCLACT
  22793. C    COMMON/RCLACT/RRWACT,RCLACT
  22794.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  22795.      1  IDOL7,IDOL8
  22796. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  22797. C     1  IDOL7,IDOL8
  22798.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  22799. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  22800.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22801. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22802. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22803. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  22804.     InTeGer*4 KLVL
  22805. C    COMMON/KLVL/KLVL
  22806.     InTeGer*4 IOLVL,IGOLD
  22807. C    COMMON/IOLVL/IOLVL
  22808. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  22809. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  22810.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22811.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22812.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  22813.      3  k3dfg,kcdelt,krdelt,kpag
  22814. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  22815. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  22816. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  22817. C ***<<< RDD COMMON END >>>***
  22818. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22819. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  22820. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  22821. C NEXT BITMAPS IMPLEMENT FVLD
  22822.         CHARACTER*1 FV1(Imp1s),FV2(Imp1s),FV4(Imp1s)
  22823.     CHARACTER*1 FVXX(IMPS3)
  22824.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(Imp2s))
  22825.     EQUIVALENCE (FV4(1),FVXX(Imp3s))
  22826.         Common/FVLDM/FVXX
  22827. c        COMMON/FVLDM/FV1,FV2,FV4
  22828.         CHARACTER*1 LBITS(8)
  22829.         COMMON/BITS/LBITS
  22830. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  22831. C TYPES OF AC'S STORAGE:
  22832.         CHARACTER*1 ITYP(Imp1s)
  22833. C ***<<< NULETC COMMON START >>>***
  22834.     InTeGer*4 ICREF,IRREF
  22835. C    COMMON/MIRROR/ICREF,IRREF
  22836.     InTeGer*4 MODPUB,LIMODE
  22837. C    COMMON/MODPUB/MODPUB,LIMODE
  22838.     InTeGer*4 KLKC,KLKR
  22839.     REAL*8 AACP,AACQ
  22840. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  22841.     InTeGer*4 NCEL,NXINI
  22842. C    COMMON/NCEL/NCEL,NXINI
  22843.     CHARACTER*1 NAMARY(20,MRows)
  22844. C    COMMON/NMNMNM/NAMARY
  22845.     InTeGer*4 NULAST,LFVD
  22846. C    COMMON/NULXXX/NULAST,LFVD
  22847.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  22848.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  22849. C ***<<< NULETC COMMON END >>>***
  22850. CCC    InTeGer*4 ICREF,IRREF
  22851. CCC    COMMON/MIRROR/ICREF,IRREF
  22852.         InTeGer*4 IATYP(27),iqnjq
  22853.         COMMON/TYP/IATYP,ITYP,iqnjq
  22854. C
  22855. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  22856. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  22857. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  22858. C AREAS WITH DATA.
  22859.         CHARACTER*1 LLTST
  22860. C ***<<< KLSTO COMMON START >>>***
  22861.     InTeGer*4 DLFG
  22862. C    COMMON/DLFG/DLFG
  22863.     InTeGer*4 KDRW,KDCL
  22864. C    COMMON/DOT/KDRW,KDCL
  22865.     InTeGer*4 DTRENA
  22866. C    COMMON/DTRCMN/DTRENA
  22867.     REAL*8 EP,PV,FV
  22868.     DIMENSION EP(20)
  22869.     INTEGER*4 KIRR
  22870. C    COMMON/ERNPER/EP,PV,FV,KIRR
  22871.     InTeGer*4 LASTOP
  22872. C    COMMON/ERROR/LASTOP
  22873.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  22874. C    COMMON/FMTBFR/FMTDAT
  22875.     CHARACTER*1 EDNAM(16)
  22876. C    COMMON/EDNAM/EDNAM
  22877.     InTeGer*4 MFID(2),MFMOD(2)
  22878. C    COMMON/FRM/MFID,MFMOD
  22879.     InTeGer*4 JMVFG,JMVOLD
  22880. C    COMMON/FUBAR/JMVFG,JMVOLD
  22881.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  22882.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  22883. C ***<<< KLSTO COMMON END >>>***
  22884. CCC        COMMON/FMTBFR/FMTDAT
  22885.         InTeGer*2 LVALBF(5,MVal)
  22886.     Real*8 xvls(1)
  22887.     Equivalence(xvls(1),LValbf(1,1))
  22888.         InTeGer*4 MPAG(2),MPMOD(2)
  22889.         COMMON/VB/MPAG,LVALBF,MPMOD
  22890.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  22891.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  22892.         InTeGer*2 LL(4)
  22893.         REAL*8 XA
  22894.         EQUIVALENCE(XA,LL(1))
  22895. CCC    InTeGer*4 NCEL,NXINI
  22896. CCC    COMMON/NCEL/NCEL,NXINI
  22897.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  22898. C AN ACCUMULATOR. SET IT.
  22899.     XVT=XX
  22900.     vavbls(1,id1)=xvt
  22901. c    DO 7801 IV=1,8
  22902. c7801    AVBLS(IV,ID1)=VT(IV)
  22903.     RETURN
  22904. 7800    CONTINUE
  22905. C        ID=(ID2-1)*60+ID1
  22906.     CALL REFLEC(ID2,ID1,ID)
  22907.     If(mvalx10.lt.mrcx8)goto 6803
  22908. c    if(mval*10.lt.mrc*8)goto 6803
  22909. C we have enough storage to hold all cells in memory so do so.
  22910.     xvls(ID)=XX
  22911.     Return
  22912. 6803    Continue
  22913. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  22914. C       IPM=(IPGMAX*200/800)
  22915.     IF(ID.LE.0)RETURN
  22916. C CALL FVLDGT TO TELL IF ANYTHING IS SET FOR THE CELL...
  22917.     CALL FVLDGT(ID1,ID2,LLTST)
  22918.     IF(ICHAR(LLTST).NE.0)GOTO 3419
  22919.     CALL FVLDST(ID1,ID2,Char(252))
  22920. c 252 = -4 to 8 bits
  22921. C TRICK ... SET UP SIGN BIT IN FVLD SO XVBLGT CAN FIND OUT IF
  22922. C VARIABLE HAS EVER BEEN WRITTEN AND EXIT IF NOT. INDEPENDENT OF
  22923. C USUAL SETTING OF FVLD SINCE IT USES "SIGN" BIT ONLY.
  22924. 3419    CONTINUE
  22925.     IBF=(MVal+99)/100
  22926. C    IBF=(800+49)/50/2
  22927. C    IF(IBF.LT.1)IBF=1
  22928.     LLL=IPGMAX*2/ibf
  22929. C 4000 BYTES PER BUFFER (400 CELLS AT 10 PER CELL)
  22930. C    LLL=(IPGMAX*2)/IBF
  22931.     IPM=LLL
  22932.     IF(IPM.LE.2)IPM=2
  22933.     IHASH=ID
  22934.         JHASH=MOD(IHASH,(MVlov2))+1
  22935.     IF(IPGMOD.NE.0)GOTO 3400
  22936. C SPACE-OPTIMIZING PACKING
  22937.         IPAG=(IHASH/(MVlov2))+1
  22938.         IPAG=MOD(IPAG,IPM)+1
  22939.     GOTO 3401
  22940. 3400    CONTINUE
  22941. C SPEED-OPTIMIZING PACKING
  22942.     FPG=FLOAT(IPGMOD)
  22943. C    IF(FPG.LE.0.)FPG=FPG+65536.
  22944.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  22945.     IPAG=FPG
  22946.     IPAG=MOD(IPAG,IPM)
  22947.     IPAG=IPAG+1
  22948. C    IPAG=1+(IHASH*IPM)/18060
  22949. 3401    CONTINUE
  22950. C        IF(IPAG.LE.0)IPAG=1
  22951.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 850
  22952.     IF(MPAG(1).NE.0)GOTO 851
  22953.     MPAG(1)=IPAG
  22954.     GOTO 850
  22955. 851    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  22956. 850    CONTINUE
  22957.     IF(MPAG(1).EQ.IPAG)GOTO 852
  22958.     IF(MPAG(2).NE.IPAG)GOTO 853
  22959. C MPAG(2) = IPAG
  22960.     MVLAST=2
  22961.     MVBASE=(MVlov2)
  22962.     GOTO 1000
  22963. 852    CONTINUE
  22964.     MVLAST=1
  22965.     MVBASE=0
  22966.     GOTO 1000
  22967. 853    CONTINUE
  22968. C NEED NEW PAGE. FIX TO USE LEAST RECENTLY USED PAGE FOR SWAPOUT.
  22969.     MVLAST=3-MVLAST
  22970. C MVLAST = 1 OR 2
  22971.     MVBASE=MVlov2-MVBASE
  22972. C MVBASE = 0 OR 400. INITIALLY 0.
  22973. C        IF(MPAG.EQ.0)MPAG=IPAG
  22974. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  22975. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  22976. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  22977. C COMPILER AND MACHINE ALLOW.
  22978. c
  22979.     IF(IPGMAX.LE.IBF)GOTO 1000
  22980. c
  22981. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  22982. C TO DISK AND BRING IN THE ONE DESIRED.
  22983. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  22984.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22985.         IRCHI=MPAG(MVLAST)*IBF
  22986.         L=1+MVBASE
  22987.         DO 500 N=IRCLO,IRCHI
  22988.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  22989.         LLL=L+(MVlo16)-1
  22990.         WRITE(13,REC=N,ERR=500)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  22991.         L=L+(MVlo16)
  22992. 500     CONTINUE
  22993. C MARK NEW PAGE MODIFIED SINCE WE WILL TOUCH IT HERE
  22994.     MPMOD(MVLAST)=1
  22995.         MPAG(MVLAST)=IPAG
  22996. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  22997.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  22998.         IRCHI=MPAG(MVLAST)*IBF
  22999.         L=1+MVBASE
  23000.         DO 501 N=IRCLO,IRCHI
  23001.         LLL=L+(MVlo16)-1
  23002.         READ(13,REC=N,ERR=501)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  23003.         L=L+(MVlo16)
  23004. 501     CONTINUE
  23005. 1000    CONTINUE
  23006. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  23007. C SET THE VALUE INTO IT AS REQUIRED...
  23008. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  23009.     MPMOD(MVLAST)=1
  23010.     IF(NXINI.NE.0)GOTO 111
  23011.         IH1=JHASH-1
  23012.         DO 1 MMN=JHASH,(MVlov2)
  23013.     N=MMN+MVBASE
  23014. C WHILE ZEROING THE ARRAY, START AT THE HASH ADDRESS AND STOP THE ZEROING
  23015. C ONCE WE ENCOUNTER A VIRGIN RECORD. THIS WILL HOPEFULLY REDUCE OVERALL
  23016. C TIME MOST TIMES FOR ZEROING THE ARRAY.
  23017.     KKKKK=LVALBF(1,N)
  23018.     IF(KKKKK.EQ.-1)GOTO 111
  23019.         IF(KKKKK.NE.ID)GOTO 1
  23020. C ZERO ALL REFS TO THIS CELL WE'RE ABOUT TO WRITE.
  23021. C **** THIS IS QUITE TIME CONSUMING... OMIT IF POSSIBLE...
  23022.         LVALBF(1,N)=0
  23023. 1       CONTINUE
  23024.         IF(IH1.LT.1)RETURN
  23025.         DO 33 MMN=1,IH1
  23026.     N=MMN+MVBASE
  23027.     NN=N
  23028.     KKKKK=LVALBF(1,N)
  23029.     IF(KKKKK.EQ.-1)GOTO 111
  23030.         IF(KKKKK.NE.ID)GOTO 33
  23031.     LVALBF(1,N)=0
  23032. 33    CONTINUE
  23033. 111    CONTINUE
  23034. C SINCE ZERO VALUES ARE RETURNED BY DEFAULT, DON'T BOTHER STORING THEM
  23035.     IF(XX.EQ.0.0D0)RETURN
  23036.         IH1=JHASH-1
  23037.         DO 2 MMN=JHASH,(MVlov2)
  23038.     N=MMN+MVBASE
  23039.     NN=N
  23040.     KKKKK=LVALBF(1,N)
  23041.     IF(KKKKK.EQ.-1)GOTO 4
  23042.         IF(KKKKK.EQ.0)GOTO 4
  23043.     IF(KKKKK.EQ.ID)GOTO 4
  23044. 2       CONTINUE
  23045.         IF(IH1.LT.1)RETURN
  23046.         DO 3 MMN=1,IH1
  23047.     N=MMN+MVBASE
  23048.     NN=N
  23049. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  23050.     KKKKK=LVALBF(1,N)
  23051.     IF(KKKKK.EQ.-1)GOTO 4
  23052.         IF(KKKKK.EQ.0)GOTO 4
  23053.     IF(KKKKK.EQ.ID)GOTO 4
  23054. 3       CONTINUE
  23055. C TELL USER VALUE AREA OVERFLOWED, USING ROW 1 END
  23056.     CALL UVT100(1,1,1)
  23057.     CALL SWRT('Value Table Storage overflowed. Try larger file.',48)
  23058.         RETURN
  23059. C RETURN IF CAN'T FIND VALUE...TOO BAD
  23060.  
  23061. 4       CONTINUE
  23062. C SAVE VALUE AS 4 16-BIT WORDS
  23063.         XA=XX
  23064. C SAVE ID AND VALUE IN CELL...
  23065.     LVALBF(1,NN)=ID
  23066.         DO 5 M=1,4
  23067. 5       LVALBF(M+1,NN)=LL(M)
  23068.         RETURN
  23069.         END
  23070. c -h- zero.for    Fri Aug 22 13:46:23 1986    
  23071.     SUBROUTINE ZERO
  23072. C COPYRIGHT (C) 1983 GLENN EVERHART
  23073. C ALL RIGHTS RESERVED
  23074. C 60=MAX REAL ROWS
  23075. C 301=MAX REAL COLS
  23076. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  23077. C VBLS AND TYPE DIMENSIONED 60,301
  23078. C **************************************************
  23079. C *                                                *
  23080. C *         SUBROUTINE  ZERO                       *
  23081. C *                                                *
  23082. C **************************************************
  23083. C
  23084. C
  23085. C
  23086. C  ZEROS OUT ALL VARIABLES EXCEPT %
  23087. C
  23088. C
  23089. C ZERO CALLS IABS
  23090. C
  23091. C
  23092. C ZERO IS CALLED BY CMND
  23093. C
  23094. C
  23095. C
  23096. C   VARIABLE    USE
  23097. C
  23098. C      I      POINTS TO VARIABLE
  23099. C      J      INDEXES DOWN ELEMENTS OF A VARIABLE
  23100. C
  23101. C
  23102. C
  23103. C    SUBROUTINE ZERO
  23104. C
  23105.     InTeGer*4  TYPE(1,2),VLEN(9)
  23106. C
  23107.     CHARACTER*1  AVBLS(24,27)
  23108.     Real*8 VAVBLS(3,27)
  23109.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  23110.     CHARACTER*1 VBLS(8,1,1)
  23111. C
  23112.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  23113. C
  23114. C
  23115. C
  23116. C JUST ZERO THE ACCUMULATORS HERE ... LEAVE REGULAR SHEET STUFF ALONE.
  23117. C    TYPE(1,1)=IABS(TYPE(1,1))
  23118.     VBLS(1,1,1)=Char(0)
  23119. C ZERO OUT ACCUMULATORS
  23120.     DO 1 I=1,27
  23121.     DO 1 J=1,20
  23122. 1    AVBLS(J,I)=Char(0)
  23123.     RETURN
  23124.     END
  23125. c -h- zneg.for    Fri Aug 22 13:46:23 1986    
  23126.     INTEGER FUNCTION ZNEG(INDXX)
  23127. C COPYRIGHT (C) 1983 GLENN EVERHART
  23128. C ALL RIGHTS RESERVED
  23129. C 60=MAX REAL ROWS
  23130. C 301=MAX REAL COLS
  23131. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  23132. C VBLS AND TYPE DIMENSIONED 60,301
  23133. C **************************************************
  23134. C *                                                *
  23135. C *        InTeGer*4 FUNCTION ZNEG(INDXX)          *
  23136. C *                                                *
  23137. C **************************************************
  23138. C
  23139. C DETERMINES IF VARIABLE POINTED TO BY INDXX IS ZERO OR NEGATIVE
  23140. C OR UNDEFINED AS OPPOSED TO BEING DEFINED AND POSITIVE
  23141. C
  23142. C     RETURNS      1   IF TRUE (ZERO OR NEGATIVE OR UNDEFINED)
  23143. C                  0   IF FALSE (POSITIVE)
  23144. C
  23145. C ZNEG CALLS ERRMSG TO PRINT ERROR MESSAGES.
  23146. C
  23147. C ZNEG IS CALLED BY CALC AND CMND.
  23148. C
  23149. C   VARIABLE       USE
  23150. C
  23151. C     INDXX      POINTER TO VARIABLE BEING TESTED
  23152. C     I,K        HOLDS TEMPORARY VALUES
  23153. C     ZNEG       RETURN VALUE
  23154. C     INT        HOLD INTEGER*4 VALUES
  23155. C     REAL       HOLD REAL*8 VALUES
  23156. C
  23157. C
  23158. C
  23159. C    INTEGER FUNCTION ZNEG*4(INDXX)
  23160.     REAL*8 REAL
  23161. C
  23162.     INTEGER*4 INT
  23163. C
  23164.     InTeGer*4 TYPE(1,2),VLEN(9),INDXX
  23165. C
  23166.     CHARACTER*1 AVBLS(24,27),FOUR(4),EIGHT(8)
  23167.     Real*8 VAVBLS(3,27)
  23168.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  23169.     CHARACTER*1 VBLS(8,1,1)
  23170. C
  23171.     EQUIVALENCE (EIGHT,REAL),(FOUR,INT)
  23172. C
  23173.     COMMON/V/ TYPE,AVBLS,VBLS,VLEN
  23174. C
  23175. C DEFAULT SETTING OF TRUE
  23176.     ZNEG=1
  23177.     CALL TYPGET(INDXX,1,K)
  23178. C    K=TYPE(INDXX,1)
  23179.     IF(K.GT.0)GO TO 50
  23180. C
  23181. C VARIABLE UNDEFINED
  23182.     CALL UVT100(1,1,1)
  23183.     CALL SWRT('Undefined Vbl',13)
  23184. C    CALL ERRMSG(16)
  23185.     GO TO 10000
  23186. C
  23187. 50    GOTO(100,200,300,300,400,400,400,300,200),K
  23188.     STOP 50
  23189. C
  23190. C ASCII
  23191. 100    IF(AVBLS(1,INDXX).LE.Char(0))GO TO 10000
  23192.     GO TO 9998
  23193. C
  23194. C DECIMAL AND REAL
  23195. 200    DO 210 I=1,8
  23196. 210    EIGHT(I)=AVBLS(I,INDXX)
  23197.     IF(REAL.LE.0.0D0)GO TO 10000
  23198.     GO TO 9998
  23199. C
  23200. C INTEGER, HEX, AND OCTAL
  23201. 300    DO 310 I=1,4
  23202. 310    FOUR(I)=AVBLS(I,INDXX)
  23203.     IF(INT.LE.0)GO TO 10000
  23204.     GO TO 9998
  23205. C
  23206. C MULTIPLE PRECISION
  23207. 400    IF(ICHAR(AVBLS(20,INDXX)).NE.0) GOTO 10000
  23208.     GO TO 9998
  23209. C
  23210. 9998    ZNEG=0
  23211. 10000    RETURN
  23212.     END
  23213. c -h- rimcmd.for    Fri Aug 22 13:04:33 1986    
  23214. C RIM-V INTERFACE FUNCTIONS
  23215. C
  23216.     SUBROUTINE RIMCMD(LINE)
  23217.     CHARACTER*1 LINE(80)
  23218.     CHARACTER*62 LINEC
  23219. C    EQUIVALENCE(LINEC(1:1),LINE(1))
  23220. C    INCLUDE VKLUGPRM.FTN''
  23221. C COPYRIGHT (C) 1983 GLENN EVERHART
  23222.     Include aparms.inc
  23223.     INTEGER RETCD
  23224. C
  23225. C DEFINE FILE AREAS FOR MAPPING FILES...
  23226. C ONE INPUT FILE, TO BE ACCESSED AS A RANDOM ACCESS FILE OF 128 BYTE
  23227. C RECORDS OF DATA IF RANDOM, OR AS A FORMULA FILE IF SEQUENTIAL, AND
  23228. C ONE OUTPUT FILE TO BE WRITTEN THE SAME WAY. INPUT FILE CAN BE
  23229. C INPUT - ONLY OR READ/WRITE.
  23230. C
  23231.     integer rmstat
  23232.     common/rimcom/rmstat
  23233. c rmstat returns 0 on success,  >0 for error, <0 for end of data
  23234. C
  23235.     CHARACTER*1 AVBLS(24,27),VBLS(8,1,1)
  23236.     Real*8 VAVBLS(3,27)
  23237.     Equivalence (VAVBLS(1,1),AVBLS(1,1))
  23238.     InTeGer*4 TYPE(1,2),VLEN(9)
  23239.     REAL*8 XAC,XVBLS(1,1)
  23240.     REAL*8 TAC,UAC,VAC,WAC,YAC
  23241.     REAL*8 TMP
  23242.     INTEGER*4 JVBLS(2,1,1)
  23243.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  23244.     EQUIVALENCE(XAC,AVBLS(1,27))
  23245.     EQUIVALENCE(TAC,AVBLS(1,20))
  23246.     EQUIVALENCE(UAC,AVBLS(1,21))
  23247.     EQUIVALENCE(VAC,AVBLS(1,22))
  23248.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  23249.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  23250.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  23251. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  23252. CCC    CHARACTER*1 XTNCMD(80)
  23253. C ***<<<< RDD COMMON START >>>***
  23254.     InTeGer*4 RRWACT,RCLACT
  23255. C    COMMON/RCLACT/RRWACT,RCLACT
  23256.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  23257.      1  IDOL7,IDOL8
  23258. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  23259. C     1  IDOL7,IDOL8
  23260.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  23261. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  23262.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  23263. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  23264. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  23265. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  23266.     InTeGer*4 KLVL
  23267. C    COMMON/KLVL/KLVL
  23268.     InTeGer*4 IOLVL,IGOLD
  23269. C    COMMON/IOLVL/IOLVL
  23270. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  23271. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  23272.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  23273.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  23274.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  23275.      3  k3dfg,kcdelt,krdelt,kpag
  23276. c    COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  23277. c     1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  23278. c     2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  23279. C ***<<< RDD COMMON END >>>***
  23280. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  23281. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  23282. CCC    InTeGer*4 RRWACT,RCLACT
  23283. CCC    COMMON/RCLACT/RRWACT,RCLACT
  23284. C ***<<< XVXTCD COMMON START >>>***
  23285.     CHARACTER*1 OARRY(100)
  23286.     InTeGer*4 OSWIT,OCNTR
  23287. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  23288. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  23289.     InTeGer*4 IPS1,IPS2,MODFLG
  23290. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  23291.        InTeGer*4 XTCFG,IPSET,XTNCNT
  23292.        CHARACTER*1 XTNCMD(80)
  23293. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  23294. C VARY FLAG ITERATION COUNT
  23295.     INTEGER KALKIT
  23296. C    COMMON/VARYIT/KALKIT
  23297.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  23298.     InTeGer*4 RCMODE,IRCE1,IRCE2
  23299. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  23300. C     1  IRCE2
  23301. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  23302. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  23303. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  23304. C RCFGX ON.
  23305. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  23306. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  23307. C  AND VM INHIBITS. (SETS TO 1).
  23308.     INTEGER*4 FH
  23309. C FILE HANDLE FOR CONSOLE I/O (RAW)
  23310. C    COMMON/CONSFH/FH
  23311.     CHARACTER*1 ARGSTR(52,4)
  23312. C    COMMON/ARGSTR/ARGSTR
  23313.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  23314.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  23315.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  23316.      3  IRCE2,FH,ARGSTR
  23317. C ***<<< XVXTCD COMMON END >>>***
  23318. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  23319. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  23320. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  23321. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  23322. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  23323. C (IMPLEMENT FOR VAX ONLY)
  23324. CCC    INTEGER KALKIT
  23325. CCC    COMMON/VARYIT/KALKIT
  23326. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  23327. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  23328. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  23329. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  23330.     DIMENSION NRDSP(JIDcl,JIDrw),NCDSP(JIDcl,JIDrw)
  23331.     COMMON/D2R/NRDSP,NCDSP
  23332. C ***<<< KLSTO COMMON START >>>***
  23333.     InTeGer*4 DLFG
  23334. C    COMMON/DLFG/DLFG
  23335.     InTeGer*4 KDRW,KDCL
  23336. C    COMMON/DOT/KDRW,KDCL
  23337.     InTeGer*4 DTRENA
  23338.     Integer*4 rimopn
  23339. C    COMMON/DTRCMN/DTRENA
  23340.     REAL*8 EP,PV,FV
  23341.     DIMENSION EP(20)
  23342.     INTEGER*4 KIRR
  23343. C    COMMON/ERNPER/EP,PV,FV,KIRR
  23344.     InTeGer*4 LASTOP
  23345. C    COMMON/ERROR/LASTOP
  23346.     CHARACTER*1 FMTDAT(9,Ifmtbk)
  23347. C    COMMON/FMTBFR/FMTDAT
  23348.     CHARACTER*1 EDNAM(16)
  23349. C    COMMON/EDNAM/EDNAM
  23350.     InTeGer*4 MFID(2),MFMOD(2)
  23351. C    COMMON/FRM/MFID,MFMOD
  23352.     InTeGer*4 JMVFG,JMVOLD
  23353. C    COMMON/FUBAR/JMVFG,JMVOLD
  23354.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  23355.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  23356. C ***<<< KLSTO COMMON END >>>***
  23357. CCC    InTeGer*4 DTRENA
  23358. CCC    COMMON/DTRCMN/DTRENA
  23359.     CHARACTER *1 LINECL(82)
  23360. C    CHARACTER*70 LINEC
  23361.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  23362. C    CHARACTER*80 SCRBUF
  23363.     CHARACTER*1 LBUF(128)
  23364.     CHARACTER*1 MBUF(128)
  23365.     CHARACTER*110 CLBUF,CMBUF
  23366.     CHARACTER*50 CCLBUF,CCMBUF
  23367.     CHARACTER*11 C11LBF
  23368.     real*4 real4(2)
  23369.     integer*4 int4r(2)
  23370.     real*8 real8
  23371.     equivalence(real8,real4(1))
  23372.     equivalence(int4r(1),real4(1))
  23373.     integer*4 ivalue(1430)
  23374.     real*4 value(1430)
  23375.     equivalence(value(1),ivalue(1))
  23376.     character*4 cvalue(1430)
  23377.     equivalence (cvalue(1),ivalue(1))
  23378.     real*8 dvalue(715)
  23379.     equivalence (dvalue(1),value(1))
  23380.     character*8 char8
  23381.     character*4 char4
  23382.     integer*4 ichar8(2),ichar4
  23383. c use these to long-align arguments
  23384.     equivalence(char8,ichar8(1)),(char4,ichar4)
  23385. C    EQUIVALENCE(C11LBF(1:1),CLBUF(1:1))
  23386.     logical lkey,lvar
  23387.     EQUIVALENCE(CLBUF(1:1),CCLBUF(1:1),LBUF(1),C11LBF(1:1)),
  23388.      1  (CMBUF(1:1),CCMBUF(1:1),MBUF(1))
  23389. C    EQUIVALENCE(CLBUF,LBUF(1)),(CMBUF,MBUF(1))
  23390. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  23391.     CHARACTER*9 FMTB
  23392.     EQUIVALENCE (FMTB(1:1),LBUF(120))
  23393. c    CHARACTER*11 FMTBF
  23394. c    CHARACTER*1 IFVLD
  23395.     integer*4 isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  23396.     common/isv/isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  23397.     character*132 inmsg
  23398.     integer inmsgf
  23399.     common/rinmsg/inmsgf,inmsg
  23400.     integer klug
  23401.     save klug
  23402.     data klug/0/
  23403. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  23404.     DO 3332 N=1,80
  23405.     NN=81-N
  23406.     IF(ICHAR(LINE(NN)).GT.32)GOTO 3333
  23407.     LINE(NN)=CHAR(0)
  23408. 3332    CONTINUE
  23409. 3333    CONTINUE
  23410. C SPACE FILL ENTIRE ARRAY
  23411.     DO 3334 N=1,82
  23412. 3334    LINECL(N)=CHAR(32)
  23413.     RETCD=1
  23414. C HANDLE RIMCMD FUNCTIONS. LINE ARRAY PASSED IN HERE
  23415. C STARTS AFTER THE "CMD" SO WE CAN DECODE IT.
  23416. C EXECUTE RIM COMMAND
  23417. C  DTRCMD (COMMAND) GIVES DTR COMMAND FACILITY AT COMMAND
  23418. C LEVEL.
  23419. 500    CONTINUE
  23420. C ENABLE/DISABLE FOR DTR FUNCTIONS
  23421. C SETTING CMDENA TO -1 IMPLIES DISABLE FUNCTIONS
  23422. 600    CONTINUE
  23423. C cmdklon enables attempt to recognize RIM phony "DOUB"
  23424. C values. cmdklof disables so dbl can be used with analy
  23425. C correctly.
  23426.     CALL SCMP(LINE,'KLON',4,ICODE)
  23427.     IF(ICODE.NE.1)GOTO 641
  23428.     klug=1
  23429. 641    continue
  23430.     CALL SCMP(LINE,'KLOF',4,ICODE)
  23431.     IF(ICODE.NE.1)GOTO 643
  23432.     klug=0
  23433. 643    continue
  23434. C cmdopen dbname - open database (must exist!)
  23435.     CALL SCMP(LINE,'OPEN',4,ICODE)
  23436.     IF(ICODE.NE.1)GOTO 700
  23437.     char8='        '
  23438.     do 601 n=1,8
  23439.         if(ichar(line(n+5)).lt.32)goto 601
  23440.     char8(n:n)=line(n+5)
  23441. 601    continue
  23442.     call RMOPEN(ichar8)
  23443.     if(rmstat.eq.0.or.rmstat.eq.16)call RMLREL
  23444.     if(rmstat.eq.0)rimopn=1
  23445.     if(rmstat.eq.0.or.rmstat.eq.16.or.rmstat.eq.90)goto 9999
  23446.     call uvt100(1,1,1)
  23447. c position to top
  23448.     call vwrt('Error on opening database',25)
  23449.     GOTO 9999
  23450. 700    CONTINUE
  23451.     CALL SCMP(LINE,'USER',4,ICODE)
  23452. C Set user password
  23453.     IF(ICODE.NE.1)GOTO 3800
  23454.         char8='        '
  23455.     do 701 n=1,8
  23456.         if(ichar(line(n+5)).lt.32)goto 701
  23457.     char8(n:n)=line(n+5)
  23458. 701    continue
  23459.     call RMUSER(ichar8)
  23460.     call RMLREL
  23461.     if(rmstat.eq.0)rimopn=1
  23462.     GOTO 9999
  23463. 3800    CONTINUE
  23464. c    GOTO 9999
  23465. 4100    CONTINUE
  23466.     CALL SCMP(LINE,'CLOSE',5,ICODE)
  23467. C CLOSE OUTPUT 
  23468.     IF(ICODE.NE.1)GOTO 4200
  23469.     call RMCLOS
  23470.     rimopn=0
  23471.     GOTO 9999
  23472. 4200    CONTINUE
  23473.     CALL SCMP(LINE,'GETATT',6,ICODE)
  23474.     IF(ICODE.NE.1)GOTO 4600
  23475. C Gets attributes of a relation (= column labels) and stores in formula of cells.
  23476. C We assume that a start cell is given and we fill in cells across from this cell
  23477. C until we are done. The command format is
  23478. C CMDGETATT relname, startcell:endcell (in a row!)
  23479. C Result is saved as aname (8 chars). In addition the numerical value
  23480. C of the 1st cell is the # rows in the relation.
  23481.         char8='        '
  23482.     do 801 n=1,8
  23483.     if(line(n+7).eq.',')goto 802
  23484.         if(ichar(line(n+7)).lt.32)goto 801
  23485.     char8(n:n)=line(n+7)
  23486. 801    continue
  23487. 802    continue
  23488. c char8 is now relname
  23489.     call rmgrel(char8,lrpw,lmpw,lastmod,numatt,numrows)
  23490.     if(rmstat.ne.0)goto 9999
  23491. C get here if we got a relation as specified.
  23492. c Now try and decode the cell name
  23493.     icomma=indx(line,44)
  23494. C LOCHR = START CHAR
  23495.     IBGN=icomma+1
  23496.     IVLD=0
  23497.     CALL GMTX(LINE,IBGN,LSTCH,JD1,JD2,IXRH,IXCH,IVLD)
  23498.     IF(IVLD.EQ.3)GOTO 9990
  23499.     maxcol=max(ixrh-jd1,ixch-jd2)
  23500. C now we have space user wants to allow
  23501.     if(maxcol.le.0)goto 9999
  23502.     tmp=numrows
  23503. C set value of cell numerically to number of rows
  23504.     CALL XVBLST(JD1,JD2,TMP)
  23505.     call fvldst(jd1,jd2,char(255))
  23506. C sets the cell as a text cell, but with desired numerical value.
  23507.     CALL REFLEC(jd2,jd1,IRXL)
  23508. C Read the cell (to get format data etc.)
  23509.     CALL WRKFIL(IRXL,LBUF,0)
  23510. C NOW zero all but what we need
  23511.     DO 4850 N=1,110
  23512.     lbuf(n)=char(32)
  23513.     if(n.le.8)lbuf(n)=char8(n:n)
  23514. 4850    CONTINUE
  23515.     lbuf(110)=char(0)
  23516. C now we have set up the cell initially with the relation name
  23517.     write(clbuf(11:16),4849)numatt
  23518. 4849    format(i6)
  23519.     lbuf(119)=char(255)
  23520.     call wrkfil(irxl,lbuf,1)
  23521. c encode the number of attributes in this relation also.
  23522. c now go across by 1 cell
  23523.     jd1=jd1+1
  23524.     call rmlatt(char8)
  23525. c the above initializes attribute seeks
  23526.     if(rmstat.ne.0)goto 9999
  23527. c now commence save of attribute names etc. in  cells.
  23528. c encoding as follows:
  23529. c  aname - 8 characters   col 1-8
  23530. c  type  - 4 characters   col 20-23 +30 cols for all...
  23531. c  matvec - 4 chars - 'mat ', 'vec ', or '    ' col 24-27
  23532. c  len1  - 8 chars - length  col 28-35
  23533. c  len2  - 8 chars - length 2 col 36-43
  23534. c  column - 8 chars col 44-51
  23535. c  keyed - 1 char col 52 (T/F)
  23536. c  var - 1 char, col 53 (t/f)
  23537.     if(numatt.gt.2000)numatt=Mrows*4
  23538.     numatt=min0(numatt,maxcol)
  23539. C ensure we only bash what user wanted (or a reasonable max for size of
  23540. C compiled spreadsheet)
  23541.     do 4860 n=1,numatt
  23542.     call rmgatt(char8,ityp,imat,lvar,ilen1,ilen2,icol,lkey)
  23543.     if(rmstat.ne.0)goto 4861
  23544. c note we limit this to mrows*4 rows. If need more, need a bigger compile... 
  23545.     CALL REFLEC(jd2,jd1,IRXL)
  23546. C Read the cell (to get format data etc.)
  23547.     CALL WRKFIL(IRXL,LBUF,0)
  23548. C NOW zero all but what we need
  23549.     DO 4870 kN=1,109
  23550.     lbuf(kn)=char(32)
  23551.     if(kn.le.8)lbuf(kn)=char8(kn:kn)
  23552. 4870    CONTINUE
  23553.     lbuf(110)=char(0)
  23554. c mark as text cell
  23555.     call fvldst(jd1,jd2,char(255))
  23556.     lbuf(119)=char(255)
  23557.     write(clbuf(50:83),4871)ityp,imat,ilen1,ilen2,icol,ikey,lvar
  23558. 4871    format(a4,a4,i8,i8,i8,l1,l1)
  23559.     call wrkfil(irxl,lbuf,1)
  23560. c Go to next cell over now.
  23561.     jd1=jd1+1
  23562. 4860    continue
  23563. 4861    continue
  23564. C note this format is chosen so that attribute names can be displayed as column
  23565. c labels. As long as only 50 chars are displayed, the extra info will not
  23566. c be visible. It is likely that any wider fields would need a different
  23567. C front end anyway.
  23568.     GOTO 9999
  23569. 4600    CONTINUE
  23570.     call scmp(line,'FIND',4,ICODE)
  23571. c RMFIND call
  23572.     if(icode.ne.1)goto 4800
  23573. c CMDFIND dbname
  23574.         char8='        '
  23575.     do 901 n=1,8
  23576.         if(ichar(line(n+5)).lt.32)goto 901
  23577.     char8(n:n)=line(n+5)
  23578. 901    continue
  23579.     call rmfind(0,ichar8)
  23580.     goto 9999
  23581. 4800    continue
  23582.     call scmp(line,'WHERE',5,icode)
  23583.     if(icode.ne.1)goto 4855
  23584. C rmwher call
  23585. C if command would be WHERE attribute oper value, use cmd
  23586. C cmdwhere attcell:valuecell,oper
  23587. C attcell will be a cell where the attribute name and other info has been
  23588. C stored via a call to CMDGETATT and valuecell will be where the value is.
  23589. C If the select is on text, the formula in the cell will be used. If
  23590. C the select is on a numeric, the value will.
  23591. C limit this to very simple where clauses (for now, at least)
  23592. c first gather the arguments while we may...
  23593.     IBGN=6
  23594.     IVLD=0
  23595.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  23596.     IF(IVLD.EQ.3)GOTO 9990
  23597.     char4='    '
  23598.     ic1=indx(line,44)
  23599.     nn=0
  23600.     ic1=ic1+1
  23601.     ic2=ic1+4
  23602.     do 904 n=ic1,ic2
  23603.     nn=nn+1
  23604.     char4(nn:nn)=line(n)
  23605. 904    continue
  23606.     ioper=ichar4
  23607.     ic1=icm2+1
  23608. c get attr cell to get attr name and type info
  23609.     call reflec(ixcl,ixrl,irx)
  23610.     call wrkfil(irx,lbuf,0)
  23611.     char8=clbuf(1:8)
  23612. c char8 is now attribute name
  23613. c cols 50-53 hold type info for this attribute
  23614.     char4=clbuf(50:53)
  23615. c char4 is now the type.
  23616.     do 903 n=1,30
  23617. 903    ivalue(n)=0
  23618.     if(char4.eq.'TEXT'.or.ioper.eq.'EQA ') goto 910
  23619. C a numerical type datum. Tread as int or float
  23620. C Find out if it's an integer or not; assume INT is integer and everything else
  23621. C is float...
  23622. C first however get spreadsheet value. Assume that this is floating point (most
  23623. C such values are).
  23624.     call xvblgt(ixrh,ixch,tmp)
  23625.     dvalue(1)=0.0d0
  23626.     if(char4.ne.'INT ')goto 905
  23627.     ivalue(1)=tmp
  23628.     goto 915
  23629. 905    continue
  23630.     if (char4.ne.'REAL')goto 906
  23631.     value(1)=tmp
  23632.     goto 915
  23633. 906    continue
  23634.     if (char4.ne.'DOUB')goto 907
  23635.     call fpfin(tmp)
  23636.     dvalue(1)=tmp
  23637.     goto 915
  23638. 907    continue
  23639. c mat or vec. punt...can't really handle this...
  23640.     ivalue(1)=1
  23641.     ivalue(2)=0
  23642.     dvalue(2)=tmp
  23643.     goto 915
  23644. 910    Continue
  23645.     call reflec(ixch,ixrh,irx)
  23646.     call wrkfil(irx,lbuf,0)
  23647. c read in value cell to get formula to use
  23648.     if(ioper.eq.'EQA ')lbuf(9)=char(0)
  23649. c if this is attribute comparison, stop the character scan after attribute name.
  23650.     do 911 n=1,110
  23651.     k=n-1
  23652.     if(ichar(lbuf(n)).eq.0)goto 912
  23653. 911    continue
  23654. 912    continue
  23655. c k is length of formula now.
  23656.     ivalue(1)=k
  23657.     ivalue(2)=0
  23658.     kk=1
  23659.     do 913 n=1,28
  23660.     cvalue(n+2)=clbuf(kk:kk+3)
  23661.     kk=kk+4
  23662. c we just copy the whole buffer into our array, but pass the correct count.
  23663. 913    continue
  23664. 915    Continue
  23665.     kk=0
  23666.     call rmwher(0,char8,ioper,value,1,kk,1)
  23667. 4855    continue
  23668.     CALL SCMP(LINE,'SORT',4,ICODE)
  23669.     IF(ICODE.NE.1)GOTO 4630
  23670. C CMDSORT - implements rmsort call.
  23671. C This too is simplified: call is
  23672. C cmdsort attcell:typcell
  23673. C where typcell contains a letter A or D for sort type of each attribute
  23674. C in attcell. (Only 1st 50 columns of attcell are used). This
  23675. C controls sort directions. Anything not an A is assumed to be a D.
  23676.     IBGN=5
  23677.     IVLD=0
  23678.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  23679.     IF(IVLD.EQ.3)GOTO 9990
  23680. c now must get the attcell.
  23681.     call reflec(ixcl,ixrl,irx)
  23682.     call wrkfil(irx,mbuf,0)
  23683.     mbuf(49)=char(0)
  23684.     call reflec(ixch,ixrh,irx)
  23685.     call wrkfil(irx,lbuf,0)
  23686.     numsort=0
  23687.     do 4852 n=1,6
  23688.     if (lbuf(n).ne.'D'.and.lbuf(n).ne.'A')goto 4852
  23689.     ii=1+(n-1)*8
  23690.     if(ichar(mbuf(ii)).lt.65)goto 4852
  23691.     numsort=numsort+1
  23692. c relations start with alphas...
  23693.     ivalue(n)=1
  23694.     if(lbuf(n).eq.'D')ivalue(n)=-1
  23695. 4852    continue
  23696.     call rmsort(0,mbuf,numsort,ivalue)
  23697. c this does the "sorted by" clause...
  23698.     GOTO 9999
  23699. 4630    CONTINUE
  23700.     CALL SCMP(LINE,'GET',3,ICOD)
  23701.     IF(ICOD.NE.1)GOTO 4700
  23702. C CMDGET titlecell,ulcell:lrcell gets data into area
  23703.     LO=4
  23704.     LHI=21
  23705.     LSTCHR=LHI
  23706.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  23707.     IF(IVLD.EQ.0)GOTO 9990
  23708. c now have relation title line cell ID
  23709. C next get the area to be filled in. We use the "value" array again
  23710. C since there's no lower limit on size of what can come in...one gets
  23711. C an entire row at a time.
  23712.     IBGN=lstchr+1
  23713.     IVLD=0
  23714.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  23715.     IF(IVLD.EQ.3)GOTO 9990
  23716. C now have pointers to the area to be filled in.
  23717. C first decode number of attributes from relation name cell
  23718.     call reflec(jd2,jd1,irx)
  23719.     call wrkfil(irx,mbuf,0)
  23720.     read(cmbuf(11:16),4849,err=9999)numatt
  23721.     if(numatt.le.0.or.numatt.gt.200)goto 9990
  23722.     jd1=jd1+1
  23723. c pass "relation name" cell
  23724.     jd1sav=jd1
  23725.     do 4636 n36=ixcl,ixch
  23726. c load a row of relation
  23727.     call rmget(0,value)
  23728.     if(rmstat.ne.0)goto 4640
  23729.     inptr=1
  23730. c inptr is pointer into value array
  23731.     jd1=jd1sav
  23732.     call reflec(jd2,jd1,irx)
  23733.     call wrkfil(irx,mbuf,0)
  23734. c read in guide cell to get type info
  23735.     do 4635 n35=ixrl,ixrh
  23736.     if((n35-ixrl+1).gt.numatt)goto 4635
  23737. C make some assumptions which in general are false but which will usually
  23738. c be true:
  23739. C no matrices or vecs
  23740. C ints are 4 bytes long
  23741. C reals are 4 bytes long
  23742. C doubs are 8 bytes long
  23743. c text is always variable length
  23744. c fill in value only for all types except text; for these
  23745. c fill in formula (to max we can accept)
  23746.     if (cmbuf(50:53).eq.'TEXT')goto 4660
  23747. c numeric type, assume it is fixed size
  23748.     tmp=ivalue(inptr)
  23749.     if (cmbuf(50:53).eq.'REAL')tmp=value(inptr)
  23750.     if (cmbuf(50:53).ne.'DOUB')goto 4663
  23751.     int4r(1)=ivalue(inptr)
  23752.     inptr=inptr+1
  23753.     int4r(2)=ivalue(inptr)
  23754.     tmp=real8
  23755.     call fpfout(tmp)
  23756. c kludge because rim doesn't really store dbl precision.
  23757. c this lets one read it anyway but won't work correctly for
  23758. c data storage. The answer seems to be that the DOUB
  23759. c attribute is not supported correctly. You can use it
  23760. c from AnalytiCalc only and it will work right, but interactive
  23761. C rim will screw up.
  23762.     if(klug.ne.0.and.int4r(2).eq.0)tmp=real4(1)
  23763. 4663    continue
  23764.     call fvldst(n35,n36,char(3))
  23765.     call xvblst(n35,n36,tmp)
  23766. c store value and set valid cell up.
  23767.     call reflec(n36,n35,irxx)
  23768.     call wrkfil(irxx,lbuf,0)
  23769.     write(clbuf(1:30),4664)tmp
  23770. 4664    format(d30.22)
  23771.     lbuf(31)=char(0)
  23772.     call wrkfil(irxx,lbuf,1)
  23773.     goto 4661
  23774. 4660    continue
  23775. c text value.
  23776.     n=ivalue(inptr)
  23777.     if(n.le.0.or.n.gt.1030)goto 9999
  23778.     nchr=ivalue(n)
  23779. c get data starting at n+1
  23780.     nov4=(nchr+3)/4
  23781. c nov4 is no. 4 byte char cells to move
  23782. c max 26
  23783.     if(nov4.gt.26)nov4=26
  23784.     if(nov4.le.0)goto 4661
  23785. c badly formed array ==> get out fast!
  23786.     call reflec(n36,n35,irxx)
  23787.     call fvldst(n35,n36,char(255))
  23788.     call wrkfil(irxx,lbuf,0)
  23789. c read in current cell contents
  23790.     kk67=1
  23791.     do 4667 n67=1,nov4
  23792.     k67=kk67+3
  23793.     clbuf(kk67:k67)=cvalue(n+n67+1)
  23794.     kk67=kk67+4
  23795. 4667    continue
  23796.     call wrkfil(irxx,lbuf,1)
  23797. c writes out the data
  23798. c    inptr=inptr+nov4+1
  23799. c pass the text
  23800. 4661    continue
  23801.     inptr=inptr+1
  23802. C go to next guide cell
  23803.     jd1=jd1+1
  23804.     call reflec(jd2,jd1,irx)
  23805.     call wrkfil(irx,mbuf,0)
  23806. 4635    continue
  23807. 4636    continue
  23808. 4640    continue
  23809. 4700    CONTINUE
  23810.     CALL SCMP(LINE,'DEL',3,ICODE)
  23811.     IF(ICODE.NE.1)GOTO 4830
  23812. C rmdel interface
  23813. C just deletes N rows
  23814. C cmddel vardel
  23815. C where value of vardel says how many rows to delete
  23816.     LO=4
  23817.     LHI=21
  23818.     LSTCHR=LHI
  23819.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  23820.     IF(IVLD.EQ.0)GOTO 9990
  23821.     call xvblgt(jd1,jd2,tmp)
  23822.     ndel=tmp
  23823.     if(ndel.le.0.or.ndel.gt.10000)goto 9990
  23824.     do 4780 n=1,ndel
  23825.     call rmdel(0)
  23826.     if(rmstat.ne.0)goto 9990
  23827. 4780    continue
  23828.     goto 9990
  23829. 4830    continue
  23830. C rmput call. Just assume user has positioned via rmget already.
  23831. C cmdput titlecell,valuerowcelllo:valuerowcellhi
  23832.     iputlod=0
  23833.     CALL SCMP(LINE,'PUT',3,ICODe)
  23834.     IF(ICODE.eq.1)iputlod=1
  23835.     call scmp(LINE,'LOD',3,ICODe)
  23836.     if(icode.eq.1)iputlod=2
  23837. c make it easier...allow cmdloa or cmdlod (SYNONYMS)
  23838.     call scmp(LINE,'LOA',3,ICODe)
  23839.     if(icode.eq.1)iputlod=2
  23840.     if(iputlod.eq.0)goto 4900
  23841. C CMDGET titlecell,ulcell:lrcell gets data into area
  23842.     LO=4
  23843.     LHI=21
  23844.     LSTCHR=LHI
  23845.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  23846.     IF(IVLD.EQ.0)GOTO 9990
  23847. c now have relation title line cell ID
  23848. C next get the area to be filled in. We use the "value" array again
  23849. C since there's no lower limit on size of what can come in...one gets
  23850. C an entire row at a time.
  23851.     IBGN=lstchr+1
  23852.     IVLD=0
  23853.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  23854.     IF(IVLD.EQ.3)GOTO 9990
  23855. C now have pointers to the area to be filled in.
  23856. C first decode number of attributes from relation name cell
  23857.     call reflec(jd2,jd1,irx)
  23858.     call wrkfil(irx,mbuf,0)
  23859.     read(cmbuf(11:16),4849,err=9999)numatt
  23860.     if(numatt.le.0.or.numatt.gt.200)goto 9990
  23861.     jd1=jd1+1
  23862.     jd1sav=jd1
  23863.     do 4736 n36=ixcl,ixch
  23864. c load a row of relation
  23865.     if(iputlod.eq.2.and.n35.ne.ixrl)goto 4835
  23866.     call rmget(0,value)
  23867.     if(rmstat.ne.0)goto 4640
  23868. 4835    continue
  23869.     inptr=1
  23870. c inptr is pointer into value array
  23871.     jd1=jd1sav
  23872.     call reflec(jd2,jd1,irx)
  23873.     call wrkfil(irx,mbuf,0)
  23874. c read in guide cell to get type info
  23875.     locatt=numatt*2+1
  23876.     do 4735 n35=ixrl,ixrh
  23877.     if((n35-ixrl+1).gt.numatt)goto 4735
  23878. C make some assumptions which in general are false but which will usually
  23879. c be true:
  23880. C no matrices or vecs
  23881. C ints are 4 bytes long
  23882. C reals are 4 bytes long
  23883. C doubs are 8 bytes long
  23884. c text is always variable length
  23885. c fill in value only for all types except text; for these
  23886. c fill in formula (to max we can accept)
  23887. c    call fvldst(n35,n36,char(3))
  23888.     call xvblgt(n35,n36,tmp)
  23889. c store value and set valid cell up.
  23890.     call reflec(n36,n35,irxx)
  23891.     call wrkfil(irxx,lbuf,0)
  23892.     if (cmbuf(50:53).eq.'TEXT')goto 4760
  23893. c numeric type, assume it is fixed size
  23894.     ivalue(inptr)=tmp
  23895.     if (cmbuf(50:53).eq.'REAL')value(inptr)=tmp
  23896.     if (cmbuf(50:53).ne.'DOUB')goto 4763
  23897.     call fpfin(tmp)
  23898.     real8=tmp    
  23899.     ivalue(inptr)=int4r(1)
  23900.     inptr=inptr+1
  23901.     ivalue(inptr)=int4r(2)
  23902. c    if(ivalue(inptr).eq.0)value(inptr-1)=tmp
  23903. 4763    continue
  23904. c    call fvldst(n35,n36,char(3))
  23905.     goto 4761
  23906. 4760    continue
  23907. c text value.
  23908.     ivalue(inptr)=locatt
  23909.     n=locatt
  23910.     locatt=locatt+2
  23911.     if(n.le.0.or.n.gt.1030)goto 9999
  23912. c get data starting at n+1
  23913.     call reflec(n36,n35,irxx)
  23914.     call wrkfil(irxx,lbuf,0)
  23915. c read in current cell contents
  23916. c get text size
  23917.     do 4745 n45=1,109
  23918.     nchr=n45 - 1
  23919.     if(ichar(lbuf(n45)).eq.0)goto 4746
  23920. 4745    continue
  23921. 4746    continue
  23922.     ivalue(n)=nchr
  23923. c null 2nd dim
  23924.     ivalue(n+1)=0
  23925.     nov4=(nchr+3)/4
  23926. c nov4 is no. 4 byte char cells to move
  23927. c max 26
  23928.     if(nov4.gt.26)nov4=26
  23929.     if(nov4.le.0)goto 9999
  23930. c badly formed array ==> get out fast!
  23931.     kk67=1
  23932.     do 4767 n67=1,nov4
  23933.     k67=kk67+3
  23934.     cvalue(n+n67+1)=clbuf(kk67:k67)
  23935.     kk67=kk67+4
  23936. 4767    continue
  23937.     locatt=locatt+nov4
  23938. c adjust pointer to skip data
  23939. 4761    continue
  23940.     inptr=inptr+1
  23941.     jd1=jd1+1
  23942.     call reflec(jd2,jd1,irx)
  23943.     call wrkfil(irx,mbuf,0)
  23944. 4735    continue
  23945.     if(iputlod.eq.2)goto 4862
  23946.     call rmput(0,value)
  23947.     goto 4863
  23948. 4862    continue
  23949.     call rmload(0,value)
  23950. 4863    continue
  23951. C write out the records over the ones last there
  23952. C go to next guide cell
  23953. 4736    continue
  23954. 4740    continue
  23955. 4900    continue
  23956.     CALL SCMP(LINE,'RIM',3,ICODE)
  23957.     IF(ICODE.NE.1)GOTO 5000
  23958. C CMDRIM interface...Begin RIM command
  23959. C mode where, until we see a RETURN command, RIM just handles all text input
  23960. C and output (via our subroutines). 
  23961.     inmsgf=0
  23962.     call rmmain
  23963.     GOTO 9999
  23964. 5000    CONTINUE
  23965.     CALL SCMP(LINE,'IRIM',4,ICODE)
  23966.     IF(ICODE.NE.1)GOTO 5100
  23967. C irim... CMDIRIM works like CMDRIM except it feeds rest of line to RIM
  23968. C followed by a RETURN command (via a little magic in atxti)
  23969.     do 5002 n=1,76
  23970.     inmsg(n:n)=line(n+4)
  23971. 5002    continue
  23972.     inmsgf=1
  23973.     call rmmain
  23974.     goto 9999
  23975. 5100    continue
  23976.     CALL SCMP(LINE,'SAV',3,ICODE)
  23977.     IF(ICODE.NE.1)GOTO 5200
  23978. C Cmdsav cell:cell saves text output
  23979.     IBGN=5
  23980.     IVLD=0
  23981. C cmdsav v1:v2 saves text output from rim into cells v1:v2 treated
  23982. C as a 2-d area
  23983. C cmdsav without an argument stops this saving.
  23984. C also it stops when all cells are full.
  23985.     isvfg=0
  23986.     CALL GMTX(LINE,IBGN,LSTCH,isvl1,isvl2,isvh1,isvh2,IVLD)
  23987.     IF(IVLD.EQ.3)GOTO 9990
  23988. c now must get the attcell.
  23989.     jsv1=isvl1
  23990.     jsv2=isvl2
  23991.     isvfg=1
  23992.     goto 9999
  23993. 5200    continue
  23994.     GOTO 9999
  23995. 9990    RETCD=3
  23996. C ERROR RETURN
  23997. 9999    RETURN
  23998.     END
  23999. C subroutines fpfin and fpfout convert sun->vax fp and vax->sun fp
  24000. C respectively...or at least handle format diffs
  24001. C to some extent since real has 8 bit exponent and doub has 11
  24002. C bit exponent on sun. On most machines these routines just return
  24003. C and do nothing.
  24004.     subroutine fpfin(tmp)
  24005. c get sun double in, output "vax" double with all mantissa
  24006. c etc. info and exp. in same format single and double
  24007.     real*8 tmp
  24008.     integer*4 t(2)
  24009.     real*4 r44(2)
  24010.     character*1 c8(8)
  24011.     real*8 f
  24012.     real*4 r4
  24013.     integer*4 ii
  24014.     equivalence (ii,r4)
  24015.     equivalence(f,t(1))
  24016.     equivalence(f,c8(1))
  24017.     equivalence(r44(1),f)
  24018. c kludge version initially
  24019. c    r4=rmp
  24020. c    iexpn=ishft(ii,-23)
  24021. c    ii=ishft(iexpn,23)
  24022. cc gets exponent, bashes mantissa
  24023. c    f=tmp
  24024. c    imnthi=and(t(1),1048575)
  24025. c    imnthi=lshift(imnthi,3)
  24026. c    imntlo=rshift(t(2),29)
  24027. c    imnthi=imnthi+and(imntlo,7)
  24028. c    imntlo=lshift(t(2),3)
  24029. c    t(1)=or(ii,imnthi)
  24030. c    t(2)=imntlo
  24031. c    tmp=f
  24032. cc shoves mantissa around so we save all but 3 bits of it in result
  24033. cccc    r44(1)=tmp
  24034. cccc    t(2)=0
  24035. cccc    tmp=f
  24036.     return
  24037.     end
  24038.     subroutine fpfout(tmp)
  24039. c get "Vax" double in, i.e. 1st word in sun real format
  24040. C output sun double
  24041.     real*8 tmp
  24042.     integer*4 t(2)
  24043.     real*4 r44(2)
  24044.     character*1 c8(8)
  24045.     real*8 f,ggg
  24046.     integer*4 gg(2)
  24047.     equivalence(gg(1),ggg)
  24048.     real*4 r4
  24049.     equivalence(f,t(1))
  24050.     equivalence(f,c8(1))
  24051.     equivalence(r44(1),f)
  24052. c    ggg=r44(1)
  24053. cc this gets a usable exponent...now fix up mantissas
  24054. c    iexpn=rshift(gg(1),20)
  24055. c    iexpn=lshift(iexpn,20)
  24056. c    imnthi=and(t(1),8388607)
  24057. c    jmnthi=rshift(imnthi,3)
  24058. c    gg(1)=or(iexpn,jmnthi)
  24059. c    jmnthi=and(imnthi,7)
  24060. c    imntlo=rshift(t(2),3)
  24061. c    jmnthi=lshift(jmnthi,29)
  24062. c    imntlo=or(jmnthi,imntlo)
  24063. c    gg(2)=imntlo
  24064. c    tmp=ggg
  24065. cccc    f=tmp
  24066. cccc    tmp=r44(1)
  24067.     return
  24068.     end
  24069.     subroutine atxto
  24070. C analyticalc text output to screen routine
  24071. C ***<<< XVXTCD COMMON START >>>***
  24072.     CHARACTER*1 OARRY(100)
  24073.     InTeGer*4 OSWIT,OCNTR
  24074. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  24075. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  24076.     InTeGer*4 IPS1,IPS2,MODFLG
  24077. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  24078.        InTeGer*4 XTCFG,IPSET,XTNCNT
  24079.        CHARACTER*1 XTNCMD(80)
  24080. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  24081. C VARY FLAG ITERATION COUNT
  24082.     INTEGER KALKIT
  24083. C    COMMON/VARYIT/KALKIT
  24084.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  24085.     InTeGer*4 RCMODE,IRCE1,IRCE2
  24086. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  24087. C     1  IRCE2
  24088. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  24089. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  24090. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  24091. C RCFGX ON.
  24092. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  24093. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  24094. C  AND VM INHIBITS. (SETS TO 1).
  24095.     INTEGER*4 FH
  24096. C FILE HANDLE FOR CONSOLE I/O (RAW)
  24097. C    COMMON/CONSFH/FH
  24098.     character*208 cargst
  24099.     CHARACTER*1 ARGSTR(52,4)
  24100.     equivalence(cargst,argstr(1,1))
  24101. C    COMMON/ARGSTR/ARGSTR
  24102.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  24103.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  24104.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  24105.      3  IRCE2,FH,ARGSTR
  24106. C ***<<< XVXTCD COMMON END >>>***
  24107.     integer*4 isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  24108.     common/isv/isvl1,isvl2,isvh1,isvh2,isvfg,jsv1,jsv2
  24109.     include FILES.BLK
  24110.     character*2 crlf
  24111.     character*1 fvd
  24112.     character*128 cmbuf
  24113.     crlf(1:1)=char(13)
  24114.     crlf(2:2)=char(10)
  24115. c MUST revise CRLF definition for end of line as needed in different
  24116. C systems. This one just emits newline...
  24117. C dumps text found in variable c128wk to screen.
  24118.     do 1 n=1,128
  24119. c search for end of actual data and only emit what is really there
  24120.     nn=129-n
  24121.     if(ichar(c128wk(nn:nn)).gt.32)goto 2
  24122. 1    continue
  24123.     return
  24124. 2    continue
  24125. c only emit txt if anything was found over a space
  24126.     call vwrt(c128wk,nn)
  24127. c one could save the text in an accumulator also...
  24128. c put text into argstr however for retrieval if needed.
  24129. c this imposes no particular performance penalty and helps make
  24130. c the data available as needed.
  24131.     cargst=c128wk
  24132. C if we are storing text in a cell range, now store it...
  24133.     if(isvfg.eq.0)goto 3000
  24134. C have to store text...
  24135. C jsv1,jsv2 is cell to use for this. Update it after storage and
  24136. C when at last cell, clear isvfg
  24137.     call reflec(jsv2,jsv1,irx)
  24138. c    call fvldgt(jsv1,jsv2,fvd)
  24139. c    if (ichar(fvd).ne.0)goto 2001
  24140.     fvd=char(255)
  24141.     call fvldst(jsv1,jsv2,fvd)
  24142. c2001    continue
  24143.     call wrkfil(irx,cmbuf,0)
  24144.     cmbuf(1:109)=c128wk(1:109)
  24145.     cmbuf(110:110)=char(0)
  24146.     call wrkfil(irx,cmbuf,1)
  24147. c store the text
  24148.     if(jsv1.eq.isvh1.and.jsv2.eq.isvh2)isvfg=0
  24149. c update the storage address next
  24150.     jsv2=jsv2+1
  24151.     if(jsv2.le.isvh2)goto 2101
  24152. c inner loop bump
  24153.     jsv2=isvh1
  24154.     jsv1=jsv1+1
  24155.     if(jsv1.le.isvh1)goto 2101
  24156. c outer loop bump
  24157.     jsv1=isvl1
  24158.     isvfg=0
  24159. 2101    continue
  24160. 3000    continue
  24161.     call vwrt(crlf,2)
  24162.     do 3 n=1,128
  24163. 3    c128wk(n:n)=char(0)
  24164. c zero array for next use
  24165.     return
  24166.     end
  24167.     subroutine atxti
  24168. C analyticalc text read routine
  24169. C returns with text in c128rd area
  24170. C ***<<<< RDD COMMON START >>>***
  24171.     InTeGer*4 RRWACT,RCLACT
  24172. C    COMMON/RCLACT/RRWACT,RCLACT
  24173.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  24174.      1  IDOL7,IDOL8
  24175. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  24176. C     1  IDOL7,IDOL8
  24177.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  24178. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  24179.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  24180. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  24181. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  24182. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  24183.     InTeGer*4 KLVL,k3dfg,kcdelt,krdelt,kpag
  24184. C    COMMON/KLVL/KLVL
  24185.     InTeGer*4 IOLVL,igold
  24186. C    COMMON/IOLVL/IOLVL
  24187. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  24188. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  24189.     Integer*4 Idsptp,Idol9
  24190.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  24191.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  24192.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD,IDSPTP,IDOL9,
  24193.      3  k3dfg,kcdelt,krdelt,kpag
  24194. C ***<<< RDD COMMON END >>>***
  24195.     include FILES.BLK
  24196.     character*1 cr,lf
  24197.     character*132 inmsg
  24198.     integer inmsgf
  24199.     common/rinmsg/inmsgf,inmsg
  24200. c Hackery here to pass commands to RIM one at a time and return...
  24201.     if(inmsgf.eq.0)goto 1000
  24202.     if(inmsgf.lt.0)goto 1001
  24203. c inmsg > 90: initial pass. Put in the given command.
  24204.     c128rd=inmsg
  24205.     cr = char(13)
  24206.     lf=char(10)
  24207.     inmsgf= -1
  24208.     goto 2000
  24209. 1001    continue
  24210.     inmsgf = 0
  24211.     c128rd='RETURN                      '
  24212.     goto 2000
  24213. 1000    continue
  24214.     IF(IOLVL.NE.11)READ(IOLVL,9002,END=9999,ERR=9999)c128rd
  24215. 9002    FORMAT(a102,a102)
  24216. C FOR READING THE CONSOLE, WE NEED A QIO$ TO CAPTURE ESCAPE SEQUENCES.
  24217.     IF(IOLVL.EQ.11)CALL GETTTL(c128rd)
  24218. 2000    c128rd(132:132)=char(0)
  24219.     CALL GTMUNG(C128rd)
  24220.     icrfg=0
  24221.         do 8000 n=1,132
  24222.     nn=133-n
  24223.     if(ichar(c128rd(nn:nn)).gt.32)goto 8001
  24224.     if(ichar(c128rd(nn:nn)).eq.13)icrfg=1
  24225.     if(ichar(c128rd(nn:nn)).eq.10)icrfg=1
  24226.     c128rd(nn:nn)=char(32)
  24227. 8000    continue
  24228. 8001    continue
  24229. c above guarantees we don't get a lot of extra spaces after the data
  24230.     if(icrfg.ne.0)call swrt(lf,1)
  24231.     if(icrfg.ne.0)call swrt(cr,1)
  24232.     return
  24233. 9999    continue
  24234.     close(iolvl)
  24235.     iolvl=11
  24236.     c128rd(1:1)=char(26)
  24237. c end of file returns explicit control Z in position 1
  24238.     return
  24239.     end
  24240. C RimLib ...
  24241.