home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d144 / analyticalc.lha / AnalytiCalc / AnalySources.Arc / AnalyO.Ftn < prev    next >
Text File  |  1988-04-11  |  95KB  |  3,157 lines

  1. c -h- acini1.fnw    Fri Aug 22 12:55:08 1986    
  2. C PORTACALC MAIN PROGRAM
  3. C SPREAD SHEET DRIVER PROGRAM
  4. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  5. C ALL RIGHTS RESERVED
  6. C MAX SHEET DIMS ARE 60 BY 300 (301 SINCE ACCUMULATORS ARE A PSEUDO ROW)
  7. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  8. C SCREEN.
  9.     SUBROUTINE INITA1(KMAP,KWID,ICODE)
  10. C
  11.     InTeGer*4 PRL(6)
  12.         CHARACTER*1 NOWRAP ( 2 )
  13.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  14.     INTEGER*4 VNLT
  15.     INTEGER IFCW
  16. c    EXTERNAL LCWRQQ
  17.     DIMENSION FORM(128),FVLD(1,1)
  18. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  19. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  20. C SO INITIALLY IGNORE.
  21. C ***<<<< RDD COMMON START >>>***
  22.     InTeGer*4 RRWACT,RCLACT
  23. C    COMMON/RCLACT/RRWACT,RCLACT
  24.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  25.      1  IDOL7,IDOL8
  26. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  27. C     1  IDOL7,IDOL8
  28.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  29. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  30.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  31. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  32. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  33. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  34.     InTeGer*4 KLVL
  35. C    COMMON/KLVL/KLVL
  36.     InTeGer*4 IOLVL,IGOLD
  37. C    COMMON/IOLVL/IOLVL
  38. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  39. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  40.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  41.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  42.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  43. C ***<<< RDD COMMON END >>>***
  44. CCC    InTeGer*4 RRWACT,RCLACT
  45. CCC    COMMON/RCLACT/RRWACT,RCLACT
  46. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  47. CCC     1  IDOL7,IDOL8
  48. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  49. CCC     1  IDOL7,IDOL8
  50. CCC    InTeGer*4 LLCMD,LLDSP
  51. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  52. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  53.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  54.     COMMON/D2R/NRDSP,NCDSP
  55. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  56. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  57. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  58. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  59.     CHARACTER*1 FORM2(4)
  60. C ***<<< XVXTCD COMMON START >>>***
  61.     CHARACTER*1 OARRY(100)
  62.     InTeGer*4 OSWIT,OCNTR
  63. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  64. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  65.     InTeGer*4 IPS1,IPS2,MODFLG
  66. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  67.        InTeGer*4 XTCFG,IPSET,XTNCNT
  68.        CHARACTER*1 XTNCMD(80)
  69. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  70. C VARY FLAG ITERATION COUNT
  71.     INTEGER KALKIT
  72. C    COMMON/VARYIT/KALKIT
  73.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  74.     InTeGer*4 RCMODE,IRCE1,IRCE2
  75. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  76. C     1  IRCE2
  77. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  78. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  79. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  80. C RCFGX ON.
  81. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  82. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  83. C  AND VM INHIBITS. (SETS TO 1).
  84.     INTEGER*4 FH
  85. C FILE HANDLE FOR CONSOLE I/O (RAW)
  86. C    COMMON/CONSFH/FH
  87.     CHARACTER*1 ARGSTR(52,4)
  88. C    COMMON/ARGSTR/ARGSTR
  89.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  90.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  91.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  92.      3  IRCE2,FH,ARGSTR
  93. C ***<<< XVXTCD COMMON END >>>***
  94. CCC    InTeGer*4 OSWIT,OCNTR
  95. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  96. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  97.     InTeGer*4 TYPE(1,1),VLEN(9)
  98. CCC    InTeGer*4 KLVL
  99. CCC    COMMON/KLVL/KLVL
  100. CCC    InTeGer*4 IOLVL
  101. CCC    COMMON/IOLVL/IOLVL
  102. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  103. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  104.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  105.     REAL*8 XXV(1,1)
  106.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  107.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  108. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  109.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  110.     CHARACTER*12 CDVFMT
  111.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  112.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  113.     COMMON/DEFVBX/DVFMT
  114.     CHARACTER*1 NMSH(80)
  115.     CHARACTER*80 NMSH80
  116.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  117.     COMMON/NMSH/NMSH
  118. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  119. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  120. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  121. CCC       CHARACTER*1 XTNCMD(80)
  122. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  123. C VARY FLAG ITERATION COUNT
  124. CCC    INTEGER KALKIT
  125. CCC    COMMON/VARYIT/KALKIT
  126. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  127. CCC    InTeGer*4 RCONE,RCMODE,IRCE1,IRCE2
  128. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  129. CCC     1  IRCE1,IRCE2
  130. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  131. C RCFGX FLAGS WHETHER TO DO AUTO RECALC
  132. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED
  133.     InTeGer*4 CWIDS(20)
  134. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY.
  135.     INTEGER*4 I4TMP
  136. C ***<<< NULETC COMMON START >>>***
  137.     InTeGer*4 ICREF,IRREF
  138. C    COMMON/MIRROR/ICREF,IRREF
  139.     InTeGer*4 MODPUB,LIMODE
  140. C    COMMON/MODPUB/MODPUB,LIMODE
  141.     InTeGer*4 KLKC,KLKR
  142.     REAL*8 AACP,AACQ
  143. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  144.     InTeGer*4 NCEL,NXINI
  145. C    COMMON/NCEL/NCEL,NXINI
  146.     CHARACTER*1 NAMARY(20,301)
  147. C    COMMON/NMNMNM/NAMARY
  148.     InTeGer*4 NULAST,LFVD
  149. C    COMMON/NULXXX/NULAST,LFVD
  150.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  151.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  152. C ***<<< NULETC COMMON END >>>***
  153. CCC    InTeGer*4 ICREF,IRREF
  154. CCC    COMMON/MIRROR/ICREF,IRREF
  155. C SETS NUMBER OF COLS TO ADD ON ROW OVERFLOW, ROWS TO ADD ON COL OVERFLOW
  156. C FOR CELL ALIASING.
  157.     REAL*8 DVS(20,75)
  158.     COMMON /FVLDC/FVLD
  159. C FOLLOWING SUPPORT VVARY OVERLAY:
  160.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  161.     LOGICAL*4 LEXIST
  162.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  163.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  164.     COMMON/DSPCMN/DVS,CWIDS
  165.     CHARACTER*1 CHR
  166.     character*20 fwt
  167.     EQUIVALENCE(FWT(1:1),CHR)
  168. C DISABLE FLOATING EXCEPTIONS
  169. C    CALL LCWRQQ(IFCW)
  170. C (MOVED LCWRQQ CALL TO MAIN)
  171.     IDOL7=1
  172. C ENABLE SCROLLING INITIALLY
  173. C ZERO "SAVED DISPLAY VALUES" FIRST...
  174.     DO 35 N=1,75
  175.     DO 35 NN=1,20
  176. 35    DVS(NN,N)=0.
  177.     MODFLG=1
  178. C INITIALLY IN NON ANSI MODE. STILL USE ANSI DRIVER FOR INPUT CONTROLS.
  179. C NOW SET UP OTHER COMMON INFO (USED TO BE A BLOCK DATA...NOW CHANGED.)
  180. C SETUP INITIAL DISPLAY LIMITS ACTUALLY USED.
  181.     RRWACT=1
  182.     RCLACT=1
  183.     IOLVL=11
  184.     DRWV=7
  185.     DCLV=19
  186.     LLCMD=22
  187.     LLDSP=23
  188.     ICREF=10
  189.     IRREF=50
  190. C SET INCREMENTS TO 1/6 OF TOTAL FOR STARTERS.
  191.     KLVL=1
  192.     KALKIT=0
  193.     IRCE1=0
  194.     IRCE2=0
  195.     RCMODE=2
  196.     ICODE=0
  197.     idol3=0
  198.     idol4=0
  199.     idol5=20000
  200.     idol6=20000
  201.     RCFGX=0
  202.     FORMFG=0
  203. C      CALL GETADR ( PRL, NOWRAP )
  204.       PRL ( 2 ) = 2
  205. c    OPEN(6,FILE='CON:',STATUS='NEW',FORM='FORMATTED')
  206.     OPEN(11,FILE='CON:20/210/450/30/Analy Command Inputs',
  207.      1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  208. c    OPEN(18,FILE='CON:20/210/450/30/Analy Cmd Prompts',
  209. c     1  ACTION='BOTH',ACCESS='SEQUENTIAL',FORM='FORMATTED')
  210. C LOOK FOR 'ACINIT.PRM' INITIALIZER FILE. IF ONE FOUND, READ IT.
  211. C IF NOT, ASK AT CONSOLE FOR SINGLE/DBL PRECISION AND INITIAL VIDEO MODE
  212.     IVV=11
  213. C SET UP AS THOUGH WE HAD AN @ACINIT.PRM AT STARTUP AND
  214. C ALLOW IT TO GO THRU NORMALLY...
  215.     INQUIRE(FILE='ACINIT.PRM',EXIST=LEXIST)
  216.     IF(.NOT.LEXIST)GOTO 6003
  217.     OPEN(3,FILE='ACINIT.PRM',STATUS='OLD',FORM='FORMATTED')
  218. C    CALL RASSIG(3,'ACINIT.PRM')
  219.     IVV=3
  220.     IOLVL=3
  221.     GOTO 6403
  222. 6003    CONTINUE
  223. C    OPEN(5,FILE='CON:',STATUS='OLD',FORM='FORMATTED')
  224. C OPEN EITHER CONSOLE OR INIT FILE AT FIRST...
  225. 6403    CONTINUE
  226. 6005    FORMAT(80A1)
  227. C For AMIGA always use "BIOS MODE" so we can have special windowing
  228. C code in place of the Fortran I/O. Fortran console I/O will be done
  229. C using LUN 11 in a CON: window, but most normal spreadsheet
  230. C operations will take place in a special window over which we will have
  231. C finer grained control...
  232. C
  233.     CALL SWSET(1)
  234.     MODFLG=1
  235. 6008    CONTINUE
  236. C SETS UP FOR USING ROM BIOS DIRECTLY FOR EVERYTHING...
  237. C COULD THEN USE E.G. NEWKEY TO DO KEYBOARD CMDS.
  238.     GOTO 6002
  239. 6006    CONTINUE
  240. C ERROR ON INPUT HERE... JUST FORGET IT.
  241.     CLOSE(3)
  242.     IOLVL=11
  243. C MAKE SURE LUN 5 HAS A CONSOLE FILE OPEN.
  244.     CLOSE(11)
  245.     OPEN(11,FILE='CON:0/50/200/60/Analy Command',
  246.      1  STATUS='OLD',FORM='FORMATTED')
  247. 6002    CALL UVT100(18,0,0)
  248. C PERFORM SYSTEM DEPENDENT INITIALIZATION for terminal. (none here really)
  249. c may later read + write auxkpd.txt to set up escape seqs.
  250.     CALL TTYINI
  251. C
  252. C SET UP THE SCREEN (ERASE, ETC.)
  253. c erase screen first
  254.     CALL UVT100(1,5,10)
  255.     CALL UVT100(11,2,0)
  256. c position cursor to r5c10
  257.     CALL UVT100(1,5,10)
  258. C ZERO THE VARIABLES TO START OFF WITH.
  259.     DO 2070 KK=1,20
  260.     DO 2070 KKK=1,27
  261. 2070    AVBLS(KK,KKK)=0
  262. C SET UP WORK ARRAY BITMAP
  263.     CALL WRKFIL(1,FORM,2)
  264. c set reverse video title
  265.     CALL UVT100(13,7,0)
  266.     CALL SWRT('AnalytiCalc-68K',15)
  267.     CALL UVT100(1,6,12)
  268.     CALL SWRT('V22-03D',7)
  269.     CALL UVT100(13,0,0)
  270.     CALL UVT100(1,8,3)
  271.     CALL SWRT(' ...The Analyst`s Tool',22)
  272.     CALL UVT100(1,9,5)
  273.     CALL SWRT('Copyright (C) 1988 Glenn & Mary Everhart',40)
  274.     CALL UVT100(1,10,1)
  275. C ALLOW SPACE FOR ASKING FOR MONEY LATER VIA PATCH IF DESIRED.
  276.     CALL SWRT('If you use this program please send $10.00 payment',
  277.      1  50)
  278.     CALL UVT100(1,11,1)
  279.     CALL SWRT('to Glenn Everhart, 25 Sleigh Ride, Glen Mills PA. ',
  280.      1  50)
  281.     CALL UVT100(1,12,1)
  282.     CALL SWRT('19342 to register. May be copied for evaluation   ',
  283.      1  50)
  284.     Call UVT100(1,13,1)
  285.     CALL SWRT(' purposes by recipient for others. ',35)
  286. C NOW GET ON WITH USEFUL WORK.
  287.       PRL ( 2 ) = 1
  288.       PRL ( 3 ) = 0
  289. c set ansi mode...
  290.       CALL UVT100 ( 18 ,0,0)
  291.     KWID=10
  292.     KMAP=1
  293.     RETURN
  294.     END
  295. c -h- acini2.for    Fri Aug 22 12:55:25 1986    
  296. C PORTACALC MAIN PROGRAM
  297. C SPREAD SHEET DRIVER PROGRAM
  298. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  299. C ALL RIGHTS RESERVED
  300. C MAX SHEET DIMS ARE 60 BY 300 (301 SINCE ACCUMULATORS ARE A PSEUDO ROW)
  301. C PARAMETER 18060=60*301
  302. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  303. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  304. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  305. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  306. C FROM THE DISK BASED FILE HERE.
  307.     SUBROUTINE INITA2(KMAP,KWID,ICODE,IKONS)
  308. C
  309.     InTeGer*4 PRL(6)
  310.         CHARACTER*1 NOWRAP ( 2 )
  311.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  312.     INTEGER*4 VNLT
  313.     INTEGER IFCW
  314. C    EXTERNAL LCWRQQ
  315.     DIMENSION FORM(128),FVLD(1,1)
  316. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  317. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  318. C SO INITIALLY IGNORE.
  319. C
  320. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  321. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  322. C ***<<<< RDD COMMON START >>>***
  323.     InTeGer*4 RRWACT,RCLACT
  324. C    COMMON/RCLACT/RRWACT,RCLACT
  325.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  326.      1  IDOL7,IDOL8
  327. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  328. C     1  IDOL7,IDOL8
  329.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  330. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  331.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  332. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  333. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  334. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  335.     InTeGer*4 KLVL
  336. C    COMMON/KLVL/KLVL
  337.     InTeGer*4 IOLVL,IGOLD
  338. C    COMMON/IOLVL/IOLVL
  339. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  340. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  341.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  342.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  343.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  344. C ***<<< RDD COMMON END >>>***
  345. CCC    InTeGer*4 RRWACT,RCLACT
  346. CCC    COMMON/RCLACT/RRWACT,RCLACT
  347. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  348. CCC     1  IDOL7,IDOL8
  349. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  350. CCC     1  IDOL7,IDOL8
  351. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  352. CCC    InTeGer*4 LLCMD,LLDSP
  353. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  354.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  355.     COMMON/D2R/NRDSP,NCDSP
  356. C ***<<< NULETC COMMON START >>>***
  357.     InTeGer*4 ICREF,IRREF
  358. C    COMMON/MIRROR/ICREF,IRREF
  359.     InTeGer*4 MODPUB,LIMODE
  360. C    COMMON/MODPUB/MODPUB,LIMODE
  361.     InTeGer*4 KLKC,KLKR
  362.     REAL*8 AACP,AACQ
  363. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  364.     InTeGer*4 NCEL,NXINI
  365. C    COMMON/NCEL/NCEL,NXINI
  366.     CHARACTER*1 NAMARY(20,301)
  367. C    COMMON/NMNMNM/NAMARY
  368.     InTeGer*4 NULAST,LFVD
  369. C    COMMON/NULXXX/NULAST,LFVD
  370.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  371.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  372. C ***<<< NULETC COMMON END >>>***
  373. CCC    InTeGer*4 ICREF,IRREF
  374. CCC    COMMON/MIRROR/ICREF,IRREF
  375. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  376. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  377. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  378. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  379.     CHARACTER*1 FORM2(4)
  380. C ***<<< XVXTCD COMMON START >>>***
  381.     CHARACTER*1 OARRY(100)
  382.     InTeGer*4 OSWIT,OCNTR
  383. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  384. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  385.     InTeGer*4 IPS1,IPS2,MODFLG
  386. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  387.        InTeGer*4 XTCFG,IPSET,XTNCNT
  388.        CHARACTER*1 XTNCMD(80)
  389. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  390. C VARY FLAG ITERATION COUNT
  391.     INTEGER KALKIT
  392. C    COMMON/VARYIT/KALKIT
  393.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  394.     InTeGer*4 RCMODE,IRCE1,IRCE2
  395. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  396. C     1  IRCE2
  397. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  398. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  399. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  400. C RCFGX ON.
  401. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  402. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  403. C  AND VM INHIBITS. (SETS TO 1).
  404.     INTEGER*4 FH
  405. C FILE HANDLE FOR CONSOLE I/O (RAW)
  406. C    COMMON/CONSFH/FH
  407.     CHARACTER*1 ARGSTR(52,4)
  408. C    COMMON/ARGSTR/ARGSTR
  409.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  410.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  411.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  412.      3  IRCE2,FH,ARGSTR
  413. C ***<<< XVXTCD COMMON END >>>***
  414. CCC    InTeGer*4 OSWIT,OCNTR
  415. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  416. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  417.     InTeGer*4 TYPE(1,1),VLEN(9)
  418. CCC    InTeGer*4 KLVL
  419. CCC    COMMON/KLVL/KLVL
  420. CCC    InTeGer*4 IOLVL
  421. CCC    COMMON/IOLVL/IOLVL
  422. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  423. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  424.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  425.     REAL*8 XXV(1,1)
  426.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  427.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  428. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  429.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  430.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  431.     CHARACTER*12 CDVFMT
  432.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  433.     COMMON/DEFVBX/DVFMT
  434.     CHARACTER*1 NMSH(80)
  435.     CHARACTER*80 NMSH80
  436.     EQUIVALENCE(NMSH80(1:1),NMSH(1))
  437.     COMMON/NMSH/NMSH
  438. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  439. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  440. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  441. CCC       CHARACTER*1 XTNCMD(80)
  442. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  443. C VARY FLAG ITERATION COUNT
  444. CCC    INTEGER KALKIT
  445. CCC    COMMON/VARYIT/KALKIT
  446. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  447. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  448. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  449. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  450. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  451. C RCFGX ON.
  452. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  453. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  454. C  AND VM INHIBITS. (SETS TO 1).
  455. C
  456. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  457. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  458. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  459. C DISPLAY ACTUALLY USED FOR SCREEN.
  460.     InTeGer*4 CWIDS(20)
  461. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  462. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  463. C AS 20 NOT 75.
  464.     INTEGER*4 I4TMP
  465.     REAL*8 DVS(20,75)
  466.     COMMON /FVLDC/FVLD
  467. C FOLLOWING SUPPORT VVARY OVERLAY:
  468.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  469.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  470.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  471. C BITMAP
  472. C    CHARACTER*1 IBITMP
  473. C    DIMENSION IBITMP(2258)
  474. C    COMMON/INITD/IBITMP
  475. C    CHARACTER*1 DFMTS(10,20,75)
  476. C 10 CHARACTERS PER ENTRY.
  477.     COMMON/DSPCMN/DVS,CWIDS
  478.     character*35 fwt
  479. C ***<<< KLSTO COMMON START >>>***
  480.     InTeGer*4 DLFG
  481. C    COMMON/DLFG/DLFG
  482.     InTeGer*4 KDRW,KDCL
  483. C    COMMON/DOT/KDRW,KDCL
  484.     InTeGer*4 DTRENA
  485. C    COMMON/DTRCMN/DTRENA
  486.     REAL*8 EP,PV,FV
  487.     DIMENSION EP(20)
  488.     INTEGER*4 KIRR
  489. C    COMMON/ERNPER/EP,PV,FV,KIRR
  490.     InTeGer*4 LASTOP
  491. C    COMMON/ERROR/LASTOP
  492.     CHARACTER*1 FMTDAT(9,76)
  493. C    COMMON/FMTBFR/FMTDAT
  494.     CHARACTER*1 EDNAM(16)
  495. C    COMMON/EDNAM/EDNAM
  496.     InTeGer*4 MFID(2),MFMOD(2)
  497. C    COMMON/FRM/MFID,MFMOD
  498.     InTeGer*4 JMVFG,JMVOLD
  499. C    COMMON/FUBAR/JMVFG,JMVOLD
  500.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  501.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  502. C ***<<< KLSTO COMMON END >>>***
  503. CCC    CHARACTER*1 EDNAM(16)
  504. CCC    COMMON/EDNAM/EDNAM
  505.     CHARACTER*1 EDNINI(4)
  506.     DATA EDNINI/'E','D','I','T'/
  507. C    DATA NOWRAP / "24,0 /
  508. C
  509.     DO 2900 III=1,16
  510. 2900    EDNAM(III)=' '
  511.     DO 2901 III=1,4
  512. 2901    EDNAM(III)=EDNINI(III)
  513.     IF(IKONS.EQ.0)GOTO 3000
  514. 3002    CONTINUE
  515.     CALL UVT100(1,1,1)
  516.     CALL VWRT('Alter Widths or Mapping Y/N:',28)
  517.     ILL=IOLVL
  518. C    IF(ILL.EQ.5)ILL=0
  519.     READ(ILL,3006,END=5600,ERR=5600)FORM
  520.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3000
  521.     CALL VWRT('Enter NEW Global Column Width 1-120:',36)
  522. C ALTER MAPPING DESIRED
  523.     READ(ILL,3004,END=5600,ERR=5600)KWID
  524. 3004    FORMAT(I3)
  525.     IF(KWID.LT.1.OR.KWID.GT.120)KWID=10
  526.     CALL VWRT('Enter length of display in lines (nominally 24):',48)
  527.     READ(ILL,3004,END=5600,ERR=5600)III
  528.     IF(III.LE.4.OR.III.GT.999)III=24
  529. C RESET DISPLAY SIZE IN S COMMAND QUESTIONS AS NEEDED.
  530.     LLDSP=III
  531.     LLCMD=III-1
  532.     CALL VWRT('Change annotate editor from "EDIT" [Y/N]:',41)
  533.     READ(ILL,3006,END=5600,ERR=5600)FORM
  534.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3031
  535.     CALL VWRT('Give desired edit command:',26)
  536.     READ(ILL,3006,END=5600,ERR=5600)EDNAM
  537.     EDNAM(16)=' '
  538. C ENSURE THERE'S A SPACE AT END OF EDITOR NAME
  539. 3031    CONTINUE
  540.     CALL VWRT('Modify Extended Area Remap Y/N: ',31)
  541.     READ(ILL,3006,END=5600,ERR=5600)FORM
  542.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3502
  543.     CALL VWRT('# cols to move over on row overflow:',36)
  544.     READ(ILL,3004,END=5600,ERR=5600)ICREF
  545.     IF(ICREF.GT.60)ICREF=10
  546.     IF(ICREF.LT.0)ICREF=10
  547.     CALL VWRT('# rows to move down on col overflow:',34)
  548.     READ(ILL,3004,END=5600,ERR=5600)IRREF
  549.     IF(IRREF.GT.300)IRREF=50
  550.     IF(IRREF.LT.0)IRREF=50
  551. C FORCE THE RESULTS TO MAKE SENSE. 0 TO 60 ON COLS, 0-300 ON ROWS.
  552. C IF USER BOTHERS TO READ MANUALS THIS WILL BE EXPLAINED.
  553. 3502    CONTINUE
  554.     CALL VWRT('Reset Display to Upper Left of Sheet Y/N:',40)
  555.     READ(ILL,3006,END=5600,ERR=5600)FORM
  556.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')KMAP=0
  557. 3006    FORMAT(80A1,50A1)
  558. 3000    CONTINUE
  559.     RETURN
  560. 5600    CONTINUE
  561.     IOLVL=11
  562.     CLOSE(3)
  563.     Rewind 11
  564. c    CLOSE(11)
  565. c    OPEN(11,FILE='CON:0/0/100/100/Analy Command',
  566. c     1  STATUS='OLD',FORM='FORMATTED')
  567.     RETURN
  568.     END
  569. c -h- acini3.for    Fri Aug 22 12:55:39 1986    
  570. C PORTACALC MAIN PROGRAM
  571. C SPREAD SHEET DRIVER PROGRAM
  572. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  573. C ALL RIGHTS RESERVED
  574. C MAX SHEET DIMS ARE 60 BY 300 (301 SINCE ACCUMULATORS ARE A PSEUDO ROW)
  575. C PARAMETER 18060=60*301
  576. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  577. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  578. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  579. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  580. C FROM THE DISK BASED FILE HERE.
  581.     SUBROUTINE INITB(KMAP,KWID,ICODE)
  582. C
  583.     InTeGer*4 PRL(6)
  584.         CHARACTER*1 NOWRAP ( 2 )
  585.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  586.     INTEGER*4 VNLT
  587.     INTEGER IFCW
  588. C    EXTERNAL LCWRQQ
  589.     DIMENSION FORM(128),FVLD(1,1)
  590. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  591. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  592. C SO INITIALLY IGNORE.
  593. C
  594. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  595. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  596. C ***<<<< RDD COMMON START >>>***
  597.     InTeGer*4 RRWACT,RCLACT
  598. C    COMMON/RCLACT/RRWACT,RCLACT
  599.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  600.      1  IDOL7,IDOL8
  601. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  602. C     1  IDOL7,IDOL8
  603.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  604. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  605.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  606. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  607. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  608. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  609.     InTeGer*4 KLVL
  610. C    COMMON/KLVL/KLVL
  611.     InTeGer*4 IOLVL,IGOLD
  612. C    COMMON/IOLVL/IOLVL
  613. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  614. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  615.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  616.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  617.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  618. C ***<<< RDD COMMON END >>>***
  619. CCC    InTeGer*4 RRWACT,RCLACT
  620. CCC    COMMON/RCLACT/RRWACT,RCLACT
  621. CCC    InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  622. CCC     1  IDOL7,IDOL8
  623. CCC    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  624. CCC     1  IDOL7,IDOL8
  625. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  626. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  627.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  628.     COMMON/D2R/NRDSP,NCDSP
  629. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  630. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  631. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  632. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  633.     CHARACTER*1 FORM2(4)
  634. d    Integer*4 ill
  635. C ***<<< XVXTCD COMMON START >>>***
  636.     CHARACTER*1 OARRY(100)
  637.     InTeGer*4 OSWIT,OCNTR
  638. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  639. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  640.     InTeGer*4 IPS1,IPS2,MODFLG
  641. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  642.        InTeGer*4 XTCFG,IPSET,XTNCNT
  643.        CHARACTER*1 XTNCMD(80)
  644. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  645. C VARY FLAG ITERATION COUNT
  646.     INTEGER KALKIT
  647. C    COMMON/VARYIT/KALKIT
  648.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  649.     InTeGer*4 RCMODE,IRCE1,IRCE2
  650. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  651. C     1  IRCE2
  652. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  653. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  654. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  655. C RCFGX ON.
  656. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  657. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  658. C  AND VM INHIBITS. (SETS TO 1).
  659.     INTEGER*4 FH
  660. C FILE HANDLE FOR CONSOLE I/O (RAW)
  661. C    COMMON/CONSFH/FH
  662.     CHARACTER*1 ARGSTR(52,4)
  663. C    COMMON/ARGSTR/ARGSTR
  664.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  665.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  666.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  667.      3  IRCE2,FH,ARGSTR
  668. C ***<<< XVXTCD COMMON END >>>***
  669. CCC    InTeGer*4 OSWIT,OCNTR
  670.  
  671. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  672. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  673.     InTeGer*4 TYPE(1,1),VLEN(9)
  674. CCC    InTeGer*4 KLVL
  675. CCC    COMMON/KLVL/KLVL
  676. CCC    InTeGer*4 IOLVL
  677. CCC    COMMON/IOLVL/IOLVL
  678. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  679. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  680.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  681.     REAL*8 XXV(1,1)
  682.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  683.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  684. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  685.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  686.     CHARACTER*12 CDVFMT
  687.     EQUIVALENCE(DEFFMT(1),DVFMT(2))
  688.     EQUIVALENCE(CDVFMT(1:1),DVFMT(1))
  689.     COMMON/DEFVBX/DVFMT
  690.     CHARACTER*1 NMSH(80)
  691.     CHARACTER*80 NMSH80
  692.     EQUIVALENCE(NMSH80(1:1),FORM(1))
  693.     COMMON/NMSH/NMSH
  694. CCC    InTeGer*4 IPS1,IPS2,MODFLG
  695. CCC    COMMON/ICPOS/IPS1,IPS2,MODFLG
  696. CCC       InTeGer*4 XTCFG,IPSET,XTNCNT
  697. CCC       CHARACTER*1 XTNCMD(80)
  698. CCC       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  699. C VARY FLAG ITERATION COUNT
  700. CCC    INTEGER KALKIT
  701. CCC    COMMON/VARYIT/KALKIT
  702. CCC    InTeGer*4 FORMFG,RCFGX,PZAP
  703. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP
  704. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  705. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  706. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  707. C RCFGX ON.
  708. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  709. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  710. C  AND VM INHIBITS. (SETS TO 1).
  711. C
  712. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  713. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  714. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  715. C DISPLAY ACTUALLY USED FOR SCREEN.
  716.     InTeGer*4 CWIDS(20)
  717. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  718. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  719. C AS 20 NOT 75.
  720.     INTEGER*4 I4TMP
  721.     REAL*8 DVS(20,75)
  722.     COMMON /FVLDC/FVLD
  723. C FOLLOWING SUPPORT VVARY OVERLAY:
  724.     REAL*8 QQAC(26),QDERIV(8),QDEL(8),OLDVV,OLDX,OLDA
  725.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  726.     COMMON/VRYDAT/QQAC,QDERIV,QDEL,QCAC,QCENT,OLDVV,OLDX,OLDA,ACV
  727. C BITMAP
  728. C    CHARACTER*1 IBITMP
  729. C    DIMENSION IBITMP(2258)
  730. C    COMMON/INITD/IBITMP
  731. C    CHARACTER*1 DFMTS(10,20,75)
  732. C 10 CHARACTERS PER ENTRY.
  733.     COMMON/DSPCMN/DVS,CWIDS
  734.     character*35 fwt
  735. d       Integer*4 ifubar
  736. d    Dimension ifubar(12)
  737. C    DATA NOWRAP / "24,0 /
  738. C
  739.     idol5=20000
  740.     idol6=20000
  741. C INITIALLY SET JRCL TO 301 = NO. OF ROWS TO BE IN WORK FILE
  742.     JRCL=301
  743.     PZAP=0
  744.     XTCFG=0
  745.     IPSET=0
  746. C ZERO BITMAP
  747. C    DO 36 N1=1,2258
  748. C36    IBITMP(N1)=0
  749. c    LINIZZ=0
  750.     CALL UVT100(1,14,1)
  751.     CALL VWRT('Enter NEW floating format default Y/N:',38)
  752.     ILL=IOLVL
  753. C    IF(ILL.EQ.5)ILL=0
  754.     READ(ILL,3006,END=5600,ERR=5600)FORM
  755.     IF(FORM(1).NE.'Y'.AND.FORM(1).NE.'y')GOTO 3589
  756. C ENTER NEW DEFAULT.
  757. 6888    CALL UVT100(1,14,1)
  758.     CALL UVT100(12,2,0)
  759. C LINE NOW ERASED... GET NEW FORMAT
  760.     CALL VWRT('Enter new format. Suggest F10.2>',32)
  761.     READ(ILL,3006,END=5600,ERR=5600)FORM
  762. C NOW HAVE HIS DESIRED FORMAT. COPY INTO THE DEFAULT ARRAY.
  763. C DEFFMT IS THAT.
  764.     DO 3591 N1=1,10
  765.     KKK=ICHAR(FORM(N1))
  766.     KKK=MAX0(32,KKK)
  767. C ASSUME NMSH COMPLETELY INIT'D
  768. 3591    DEFFMT(N1)=Char(KKK)
  769. c    dvfmt(1)='('
  770. c    dvfmt(12)=')'
  771. C CHECK ITS LEGALITY BY TRYING TO USE IT ONCE.
  772.     XX=3.14159
  773.     WRITE(NMSH80(1:80),DVFMT,ERR=6888)XX
  774. C    ENCODE(78,DVFMT,NMSH,ERR=6888)XX
  775. C IF IT FAILS, PROGRAM WILL CRASH AND FILE WON'T GET CLOBBERED.
  776. 3589    CONTINUE
  777.     CALL UVT100(1,15,1)
  778.     CALL VWRT('Title for Spreadsheet:',22)
  779.     ILL=IOLVL
  780. C    IF(ILL.EQ.5)ILL=0
  781.     READ(ILL,3006,END=5600,ERR=5600)FORM
  782. 3006    FORMAT(80A1,50A1)
  783.     IF(ICHAR(FORM(1)).LE.32.AND.ICHAR(FORM(2)).LE.32) GOTO 3008
  784. C COPY TITLE UNLESS IT'S OLD
  785.     DO 3007 KKK=1,80
  786. 3007    NMSH(KKK)=FORM(KKK)
  787. C THAT WAY JUST C.R. LEAVES IN OLD TITLE.
  788. 3008    CONTINUE
  789. C ****** IF S OPTION GIVEN THEN ICODE=-2
  790. C THEREFORE, DON'T ASK DISK SIZE ETC, BUT ALLOW RESET OF TITLE
  791. C AND DEFAULT FORMATS.
  792.     IF(ICODE.EQ.-2) GOTO 7831
  793. C ******
  794.     CALL UVT100(1,16,1)
  795.     CALL VWRT('Give Max Rows to be used:',25)
  796.     READ(ILL,7202,END=5600,ERR=5600)KR
  797.     IF(KR.LE.0)KR=301
  798.     CALL UVT100(1,17,1)
  799.     CALL VWRT('Give Max Cols to be used:',25)
  800.     READ(ILL,7202,END=5600,ERR=5600)KC
  801.     IF(KC.LE.0)KC=60
  802. C    KKK=(KR-1)*60+KC
  803. C ALLOW REPLIES IN ANY RANGE AND REFLECT BACK TO PRIME RANGE
  804. C NOTE WE WANT A CELL ADDRESS HERE FOR THE END CELL...
  805.     CALL REFLEC(KR,KC,KKK)
  806.     XKKKK=KR*KC
  807.     XKDF=XKKKK/64.
  808.     XKDN=XKKKK/100.
  809. C COMPUTED ABOVE THE MIN # OF K FOR DISK FILES
  810.     CALL UVT100(1,18,1)
  811.     write(fwt(1:12),2058)xkdn
  812. 2058    format(F9.0)
  813.     CALL SWRT('Min=',4)
  814.     call swrt(fwt(1:12),9)
  815.     write(fwt,2058)xkdf
  816.     call swrt(' K Value file ',14)
  817.     CALL SWRT(fwt(1:12),9)
  818.     CALL SWRT(' K Formula file',15)
  819. c    WRITE(0,2058)XKDN,XKDF
  820. c2058    FORMAT(' Mins=',F9.0' K Value file, ',F9.0,' K Formula file',\)
  821. C KKK IS MAX INDEX TO BE USED HERE.
  822.     CALL UVT100(1,21,1)
  823.     CALL VWRT('Give Value File size, K:',24)
  824.     READ(ILL,7202,END=5600,ERR=5600)IPGMAX
  825. 7202    FORMAT(I6)
  826.     IPGMOD=KKK
  827.     IF(IPGMAX.LT.0)IPGMOD=0
  828.     IPGMAX=IABS(IPGMAX)
  829.     IF(IPGMAX.GT.2512)IPGMAX=1
  830.     CALL UVT100(1,22,1)
  831.     CALL VWRT('Give Formula File size, K:',26)
  832.     READ(ILL,7202,END=5600,ERR=5600)LPGMXF
  833.     LPGMOD=KKK
  834.     IF(LPGMXF.LT.0)LPGMOD=0
  835.     LPGMXF=IABS(LPGMXF)
  836. C IF NUMBERS ARE ENTERED NEGATIVE, SET MODE TO "SLOW, FILE-SPACE
  837. C CONSERVING" PACKING, SCATTERING PAGES ACROSS FILE.
  838.     IF(LPGMXF.GT.4096)LPGMXF=(IPGMAX*3)/2
  839. C NULL TERMINATE ALL FORMAT STRINGS.
  840. C SET MAX WIDTH FOR PRINT TO DIMENSION OF THE BUFFER. NOTE THIS IS THE
  841. C USUAL HARDWARE MAXIMUM SO WE DON'T WORRY TOO MUCH ABOUT IT. NOTE
  842. C BILL TABOR'S PROGRAM TO PRINT PASTE-ABLE VERSIONS OF THE SHEET FROM
  843. C SAVE FILES EXISTS, SO WE NEEDN'T WORRY TOO MUCH EITHER ABOUT USING
  844. C DISPLAY FOR DOUBLE DUTY.
  845.     MXL=132
  846. C INITIALIZE WORK STORAGE FOR FORMULAS AND VARIABLES
  847.     CALL WSSET
  848. 7831    CONTINUE
  849. C SET DEFAULT WIDTHS OF COLUMNS TO 10. MAY BE ALTERED BELOW FOR DIFFERENT
  850. C DEFAULT IF DESIRED.
  851.     DO 16 N1=1,20
  852.     CWIDS(N1)=KWID
  853. 16    CONTINUE
  854. C
  855. C NOW SET UP NRDSP, NCDSP
  856.     IF(KMAP.EQ.0)GOTO 3009
  857. C SET UP MAPPING NOW FOR INITIALLY UPPER LEFT CORNER OF PHYS SHEET IN DISPLAY SHT.
  858.     DO 5 N1=1,20
  859.     DO 5 N2=1,75
  860. C INITIALLY WE DISPLAY THE UPPER LEFT PART OF THE SYSTEM.
  861. C ESTABLISH ASSOCIATION INITIALLY THEREFORE OF DISPLAY TO UPPER
  862. C LEFT OF PHYSICAL SHEET.
  863.     NRDSP(N1,N2)=N1
  864.     NCDSP(N1,N2)=N2+1
  865.     DVS(N1,N2)=.00000031
  866. 5    CONTINUE
  867. C FOR S OPTION USE SECRET -4 CODE TO RESET SHEET. STILL NEEDS WORK
  868. C IN PORTACALC PC.
  869.     IF(ICODE.EQ.-4)CALL WRKFIL(1,FORM,2)
  870. 3009    IF(ICODE.EQ.-4)GOTO 1
  871. C43    CALL UVT100(1,21,1)
  872.     KZPPD=0
  873.     CMDLIN(1)=0
  874.     IOLDFL=0
  875. C3017    FORMAT(Q,80A1,80A1)
  876.     MXL=1
  877.     CMDLIN(MXL+1)=0
  878. 3572    FORMAT(I6)
  879.     CALL UVT100(13,0,0)
  880. C  SET UP RANDOM FILE AS NEEDED FOR SHEET
  881. C EACH RECORD HAS:
  882. C CHARS 1-110    FORMULAS
  883. C CHARS 120-128    DISPLAY FORMAT (INITIALLY F9.2)
  884. C CHAR 119    VALID FLAG (ALLOWS HANDLING READS.)
  885. C    values: -3, -2: Numeric-only text (or special chars)
  886. C         -1    : Alphanumeric text
  887. C          0    : Uninitialized
  888. C          1    : Alphanumeric formula
  889. C         +2    : Number or pure numeric formula with value calculated
  890. C         +3    : Number or pure numeric formula, value not yet computed
  891. C CHAR 118    MAGIC NUMBER 15 (CHECKS ALL WELL)
  892. C READ A RECORD, IF ERROR, CREATE EMPTY FILE.
  893. C    IF(IOLDFL.EQ.0)GOTO 1
  894. CC IF IOLDFL NONZERO IT MEANS USER CLAIMS THERE EXISTS A FILE. IF 0 IT'S NEW.
  895. CC HERE IT'S OLD SO LET'S BE SURE IT REALLY IS OK.
  896. 1    CONTINUE
  897. C HIT EOF OR ERROR. MUST BE A NEW FILE. THEREFORE ZERO IT TO OUR NEEDS.
  898. C AT THIS POINT WE ARE CREATING A NEW FILE AND NEED TO ZERO IT.
  899. C
  900.     DO 3 N=1,128
  901.     FORM(N)=0
  902. 3    CONTINUE
  903.     DO 3592 N=1,9
  904. C SET UP DEFAULT FORMAT
  905. 3592    FORM(119+N)=DEFFMT(N)
  906.     FORM(118)=CHAR(15)
  907.     FORM(1)='0'
  908.     FORM(2)='.'
  909. C CREATE NULL FILE INITIALLY BY RESETTING ALL.
  910.     JRRCL=60*JRCL
  911.     KZPPD=1
  912. C
  913. 2    CONTINUE
  914. C COMMON POINT WITH FILE PREPARED.
  915.     PCOL=2
  916.     PROW=1
  917.     DCOL=1
  918.     DROW=1
  919.     RETURN
  920. 5600    CONTINUE
  921. C ERROR ON READ FROM IOLVL HANDLED HERE.
  922. C    REWIND 5
  923.     Rewind 11
  924. c    CLOSE(11)
  925. c    OPEN(11,FILE='CON:0/150/500/49/Analy Command',
  926. c     1  STATUS='OLD',FORM='FORMATTED')
  927.     CLOSE(3)
  928.     IOLVL=11
  929.     RETURN
  930.     END
  931. c -h- block.for    Fri Aug 22 12:58:14 1986    
  932.     SUBROUTINE BLOCK
  933. C    BLOCK DATA
  934. C COPYRIGHT (C) 1983 GLENN EVERHART
  935. C ALL RIGHTS RESERVED
  936. C 18060 = 60*301
  937. C 18033=18060-27
  938. C 60=MAX REAL ROWS
  939. C 301=MAX REAL COLS
  940. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  941. C VBLS AND TYPE DIMENSIONED 60,301
  942. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  943. C   +                                                +
  944. C   +            CALC    VERSION  X01-06             +
  945. C   +                                                +
  946. C   ++++++++++++++++++++++++++++++++++++++++++++++++++
  947. C
  948. C
  949. C *******************************************************
  950. C *                                                     *
  951. C *            BLOCK  DATA  MODULE                      *
  952. C *                                                     *
  953. C *******************************************************
  954. C
  955. C
  956. C COMMON AREAS ARE INITIALIZED BY THIS MODULE.
  957. C FAKEUP FOR MICROSOFT WHICH HAS NO BLOCK DATA.
  958. C DO IT ALL VIA LOOPS...
  959. C
  960. C
  961. C MODIFIED 18-MAY-1981 P.B. SET % TO VERSION 6
  962. C
  963. C
  964. C
  965. C   VARIABLE      USE
  966. C
  967. C  ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC CHARACTERS
  968. C               OR THE CHARACTER %.
  969. C  BASED     HOLDS DEFAULT BASE.
  970. C  BLANK        ' '
  971. C  COMMA        ','
  972. C  DIGITS(16,3) HOLDS DECIMAL, OCTAL, AND HEXADECIMAL DIGITS. THE
  973. C               SECOND SUBSCRIPT IS
  974. C                     1 FOR DECIMAL
  975. C                     2 FOR OCTAL
  976. C                     3 FOR HEXADECIMAL
  977. C  DTBL1(9,9,8) CONTROLS THE DECISION PROCESS WHEN EVALUATING A
  978. C               BINARY OPERATION. SEE BELOW FOR DETAILS.
  979. C  EQ           '='
  980. C  ITCNTV(6)    INDEXED BY LEVEL. 0 INDICATES THAT NO ITERATION ON THE
  981. C               INDIRECT COMMAND FILE IS TO TAKE PLACE. IF POSITIVE, IT
  982. C               HOLDS THE INDEX INTO VBLS AND REPRESENTS THE VARIABLE
  983. C               USED TO CONTROL ITERATION.
  984. C  LINE(80)     COMMAND INPUT LINE
  985. C  LPAR         '('
  986. C  RPAR         ')'
  987. C  ST1LIM       HOLDS THE SIZE OF STACK 1 (ALWAYS CONSTANT)
  988. C  ST2LIM       HOLDS THE SIZE OF STACK 2 (ALWAYS CONSTANT)
  989. C  ST1PT        POINTS TO THE TOP OF STACK 1 (CHANGES AS STACK IS USED)
  990. C  ST2PT        POINTS TO THE TOP OF STACK 2 (CHANGES AS STACK IS USED)
  991. C  ST1TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 1
  992. C  ST2TYP(40)       DATA TYPE FOR EACH ELEMENT IN STACK 2
  993. C  STACK1(20,40)   UTILITY STACKS USED WHEN EVALUATING EXPRESSIONS. THE FIRST
  994. C  STACK2(20,40)   SUBSCRIPT CONTROLS INDEXING ACROSS THE BYTES OF A SINGLE
  995. C                   VARIABLE. THE SECOND SUBSCRIPT CONTROLS STACK ELEMENTS.
  996. C  TYPE(27)         HOLDS THE DATA TYPES FOR EACH OF THE 27 VARIABLES. SEE
  997. C                   CODES.FTN FOR THE POSSIBLE VALUES.
  998. C  VIEWSW           VIEW SWITCH
  999. C                    0 = OUTPUT ERROR MESSAGES
  1000. C                    1 = OUTPUT ERROR MESSAGES AND FILE COMMAND LINES
  1001. C                    2 = OUTPUT ERROR MESSAGES AND VALUE OF EXPRESSIONS
  1002. C                        EVALUATED.
  1003. C                    3 = OUTPUT EVERYTHING
  1004. C  VLEN(9)      INDEXED BY DATA TYPE. GIVES THE NUMBER OF BYTES USED
  1005. C               BY THAT DATA TYPE.
  1006. C  AVBLS(20,27)      HOLDS THE VALUES OF THE 27 LEGAL VARIABLES.(ACCUMULATORS)
  1007. C  VBLS(8,60,301)    HOLDS VALUES OF ALL VARIABLES
  1008. C
  1009. C
  1010. C
  1011. C    CONSTANTS ARE STORED IN VBLS ACCORDING TO THEIR TYPE:
  1012. C
  1013. C
  1014. C
  1015. C <----------- MULTIPLE PRECISION (M10, M8, M16) ------------------------->
  1016. C !                        <------------- DECIMAL AND REAL --------------->
  1017. C !                        !                      <-- INTEGER HEX OCTAL -->
  1018. C !                                               !             ---> ASCII <---
  1019. C !                        !                      !                        !
  1020. C
  1021. C -------------     -------------------------------------------------------
  1022. C !     !     !     !     !     !     !     !     !     !     !     !     !
  1023. C ! 20  !  19 ! ... !  9  !  8  !  7  !  6  !  5  !  4  !  3  !  2  !  1  !
  1024. C !     !     !     !     !     !     !     !     !     !     !     !     !
  1025. C -------------     -------------------------------------------------------
  1026. C
  1027. C
  1028. C NOTE: BYTE 20 HOLDS THE SIGN FOR MULTIPLE PRECISION NUMBERS.
  1029. C       0 = POSITIVE, 1 = NEGATIVE
  1030. C
  1031. C
  1032. C
  1033. C
  1034. C
  1035. C    BLOCK DATA
  1036.     InTeGer*4 LEVEL,NONBLK,LEND
  1037.     InTeGer*4 LASTOP
  1038.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  1039.     InTeGer*4 TYPE(1,1)
  1040.     InTeGer*4 VIEWSW,BASED,VLEN(9),BVLEN(9)
  1041.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  1042.     InTeGer*4 ITCNTV(6)
  1043. C
  1044.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ,LINE(80)
  1045.     CHARACTER*1 BOMMA,BBLANK,BRPAR,BLPAR,BEQ
  1046.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  1047.     CHARACTER*1 AVBLS(20,27),BLPHA(27)
  1048.     CHARACTER*1 VBLS(8,1,1)
  1049. C ***<<< XVXTCD COMMON START >>>***
  1050.     CHARACTER*1 OARRY(100)
  1051. d    integer*4 ill
  1052.     InTeGer*4 OSWIT,OCNTR
  1053. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1054. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1055.     InTeGer*4 IC1POS,IC2POS,MODFLG
  1056. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1057.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1058.        CHARACTER*1 XTNCMD(80)
  1059. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1060. C VARY FLAG ITERATION COUNT
  1061.     INTEGER KALKIT
  1062. C    COMMON/VARYIT/KALKIT
  1063.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1064.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1065. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1066. C     1  IRCE2
  1067. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1068. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1069. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1070. C RCFGX ON.
  1071. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1072. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1073. C  AND VM INHIBITS. (SETS TO 1).
  1074.     INTEGER*4 FH
  1075. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1076. C    COMMON/CONSFH/FH
  1077.     CHARACTER*1 ARGSTR(52,4)
  1078. C    COMMON/ARGSTR/ARGSTR
  1079.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  1080.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1081.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1082.      3  IRCE2,FH,ARGSTR
  1083. C ***<<< XVXTCD COMMON END >>>***
  1084. CCC    InTeGer*4 IC1POS,IC2POS
  1085. CCC    COMMON/ICPOS/IC1POS,IC2POS
  1086.     CHARACTER*1 DTBL1(9,9,8)
  1087. CC BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  1088. C MOVED TABLE TO WRKFIL WHERE IT IS OVERLAIN BY A BUFFER DURING OPERATION
  1089. C AND JUST INITIALIZES DTBL1 AT STARTUP. THIS SHOULD ESSENTIALLY REMOVE DATA
  1090. C SPACE PENALTY FOR THIS HUGE ARRAY. NOTE IT'D BE SMALLER IF THERE WEREN'T
  1091. C SO MANY SUPPORTED DATA TYPES IN CALC.
  1092. C    InTeGer*4 BTBL(9,9,8)
  1093. C    InTeGer*4 BTBL1(9,9)
  1094. C    InTeGer*4 BTBL2(9,9),BTBL3(9,9),BTBL4(9,9),BTBL5(9,9)
  1095. C    InTeGer*4 BTBL6(9,9),BTBL7(9,9),BTBL8(9,9)
  1096. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  1097. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  1098. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  1099. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  1100.     CHARACTER*1 DIGITS(16,3),BIGITS(16,3)
  1101. C
  1102. C OARRY WILL BE USED TO HOLD OUTPUT VARIABLE IF OSWIT IS NONZERO
  1103. CCC    InTeGer*4 OSWIT
  1104. C OCNTR MAY HOLD BYTES VALID IN OARRY (UP TO 100, NO MORE...)
  1105. CCC    InTeGer*4 OCNTR
  1106. CCC    CHARACTER*1 OARRY(100)
  1107. C
  1108. C ILINE IS PROGRAMMABLE LINE INPUT (I.E., NOT FROM CONSOLE)
  1109.     CHARACTER*1 ILINE(106)
  1110.     InTeGer*4 ILNFG
  1111.     InTeGer*4 ILNCT
  1112.     COMMON /ILN/ILNFG,ILNCT,ILINE
  1113. C ILINE IS PRESENT IF ILNFG <> 0 AND ILNCT HAS # BYTES IN IT.
  1114. CCC    COMMON /OAR/OSWIT,OCNTR,OARRY
  1115.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1116.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  1117.     COMMON /STACK/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  1118.      ;         ST1LIM,ST2LIM
  1119.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  1120.     COMMON /DECIDE/ DTBL1
  1121.     COMMON /DIGV/ DIGITS
  1122. C ***<<< KLSTO COMMON START >>>***
  1123.     InTeGer*4 DLFG
  1124. C    COMMON/DLFG/DLFG
  1125.     InTeGer*4 KDRW,KDCL
  1126. C    COMMON/DOT/KDRW,KDCL
  1127.     InTeGer*4 DTRENA
  1128. C    COMMON/DTRCMN/DTRENA
  1129.     REAL*8 EP,PV,FV
  1130.     DIMENSION EP(20)
  1131.     INTEGER*4 KIRR
  1132. C    COMMON/ERNPER/EP,PV,FV,KIRR
  1133. c    InTeGer*4 LASTOP
  1134. C    COMMON/ERROR/LASTOP
  1135.     CHARACTER*1 FMTDAT(9,76)
  1136. C    COMMON/FMTBFR/FMTDAT
  1137.     CHARACTER*1 EDNAM(16)
  1138. C    COMMON/EDNAM/EDNAM
  1139.     InTeGer*4 MFID(2),MFMOD(2)
  1140. C    COMMON/FRM/MFID,MFMOD
  1141.     InTeGer*4 JMVFG,JMVOLD
  1142. C    COMMON/FUBAR/JMVFG,JMVOLD
  1143.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  1144.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  1145. C ***<<< KLSTO COMMON END >>>***
  1146. CCC    COMMON /ERROR/ LASTOP
  1147.     COMMON/ITERA/ ITCNTV
  1148.     CHARACTER*1 DVFMT(12),BVFMT(12)
  1149.     COMMON/DEFVBX/DVFMT
  1150. C SUPPORT VVARY OVERLAY WITH INITIAL VARY DATA:
  1151.     REAL*8 QAC(26),QDERIV(8),QDEL(8),QOLDVV
  1152.     InTeGer*4 QCAC,QCENT(8),ACV(8)
  1153.     COMMON/VRYDAT/QAC,QDERIV,QDEL,QCAC,QCENT,QOLDVV,ACV
  1154. C INITIAL DEFAULT FORMAT FOR NUMERICS
  1155.     DATA BVFMT/'(','F','9','.','2',' ',
  1156.      1  ' ',' ',' ',' ',' ',')'/
  1157. C
  1158. C    DATA BIEWSW/2/
  1159. C    DATA ITCNTV/6*0/
  1160.     DATA BLPHA/'A','B','C','D','E','F','G','H','I','J','K','L','M',
  1161.      ;       'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','%'/
  1162.     DATA BIGITS/'1','2','3','4','5','6','7','8','9',
  1163.      1  '0','0','0','0','0','0','0',
  1164.      ;       '1','2','3','4','5','6','7',
  1165.      1  '0','0','0','0','0','0','0','0','0',
  1166.      ;  '1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','0'/
  1167.     DATA BOMMA/','/,BBLANK/' '/,BRPAR/')'/,BLPAR/'('/,BEQ/'='/
  1168. C
  1169. C
  1170. C DEFAULT BASE IS 10
  1171. C    DATA BASED/10/
  1172. C
  1173. C
  1174. C STACKS ARE CURRENTLY SET AT 40 ELEMENTS DEEP
  1175. C    DATA ST1LIM/40/, ST2LIM/40/
  1176. C
  1177. C
  1178. C
  1179. C    DEFAULT TYPES
  1180. C    A,B,C,D,E,F,G,H  =  DECIMAL
  1181. C    I,J,K,L,M,N      =  INTEGER (BASE10)
  1182. C    O,P,Q,R,S,T,U,V,W,X,Y,Z  =  DECIMAL
  1183. C
  1184. C  % AS INTEGER TO HOLD CALC VERSION NUMBER
  1185. C
  1186. C    DATA TYPE/8*2,6*4,12*2,4,1*2/
  1187. c modify type array so ac's i-n are reals
  1188. C    DATA TYPE/8*2,6*2,12*2,2,1*2/
  1189. C
  1190. C
  1191. C GIVE VERSION # BY VALUE IN %
  1192. C
  1193. c don't bother with this; by the time user gets into calc,
  1194. c % already is clobbered most times, so no need for it.
  1195. c    DATA AVBLS(1,27)/6/
  1196. c    DATA AVBLS(2,27)/0/,AVBLS(3,27)/0/,AVBLS(4,27)/0/
  1197. C
  1198. C
  1199. C
  1200. C
  1201. C SPECIFY THE LENGTH USED BY EACH DATA TYPE
  1202.     DATA BVLEN/1,8,4,4,8,8,8,4,8/
  1203. C
  1204. C NOTE ALL LENGTHS 8 OR LESS SINCE MULTIPLE PRECISION THINGS SNIPPED OUT
  1205. C
  1206. C  DECISION TABLE FOR PERFORMING BINARY OPERATIONS
  1207. C
  1208. C  DTBL1(OPERAND2,OPERAND1,INDEX)
  1209. C
  1210. C  WHERE:                    OPERATOR:
  1211. C  INDEX=1    MODIFY CODE FOR OPERAND 1    */+-
  1212. C     2    MODIFY CODE FOR OPERAND 2    */+-
  1213. C     3    FUNCTION VALUE TYPE        */+-
  1214. C     4    OPERATOR CLASS            */+-
  1215. C
  1216. C     5    MODIFY CODE FOR OPERAND 1    **
  1217. C     6    MODIFY CODE FOR OPERAND 2    **
  1218. C     7    FUNCTION VALUE TYPE        **
  1219. C     8    OPERATOR CLASS            **
  1220. C
  1221. C
  1222. C  WHERE TYPE CODES (MODIFY CODES) ARE:
  1223. C    0    NO CHANGE
  1224. C    1    CONVERT TO ASCII
  1225. C    2    CONVERT TO DECIMAL
  1226. C    3    CONVERT TO HEXADECIMAL
  1227. C    4    CONVERT TO INTEGER
  1228. C    5    CONVERT TO M10
  1229. C    6    CONVERT TO M8
  1230. C    7    CONVERT TO M16
  1231. C    8    CONVERT TO OCTAL
  1232. C    9    CONVERT TO REAL
  1233. C
  1234. C  FOR */+- FUNCTION VALUE TYPES AND OPERATOR CLASS ARE PRESENTLY
  1235. C  IDENTICAL
  1236. C
  1237. C  FOR **  OPERATOR CLASSES FOLLOW:
  1238. C
  1239. C     CODE    OPERATOR CLASS
  1240. C    1    REAL**REAL
  1241. C    2    REAL**INTEGER
  1242. C    3    INTEGER**REAL
  1243. C    4    INTEGER**REAL
  1244. C    5    M8**INTEGER
  1245. C    6    M10**INTEGER
  1246. C    7    M16**INTEGER
  1247. C
  1248. C
  1249. C
  1250. C    DATA BTBL1 /4,2,3,4,5,6,7,8,9,
  1251. 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,
  1252. 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/
  1253. C    DATA BTBL2/
  1254. 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,
  1255. 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/
  1256. C    DATA BTBL3/4,2,3,4,5,6,7,8,9,
  1257. 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,
  1258. 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/
  1259. C    DATA BTBL4/
  1260. 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,
  1261. 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,
  1262. C     9  9,2,7*9/
  1263. 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,
  1264. C     1  9*0,9*0/
  1265. 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,
  1266. 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,
  1267. C     3  4,3*0,3*9,2*0/
  1268. 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,
  1269. C     4  7,9,6*7,9,9*8,9*9/
  1270. 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,
  1271. 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,
  1272. C     6  4,3,2,1,2,2,3*1,2,1/
  1273. C
  1274. C HERE COPY LOCAL DATA INTO THE COMMONS.
  1275. C SINCE MOST ARRAYS AND THINGS ARE SMALL, WE JUST DO IT WITH REGULAR FORTRAN.
  1276. C THE BTBL ARRAY IS HANDLED IN WRKFIL WHERE THERE'S A BIG ENOUGH ARRAY FOR
  1277. C SCRATCH SPACE TO HOLD THE INITIAL DATA; WRKFIL IS CALLED BY WSSET WITH
  1278. C "SECRET CODE" TO INIT DTBL1 FROM THE ARRAY AND DOES SO ONCE ONLY.
  1279.     VIEWSW=0
  1280.     LEVEL=1
  1281.     LASTOP=0
  1282.     BASED=10
  1283.     COMMA=BOMMA
  1284.     BLANK=BBLANK
  1285.     RPAR=BRPAR
  1286.     LPAR=BLPAR
  1287.     EQ=BEQ
  1288.     DO 1 N=1,6
  1289.     ITCNTV(N)=0
  1290. 1    CONTINUE
  1291.     DO 2 N=1,27
  1292.     DO 12 NN=1,20
  1293. 12    AVBLS(NN,N)=0
  1294. 2    ALPHA(N)=BLPHA(N)
  1295.     ST1LIM=40
  1296.     ST2LIM=40
  1297. C THIS IS DONE IN WRKFIL SINCE THERE'S A BIG LOCAL ARRAY THERE
  1298. C WE CAN KEEP EQUIVALENCED TO THIS ONE...
  1299. C    DO 3 N2=1,9
  1300. C    DO 3 N1=1,9
  1301. C    DTBL1(N1,N2,2)=BTBL2(N1,N2)
  1302. C    DTBL1(N1,N2,3)=BTBL3(N1,N2)
  1303. C    DTBL1(N1,N2,4)=BTBL4(N1,N2)
  1304. C    DTBL1(N1,N2,5)=BTBL5(N1,N2)
  1305. C    DTBL1(N1,N2,6)=BTBL6(N1,N2)
  1306. C    DTBL1(N1,N2,7)=BTBL7(N1,N2)
  1307. C    DTBL1(N1,N2,8)=BTBL8(N1,N2)
  1308. C3    DTBL1(N1,N2,1)=BTBL1(N1,N2)
  1309.     DO 4 N=1,9
  1310.     VLEN(N)=BVLEN(N)
  1311. 4    CONTINUE
  1312.     DO 5 N2=1,3
  1313.     DO 5 N1=1,16
  1314.     DIGITS(N1,N2)=BIGITS(N1,N2)
  1315. 5    CONTINUE
  1316. C SET UP DEFAULT DISPLAY FORMAT (INCLUDES "(" AND ")" CHARS WHICH
  1317. C ***MUST*** BE THERE FOR MAIN PGM TO WORK).
  1318.     DO 17 N=1,12
  1319.     DVFMT(N)=BVFMT(N)
  1320. 17    Continue
  1321. d    ill=loc(bvfmt(1))
  1322. d    write(*,9210) (bvfmt(n),n=1,12),ill
  1323. d    ill=loc(dvfmt(1))
  1324. d    write(*,9210) (dvfmt(n),n=1,12),ill
  1325. d9210   Format(' Bvfmt at init=',12A1,': addr=',i12)
  1326.     DO 15 N=1,26
  1327.     QAC(N)=0.
  1328. 15    CONTINUE
  1329.     DO 18 N=1,8
  1330.     QDERIV(N)=1.
  1331.     ACV(N)=0
  1332.     QDEL(N)=0.
  1333.     QCENT(N)=0
  1334. 18    CONTINUE
  1335.     QOLDVV=1.
  1336.     QCAC=1
  1337.     OSWIT=0
  1338.     OCNTR=0
  1339.     ILNFG=0
  1340.     ILNCT=0
  1341.     IC1POS=0
  1342.     IC2POS=0
  1343.     RETURN
  1344.     END
  1345. c -h- dtrcmd.for    Fri Aug 22 13:04:33 1986    
  1346. C DATATRIEVE INTERFACE FUNCTIONS
  1347. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  1348. C
  1349. C THIS IS THE NON-DTR VERSION with dummy entry points for
  1350. C the DTR functions BUT supplying the new non-DTR functions
  1351. c completely.
  1352.     SUBROUTINE DTRCMD(LINE)
  1353.     CHARACTER*1 LINE(80)
  1354.     CHARACTER*62 LINEC
  1355. C    EQUIVALENCE(LINEC(1:1),LINE(1))
  1356. C    INCLUDE 'VKLUGPRM.FTN'
  1357. C COPYRIGHT (C) 1983 GLENN EVERHART
  1358.     INTEGER RETCD
  1359. C
  1360. C DEFINE FILE AREAS FOR MAPPING FILES...
  1361. C ONE INPUT FILE, TO BE ACCESSED AS A RANDOM ACCESS FILE OF 128 BYTE
  1362. C RECORDS OF DATA IF RANDOM, OR AS A FORMULA FILE IF SEQUENTIAL, AND
  1363. C ONE OUTPUT FILE TO BE WRITTEN THE SAME WAY. INPUT FILE CAN BE
  1364. C INPUT - ONLY OR READ/WRITE.
  1365. C
  1366. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  1367. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  1368. C
  1369. C MFIOPN =    0    IF NOT OPEN
  1370. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  1371. C        2    IF OPEN READ ONLY, RANDOM
  1372. C        3    IF OPEN READ/WRITE, RANDOM.
  1373. C
  1374. C MFOOPN =    0    IF NOT OPEN
  1375. C        1    IF OPEN WRITE SEQUENTIAL
  1376. C        2    IF OPEN WRITE RANDOM
  1377. C
  1378. C OTHER OPTIONS DON'T MAKE SENSE.
  1379. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  1380. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  1381. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  1382. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  1383.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  1384.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  1385.  
  1386.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  1387.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  1388.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  1389. C
  1390. C
  1391.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  1392.     InTeGer*4 TYPE(1,1),VLEN(9)
  1393.     REAL*8 XAC,XVBLS(1,1)
  1394.     REAL*8 TAC,UAC,VAC,WAC,YAC
  1395.     REAL*8 TMP
  1396.     INTEGER*4 JVBLS(2,1,1)
  1397.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  1398.     EQUIVALENCE(XAC,AVBLS(1,27))
  1399.     EQUIVALENCE(TAC,AVBLS(1,20))
  1400.     EQUIVALENCE(UAC,AVBLS(1,21))
  1401.     EQUIVALENCE(VAC,AVBLS(1,22))
  1402.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  1403.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  1404.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1405. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  1406. CCC    CHARACTER*1 XTNCMD(80)
  1407. C ***<<<< RDD COMMON START >>>***
  1408.     InTeGer*4 RRWACT,RCLACT
  1409. C    COMMON/RCLACT/RRWACT,RCLACT
  1410.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1411.      1  IDOL7,IDOL8
  1412. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1413. C     1  IDOL7,IDOL8
  1414.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1415. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1416.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1417. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1418. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1419. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1420.     InTeGer*4 KLVL
  1421. C    COMMON/KLVL/KLVL
  1422.     InTeGer*4 IOLVL,IGOLD
  1423. C    COMMON/IOLVL/IOLVL
  1424. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1425. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1426.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1427.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1428.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1429. C ***<<< RDD COMMON END >>>***
  1430. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1431. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1432. CCC    InTeGer*4 RRWACT,RCLACT
  1433. CCC    COMMON/RCLACT/RRWACT,RCLACT
  1434. C ***<<< XVXTCD COMMON START >>>***
  1435.     CHARACTER*1 OARRY(100)
  1436.     InTeGer*4 OSWIT,OCNTR
  1437. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1438. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1439.     InTeGer*4 IPS1,IPS2,MODFLG
  1440. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1441.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1442.        CHARACTER*1 XTNCMD(80)
  1443. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1444. C VARY FLAG ITERATION COUNT
  1445.     INTEGER KALKIT
  1446. C    COMMON/VARYIT/KALKIT
  1447.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1448.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1449. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1450. C     1  IRCE2
  1451. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1452. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1453. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1454. C RCFGX ON.
  1455. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1456. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1457. C  AND VM INHIBITS. (SETS TO 1).
  1458.     INTEGER*4 FH
  1459. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1460. C    COMMON/CONSFH/FH
  1461.     CHARACTER*1 ARGSTR(52,4)
  1462. C    COMMON/ARGSTR/ARGSTR
  1463.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1464.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1465.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1466.      3  IRCE2,FH,ARGSTR
  1467. C ***<<< XVXTCD COMMON END >>>***
  1468. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1469. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  1470. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1471. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  1472. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  1473. C (IMPLEMENT FOR VAX ONLY)
  1474. CCC    INTEGER KALKIT
  1475. CCC    COMMON/VARYIT/KALKIT
  1476. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  1477. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  1478. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1479. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1480.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1481.     COMMON/D2R/NRDSP,NCDSP
  1482. C ***<<< KLSTO COMMON START >>>***
  1483.     InTeGer*4 DLFG
  1484. C    COMMON/DLFG/DLFG
  1485.     InTeGer*4 KDRW,KDCL
  1486. C    COMMON/DOT/KDRW,KDCL
  1487.     InTeGer*4 DTRENA
  1488. C    COMMON/DTRCMN/DTRENA
  1489.     REAL*8 EP,PV,FV
  1490.     DIMENSION EP(20)
  1491.     INTEGER*4 KIRR
  1492. C    COMMON/ERNPER/EP,PV,FV,KIRR
  1493.     InTeGer*4 LASTOP
  1494. C    COMMON/ERROR/LASTOP
  1495.     CHARACTER*1 FMTDAT(9,76)
  1496. C    COMMON/FMTBFR/FMTDAT
  1497.     CHARACTER*1 EDNAM(16)
  1498. C    COMMON/EDNAM/EDNAM
  1499.     InTeGer*4 MFID(2),MFMOD(2)
  1500. C    COMMON/FRM/MFID,MFMOD
  1501.     InTeGer*4 JMVFG,JMVOLD
  1502. C    COMMON/FUBAR/JMVFG,JMVOLD
  1503.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  1504.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  1505. C ***<<< KLSTO COMMON END >>>***
  1506. CCC    InTeGer*4 DTRENA
  1507. CCC    COMMON/DTRCMN/DTRENA
  1508.     CHARACTER *1 LINECL(82)
  1509. C    CHARACTER*70 LINEC
  1510.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  1511. C    CHARACTER*80 SCRBUF
  1512.     CHARACTER*1 LBUF(128)
  1513.     CHARACTER*1 MBUF(128)
  1514.     CHARACTER*110 CLBUF,CMBUF
  1515.     CHARACTER*50 CCLBUF,CCMBUF
  1516.     CHARACTER*11 C11LBF
  1517. C    EQUIVALENCE(C11LBF(1:1),CLBUF(1:1))
  1518.     EQUIVALENCE(CLBUF(1:1),CCLBUF(1:1),LBUF(1),C11LBF(1:1)),
  1519.      1  (CMBUF(1:1),CCMBUF(1:1),MBUF(1))
  1520. C    EQUIVALENCE(CLBUF,LBUF(1)),(CMBUF,MBUF(1))
  1521. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  1522.     CHARACTER*9 FMTB
  1523.     EQUIVALENCE (FMTB(1:1),LBUF(120))
  1524.     CHARACTER*11 FMTBF
  1525.     CHARACTER*1 IFVLD
  1526. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  1527. ccc    DO 3332 N=1,80
  1528. ccc    NN=81-N
  1529. ccc    IF(ICHAR(LINE(NN)).GT.32)GOTO 3333
  1530. ccc    LINE(NN)=CHAR(0)
  1531. ccc3332    CONTINUE
  1532. ccc3333    CONTINUE
  1533. C SPACE FILL ENTIRE ARRAY
  1534.     DO 3334 N=1,82
  1535. 3334    LINECL(N)=CHAR(32)
  1536.     RETCD=1
  1537. C HANDLE DTRCMD FUNCTIONS. LINE ARRAY PASSED IN HERE
  1538. C STARTS AFTER THE "DTR" SO WE CAN DECODE IT.
  1539. C EXECUTE DTR COMMAND
  1540. C  DTRCMD (COMMAND) GIVES DTR COMMAND FACILITY AT COMMAND
  1541. C LEVEL.
  1542. C ALLOW DTRIMM COMMAND TO USE DTR IMMEDIATE TERMINAL
  1543. C INTERFACE. THE REST CAN USE SAME COMMAND NAMES AS AFTER
  1544. C THE "DB" IN *U DBXXXX COMMANDS.
  1545. 500    CONTINUE
  1546. C ENABLE/DISABLE FOR DTR FUNCTIONS
  1547. C SETTING DTRENA TO -1 IMPLIES DISABLE FUNCTIONS
  1548.     CALL SCMP(LINE,'ENA',3,ICODE)
  1549.     IF(ICODE.NE.1)GOTO 600
  1550.     DTRENA=1
  1551.     GOTO 9999
  1552. 600    CONTINUE
  1553.     CALL SCMP(LINE,'DIS',3,ICODE)
  1554.     IF(ICODE.NE.1)GOTO 700
  1555.     DTRENA=-1
  1556.     GOTO 9999
  1557. 700    CONTINUE
  1558.     CALL SCMP(LINE,'OPINS',5,ICODE)
  1559. C OPEN INPUT SEQUENTIAL
  1560.     IF(ICODE.NE.1)GOTO 3800
  1561. C DTROPINS RANGE FILENAME
  1562.     IBGN=6
  1563.     IVLD=0
  1564.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  1565.     IF(IVLD.EQ.3)GOTO 9990
  1566.     LINE(LSTCH+25)=CHAR(0)
  1567.     OPEN(UNIT=MFILUN,FILE=LINE(LSTCH),ACCESS='SEQUENTIAL',
  1568.      1  STATUS='OLD',IOSTAT=IVVV)
  1569.     IF(IVVV.NE.0)GOTO 9990
  1570.     MFIOPN=1
  1571.     GOTO 9999
  1572. 3800    CONTINUE
  1573.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  1574. C OPEN IN RANDOM READ
  1575.     IF(ICODE.NE.1)GOTO 3900
  1576.     KK=2
  1577.     GOTO 3910
  1578. 3900    CONTINUE
  1579.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  1580. C OPEN IN RANDOM UPDATE
  1581.     IF(ICODE.NE.1)GOTO 3950
  1582.     KK=3
  1583. 3910    CONTINUE
  1584. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  1585.     IBGN=7
  1586.     IVLD=0
  1587.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  1588.     IF(IVLD.EQ.3)GOTO 9990
  1589. C *******
  1590. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  1591.     DO 5601 NN=1,50
  1592. 5601    MBUF(NN)=' '
  1593.     DO 5602 NN=1,25
  1594. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  1595. C    LINE(LSTCH+25)=0
  1596. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  1597. C    OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='BINARY',
  1598. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='OLD',
  1599. C     1  RECL=128,BLOCKSIZE=128,ERR=9990)
  1600.     OPEN(UNIT=MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  1601.      1  STATUS='OLD',FORM='UNFORMATTED',RECL=128,
  1602.      1  IOSTAT=IVVV)
  1603.     IF(IVVV.NE.0)GOTO 9990
  1604.     MFIOPN=KK
  1605.     GOTO 9999
  1606. 3950    CONTINUE
  1607.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  1608. C OPEN OUTPUT SEQUENTIAL
  1609.     IF(ICODE.NE.1)GOTO 4000
  1610.     IBGN=7
  1611.     IVLD=0
  1612.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  1613.     IF(IVLD.EQ.3)GOTO 9990
  1614. C *******
  1615. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  1616. C    LINE(LSTCH+25)=0
  1617.     DO 5603 NN=1,50
  1618. 5603    MBUF(NN)=' '
  1619.     DO 5604 NN=1,25
  1620. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  1621.     OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='SEQUENTIAL',
  1622.      1  STATUS='NEW',IOSTAT=IVVV)
  1623.     IF(IVVV.NE.0)GOTO 9990
  1624.     MFOOPN=1
  1625.     GOTO 9999
  1626. 4000    CONTINUE
  1627.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  1628. C OPEN OUTPUT RANDOM
  1629.     IF(ICODE.NE.1)GOTO 4100
  1630.     IBGN=7
  1631.     IVLD=0
  1632.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  1633.     IF(IVLD.EQ.3)GOTO 9990
  1634. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  1635. C *******
  1636. C NEED HERE TO MOVE NAME INTO CHAR ARRAY...
  1637.     DO 5605 NN=1,50
  1638. 5605    MBUF(NN)=' '
  1639.     DO 5606 NN=1,25
  1640. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  1641. C    LINE(LSTCH+25)=0
  1642. C    OPEN(UNIT=MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  1643. C     1  INITIALSIZE=NBK,FORM='UNFORMATTED',STATUS='NEW',
  1644. C     1  RECL=32,BLOCKSIZE=128,ERR=9990)
  1645.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='DIRECT',
  1646.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  1647.      2  IOSTAT=IVVV)
  1648.     IF(IVVV.NE.0)GOTO 9990
  1649.     MFOOPN=2
  1650.     GOTO 9999
  1651. 4100    CONTINUE
  1652.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  1653. C CLOSE OUTPUT 
  1654.     IF(ICODE.NE.1)GOTO 4200
  1655.     CLOSE(UNIT=MFOLUN)
  1656.     MFOOPN=0
  1657.     GOTO 9999
  1658. 4200    CONTINUE
  1659.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  1660. C CLOSE INPUT 
  1661.     IF(ICODE.NE.1)GOTO 4300
  1662.     CLOSE(UNIT=MFILUN)
  1663.     MFIOPN=0
  1664.     GOTO 9999
  1665. 4300    CONTINUE
  1666.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  1667. C ENABLE OUTPUT 
  1668.     IF(ICODE.NE.1)GOTO 4400
  1669.     MFOFLG=1
  1670.     GOTO 9999
  1671. 4400    CONTINUE
  1672.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  1673. C ENABLE INPUT 
  1674.     IF(ICODE.NE.1)GOTO 4500
  1675.     MFIFLG=1
  1676.     GOTO 9999
  1677. 4500    CONTINUE
  1678.     CALL SCMP(LINE,'DISINP',6,ICODE)
  1679. C DISABLE INPUT 
  1680.     IF(ICODE.NE.1)GOTO 4510
  1681.     MFIFLG=0
  1682.     GOTO 9999
  1683. 4510    CONTINUE
  1684.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  1685. C DISABLE OUTPUT
  1686.     IF(ICODE.NE.1)GOTO 4520
  1687.     MFOFLG=0
  1688.     GOTO 9999
  1689. 4520    CONTINUE
  1690.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  1691. C ENABLE INPUT FORCE
  1692. C COMMAND
  1693. C DTREDTINP RANGE
  1694. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  1695. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  1696. C IT OUT AGAIN.
  1697.     IF(ICODE.NE.1)GOTO 4600
  1698. C FORCE ENABLE OF READIN DURING THIS
  1699.     MFIFLG=1
  1700.     MFOFLG=1
  1701. C ENABLE OUTPUT TOO.
  1702.     IBGN=7
  1703.     IVLD=0
  1704.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  1705.     IF(IVLD.EQ.3)GOTO 9990
  1706.     DO 4550 N1=IXRL,IXRH
  1707.     DO 4550 N2=IXCL,IXCH
  1708.     CALL REFLEC(N2,N1,IRX)
  1709. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  1710.     CALL FVLDST(N1,N2,Char(255))
  1711.     CALL WRKFIL(IRX,LBUF,0)
  1712.     CALL WRKFIL(IRX,LBUF,1)
  1713. 4550    CONTINUE
  1714.     MFIFLG=0
  1715.     MFOFLG=0
  1716.     GOTO 9999
  1717. 4600    CONTINUE
  1718.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  1719. C FORMAT/WRITE OUTPUT
  1720. C COMMAND
  1721. C DTRFMTOUT RANGE
  1722. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  1723. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  1724. C IT OUT AGAIN.
  1725.     IF(ICODE.NE.1)GOTO 4630
  1726.     IVLFG=1
  1727.     GOTO 4740
  1728. 4630    CONTINUE
  1729.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  1730.     IF(ICODE.NE.1)GOTO 4700
  1731. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  1732.     IVFLG=2
  1733. C    GOTO 4740
  1734. 4740    CONTINUE
  1735. C FORCE ENABLE OF READIN DURING THIS
  1736.     MFIFLG=1
  1737.     MFOFLG=1
  1738. C ENABLE OUTPUT TOO.
  1739.     IBGN=7
  1740.     IVLD=0
  1741.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  1742.     IF(IVLD.EQ.3)GOTO 9990
  1743.     DO 4650 N1=IXRL,IXRH
  1744.     DO 4650 N2=IXCL,IXCH
  1745. C FIND INDEX FOR WRKFIL
  1746.     CALL REFLEC(N2,N1,IRX)
  1747. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  1748.     CALL XVBLGT(N1,N2,TMP)
  1749. C TMP IS REAL*8 SCRATCH
  1750.     CALL FVLDST(N1,N2,Char(255))
  1751.     CALL WRKFIL(IRX,LBUF,0)
  1752. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  1753. C NOW GRAB THE VALUE AND SAVE IT...
  1754. C FIRST MOVE THE FORMAT DOWN
  1755. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  1756.     DO 4651 N=1,9
  1757.     LBUF(N+1)=LBUF(N+119)
  1758. 4651    CONTINUE
  1759.     LBUF(1)='('
  1760.     LBUF(11)=')'
  1761. c    LBUF(12)=CHAR(0)
  1762. C CHANGE TO USE CHAR VERSION OF LBUF
  1763. C *******
  1764. C FORMAT NOW LIVES IN LOW PART OF LBUF
  1765. C D25.17 FORMAT WOULD DO FOR WRITE
  1766. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF(1:11),ERR=4652)TMP
  1767.     IF(IVLFG.EQ.1)WRITE(LINEC(1:70),C11LBF,ERR=4652)TMP
  1768.     IF(IVLFG.EQ.2)WRITE(LINEC(1:70),4658,ERR=4652)TMP
  1769. 4658    FORMAT(D25.17)
  1770. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  1771. C USE DISPLAY FORMAT.
  1772. 4652    CONTINUE
  1773.     KK=1
  1774.     DO 4653 N=1,110
  1775. 4653    LBUF(N)=CHAR(0)
  1776.     DO 4654 N=1,60
  1777. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  1778.     KKK=JCHAR(LINECL(N))
  1779.     IF(KKK.LE.32)GOTO 4654
  1780.     LBUF(KK)=LINECL(N)
  1781.     KK=KK+1
  1782. 4654    CONTINUE
  1783.     CALL WRKFIL(IRX,LBUF,1)
  1784. 4650    CONTINUE
  1785.     MFIFLG=0
  1786.     MFOFLG=0
  1787.     GOTO 9999
  1788. 4700    CONTINUE
  1789.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  1790.     IF(ICODE.NE.1)GOTO 4800
  1791. C DBCMPFRM V1:V2
  1792. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  1793.     IBGN=7
  1794.     IVLD=0
  1795. C USE GMTX TO GET CELL ADDRESSES.
  1796.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  1797.     IF(IVLD.EQ.3)GOTO 9990
  1798. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  1799.     CALL REFLEC(IXCL,IXRL,IRXL)
  1800.     CALL REFLEC(IXCH,IXRH,IRXH)
  1801.     IF(LINE(LSTCH).NE.',')GOTO 4780
  1802.     IBGN=LSTCH+1
  1803.     IVLD=0
  1804.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  1805.     IF(IVLD.EQ.3)GOTO 4780
  1806. C GET THE LENGTHS NOW
  1807.     CALL XVBLGT(IYRL,IYCL,TMP)
  1808.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  1809.     LBUFL=TMP
  1810.     CALL XVBLGT(IYRH,IYCH,TMP)
  1811.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  1812.     MBUFL=TMP
  1813. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  1814. C COMPARISONS BASED ON THAT.
  1815.     GOTO 4770
  1816. 4780    CONTINUE
  1817. C GET INDEX OF EACH ELEMENT...
  1818.     CALL WRKFIL(IRXL,LBUF,0)
  1819.     CALL WRKFIL(IRXH,MBUF,0)
  1820. C LOAD THE 2 FORMULAS.
  1821. C NOW FIND THE ENDS...
  1822.     DO 4750 N=1,110
  1823.     NN=111-N
  1824.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  1825. 4750    CONTINUE
  1826. 4751    LBUFL=NN
  1827.     DO 4760 N=1,110
  1828.     NN=111-N
  1829.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  1830. 4760    CONTINUE
  1831. 4761    MBUFL=NN
  1832. 4770    CONTINUE
  1833. c find index pos'n by hand...
  1834.     KK=LBUFL-MBUFL+1
  1835.     DO 4776 NN=1,KK
  1836.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  1837.     NNN=MBUFL-1
  1838.     DO 4777 N=1,NNN
  1839.     IVVV=NN+N
  1840.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  1841. 4777    CONTINUE
  1842. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  1843. C SINCE NN IS WHAT WE NEED, GO USE IT.
  1844.     GOTO 4779
  1845. 4778    CONTINUE
  1846. 4776    CONTINUE
  1847. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  1848. C
  1849.     NN=0
  1850. 4779    CONTINUE
  1851. C NN IS LOCATION OF SUBSTRING NOW
  1852. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  1853. C NN IS LOCATION OF SUBSTRING NOW
  1854.     XAC=NN
  1855. C RETURN RESULT IN % ACCUMULATOR.
  1856.     WAC=0.
  1857.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  1858.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  1859. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  1860. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  1861. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  1862.     GOTO 9999
  1863. 4800    CONTINUE
  1864.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  1865.     IF(ICODE.NE.1)GOTO 4900
  1866. C DBLENFRM V1:V2
  1867. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  1868.     IBGN=7
  1869.     IVLD=0
  1870. C USE GMTX TO GET CELL ADDRESSES.
  1871.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  1872.     IF(IVLD.EQ.3)GOTO 9990
  1873. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  1874.     CALL REFLEC(IXCL,IXRL,IRXL)
  1875. C GET INDEX OF EACH ELEMENT...
  1876.     CALL WRKFIL(IRXL,LBUF,0)
  1877. C LOAD THE FORMULA.
  1878. C NOW FIND THE END...
  1879.     DO 4850 N=1,110
  1880.     NN=111-N
  1881.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  1882. 4850    CONTINUE
  1883. 4851    LBUFL=NN
  1884.     TMP=LBUFL
  1885.     XAC=TMP
  1886. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  1887.     NN=0
  1888. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  1889.     CALL FVLDGT(IXRH,IXCH,NN)
  1890.     IF(NN.EQ.0)GOTO 9999
  1891.     CALL XVBLST(IXRH,IXCH,TMP)
  1892.     GOTO 9999
  1893. 4900    CONTINUE
  1894.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  1895.     IF(ICODE.NE.1)GOTO 5000
  1896. C TRIM FORMULA
  1897. C DTRTRMFRM INCELL:OUTCELL,START:END
  1898. C RETURNS TRIMMED FORMULA TO CELL.
  1899.     IBGN=7
  1900.     IVLD=0
  1901. C USE GMTX TO GET CELL ADDRESSES.
  1902.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  1903.     IF(IVLD.EQ.3)GOTO 9990
  1904. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  1905.     CALL REFLEC(IXCL,IXRL,IRXL)
  1906. C GET INDEX OF EACH ELEMENT...
  1907.     CALL REFLEC(IXCH,IXRH,IRXH)
  1908.     CALL WRKFIL(IRXL,LBUF,0)
  1909.     LO=LSTCHR+1
  1910.     LHI=LSTCHR+21
  1911.     LSTCHR=LHI
  1912.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  1913.     IF(IVLD.EQ.0)GOTO 9990
  1914.     CALL XVBLGT(JD1,JD2,TMP)
  1915.     LOCHR=1
  1916.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  1917. C LOCHR = START CHAR
  1918.     LO=LSTCHR+1
  1919.     LHI=LSTCHR+21
  1920.     LSTCHR=LHI
  1921.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  1922.     IF(IVLD.EQ.0)GOTO 9990
  1923.     CALL XVBLGT(JD1,JD2,TMP)
  1924.     LHICHR=110
  1925.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  1926. C LHICHR IS END CHARACTER
  1927. C NOW ALL ARGS ARE COLLECTED.
  1928. C (IGNORE WHAT WAS DELIMITER...)
  1929. C COPY DESIRED STUFF TO MBUF
  1930.     N=1
  1931.     DO 4910 NN=1,110
  1932.     MBUF(NN)=CHAR(0)
  1933.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  1934.     MBUF(N)=LBUF(NN)
  1935.     N=N+1
  1936. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  1937. 4910    CONTINUE
  1938.     DO 4911 NN=111,128
  1939. 4911    MBUF(NN)=LBUF(NN)
  1940.     CALL WRKFIL(IRXH,MBUF,1)
  1941. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  1942. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  1943.     GOTO 9999
  1944. 5000    CONTINUE
  1945.     GOTO 9999
  1946. 9990    RETCD=3
  1947. C ERROR RETURN
  1948. 9999    RETURN
  1949.     END
  1950. c -h- dtrfct.for    Fri Aug 22 13:05:02 1986    
  1951. C DATATRIEVE INTERFACE FUNCTIONS
  1952. C NON-DATATRIEVE PARTS, FOR MSDOS VERSION
  1953. C COPYRIGHT 1986 GCE
  1954.     SUBROUTINE DTRFCT(LINE,RETCD)
  1955.     InTeGer*4 RETCD
  1956.     CHARACTER*1 LINE(80)
  1957.     CHARACTER *1 LINECL(82)
  1958.     CHARACTER*62 LINEC
  1959.     EQUIVALENCE(LINEC(1:1),LINECL(1))
  1960. C
  1961. C
  1962. C DEFINE FILE AREAS FOR MAPPING FILES...
  1963. C
  1964. C DEFINE ALSO DATA STRUCTURES TO HOLD CELL RANGES (IN ROW AND COL)
  1965. C TO BE TREATED WITH THESE FILES, FLAG FOR HOW-OPEN, AND LUN USED.
  1966. C
  1967. C MFIOPN =    0    IF NOT OPEN
  1968. C        1    IF OPEN FOR READ ONLY, SEQUENTIAL
  1969. C        2    IF OPEN READ ONLY, RANDOM
  1970. C        3    IF OPEN READ/WRITE, RANDOM.
  1971. C
  1972. C MFOOPN =    0    IF NOT OPEN
  1973. C        1    IF OPEN WRITE SEQUENTIAL
  1974. C        2    IF OPEN WRITE RANDOM
  1975. C
  1976. C OTHER OPTIONS DON'T MAKE SENSE.
  1977. C MFIRL,MFIRH = RRW DIMENSION LOW, HIGH BOUND, INPUT FILE
  1978. C MFICL,MFICH = RCL DIMENSION LOW, HIGH BOUND, INPUT FILE
  1979. C MFORL,RH,MFOCL,CH = OUT FILE BOUNDS
  1980. C MFILUN,MFOLUN ARE LOGICAL UNITS.
  1981.     InTeGer*4 MFIOPN,MFIRL,MFIRH,MFICL,MFICH
  1982.     InTeGer*4 MFOOPN,MFORL,MFORH,MFOCL,MFOCH
  1983.     InTeGer*4 MFILUN,MFOLUN,MFIFLG,MFOFLG
  1984.     COMMON/MFILES/MFIOPN,MFOOPN,MFIRL,MFIRH,MFICL,MFICH,
  1985.      1  MFORL,MFORH,MFOCL,MFOCH,MFILUN,MFOLUN,MFIFLG,MFOFLG
  1986. C
  1987. C
  1988. C    INCLUDE 'VKLUGPRM.FTN'
  1989. C COPYRIGHT (C) 1983 GLENN EVERHART
  1990. C PERMISSION IS GIVEN TO ANYONE TO USE, DISTRIBUTE, OR COPY THIS
  1991. C PROGRAM FREELY BUT NOT TO SELL IT COMMERICALLY.
  1992.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  1993.     InTeGer*4 TYPE(1,1),VLEN(9)
  1994.     REAL*8 XAC,XVBLS(1,1)
  1995.     REAL*8 TAC,UAC,VAC,WAC,YAC
  1996.     REAL*8 TMP
  1997.     INTEGER*4 JVBLS(2,1,1)
  1998.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  1999.     EQUIVALENCE(XAC,AVBLS(1,27))
  2000.     EQUIVALENCE(TAC,AVBLS(1,20))
  2001.     EQUIVALENCE(UAC,AVBLS(1,21))
  2002.     EQUIVALENCE(VAC,AVBLS(1,22))
  2003.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  2004.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  2005.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  2006. C ***<<<< RDD COMMON START >>>***
  2007.     InTeGer*4 RRWACT,RCLACT
  2008. C    COMMON/RCLACT/RRWACT,RCLACT
  2009.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2010.      1  IDOL7,IDOL8
  2011. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2012. C     1  IDOL7,IDOL8
  2013.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2014. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2015.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2016. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2017. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2018. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2019.     InTeGer*4 KLVL
  2020. C    COMMON/KLVL/KLVL
  2021.     InTeGer*4 IOLVL,IGOLD
  2022. C    COMMON/IOLVL/IOLVL
  2023. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2024. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2025.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2026.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2027.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2028. C ***<<< RDD COMMON END >>>***
  2029. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  2030. CCC    CHARACTER*1 XTNCMD(80)
  2031. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2032. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2033. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2034. CCC    InTeGer*4 RRWACT,RCLACT
  2035. CCC    COMMON/RCLACT/RRWACT,RCLACT
  2036. C ***<<< XVXTCD COMMON START >>>***
  2037.     CHARACTER*1 OARRY(100)
  2038.     InTeGer*4 OSWIT,OCNTR
  2039. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  2040. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  2041.     InTeGer*4 IPS1,IPS2,MODFLG
  2042. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  2043.        InTeGer*4 XTCFG,IPSET,XTNCNT
  2044.        CHARACTER*1 XTNCMD(80)
  2045. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2046. C VARY FLAG ITERATION COUNT
  2047.     INTEGER KALKIT
  2048. C    COMMON/VARYIT/KALKIT
  2049.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2050.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2051. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2052. C     1  IRCE2
  2053. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2054. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2055. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2056. C RCFGX ON.
  2057. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2058. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2059. C  AND VM INHIBITS. (SETS TO 1).
  2060.     INTEGER*4 FH
  2061. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2062. C    COMMON/CONSFH/FH
  2063.     CHARACTER*1 ARGSTR(52,4)
  2064. C    COMMON/ARGSTR/ARGSTR
  2065.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2066.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2067.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2068.      3  IRCE2,FH,ARGSTR
  2069. C ***<<< XVXTCD COMMON END >>>***
  2070. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  2071. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2072. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  2073. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  2074. C (IMPLEMENT FOR VAX ONLY)
  2075.     INTEGER IVVV
  2076. CCC    COMMON/VARYIT/KALKIT
  2077. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  2078. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  2079. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2080. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2081.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  2082.     COMMON/D2R/NRDSP,NCDSP
  2083. C ***<<< KLSTO COMMON START >>>***
  2084.     InTeGer*4 DLFG
  2085. C    COMMON/DLFG/DLFG
  2086.     InTeGer*4 KDRW,KDCL
  2087. C    COMMON/DOT/KDRW,KDCL
  2088.     InTeGer*4 DTRENA
  2089. C    COMMON/DTRCMN/DTRENA
  2090.     REAL*8 EP,PV,FV
  2091.     DIMENSION EP(20)
  2092.     INTEGER*4 KIRR
  2093. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2094.     InTeGer*4 LASTOP
  2095. C    COMMON/ERROR/LASTOP
  2096.     CHARACTER*1 FMTDAT(9,76)
  2097. C    COMMON/FMTBFR/FMTDAT
  2098.     CHARACTER*1 EDNAM(16)
  2099. C    COMMON/EDNAM/EDNAM
  2100.     InTeGer*4 MFID(2),MFMOD(2)
  2101. C    COMMON/FRM/MFID,MFMOD
  2102.     InTeGer*4 JMVFG,JMVOLD
  2103. C    COMMON/FUBAR/JMVFG,JMVOLD
  2104.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2105.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2106. C ***<<< KLSTO COMMON END >>>***
  2107. CCC    InTeGer*4 DTRENA
  2108. CCC    COMMON/DTRCMN/DTRENA
  2109. C    CHARACTER*70 LINEC
  2110.     CHARACTER*1 LBUF(128)
  2111.     CHARACTER*1 MBUF(128)
  2112.     CHARACTER*110 CLBUF,CMBUF
  2113. C    EQUIVALENCE(CLBUF(1:1),LBUF(1)),(CMBUF(1:1),MBUF(1))
  2114.     CHARACTER*50 CCMBUF
  2115.     CHARACTER*11 C11LBF
  2116.     EQUIVALENCE(CCMBUF(1:1),CMBUF(1:1),MBUF(1)),
  2117.      1  (C11LBF(1:1),CLBUF(1:1),LBUF(1))
  2118. C USE CLBUF, CMBUF FOR CHARACTER COMPARISONS...
  2119. c    CHARACTER*1 IFVLD
  2120.     RETCD=1
  2121.     IF(DTRENA.LT.0)GOTO 9999
  2122. C NULL OUT ANY TRAILING BLANKS ON COMMAND LINE
  2123. ccc    DO 3332 N=1,76
  2124. ccc    NN=77-N
  2125. ccc    IF(JCHAR(LINE(NN)).GT.32)GOTO 3333
  2126. ccc    LINE(NN)=CHAR(0)
  2127. ccc3332    CONTINUE
  2128. ccc3333    CONTINUE
  2129. C SPACE FILL ENTIRE ARRAY
  2130.     DO 3334 N=1,82
  2131. 3334    LINECL(N)=CHAR(32)
  2132.     RETCD=1
  2133. C HANDLE *U DBXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  2134. C STARTS AFTER THE "DB" SO WE CAN DECODE IT.
  2135. C *U DBCMD (COMMAND) PASSES COMMAND TO DTR FOR ACTION
  2136. C  HOWEVER THIS DOES NOT RETURN A VALUE. USE FOR
  2137. C  SETUP PURPOSES ONLY.
  2138. C
  2139. C NO NEED TO INCLUDE ABILITY TO STORE COMMANDS IN CELLS
  2140. C FOR EDITING SINCE {CELL CONSTRUCT PROVIDES THIS ALREADY.
  2141. C (AND AT COMMAND LEVEL THE __{CELL CONSTRUCT DOES ALSO.)
  2142. 500    CONTINUE
  2143.     CALL SCMP(LINE,'OPINS',5,ICODE)
  2144. C OPEN INPUT SEQUENTIAL
  2145.     IF(ICODE.NE.1)GOTO 3800
  2146. C DTROPINS RANGE FILENAME
  2147.     IBGN=6
  2148.     IVLD=0
  2149.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  2150.     IF(IVLD.EQ.3)GOTO 9990
  2151. C    LINE(LSTCH+25)=CHAR(0)
  2152.     DO 5601 NN=1,50
  2153. 5601    MBUF(NN)=' '
  2154.     DO 5602 NN=1,25
  2155. 5602    MBUF(NN)=LINE(LSTCH+NN-1)
  2156.     OPEN(UNIT=MFILUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  2157.      1  STATUS='OLD',IOSTAT=IVVV)
  2158.     IF(IVVV.NE.0)GOTO 9990
  2159.     MFIOPN=1
  2160.     GOTO 9999
  2161. 3800    CONTINUE
  2162.     CALL SCMP(LINE,'OPINRR',6,ICODE)
  2163. C OPEN IN RANDOM READ
  2164.     IF(ICODE.NE.1)GOTO 3900
  2165.     KK=2
  2166.     GOTO 3910
  2167. 3900    CONTINUE
  2168.     CALL SCMP(LINE,'OPINRU',6,ICODE)
  2169. C OPEN IN RANDOM UPDATE
  2170.     IF(ICODE.NE.1)GOTO 3950
  2171.     KK=3
  2172. 3910    CONTINUE
  2173. C HANDLE INPUT DIRECT ACCESS OPEN COMMONLY FOR READ ONLY AND R/W
  2174.  
  2175.     IBGN=7
  2176.     IVLD=0
  2177.     CALL GMTX(LINE,IBGN,LSTCH,MFIRL,MFICL,MFIRH,MFICH,IVLD)
  2178.     IF(IVLD.EQ.3)GOTO 9990
  2179. C    LINE(LSTCH+25)=0
  2180.     DO 5603 NN=1,50
  2181. 5603    MBUF(NN)=' '
  2182.     DO 5604 NN=1,25
  2183. 5604    MBUF(NN)=LINE(LSTCH+NN-1)
  2184. C    NBK=(MFIRH-MFIRL+1)*(MFICH-MFICL+1)
  2185.     OPEN(MFILUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  2186.      1  FORM='UNFORMATTED',RECL=128,STATUS='OLD',IOSTAT=IVVV)
  2187.     IF(IVVV.NE.0)GOTO 9990
  2188.     MFIOPN=KK
  2189.     GOTO 9999
  2190. 3950    CONTINUE
  2191.     CALL SCMP(LINE,'OPOUTS',6,ICODE)
  2192. C OPEN OUTPUT SEQUENTIAL
  2193.     IF(ICODE.NE.1)GOTO 4000
  2194.     IBGN=7
  2195.     IVLD=0
  2196.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  2197.     IF(IVLD.EQ.3)GOTO 9990
  2198.     DO 5605 NN=1,50
  2199. 5605    MBUF(NN)=' '
  2200.     DO 5606 NN=1,25
  2201. 5606    MBUF(NN)=LINE(LSTCH+NN-1)
  2202.     OPEN(UNIT=MFOLUN,FILE=CCMBUF,ACCESS='SEQUENTIAL',
  2203.      1  STATUS='NEW',IOSTAT=IVVV)
  2204.     IF(IVVV.NE.0)GOTO 9990
  2205.     MFOOPN=1
  2206.     GOTO 9999
  2207. 4000    CONTINUE
  2208.     CALL SCMP(LINE,'OPOUTR',6,ICODE)
  2209. C OPEN OUTPUT RANDOM
  2210.     IF(ICODE.NE.1)GOTO 4100
  2211.     IBGN=7
  2212.     IVLD=0
  2213.     CALL GMTX(LINE,IBGN,LSTCH,MFORL,MFOCL,MFORH,MFOCH,IVLD)
  2214.     IF(IVLD.EQ.3)GOTO 9990
  2215. C    NBK=(MFORH-MFORL+1)*(MFOCH-MFOCL+1)
  2216. C    LINE(LSTCH+25)=0
  2217.     DO 5607 NN=1,50
  2218. 5607    MBUF(NN)=' '
  2219.     DO 5608 NN=1,25
  2220. 5608    MBUF(NN)=LINE(LSTCH+NN-1)
  2221.     OPEN(MFOLUN,FILE=CCMBUF(1:49),ACCESS='DIRECT',
  2222.      1  STATUS='NEW',FORM='UNFORMATTED',RECL=128,
  2223.      2  IOSTAT=IVVV)
  2224.     IF(IVVV.NE.0)GOTO 9990
  2225.     MFOOPN=2
  2226.     GOTO 9999
  2227. 4100    CONTINUE
  2228.     CALL SCMP(LINE,'CLSOUT',6,ICODE)
  2229. C CLOSE OUTPUT 
  2230.     IF(ICODE.NE.1)GOTO 4200
  2231.     CLOSE(UNIT=MFOLUN)
  2232.     MFOOPN=0
  2233.     GOTO 9999
  2234. 4200    CONTINUE
  2235.     CALL SCMP(LINE,'CLSINP',6,ICODE)
  2236. C CLOSE INPUT 
  2237.     IF(ICODE.NE.1)GOTO 4300
  2238.     CLOSE(UNIT=MFILUN)
  2239.     MFIOPN=0
  2240.     GOTO 9999
  2241. 4300    CONTINUE
  2242.     CALL SCMP(LINE,'ENAOUT',6,ICODE)
  2243. C ENABLE OUTPUT 
  2244.     IF(ICODE.NE.1)GOTO 4400
  2245.     MFOFLG=1
  2246.     GOTO 9999
  2247. 4400    CONTINUE
  2248.     CALL SCMP(LINE,'ENAINP',6,ICODE)
  2249. C ENABLE INPUT 
  2250.     IF(ICODE.NE.1)GOTO 4500
  2251.     MFIFLG=1
  2252.     GOTO 9999
  2253. 4500    CONTINUE
  2254.     CALL SCMP(LINE,'DISINP',6,ICODE)
  2255. C DISABLE INPUT 
  2256.     IF(ICODE.NE.1)GOTO 4510
  2257.     MFIFLG=0
  2258.     GOTO 9999
  2259. 4510    CONTINUE
  2260.     CALL SCMP(LINE,'DISOUT',6,ICODE)
  2261. C DISABLE OUTPUT
  2262.     IF(ICODE.NE.1)GOTO 4520
  2263.     MFOFLG=0
  2264.     GOTO 9999
  2265. 4520    CONTINUE
  2266.     CALL SCMP(LINE,'EDTINP',6,ICODE)
  2267. C ENABLE INPUT FORCE
  2268. C COMMAND
  2269. C DTREDTINP RANGE
  2270. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  2271. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  2272. C IT OUT AGAIN.
  2273.     IF(ICODE.NE.1)GOTO 4600
  2274. C FORCE ENABLE OF READIN DURING THIS
  2275.     MFIFLG=1
  2276.     MFOFLG=1
  2277. C ENABLE OUTPUT TOO.
  2278.     IBGN=7
  2279.     IVLD=0
  2280.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  2281.     IF(IVLD.EQ.3)GOTO 9990
  2282.     DO 4550 N1=IXRL,IXRH
  2283.     DO 4550 N2=IXCL,IXCH
  2284.     CALL REFLEC(N2,N1,IRX)
  2285. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  2286.     CALL FVLDST(N1,N2,Char(255))
  2287.     CALL WRKFIL(IRX,LBUF,0)
  2288.     CALL WRKFIL(IRX,LBUF,1)
  2289. 4550    CONTINUE
  2290.     MFIFLG=0
  2291.     MFOFLG=0
  2292.     GOTO 9999
  2293. 4600    CONTINUE
  2294.     CALL SCMP(LINE,'FMTOUT',6,ICODE)
  2295. C FORMAT/WRITE OUTPUT
  2296. C COMMAND
  2297. C DTRFMTOUT RANGE
  2298. C GETS RANGE, THEN FOR EACH CELL IN RANGE READS IN (BY WRKFIL READ CALL)
  2299. C A CELL, SETS ITS FVLD CODE TO -1 (TO FLAG A TEXT CELL), AND WRITES
  2300. C IT OUT AGAIN.
  2301.     IF(ICODE.NE.1)GOTO 4630
  2302.     IVLFG=1
  2303.     GOTO 4740
  2304. 4630    CONTINUE
  2305.     CALL SCMP(LINE,'VALOUT',6,ICODE)
  2306.     IF(ICODE.NE.1)GOTO 4700
  2307. C VALOUT CMD OUTPUTS VALUES WITH LONG D FORMAT
  2308.     IVFLG=2
  2309. C    GOTO 4740
  2310. 4740    CONTINUE
  2311. C FORCE ENABLE OF READIN DURING THIS
  2312.     MFIFLG=1
  2313.     MFOFLG=1
  2314. C ENABLE OUTPUT TOO.
  2315.     IBGN=7
  2316.     IVLD=0
  2317.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  2318.     IF(IVLD.EQ.3)GOTO 9990
  2319.     DO 4650 N1=IXRL,IXRH
  2320.     DO 4650 N2=IXCL,IXCH
  2321. C FIND INDEX FOR WRKFIL
  2322.     CALL REFLEC(N2,N1,IRX)
  2323. C SET THE ELEMENT AS VALID AND READ/WRITE IT ONCE.
  2324.     CALL XVBLGT(N1,N2,TMP)
  2325. C TMP IS REAL*8 SCRATCH
  2326.     CALL FVLDST(N1,N2,Char(255))
  2327.     CALL WRKFIL(IRX,LBUF,0)
  2328. C HAVING LOADED THE RECORD NOW (GETTING FORMAT, ETC.)
  2329. C NOW GRAB THE VALUE AND SAVE IT...
  2330. C FIRST MOVE THE FORMAT DOWN
  2331. C NOTE LINEC AND LINECL ARE EQUIVALENT BUT LINECL IS CHAR*1
  2332.     DO 4651 N=1,9
  2333.     LBUF(N+1)=LBUF(N+119)
  2334. 4651    CONTINUE
  2335.     LBUF(1)='('
  2336.     LBUF(11)=')'
  2337. c    LBUF(12)=0
  2338. C FORMAT NOW LIVES IN LOW PART OF LBUF
  2339. C D25.17 FORMAT WOULD DO FOR WRITE
  2340. C NEED CHAR VBL FOR FORMAT EQUIV'D TO LOW 12 CHARS OF LBUF
  2341. c    IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF(1:11),ERR=4652)TMP
  2342.     IF(IVLFG.EQ.1)WRITE(LINEC(1:62),C11LBF,ERR=4652)TMP
  2343.     IF(IVLFG.EQ.2)WRITE(LINEC(1:62),4658,ERR=4652)TMP
  2344. 4658    FORMAT(D25.17)
  2345. C USE BUILTIN FORMAT TO WRITE THE VALUE IF COMMANDED TO DO SO OR
  2346. C USE DISPLAY FORMAT.
  2347. 4652    CONTINUE
  2348.     KK=1
  2349.     DO 4653 N=1,110
  2350. 4653    LBUF(N)=CHAR(0)
  2351.     DO 4654 N=1,60
  2352. C COPY LINECL CHARS TO LBUF, SKIPPING SPACES
  2353.     KKK=JCHAR(LINECL(N))
  2354.     IF(KKK.LE.32)GOTO 4654
  2355.     LBUF(KK)=LINECL(N)
  2356.     KK=KK+1
  2357. 4654    CONTINUE
  2358.     CALL WRKFIL(IRX,LBUF,1)
  2359. 4650    CONTINUE
  2360.     MFIFLG=0
  2361.     MFOFLG=0
  2362.     GOTO 9999
  2363. 4700    CONTINUE
  2364.     CALL SCMP(LINE,'CMPFRM',6,ICODE)
  2365.     IF(ICODE.NE.1)GOTO 4800
  2366. C DBCMPFRM V1:V2
  2367. C RETURNS IN % THE INDEX OF FORMULA 1 IN FORMULA 2
  2368.     IBGN=7
  2369.     IVLD=0
  2370.     LSTCH=78
  2371. C USE GMTX TO GET CELL ADDRESSES.
  2372.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  2373.     IF(IVLD.EQ.3)GOTO 9990
  2374. C IF WE HAVE A COMMA AND ANOTHER MTX USE IT AS LENGTHS
  2375.     CALL REFLEC(IXCL,IXRL,IRXL)
  2376.     CALL REFLEC(IXCH,IXRH,IRXH)
  2377.     IF(LINE(LSTCH).NE.',')GOTO 4780
  2378.     IBGN=LSTCH+1
  2379.     IVLD=0
  2380.     CALL GMTX(LINE,IBGN,LSTCH,IYRL,IYCL,IYRH,IYCH,IVLD)
  2381.     IF(IVLD.EQ.3)GOTO 4780
  2382. C GET THE LENGTHS NOW
  2383.     CALL XVBLGT(IYRL,IYCL,TMP)
  2384.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  2385.     LBUFL=TMP
  2386.     CALL XVBLGT(IYRH,IYCH,TMP)
  2387.     IF(TMP.LT.1.OR.TMP.GT.109.)GOTO 4780
  2388.     MBUFL=TMP
  2389. C IF LENGTHS ARE OK FOR BOTH, THEN USE THEM AND DO THE
  2390. C COMPARISONS BASED ON THAT.
  2391.     GOTO 4770
  2392. 4780    CONTINUE
  2393. C GET INDEX OF EACH ELEMENT...
  2394.     CALL WRKFIL(IRXL,LBUF,0)
  2395.     CALL WRKFIL(IRXH,MBUF,0)
  2396. C LOAD THE 2 FORMULAS.
  2397. C NOW FIND THE ENDS...
  2398.     DO 4750 N=1,110
  2399.     NN=111-N
  2400.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4751
  2401. 4750    CONTINUE
  2402. 4751    LBUFL=NN
  2403.     DO 4760 N=1,110
  2404.     NN=111-N
  2405.     IF(JCHAR(MBUF(NN)).GT.32)GOTO 4761
  2406. 4760    CONTINUE
  2407. 4761    MBUFL=NN
  2408. 4770    CONTINUE
  2409. c find index pos'n by hand...
  2410.     KK=LBUFL-MBUFL+1
  2411.     DO 4776 NN=1,KK
  2412.     IF(LBUF(NN).NE.MBUF(1))GOTO 4776
  2413.     NNN=MBUFL-1
  2414.     DO 4777 N=1,NNN
  2415.     IVVV=NN+N
  2416.     IF (LBUF(IVVV).NE.MBUF(N+1))GOTO 4778
  2417. 4777    CONTINUE
  2418. C IF WE GALL THRU HERE ANYTIME WE HAVE A MATCH.
  2419. C SINCE NN IS WHAT WE NEED, GO USE IT.
  2420.     GOTO 4779
  2421. 4778    CONTINUE
  2422. 4776    CONTINUE
  2423. C IF NO MATCH, SET NN=0 TO SO FLAG IT AND BUG OUT.
  2424. C
  2425.     NN=0
  2426. 4779    CONTINUE
  2427. C NN IS LOCATION OF SUBSTRING NOW
  2428. C    NN=INDEX(CLBUF(1:LBUFL),CMBUF(1:MBUFL))
  2429.     XAC=NN
  2430. C RETURN RESULT IN % ACCUMULATOR.
  2431.     WAC=0.
  2432.     IF(LLT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=-1.
  2433.     IF(LGT(CLBUF(1:LBUFL),CMBUF(1:MBUFL)))WAC=1.
  2434. C RETURN LESS/GREATER/EQUAL IN W ACCUMULATOR FOR POSSIBLE
  2435. C USE IN SORTS, ETC. THUS WE CAN TEST 2 STRINGS BY TESTING W ACCUM.
  2436. C (LEAVES X, Y ALONE SINCE W IS MORE FREQUENTLY FREE.)
  2437.     GOTO 9999
  2438. 4800    CONTINUE
  2439.     CALL SCMP(LINE,'LENFRM',6,ICODE)
  2440.     IF(ICODE.NE.1)GOTO 4900
  2441. C DBLENFRM V1:V2
  2442. C RETURNS LENGTH OF FORMULA IN V1 IN % AND V2
  2443.     IBGN=7
  2444.     IVLD=0
  2445. C USE GMTX TO GET CELL ADDRESSES.
  2446.     CALL GMTX(LINE,IBGN,LSTCH,IXRL,IXCL,IXRH,IXCH,IVLD)
  2447.     IF(IVLD.EQ.3)GOTO 9990
  2448.     CALL REFLEC(IXCL,IXRL,IRXL)
  2449. C GET INDEX OF EACH ELEMENT...
  2450.     CALL WRKFIL(IRXL,LBUF,0)
  2451. C LOAD THE FORMULA.
  2452. C NOW FIND THE END...
  2453.     DO 4850 N=1,110
  2454.     NN=111-N
  2455.     IF(JCHAR(LBUF(NN)).GT.32)GOTO 4851
  2456. 4850    CONTINUE
  2457. 4851    LBUFL=NN
  2458.     TMP=LBUFL
  2459.     XAC=TMP
  2460. C SAVE LENGTH IN OUTPUT CELL. DON'T TOUCH VALIDITY FOR THE CELL.
  2461.     NN=0
  2462. C SEE IF CELL IS VALID AND IF NOT VALID DON'T SAVE ANYTHING IN IT.
  2463.     CALL FVLDGT(IXRH,IXCH,NN)
  2464.     IF(NN.EQ.0)GOTO 9999
  2465.     CALL XVBLST(IXRH,IXCH,TMP)
  2466.     GOTO 9999
  2467. 4900    CONTINUE
  2468.     CALL SCMP(LINE,'TRMFRM',6,ICODE)
  2469.     IF(ICODE.NE.1)GOTO 5000
  2470. C TRIM FORMULA
  2471. C DTRTRMFRM INCELL:OUTCELL,START:END
  2472. C RETURNS TRIMMED FORMULA TO CELL.
  2473.     IBGN=7
  2474.     IVLD=0
  2475. C USE GMTX TO GET CELL ADDRESSES.
  2476.     CALL GMTX(LINE,IBGN,LSTCHR,IXRL,IXCL,IXRH,IXCH,IVLD)
  2477.     IF(IVLD.EQ.3)GOTO 9990
  2478. C GOT CELL HERE...BOTH FOR INPUT AND OUTPUT
  2479.     CALL REFLEC(IXCL,IXRL,IRXL)
  2480. C GET INDEX OF EACH ELEMENT...
  2481.     CALL REFLEC(IXCH,IXRH,IRXH)
  2482.     CALL WRKFIL(IRXL,LBUF,0)
  2483.     LO=LSTCHR+1
  2484.     LHI=LSTCHR+21
  2485.     LSTCHR=LHI
  2486.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  2487.     IF(IVLD.EQ.0)GOTO 9990
  2488.     CALL XVBLGT(JD1,JD2,TMP)
  2489.     LOCHR=1
  2490.     IF(TMP.GT.0..AND.TMP.LT.110.)LOCHR=TMP
  2491. C LOCHR = START CHAR
  2492.     LO=LSTCHR+1
  2493.     LHI=LSTCHR+21
  2494.     LSTCHR=LHI
  2495.     CALL VARSCN(LINE,LO,LHI,LSTCHR,JD1,JD2,IVLD)
  2496.     IF(IVLD.EQ.0)GOTO 9990
  2497.     CALL XVBLGT(JD1,JD2,TMP)
  2498.     LHICHR=110
  2499.     IF(TMP.GT.0..AND.TMP.LT.110.)LHICHR=TMP
  2500. C LHICHR IS END CHARACTER
  2501. C NOW ALL ARGS ARE COLLECTED.
  2502. C (IGNORE WHAT WAS DELIMITER...)
  2503. C COPY DESIRED STUFF TO MBUF
  2504.     N=1
  2505.     DO 4910 NN=1,110
  2506.     MBUF(NN)=CHAR(0)
  2507.     IF(NN.LT.LOCHR.OR.NN.GT.LHICHR)GOTO 4910
  2508.     MBUF(N)=LBUF(NN)
  2509.     N=N+1
  2510. C COPY DESIRED PART OF FORMULA TO MBUF WITH THE REST ZEROED.
  2511. 4910    CONTINUE
  2512.     DO 4911 NN=111,128
  2513. 4911    MBUF(NN)=LBUF(NN)
  2514.     CALL WRKFIL(IRXH,MBUF,1)
  2515. C WRITE BUFFER BACK TO CELL AS TRIMMED NOW, GOING TO OUT CELL
  2516. C RATHER THAN INPUT CELL (TO ALLOW REPEATED CALCS TO BE STABLE.)
  2517.     GOTO 9999
  2518. 5000    CONTINUE
  2519.     GOTO 9999
  2520. 9990    RETCD=3
  2521. C ERROR RETURN
  2522. 9999    RETURN
  2523.     END
  2524. c -h- fft.ftn    Fri Aug 22 13:08:56 1986    
  2525. C  
  2526. C-----------------------------------------------------------------------
  2527. C SUBROUTINE: FOUREA
  2528. C PERFORMS COOLEY-TUKEY FAST FOURIER TRANSFORM
  2529. C-----------------------------------------------------------------------
  2530. C  
  2531.       SUBROUTINE FOUREA(ID1,ID2,IC,IR,IVN,ISI)
  2532. C ID1,ID2 = COORDS OF FIRST CELL. IC AND IR ARE 0, OR 1
  2533. C ONLY ONE OF IC, IR MAY BE NONZERO. (FLAGS HORIZ/VERTICAL
  2534. C DATA AREA)
  2535. C  
  2536. C THE COOLEY-TUKEY FAST FOURIER TRANSFORM IN ANSI FORTRAN
  2537. C  
  2538. C DATA IS A ONE-DIMENSIONAL COMPLEX ARRAY WHOSE LENGTH, N, IS A
  2539. C POWER OF TWO.  ISI IS +1 FOR AN INVERSE TRANSFORM AND -1 FOR A
  2540. C FORWARD TRANSFORM.  TRANSFORM VALUES ARE RETURNED IN THE INPUT
  2541. C ARRAY, REPLACING THE INPUT.
  2542. C TRANSFORM(J)=SUM(DATA(I)*W**((I-1)*(J-1))), WHERE I AND J RUN
  2543. C FROM 1 TO N AND W = EXP (ISI*2*PI*SQRT(-1)/N).  PROGRAM ALSO
  2544. C COMPUTES INVERSE TRANSFORM, FOR WHICH THE DEFINING EXPRESSION
  2545. C IS INVTR(J)=(1/N)*SUM(DATA(I)*W**((I-1)*(J-1))).
  2546. C RUNNING TIME IS PROPORTIONAL TO N*LOG2(N), RATHER THAN TO THE
  2547. C CLASSICAL N**2.
  2548. C AFTER PROGRAM BY BRENNER, JUNE 1967. THIS IS A VERY SHORT VERSION
  2549. C OF THE FFT AND IS INTENDED MAINLY FOR DEMONSTRATION. PROGRAMS
  2550. C ARE AVAILABLE IN THIS COLLECTION WHICH RUN FASTER AND ARE NOT
  2551. C RESTRICTED TO POWERS OF 2 OR TO ONE-DIMENSIONAL ARRAYS.
  2552. C SEE -- IEEE TRANS AUDIO (JUNE 1967), SPECIAL ISSUE ON FFT.
  2553. C  
  2554. C ASSUMES THAT FIRST N/2 ELEMENTS ARE REAL, SECOND COMPLEX...
  2555. C STORES DATA THAT WAY ALSO...
  2556. C
  2557. C      COMPLEX DATA(1)
  2558. C      COMPLEX TEMP, W
  2559. C MAKE THIS A REAL FFT, NOT COMPLEX...
  2560.     REAL*8 DATA(1),TEMP,W,TEMP2,TEMPI,WI
  2561.     InTeGer*4 ID1,ID2,IC,IR,IRX,IRXX,IVN,N
  2562. C SET UP STMT FUNCTIONS...
  2563.     ID1F(K)=ID1+IC*(K-1)
  2564.     ID2F(K)=ID2+IR*(K-1)
  2565.     N=IVN
  2566. C  
  2567. C CHECK FOR POWER OF TWO UP TO 14
  2568. C  
  2569. C INITIALLY SAY ALL OK
  2570.       NN = 1
  2571.       DO 10 I=1,14
  2572.         M = I
  2573.         NN = NN*2
  2574.         IF (NN.EQ.N) GO TO 20
  2575.     IF(NN.GT.N)GOTO 11
  2576.   10  CONTINUE
  2577. 11    CONTINUE
  2578.     N=NN/2
  2579. C USE NEXT SMALLER POWER OF 2 ARRAY...
  2580. C    RETURN
  2581. C HERE BEGINNETH ACTUAL WORK.
  2582. C SET UP DATA COORDS ON THE FLY. NORMALLY I,J RUN IN RANGE 1 TO N
  2583. C SO WHERE K=(I OR J) (I.E., ONE OF THE TWO) WE USE A RELATION
  2584. C ID1V=ID1+IC*(K-1) AND ID2V=ID2+IR*(K-1). WE USE STMT FUNCTIONS
  2585. C ID1F AND ID2F FOR THIS.
  2586.   20  CONTINUE
  2587.     NOV2=N/2
  2588. C  
  2589. C      PI = 4.*ATAN(1.)
  2590.     PI=3.14159265358979323846264
  2591.       FN = NOV2
  2592. C  
  2593. C THIS SECTION PUTS DATA IN BIT-REVERSED ORDER
  2594. C  
  2595.       J = 1
  2596.       DO 80 I=1,NOV2
  2597. C  
  2598. C AT THIS POINT, I AND J ARE A BIT REVERSED PAIR (EXCEPT FOR THE
  2599. C DISPLACEMENT OF +1)
  2600. C  
  2601.     IF(I.GE.J)GOTO 40
  2602. C  
  2603. C EXCHANGE DATA(I) WITH DATA(J) IF I.LT.J.
  2604. C  
  2605.  30    CONTINUE
  2606. C EXCHANGE DATA(J), DATA(I)
  2607.     CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  2608.     CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  2609.     CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  2610.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  2611. C FLIP BOTH REAL AND COMPLEX PARTS OF DATA
  2612.     CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMP)
  2613.     CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  2614.     CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  2615.     CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP)
  2616. C  30    TEMP = DATA(J)
  2617. C        DATA(J) = DATA(I)
  2618. C        DATA(I) = TEMP
  2619. C  
  2620. C IMPLEMENT J=J+1, BIT-REVERSED COUNTER
  2621. C  
  2622.   40    M = NOV2/2
  2623.   50    IF (J.LE.M) GOTO 70
  2624.   60    J = J - M
  2625.         M = (M+1)/2
  2626.         GO TO 50
  2627.   70    J = J + M
  2628.   80  CONTINUE
  2629. C  
  2630. C NOW COMPUTE THE BUTTERFLIES
  2631. C  
  2632.       MMAX = 1
  2633.   90  IF (MMAX.GE.NOV2)GOTO 130
  2634.  100  ISTEP = 2*MMAX
  2635.       DO 120 M=1,MMAX
  2636.         THETA = PI*FLOAT(ISI*(M-1))/FLOAT(MMAX)
  2637.      W = COS(THETA)
  2638.         WI = SIN(THETA)
  2639. C        W = CMPLX(COS(THETA),SIN(THETA))
  2640.         DO 110 I=M,NOV2,ISTEP
  2641.           J = I + MMAX
  2642. C GET REAL AND IMAG HALVES OF NUMBER...
  2643.       CALL XVBLGT(ID1F(J),ID2F(J),TEMP)
  2644.       CALL XVBLGT(ID1F(J+NOV2),ID2F(J+NOV2),TEMPI)
  2645. C DO COMPLEX MULTIPLICATION BY HAND TO AVOID LARGE RUNTIME SYSTEM
  2646. C ROUTINE INCLUSION.
  2647.       TEMP2=W*TEMP-WI*TEMPI
  2648.       TEMPI=WI*TEMP+W*TEMPI
  2649.     TEMP=TEMP2
  2650. C          TEMP = W*DATA(J)
  2651. C          DATA(J) = DATA(I) - TEMP
  2652. C          DATA(I) = DATA(I) + TEMP
  2653.        CALL XVBLGT(ID1F(I),ID2F(I),DATA(1))
  2654.        TEMP2=DATA(1)+TEMP
  2655.        DATA(1)=DATA(1) - TEMP
  2656.        CALL XVBLST(ID1F(J),ID2F(J),DATA(1))
  2657.        CALL XVBLST(ID1F(I),ID2F(I),TEMP2)
  2658. C COMPLEX PART
  2659.        CALL XVBLGT(ID1F(I+NOV2),ID2F(I+NOV2),DATA(1))
  2660.        TEMP2=DATA(1)+TEMPI
  2661.        DATA(1)=DATA(1) - TEMPI
  2662.        CALL XVBLST(ID1F(J+NOV2),ID2F(J+NOV2),DATA(1))
  2663.        CALL XVBLST(ID1F(I+NOV2),ID2F(I+NOV2),TEMP2)
  2664.  110    CONTINUE
  2665.  120  CONTINUE
  2666.       MMAX = ISTEP
  2667.       GO TO 90
  2668.   130  IF (ISI.LT.0) GOTO 160
  2669. C  
  2670. C FOR INV TRANS -- ISI=1 -- MULTIPLY OUTPUT BY 1/N
  2671. C  
  2672.  140  DO 150 I=1,N
  2673. C        DATA(I) = DATA(I)/FN
  2674.     CALL XVBLGT(ID1F(I),ID2F(I),TEMP)
  2675.     TEMP=TEMP/FN
  2676.     CALL XVBLST(ID1F(I),ID2F(I),TEMP)
  2677.  150  CONTINUE
  2678.  160  RETURN
  2679.       END
  2680. c -h- help.for    Fri Aug 22 13:20:10 1986    
  2681.     SUBROUTINE HELP(LVL)
  2682. C PRINT HELP INFO ON SCREEN USING FIRST 22 LINES. ASSUME XQTCMD INVALIDATES
  2683. C THE DISPLAY.
  2684. C COPYRIGHT (C) 1983 GLENN AND MARY EVERHART
  2685.     CHARACTER*1 FORM(128)
  2686.     CALL UVT100(18,0,0)
  2687.     CALL UVT100(11,2,0)
  2688.     CALL UVT100(1,1,1)
  2689. C COPYRIGHT (C) 1983 GLENN and MARY EVERHART
  2690. C All Rights Reserved
  2691. C
  2692. C NEW PC HELP FILE
  2693. C DESIGNED TO BE SMALLER THAN OLD VERSION. READS FILES OFF DISK
  2694. C BY SKIPPING N*24 LINES AND DISPLAYING 24 LINES, WHERE N=LVL
  2695. C ASSUME HELP FILE ON DISK LOGGED CURRENTLY
  2696.     CLOSE(3)
  2697. c for now, assume help file lives on same disk as our default.
  2698.     IXXX=0
  2699.     OPEN(3,FILE='PCCHELP.HLP',STATUS='OLD',ACCESS='DIRECT',
  2700.      1  FORM='UNFORMATTED',RECL=128,IOSTAT=IXXX)
  2701.     IF(IXXX.GT.0)RETURN
  2702. C RETURN IF HELP FILE IS MISSING...
  2703. C USE A FIXED HELP FILE FOR MULTISCREEN HELP. LOWER OVERHEAD,...
  2704.     NSKP=LVL*24
  2705. C NOW READ IN THE DATA, WRITE TO SCREEN.
  2706.     KKL=NSKP+1
  2707.     KKH=NSKP+23
  2708. C JUST GO DIRECTLY TO THE DESIRED SCREENFUL OF INFO.
  2709.     DO 7640 KKK=KKL,KKH
  2710.     READ(3,REC=KKK,END=7642,ERR=7642)FORM
  2711. c use fortran writes here normally since we want the crlf stuff they imply
  2712. c always write 24 lines to scroll all else off...
  2713.     IVVV=78
  2714. C FIND END OF LINE AND ONLY EMIT CHARACTERS TO THAT; DON'T WASTE
  2715. C TIME DRAWING SPACES ON THE SCREEN.
  2716.     DO 772 IV=1,78
  2717.     IVVV=79-IV
  2718.     IF(ICHAR(FORM(IVVV)).GT.32)GOTO 773
  2719. 772    CONTINUE
  2720. 773    CONTINUE
  2721.     FORM(IVVV+1)=Char(13)
  2722.     FORM(IVVV+2)=Char(10)
  2723.     IVVV=IVVV+2
  2724.     CALL SWRT(FORM,IVVV)
  2725. C    WRITE(11,7643)(FORM(IV),IV=1,IVVV)
  2726. C NOTE WE HAVE LUN 6 OPENED AS CON: IN THE MAIN PROGRAM TO GIVE AN
  2727. C INDEPENDENT TERMINAL OUTPUT CHANNEL. HOPEFULLY THIS PREVENTS SOME
  2728. C SCREWUPS DUE TO USING LUN 0 FOR BOTH CONSOLE INPUT AND OUTPUT; END OF
  2729. C RECORDS OUGHT TO BE INDEPENDENT THIS WAY (I HOPE).
  2730. C7643    FORMAT(1X,82A1,4A1)
  2731. 7640    CONTINUE
  2732. 7642    CONTINUE
  2733.     CLOSE(3)
  2734.     FORM(1)=13
  2735.     CALL SWRT(FORM,1)
  2736.     RETURN
  2737.     END
  2738. c -h- linfit.for    Fri Aug 22 13:23:55 1986    
  2739. C LINE FITTING SUBROUTINE WITH ERROR MEASURE RETURN ALSO.
  2740.     SUBROUTINE LINFIT(ID1X,ID2X,IRCOL,ID1,ID2,N,A,B,DEL,RR)
  2741.     InTeGer*4 ID1X,ID2X,IRCOL,ID1,ID2,N
  2742.     REAL*8 A,B,DEL,XY,SX2,SX,SY,RR
  2743.     InTeGer*4 IC,IR,KK,KKK,I
  2744.     REAL*8 XI,YI,SY2,EN,WRK
  2745. C FIT LINE TO EQUALLY SPACED POINTS...
  2746. C Y=BX+A
  2747.     SY2=0.
  2748.     EN=N
  2749.     XY=0.
  2750.     SX2=0.
  2751.     SX=0.
  2752.     SY=0.
  2753.     IC=IRCOL
  2754.     IR=1-IRCOL
  2755. C IRCOL IS 0 OR 1 FOR ACROSS OR DOWN
  2756.     DO 10 I=1,N
  2757. C IF ID1X < 0 THEN FORM IT HERE AS ID1+I-1
  2758.     IF (ID1X.GT.0)GOTO 20
  2759. C FORM XI
  2760.     XI=I
  2761.     GOTO 30
  2762. 20    CONTINUE
  2763. C INPUT XI
  2764.     KK=ID1X+IC*(I-1)
  2765.     KKK=ID2X+IR*(I-1)
  2766.     CALL XVBLGT(KK,KKK,XI)
  2767. 30    CONTINUE
  2768. C GET YI IN ANY CASE...
  2769.     KK=ID1+IC*(I-1)
  2770.     KKK=ID2+IR*(I-1)
  2771.     CALL XVBLGT(KK,KKK,YI)
  2772.     XY=XY+XI*YI
  2773. C FORM SUMS NEEDED TO FIT LINE...
  2774.     SX2=SX2+XI*XI
  2775.     SX=SX+XI
  2776.     SY=SY+YI
  2777.     SY2=SY2+YI*YI
  2778. 10    CONTINUE
  2779. C NOW GET SLOPE
  2780.     WRK=((XY-(SX*SY)/EN)/(SX2-(SX*SX)/EN))
  2781.     B=WRK
  2782. C THEN INTERCEPT
  2783.     WRK=(SY/EN)-B*(SX/EN)
  2784.     A=WRK
  2785.     WRK=DSQRT((SY2-(A*SY+B*XY))/EN)
  2786.     DEL=WRK
  2787. C DEL = ERROR OF FIT
  2788.     RR=(EN*XY-SX*SY)/DSQRT((EN*SX2-SX*SX)*(EN*SY2-SY*SY))
  2789. C RR IS CORRELATION COEFFICIENT
  2790.     RETURN
  2791.     END
  2792. c -h- list.for    Fri Aug 22 13:24:14 1986    
  2793.     SUBROUTINE LIST
  2794. C COPYRIGHT (C) 1983 GLENN EVERHART
  2795. C ALL RIGHTS RESERVED
  2796. C 60=MAX REAL ROWS
  2797. C 301=MAX REAL COLS
  2798. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2799. C VBLS AND TYPE DIMENSIONED 60,301
  2800. C **************************************************
  2801. C *                                                *
  2802. C *              SUBROUTINE  LIST                  *
  2803. C *                                                *
  2804. C **************************************************
  2805. C
  2806. C
  2807. C LISTS THE LEGAL CALC COMMANDS AND GIVES A BRIEF
  2808. C DESCRIPTION OF THEIR FUNCTION.
  2809. C
  2810. C LIST IS CALLED BY CALC
  2811. C
  2812. C    SUBROUTINE LIST
  2813. C
  2814. C
  2815. C NOTE WE USE FORTRAN WRITE HERE SINCE IT SHOULD ONLY HAPPEN IN CALC MODE.
  2816.     rewind 11
  2817.     WRITE (11,20)
  2818.     WRITE (11,30)
  2819.     rewind 11
  2820.     RETURN
  2821. 20    FORMAT (' CMDS= @FILE-DO FILE;*C-COMMENT;*E-EXIT;*R-READ CON')
  2822. 30    FORMAT (' *S-STOP;*V n(bet.0,3)-VIEW CTL- HIGHER=SEE MORE')
  2823.     END
  2824. c -h- wsset.f40    Fri Aug 22 13:43:11 1986    
  2825.         SUBROUTINE WSSET
  2826. C WORK SHEET MANAGMENT ROUTINES
  2827. C HANDLE SPREADSHEET "IN MEMORY" STORAGE
  2828. C COPYRIGHT (C) GLENN AND MARY EVERHART 1983,1984
  2829. C
  2830. C ALL RIGHTS RESERVED
  2831. C
  2832. C WSSET - INITIALIZE STORAGE TO START CONDITIONS
  2833. C EXPECT IMPLEMENTATION TO USE A COMMON BITMAP AND PROVIDE A VARIABLE
  2834. C NCEL TO TELL HOW MANY CELLS ARE IN USE
  2835. C NEXT BITMAPS IMPLEMENT FVLD
  2836.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  2837.     CHARACTER*1 FVXX(6792)
  2838.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  2839.     EQUIVALENCE (FV4(1),FVXX(4529))
  2840.         Common/FVLDM/FVXX
  2841. c        COMMON/FVLDM/FV1,FV2,FV4
  2842. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  2843. C TYPES OF AC'S STORAGE:
  2844.         CHARACTER*1 ITYP(2264)
  2845.         InTeGer*4 IATYP(27),LINTGR
  2846.         COMMON/TYP/IATYP,ITYP,LINTGR
  2847.         CHARACTER*1 LBITS(8)
  2848.         COMMON/BITS/LBITS
  2849. C ***<<<< RDD COMMON START >>>***
  2850.     InTeGer*4 RRWACT,RCLACT
  2851. C    COMMON/RCLACT/RRWACT,RCLACT
  2852.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2853.      1  IDOL7,IDOL8
  2854. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2855. C     1  IDOL7,IDOL8
  2856.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2857. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2858.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2859. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2860. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2861. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2862.     InTeGer*4 KLVL
  2863. C    COMMON/KLVL/KLVL
  2864.     InTeGer*4 IOLVL,IGOLD
  2865. C    COMMON/IOLVL/IOLVL
  2866. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2867. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2868.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2869.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2870.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2871. C ***<<< RDD COMMON END >>>***
  2872. CCC        InTeGer*4 IPGMAX,LPGMXF
  2873. CCC        COMMON/FILEMX/IPGMAX,LPGMXF
  2874. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2875. C USE LUN 7 FOR FORMULAS, 9 FOR VALUES FILE IF NEEDED...
  2876. C
  2877. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  2878. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  2879. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  2880. C AREAS WITH DATA.
  2881. C ***<<< KLSTO COMMON START >>>***
  2882.     InTeGer*4 DLFG
  2883. C    COMMON/DLFG/DLFG
  2884.     InTeGer*4 KDRW,KDCL
  2885. C    COMMON/DOT/KDRW,KDCL
  2886.     InTeGer*4 DTRENA
  2887. C    COMMON/DTRCMN/DTRENA
  2888.     REAL*8 EP,PV,FV
  2889.     DIMENSION EP(20)
  2890.     INTEGER*4 KIRR
  2891. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2892.     InTeGer*4 LASTOP
  2893. C    COMMON/ERROR/LASTOP
  2894.     CHARACTER*1 FMTDAT(9,76)
  2895. C    COMMON/FMTBFR/FMTDAT
  2896.     CHARACTER*1 EDNAM(16)
  2897. C    COMMON/EDNAM/EDNAM
  2898.     InTeGer*4 MFID(2),MFMOD(2)
  2899. C    COMMON/FRM/MFID,MFMOD
  2900.     InTeGer*4 JMVFG,JMVOLD
  2901. C    COMMON/FUBAR/JMVFG,JMVOLD
  2902.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2903.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2904. C ***<<< KLSTO COMMON END >>>***
  2905. CCC        CHARACTER*1 FMTDAT(9,76)
  2906. CCC        COMMON/FMTBFR/FMTDAT
  2907.         CHARACTER*1 DVF(12),DFMT(10)
  2908.         EQUIVALENCE(DVF(2),DFMT(1))
  2909.         COMMON/DEFVBX/DVF
  2910. CCC    InTeGer*4 DLFG
  2911. CCC    COMMON/DLFG/DLFG
  2912. C DLFG IS NONZERO IF ANY D## FORMS HAVE BEEN SEEN
  2913.         InTeGer*4 MPAG(2),MPMOD
  2914.         InTeGer*2 LVALBF(5,800)
  2915.     DIMENSION MPMOD(2)
  2916.         COMMON/VB/MPAG,LVALBF,MPMOD
  2917.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  2918.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  2919. CCC    InTeGer*4 MFID(2)
  2920. C        InTeGer*4 MFID,IFID(8,2048)
  2921. C        CHARACTER*1 LFID(16,2048)
  2922. C        EQUIVALENCE(IFID(1,1),LFID(1,1))
  2923. CCC        COMMON/FRM/MFID,MFMOD
  2924. C        COMMON/FRM/MFID,IFID
  2925. C
  2926. C ***<<< NULETC COMMON START >>>***
  2927.     InTeGer*4 ICREF,IRREF
  2928. C    COMMON/MIRROR/ICREF,IRREF
  2929.     InTeGer*4 MODPUB,LIMODE
  2930. C    COMMON/MODPUB/MODPUB,LIMODE
  2931.     InTeGer*4 KLKC,KLKR
  2932.     REAL*8 AACP,AACQ
  2933. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2934.     InTeGer*4 NCEL,NXINI
  2935. C    COMMON/NCEL/NCEL,NXINI
  2936.     CHARACTER*1 NAMARY(20,301)
  2937. C    COMMON/NMNMNM/NAMARY
  2938.     InTeGer*4 NULAST,LFVD
  2939. C    COMMON/NULXXX/NULAST,LFVD
  2940.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2941.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2942. C ***<<< NULETC COMMON END >>>***
  2943. CCC        COMMON /NCEL/NCEL,NXINI
  2944.     LINTGR=0
  2945.     MPMOD(1)=0
  2946.     MPMOD(2)=0
  2947.     MFMOD(1)=0
  2948.     MFMOD(2)=0
  2949.     DLFG=0
  2950.         IBP=1
  2951. C INITIALIZE ADDRESSES FOR FVLDSG/FVLDGT
  2952. C    CALL FVGO(FV1,LBITS)
  2953.         DO 2 N=1,9
  2954. 2       FMTDAT(N,1)=DFMT(N)
  2955.         DO 3 N=2,76
  2956.         DO 3 NN=1,9
  2957. 3       FMTDAT(NN,N)=CHAR(0)
  2958.         DO 1 N=1,8
  2959.     NN=128/IBP
  2960.         LBITS(N)=CHAR(NN)
  2961. 1       IBP=IBP+IBP
  2962.         DO 4 N=1,2264
  2963. C CLEAR BITMAPS NOW
  2964.         FV1(N)=CHAR(0)
  2965.         FV2(N)=CHAR(0)
  2966.         FV4(N)=CHAR(0)
  2967. 4       ITYP(N)=CHAR(0)
  2968. C OPEN THE WORK FILES SO WE DON'T NEED TO LATER...
  2969. C LUN 7 IS FORMULAS; LUN 9 IS VALUES
  2970. C HOWEVER, IF IPGMAX IS LESS THAN 800/205 (INDICATING ENTIRE FILE
  2971. C FITS IN MEMORY) DON'T OPEN LUN 9 AND IF LPGMXF IS < 2048/64, LIKEWISE
  2972. C FOR LUN 7.
  2973. C INITIALLY CLOSE FILES IN CASE THEY WERE OPEN...
  2974.         CLOSE(7,STATUS='DELETE')
  2975.         CLOSE(13,STATUS='DELETE')
  2976. C NOW OPEN THEM AS RANDOM ACCESS FILES.
  2977.         NBK=IPGMAX*2
  2978. C KEEP VALUE PAGES IN 500 BYTE UNITS, NOT 512 BYTE UNITS, TO COME
  2979. C OUT EVEN...
  2980.         IF(IPGMAX.GT.(800/100))OPEN(13,
  2981.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  2982.      3  RECL=500,STATUS='NEW')
  2983.         NBK=LPGMXF*2
  2984.         IF(LPGMXF.GT.(2048/64))OPEN(7,
  2985.      1  ACCESS='DIRECT',FORM='UNFORMATTED',
  2986.      3  RECL=512,STATUS='NEW')
  2987. C SET NOTHING IN MEMORY YET
  2988.         MFID(1)=0
  2989.     MFID(2)=0
  2990.         MPAG(1)=0
  2991.     MPAG(2)=0
  2992. C MARK BUFFER 1 AS IN MEMORY AND AS LAST-ACCESSED (SO WE FIRST ATTEMPT TO
  2993. C OVERWRITE BUFFER 2 TO GET STARTED.)
  2994.     MFLAST=1
  2995.     MFBASE=0
  2996.     MVLAST=1
  2997.     MVBASE=0
  2998. C ZERO MEMORY BUFFER AND FILES
  2999. C ACTUALLY MARK WITH -1 SO THAT WE CAN TELL WHEN WE HIT A VIRGIN
  3000. C AREA.
  3001.         DO 9 N=1,800
  3002.         DO 9 M=1,5
  3003. 9       LVALBF(M,N)=-1
  3004.         NPG=(IPGMAX*2)
  3005.         IF(IPGMAX.LE.(800/100))GOTO 11
  3006.         DO 10 N=1,NPG
  3007. 10      WRITE(13,REC=N,ERR=11)((LVALBF(K,KKK),K=1,5),KKK=1,50)
  3008. 11      CONTINUE
  3009.     CALL WRKFIL(0,0,50)
  3010. C        DO 12 N=1,2048
  3011. C        DO 12 M=1,8
  3012. C12      IFID(M,N)=0
  3013. C    NPG=LPGMXF*2
  3014. C        IF(LPGMXF.LE.(2048/64))GOTO 14
  3015. C        DO 13 N=1,NPG
  3016. C13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  3017. 14      CONTINUE
  3018. C SET ALL AC'S TO TYPE FLOATING...
  3019.         DO 8 N=1,27
  3020. 8       IATYP(N)=2
  3021. C TYPE 2 IS REALS (DEFAULT)
  3022.         NCEL=0
  3023.     NXINI=0
  3024.         RETURN
  3025.         END
  3026. c -h- wtbini.f40    Fri Aug 22 13:43:29 1986    
  3027. C WORK FORMULA TABLE INITIALIZE FOR DTBL1 COMMON
  3028. C COPYRIGHT (C) GLENN AND MARY EVERHART 1985
  3029. C ALL RIGHTS RESERVED
  3030.     SUBROUTINE WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,
  3031.      1  BTBL6,BTBL7,BTBL8)
  3032.     CHARACTER*1 DTBL1(9,9,8)
  3033. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  3034.     Integer*4 LPGMXF
  3035. C    InTeGer*2 BTBL(6,6,8)
  3036. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  3037. C NO NEED TO WASTE IT.
  3038.     InTeGer*2 IFID(8,2048)
  3039. C    CHARACTER*1 LFID(16,2048)
  3040. C    EQUIVALENCE(LFID(1,1),IFID(1,1))
  3041. C    EQUIVALENCE(IFID(1,1),BTBL(1,1,1))
  3042.     InTeGer*2 BTBL1(6,6)
  3043.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  3044.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  3045. C    EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  3046. C    EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  3047. C    EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  3048. C    EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  3049.     COMMON /DECIDE/ DTBL1
  3050. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  3051. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  3052.     do 135 n3=1,8
  3053.     do 135 n2=1,9
  3054.     do 135 n1=1,9
  3055. 135    dtbl1(n1,n2,n3)=CHAR(0)
  3056.     DO 35 NN2=1,6
  3057.     N2=NN2
  3058.     IF(NN2.GT.4)N2=NN2+3
  3059.     DO 235 N1=1,4
  3060.     DTBL1(N1,N2,1)=CHAR(BTBL1(N1,NN2))
  3061.     DTBL1(N1,N2,2)=CHAR(BTBL2(N1,NN2))
  3062.     DTBL1(N1,N2,3)=CHAR(BTBL3(N1,NN2))
  3063.     DTBL1(N1,N2,4)=CHAR(BTBL4(N1,NN2))
  3064.     DTBL1(N1,N2,5)=CHAR(BTBL5(N1,NN2))
  3065.     DTBL1(N1,N2,6)=CHAR(BTBL6(N1,NN2))
  3066.     DTBL1(N1,N2,7)=CHAR(BTBL7(N1,NN2))
  3067. 235    DTBL1(N1,N2,8)=CHAR(BTBL8(N1,NN2))
  3068.     do 335 n1=5,6
  3069.     DTBL1(N1+3,N2,1)=CHAR(BTBL1(N1,NN2))
  3070.     DTBL1(N1+3,N2,2)=CHAR(BTBL2(N1,NN2))
  3071.     DTBL1(N1+3,N2,3)=CHAR(BTBL3(N1,NN2))
  3072.     DTBL1(N1+3,N2,4)=CHAR(BTBL4(N1,NN2))
  3073.     DTBL1(N1+3,N2,5)=CHAR(BTBL5(N1,NN2))
  3074.     DTBL1(N1+3,N2,6)=CHAR(BTBL6(N1,NN2))
  3075.     DTBL1(N1+3,N2,7)=CHAR(BTBL7(N1,NN2))
  3076.     DTBL1(N1+3,N2,8)=CHAR(BTBL8(N1,NN2))
  3077. 335    continue
  3078. 35    CONTINUE
  3079. C NOW CLEAR THE BUFFER OUT, HAVING SET UP DTBL1 FROM IT.
  3080. C SET INITIAL -1 SO WE CAN RECOGNIZE WHEN TO STOP LOOKING
  3081. C INITIALLY...
  3082.     DO 36 NN=1,2048
  3083.     DO 36 N=1,8
  3084. 36    IFID(N,NN)=-1
  3085. C ZERO THE FILE NOW
  3086.     NPG=LPGMXF*2
  3087.         IF(LPGMXF.LE.32)GOTO 14
  3088. C        IF(LPGMXF.LE.(2048/64))GOTO 14
  3089.         DO 13 N=1,NPG
  3090. 13      WRITE(7,REC=N,ERR=14)((IFID(K,KKK),K=1,8),KKK=1,32)
  3091. 14      CONTINUE
  3092.     RETURN
  3093.     END
  3094. c -h- wkdy.for    Fri Aug 22 13:44:33 1986    
  3095.     SUBROUTINE WKDY(JULLO,JULHI,NDAYS)
  3096. C GIVEN START AND END JULIAN DATE, FIGURE OUT HOW MANY WEEK DAYS
  3097. C THERE ARE BETWEEN THEM.
  3098.     JL=JULLO
  3099.     JH=JULHI
  3100.     IF(JL.LE.JH)GOTO 10
  3101.     JL=JULHI
  3102.     JH=JULLO
  3103. 10    CONTINUE
  3104.     IDL=(JH-JL)/7
  3105. C GET NUMBER OF WEEKS BETWEEN DAYS, 5 WORKDAYS PER WHOLE WEEK.
  3106.     IWDY=IDL*5
  3107. C ADD 3 SO THAT MODULO OF SUNDAY IS 0, NOT WED.
  3108.     IDOR=JH-JL-7*(IDL)
  3109.     IF(IDOR.NE.0)IDOR=5
  3110. C IDOR IS ORIGINAL # DAYS DIFFERENCE, CORRECTED FOR WHOLE
  3111. C WEEKS ALREADY ALLOWED.
  3112.     LD=JL+3
  3113.     LD=MOD(LD,7)
  3114.     LH=JH+3
  3115.     LH=MOD(LH,7)
  3116. C NOW HAVE DAY OF WEEK START,END. FIND WORK DAYS THAT WEEK (M-F ONLY)
  3117.     IKLU=0
  3118.     IK2=1
  3119.     IF(LD.LT.1)IK2=0
  3120.     IF(LD.LT.1)LD=1
  3121.     IF(LD.GT.5)LD=5
  3122. C FOR HIGH END OF RANGE IF THE END DATE IS SUNDAY SUBTRACT ONE DAY
  3123. C FROM THE DAYS SO WE OMIT THE MONDAY FROM THE RANGE...
  3124.     IF(LH.LT.1)IKLU=IK2
  3125.     IF(LH.LT.1)LH=1
  3126.     IF(LH.GT.5)LH=5
  3127. C LH = DAY ENDED ON, LD=START DAY, FORCED INTO WORK WEEK.
  3128.     IF (LH.GT.LD)IWDY=IWDY+LH-LD-IKLU
  3129.     IF (LH.LE.LD)IWDY=IWDY+IDOR-(LD-LH)-IKLU
  3130. C GIVES DAYS BETWEEN 2 DATES JUST LIKE JULIAN DATE SUBTRACTION FOR
  3131. C CALENDAR DATES.
  3132.     NDAYS=IWDY
  3133.     RETURN
  3134.     END
  3135. c -h- wrkint.for    Fri Aug 22 13:44:46 1986    
  3136.     SUBROUTINE WRKINT(JULLO,NWDY,JULHI)
  3137. C GETS JULLO = START DATE AND NWDY = NO. WORKDAYS (M-F) TO ADD AND
  3138. C FINDS JULHI = END JULIAN DATE, CONSTRAINED TO BE IN MONDAY TO
  3139. C FRIDAY RANGE.
  3140. C MUST ADD 3 BECAUSE THAT'S THE BIAS OF OUR JULIAN DATE BASE.
  3141.     IDJL=MOD(JULLO+3,7)
  3142. C IDJL = DAY CODE OF START DATE
  3143.     NWWK=NWDY/5
  3144.     JL=JULLO
  3145.     IF(IDJL.LT.1)JL=JL+1
  3146.     IF(IDJL.GT.5)JL=JL+2
  3147. C BUMP START INTERVAL...
  3148.     NWDD=NWDY-5*NWWK
  3149.     JL=JL+NWWK*7+NWDD
  3150.     IDJL=MOD(JL+3,7)
  3151.     IF(IDJL.LT.1)JL=JL+1
  3152.     IF(IDJL.GT.5)JL=JL+2
  3153. C FORCE OUTPUT DATE TO BE WITHIN WORKWEEK
  3154.     JULHI=JL
  3155.     RETURN
  3156.     END
  3157.