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

  1. c -h- test.for    Fri Aug 22 13:35:58 1986    
  2.     SUBROUTINE TEST(LOGTYP,FLAG,V1,V2)
  3.     InTeGer*4 FLAG
  4.     REAL*8 V1,V2
  5.     FLAG=0
  6.     IF(LOGTYP.EQ.1.AND.V1.GT.V2)FLAG=1
  7.     IF(LOGTYP.EQ.2.AND.V1.LT.V2)FLAG=1
  8.     IF(LOGTYP.EQ.3.AND.V1.EQ.V2)FLAG=1
  9.     IF(LOGTYP.EQ.4.AND.V1.NE.V2)FLAG=1
  10.     IF(LOGTYP.EQ.5.AND.V1.GE.V2)FLAG=1
  11.     IF(LOGTYP.EQ.6.AND.V1.LE.V2)FLAG=1
  12. C TEST LOGICAL RELATIONS FOR IF STATEMENT, FLAG=1 IF TRUE, 0 ELSE.
  13.     RETURN
  14.     END
  15. c -h- ttydei.for    Fri Aug 22 13:35:58 1986    
  16.     SUBROUTINE TTYDEI
  17.     INCLUDE DOS.INC
  18.     INTEGER *4 MODE
  19.     Integer*4 Amiga
  20.     External Amiga
  21. C ***<<< XVXTCD COMMON START >>>***
  22.     CHARACTER*1 OARRY(100)
  23.     InTeGer*4 OSWIT,OCNTR
  24. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  25. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  26.     InTeGer*4 IPS1,IPS2,MODFLG
  27. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  28.        InTeGer*4 XTCFG,IPSET,XTNCNT
  29.        CHARACTER*1 XTNCMD(80)
  30. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  31. C VARY FLAG ITERATION COUNT
  32.     INTEGER KALKIT
  33. C    COMMON/VARYIT/KALKIT
  34.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  35.     InTeGer*4 RCMODE,IRCE1,IRCE2
  36. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  37. C     1  IRCE2
  38. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  39. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  40. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  41. C RCFGX ON.
  42. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  43. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  44. C  AND VM INHIBITS. (SETS TO 1).
  45.     INTEGER*4 FH
  46. C FILE HANDLE FOR CONSOLE I/O (RAW)
  47. C    COMMON/CONSFH/FH
  48.     CHARACTER*1 ARGSTR(52,4)
  49. C    COMMON/ARGSTR/ARGSTR
  50.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  51.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  52.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  53.      3  IRCE2,FH,ARGSTR
  54. C ***<<< XVXTCD COMMON END >>>***
  55. CCC    COMMON/CONSFH/FH
  56.     If (FH.ne.0)Call Amiga(Close,FH)
  57.     RETURN
  58.     END
  59. c -h- ttyini.for    Fri Aug 22 13:35:58 1986    
  60.     SUBROUTINE TTYINI
  61. C PERFORM INITS ON UNIT 5. NORMALLY EITHER DO NOTHING OR
  62. C REPLACE WITH SOMETHING THAT WORKS FOR YOUR SYSTEM. TYPICAL
  63. C ACTIONS:
  64. C  SET THE TERMINAL NOT TO WRAP AROUND
  65. C  ATTACH TERMINAL SO TYPE-AHEAD WORKS
  66. C  SET UP TERMINAL TO MUNGE AROUND THE ESCAPE SEQUENCES TO ALLOW
  67. C  SPECIAL FUNCTION AND/OR ARROW KEYS TO WORK.
  68. C ULTIMATELY USE WRITE OF UNIT 0 TO DUMP OUT SOME USEFUL ESCAPE SEQS.
  69. C TO DEFINE FUNCTION KEYS A LA VT100 (SORT OF).
  70.     INCLUDE DOS.INC
  71.     CHARACTER*40 NAME
  72.     INTEGER *4 MODE
  73.     Integer*4 Amiga
  74.     External Amiga
  75. C ***<<< XVXTCD COMMON START >>>***
  76.     CHARACTER*1 OARRY(100)
  77.     InTeGer*4 OSWIT,OCNTR
  78. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  79. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  80.     InTeGer*4 IPS1,IPS2,MODFLG
  81. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  82.        InTeGer*4 XTCFG,IPSET,XTNCNT
  83.        CHARACTER*1 XTNCMD(80)
  84. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  85. C VARY FLAG ITERATION COUNT
  86.     INTEGER KALKIT
  87. C    COMMON/VARYIT/KALKIT
  88.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  89.     InTeGer*4 RCMODE,IRCE1,IRCE2
  90. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  91. C     1  IRCE2
  92. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  93. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  94. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  95. C RCFGX ON.
  96. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  97. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  98. C  AND VM INHIBITS. (SETS TO 1).
  99.     INTEGER*4 FH
  100. C FILE HANDLE FOR CONSOLE I/O (RAW)
  101. C    COMMON/CONSFH/FH
  102.     CHARACTER*1 ARGSTR(52,4)
  103. C    COMMON/ARGSTR/ARGSTR
  104.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  105.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  106.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  107.      3  IRCE2,FH,ARGSTR
  108. C ***<<< XVXTCD COMMON END >>>***
  109. CCC    COMMON/CONSFH/FH
  110.     NAME="RAW:0/0/630/199/AnalytiCalc-AMIGA" // CHAR(0)
  111.     MODE=MODE_NEWFILE
  112.     FH=AMIGA(Open,NAME,MODE)
  113.     RETURN
  114.     END
  115. c -h- typget.for    Fri Aug 22 13:35:58 1986    
  116.         SUBROUTINE TYPGET(ID1,ID2,IVAL)
  117. C
  118. C TYPGET - GET TYPE(60,301) ARRAY WORDS BACK
  119. C RETURN TYPE(ID1,ID2) IN IVAL, BUT NOT REALLY...
  120. C NEXT BITMAPS IMPLEMENT FVLD
  121.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  122.     CHARACTER*1 FVXX(6792)
  123.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  124.     EQUIVALENCE (FV4(1),FVXX(4529))
  125.         Common/FVLDM/FVXX
  126. c        COMMON/FVLDM/FV1,FV2,FV4
  127.         CHARACTER*1 LBITS(8)
  128.         COMMON/BITS/LBITS
  129. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  130. C TYPES OF AC'S STORAGE:
  131.     LOGICAL*4 LB1,LB2
  132.     InTeGer*4 KB1,KB2
  133.     EQUIVALENCE(LB1,KB1),(LB2,KB2)
  134.         CHARACTER*1 ITYP(2264)
  135.         InTeGer*4 IATYP(27),LINTGR
  136.         COMMON/TYP/IATYP,ITYP,LINTGR
  137. C ***<<< NULETC COMMON START >>>***
  138.     InTeGer*4 ICREF,IRREF
  139. C    COMMON/MIRROR/ICREF,IRREF
  140.     InTeGer*4 MODPUB,LIMODE
  141. C    COMMON/MODPUB/MODPUB,LIMODE
  142.     InTeGer*4 KLKC,KLKR
  143.     REAL*8 AACP,AACQ
  144. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  145.     InTeGer*4 NCEL,NXINI
  146. C    COMMON/NCEL/NCEL,NXINI
  147.     CHARACTER*1 NAMARY(20,301)
  148. C    COMMON/NMNMNM/NAMARY
  149.     InTeGer*4 NULAST,LFVD
  150. C    COMMON/NULXXX/NULAST,LFVD
  151.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  152.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  153. C ***<<< NULETC COMMON END >>>***
  154. CCC    InTeGer*4 ICREF,IRREF
  155. CCC    COMMON/MIRROR/ICREF,IRREF
  156. C
  157. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  158. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  159. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  160. C AREAS WITH DATA.
  161. C ***<<< KLSTO COMMON START >>>***
  162.     InTeGer*4 DLFG
  163. C    COMMON/DLFG/DLFG
  164.     InTeGer*4 KDRW,KDCL
  165. C    COMMON/DOT/KDRW,KDCL
  166.     InTeGer*4 DTRENA
  167. C    COMMON/DTRCMN/DTRENA
  168.     REAL*8 EP,PV,FV
  169.     DIMENSION EP(20)
  170.     INTEGER*4 KIRR
  171. C    COMMON/ERNPER/EP,PV,FV,KIRR
  172.     InTeGer*4 LASTOP
  173. C    COMMON/ERROR/LASTOP
  174.     CHARACTER*1 FMTDAT(9,76)
  175. C    COMMON/FMTBFR/FMTDAT
  176.     CHARACTER*1 EDNAM(16)
  177. C    COMMON/EDNAM/EDNAM
  178.     InTeGer*4 MFID(2),MFMOD(2)
  179. C    COMMON/FRM/MFID,MFMOD
  180.     InTeGer*4 JMVFG,JMVOLD
  181. C    COMMON/FUBAR/JMVFG,JMVOLD
  182.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  183.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  184. C ***<<< KLSTO COMMON END >>>***
  185. CCC        CHARACTER*1 FMTDAT(9,76)
  186. CCC        COMMON/FMTBFR/FMTDAT
  187.         CHARACTER*1 ITST,ITST2
  188.     LOGICAL*4 LTST,LTST2
  189.     InTeGer*4 KTST,KTST2
  190.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  191.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  192.         IF(ID1.LE.27.AND.ID2.LE.1)GOTO 1000
  193.     IVAL=2
  194.     IF(LINTGR.EQ.0)RETURN
  195.     CALL FVLDGT(ID1,ID2,ITST)
  196.     IF(ICHAR(ITST).EQ.0)GOTO 500
  197. C        ID=(ID2-1)*60+ID1
  198.     CALL REFLEC(ID2,ID1,ID)
  199.         IBT=(ID-1)/8
  200.     KB1=ID-1
  201.     KB2=7
  202.     LB1=LB1.AND.LB2
  203.     IBIT=KB1+1
  204. C        IBIT=((ID-1).AND.7)+1
  205.     KTST=ICHAR(ITYP(IBT))
  206.     KTST2=ICHAR(LBITS(IBIT))
  207.     LTST=LTST.AND.LTST2
  208. C        ITST=CHAR(ICHAR(ITYP(IBT)).AND.ICHAR(LBITS(IBIT)))
  209. 500     IVAL=2
  210.         IF(KTST.NE.0)IVAL=4
  211.         RETURN
  212. 1000    CONTINUE
  213. C AN AC. RETURN FULL TYPE WORD
  214.         IVAL=IATYP(ID1)
  215.         RETURN
  216.         END
  217. c -h- typset.for    Fri Aug 22 13:35:58 1986    
  218.         SUBROUTINE TYPSET(ID1,ID2,IVAL)
  219. C
  220. C TYPSET - STORE IVAL IN TYPE(60,301) ARRAY
  221. C NEXT BITMAPS IMPLEMENT FVLD
  222.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  223.     CHARACTER*1 FVXX(6792)
  224.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  225.     EQUIVALENCE (FV4(1),FVXX(4529))
  226.         Common/FVLDM/FVXX
  227. c        COMMON/FVLDM/FV1,FV2,FV4
  228.         CHARACTER*1 LBITS(8)
  229.         COMMON/BITS/LBITS
  230. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  231. C TYPES OF AC'S STORAGE:
  232.     LOGICAL*4 LTST,LTST2,LTST3,LT1,LT2
  233.     InTeGer*4 KTST,KTST2,KTST3,KT1,KT2
  234.     EQUIVALENCE(LT1,KT1),(LT2,KT2)
  235.         CHARACTER*1 ITYP(2264)
  236.         InTeGer*4 IATYP(27),LINTGR
  237.         COMMON/TYP/IATYP,ITYP,LINTGR
  238. C ***<<< NULETC COMMON START >>>***
  239.     InTeGer*4 ICREF,IRREF
  240. C    COMMON/MIRROR/ICREF,IRREF
  241.     InTeGer*4 MODPUB,LIMODE
  242. C    COMMON/MODPUB/MODPUB,LIMODE
  243.     InTeGer*4 KLKC,KLKR
  244.     REAL*8 AACP,AACQ
  245. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  246.     InTeGer*4 NCEL,NXINI
  247. C    COMMON/NCEL/NCEL,NXINI
  248.     CHARACTER*1 NAMARY(20,301)
  249. C    COMMON/NMNMNM/NAMARY
  250.     InTeGer*4 NULAST,LFVD
  251. C    COMMON/NULXXX/NULAST,LFVD
  252.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  253.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  254. C ***<<< NULETC COMMON END >>>***
  255. CCC    InTeGer*4 ICREF,IRREF
  256. CCC    COMMON/MIRROR/ICREF,IRREF
  257. C
  258. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  259. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  260. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  261. C AREAS WITH DATA.
  262. C ***<<< KLSTO COMMON START >>>***
  263.     InTeGer*4 DLFG
  264. C    COMMON/DLFG/DLFG
  265.     InTeGer*4 KDRW,KDCL
  266. C    COMMON/DOT/KDRW,KDCL
  267.     InTeGer*4 DTRENA
  268. C    COMMON/DTRCMN/DTRENA
  269.     REAL*8 EP,PV,FV
  270.     DIMENSION EP(20)
  271.     INTEGER*4 KIRR
  272. C    COMMON/ERNPER/EP,PV,FV,KIRR
  273.     InTeGer*4 LASTOP
  274. C    COMMON/ERROR/LASTOP
  275.     CHARACTER*1 FMTDAT(9,76)
  276. C    COMMON/FMTBFR/FMTDAT
  277.     CHARACTER*1 EDNAM(16)
  278. C    COMMON/EDNAM/EDNAM
  279.     InTeGer*4 MFID(2),MFMOD(2)
  280. C    COMMON/FRM/MFID,MFMOD
  281.     InTeGer*4 JMVFG,JMVOLD
  282. C    COMMON/FUBAR/JMVFG,JMVOLD
  283.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  284.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  285. C ***<<< KLSTO COMMON END >>>***
  286. CCC        CHARACTER*1 FMTDAT(9,76)
  287. CCC        COMMON/FMTBFR/FMTDAT
  288.         CHARACTER*1 ITST,ITST2,ITST3
  289.     EQUIVALENCE(LTST,ITST),(LTST2,ITST2)
  290.     EQUIVALENCE(KTST,ITST),(KTST2,ITST2)
  291.     EQUIVALENCE(KTST3,ITST3),(KTST3,LTST3)
  292.     IF(ID2.EQ.1.AND.ID1.LE.27)GOTO 2000
  293. C KEEP TRACK OF WHEN WE START TO SET INTEGER TYPE
  294.     IF(LINTGR.EQ.0.AND.IABS(IVAL).EQ.2)RETURN
  295. C FOR SIMPLICITY SET FLAG ON 1ST NONFLOATING TYPE AND
  296. C START KEEPING EXACT TRACK THEN ONLY.
  297.     LINTGR=1
  298. C        ID=(ID2-1)*60+ID1
  299.     CALL REFLEC(ID2,ID1,ID)
  300.         IBT=(ID-1)/8
  301.     KT1=ID-1
  302.     KT2=7
  303.     LT1=LT1.AND.LT2
  304.     IBIT=KT1+1
  305. C        IBIT=((ID-1).AND.7)+1
  306.     KTST2=ICHAR(LBITS(IBIT))
  307.     KTST3=KTST2
  308.     LTST2=.NOT.LTST2
  309. C        ITST2=.NOT.LBITS(IBIT)
  310.     KTST=ICHAR(ITYP(IBT))
  311.     LTST2=LTST.AND.LTST2
  312. C        ITST2=ITYP(IBT).AND.ITST2
  313.     LTST=LTST.OR.LTST3
  314.     ITST=CHAR(KTST)
  315.     ITST2=CHAR(KTST2)
  316. C        ITST=ITYP(IBT).OR.LBITS(IBIT)
  317.         ITYP(IBT)=ITST2
  318.         IF(IVAL.NE.-2.AND.IVAL.NE.2)ITYP(IBT)=ITST
  319.     RETURN
  320. 2000    IATYP(ID1)=IVAL
  321. C ACCUMULATORS JUST STORE NORMAL TYPE INTEGER.
  322.         RETURN
  323.         END
  324. c -h- usrcmd.for    Fri Aug 22 13:36:30 1986    
  325. c        interface to InTeGer*4 function system [c]
  326. c     +          (string[reference])
  327. c        character*1 string
  328. c        end
  329.     SUBROUTINE USRCMD(CMDLIN,ICODE,IGOTIT)
  330. C --- FOR 320K AnalytiCalc only (to keep it able to fit on 256K
  331. c     versions...)
  332. c Add "annotation" commands via main force & awkwardness as follows:
  333. c  1. ANN command will create a file named cell.ANN for the current
  334. c     cell (or overwrite an old one) dynamically for up to 20 lines
  335. c     of text, just firing up the command "EDIT namecell.ANN" so the user
  336. c     gets to do full screen edits. THE "name" part of the files is
  337. c     taken from the first 6 characters of the sheet name. If these
  338. c     are not in the uppercase alpha range they will be ignored, however,
  339. c     so it is a good idea for sheet titles to have recognizable initial
  340. c     6 characters.
  341. c  2. QUERY or ? command will display the name.ANN file if it exists
  342. c     after setting cursor to top of screen and doing line erase
  343. c     there.
  344. c
  345.     CHARACTER*81 CMDSTR
  346.     CHARACTER*1 CMLN(80),CMLN2(84)
  347. C    PARAMETER CUP=1,EL=12,ED=11,SGR=13
  348.     InTeGer*4 IJUNK
  349. c    InTeGer*4 SYSTEM
  350. c    EXTERNAL SYSTEM
  351.     EQUIVALENCE(CMLN2(5),CMLN(1),CMDSTR(1:1))
  352. C    EQUIVALENCE(CMLN2(5),CMLN(1))
  353. C DUMMY PLACE FOR USER COMMANDS TO PARSE CMDLIN AND HANDLE
  354. C DEFINE VALUE AREA FOR SPREAD SHEET. MORE WILL BE NEEDED GENERALLY
  355. C OUT OF COMMONS, BUT AT A MINIMUM, THIS WILL ALLOW SOME ACCESS TO
  356. C USEFUL NUMBERS. LOOK IN XQTCMD FOR MORE...
  357.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  358.     InTeGer*4 TYPE(1,1),VLEN(9)
  359.     LOGICAL*4 LEXIST
  360.     CHARACTER*1 NMSH(80)
  361.     COMMON/NMSH/NMSH
  362. C ***<<<< RDD COMMON START >>>***
  363.     InTeGer*4 RRWACT,RCLACT
  364. C    COMMON/RCLACT/RRWACT,RCLACT
  365.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  366.      1  IDOL7,IDOL8
  367. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  368. C     1  IDOL7,IDOL8
  369.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  370. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  371.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  372. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  373. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  374. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  375.     InTeGer*4 KLVL
  376. C    COMMON/KLVL/KLVL
  377.     InTeGer*4 IOLVL,IGOLD
  378. C    COMMON/IOLVL/IOLVL
  379. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  380. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  381.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  382.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  383.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  384. C ***<<< RDD COMMON END >>>***
  385. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  386. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  387.     REAL*8 XAC,XVBLS(1,1)
  388.     REAL*8 TAC,UAC,VAC
  389.     INTEGER*4 JVBLS(2,1,1)
  390.     EQUIVALENCE(XAC,AVBLS(1,27))
  391.     EQUIVALENCE(TAC,AVBLS(1,20))
  392.     EQUIVALENCE(UAC,AVBLS(1,21))
  393.     EQUIVALENCE(VAC,AVBLS(1,22))
  394.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  395.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  396.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  397. C    CHARACTER*1 FORM(4)
  398.     CHARACTER*1 CELNAM(5)
  399.     character*18 annam
  400.     CHARACTER*1 annams(18)
  401.     equivalence(annam(1:1),annams(1))
  402.     CHARACTER*5 CELNM
  403.     CHARACTER*5 CELRW
  404.     EQUIVALENCE(CELNM(1:1),CELRW(1:1),CELNAM(1))
  405. C    EQUIVALENCE(FORM(1),CELNAM(1))
  406. C    EQUIVALENCE(CELRW,CELNAM(1))
  407. C ***<<< KLSTO COMMON START >>>***
  408.     InTeGer*4 DLFG
  409. C    COMMON/DLFG/DLFG
  410.     InTeGer*4 KDRW,KDCL
  411. C    COMMON/DOT/KDRW,KDCL
  412.     InTeGer*4 DTRENA
  413. C    COMMON/DTRCMN/DTRENA
  414.     REAL*8 EP,PV,FV
  415.     DIMENSION EP(20)
  416.     INTEGER*4 KIRR
  417. C    COMMON/ERNPER/EP,PV,FV,KIRR
  418.     InTeGer*4 LASTOP
  419. C    COMMON/ERROR/LASTOP
  420.     CHARACTER*1 FMTDAT(9,76)
  421. C    COMMON/FMTBFR/FMTDAT
  422.     CHARACTER*1 EDNAM(16)
  423. C    COMMON/EDNAM/EDNAM
  424.     InTeGer*4 MFID(2),MFMOD(2)
  425. C    COMMON/FRM/MFID,MFMOD
  426.     InTeGer*4 JMVFG,JMVOLD
  427. C    COMMON/FUBAR/JMVFG,JMVOLD
  428.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  429.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  430. C ***<<< KLSTO COMMON END >>>***
  431. CCC    CHARACTER*1 EDNAM(16)
  432. CCC    common/ednam/ednam
  433. c available parsing aid:
  434. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  435. c where line(ibgn... lend) is scanned. If variable found
  436. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  437. c variable found if any. lstchr is last char found+1...
  438. C OTHER USEFUL ROUTINES IN THE SHEET:
  439. C GN(LAST,LEND,NUMBER,LINE)
  440. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  441. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  442. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  443. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  444. C  NUMERIC.
  445. C INDEX(LINE,CHAR)
  446. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  447. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  448. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  449. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  450. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  451. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  452. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  453.     CHARACTER*1 CMDLIN(132)
  454. C    INTEGER*4 ISTTS
  455. C
  456. C 16 MUST BE LENGTH OF EDNAM IN BYTES
  457. C KEEP NAME "EDIT " IN DATA SO IT CAN BE BASHED IF NEEDED TO BE...
  458. C INSERT CODE FOR ADDING A LIB$SPAWN CALL HERE TO PASS COMMANDS TO
  459. C 75 IF THEY BEGIN WITH A $ CHARACTER.
  460.     IGOTIT=0
  461.     IF(CMDLIN(1).NE.'}'.AND.CMDLIN(1).NE.'$')GOTO 8990
  462. C
  463. CC HERE CALL EXECIT WITH THE COMMAND LINE AS AN ARGUMENT...
  464.     DO 1000 NN=1,80
  465. 1000    CMLN(NN)=CMDLIN(NN+1)
  466.     CMLN(79)=Char(13)
  467.     CMLN(80)=Char(0)
  468.     DO 1002 NN=1,77
  469.     N=78-NN
  470.     IF(ICHAR(CMLN(N)).GT.32)GOTO 1004
  471. 1002    CONTINUE
  472. C FINDING END OF REAL STRING THIS WAY
  473. 1004    CONTINUE
  474.     CMLN(N+1)=0
  475. c was =13, not =0 above...
  476. C ADD C.R., THEN NULL
  477.     CMLN(N+2)=0
  478.     CMLN(N+3)=0
  479. C INSERT LENGTH COUNT AS 1ST BYTE OF CMD LENGTH
  480. C PER DOS 2.0 MANUAL PG F-1
  481. ccc    CMLN2(1)=CHAR(N+3)
  482. ccc    CMLN2(2)='/'
  483. ccc    CMLN2(3)='C'
  484. ccc    CMLN2(4)=' '
  485. CC ! ADD C.R. AFTER LINE
  486. CC ABOVE, INSERT A CR AFTER CMD LINE
  487. C USE SYSTEM CALL INSTEAD OF OLDER CALL WHICH USES NOW-UNSUPPORTED
  488. C FORTRAN FEATURES IN MS-FORTRAN V3.3
  489.     call system(cmln2(5))
  490. c    N=SYSTEM(CMLN2(5))
  491. ccc    CALL EXECIT(CMLN2)
  492. C ASSUME WE NEED A REDRAW AFTER THE SPAWN FINISHES
  493. C EVENTUALLY FIGURE OUT HOW TO EXEC A ROUTINE THIS WAY, BUT JUST DUMMY OUT
  494. C  AT FIRST.
  495.     IF(CMDLIN(1).NE.'}')GOTO 2300
  496. C IMPLEMENT WAIT ON } FORM...
  497.     CALL UVT100(1,25,1)
  498.     CALL VWRT('Push Return key to return to sheet>',35)
  499.     READ(11,2400,END=2300,ERR=2300)IJUNK
  500. 2400    FORMAT(2A1)
  501. 2300    CONTINUE
  502.     ICODE=2
  503. C FLAG THE MAIN COMMAND PARSER WE HANDLED THE COMMAND
  504.     IGOTIT=1
  505. 8990    CONTINUE
  506.     IF(CMDLIN(1).NE.'F'.OR.
  507.      1     CMDLIN(2).NE.'I'.OR.
  508.      2     CMDLIN(3).NE.'L') GOTO 9000
  509.     IGOTIT=1
  510.     ICODE=3
  511.     CALL DTRCMD(CMDLIN(4))
  512. C ALLOW EXTRA COMMANDS OUT OF VAX VERSION...
  513. C
  514. 9000    CONTINUE
  515.     IF(CMDLIN(1).NE.'A'.OR.CMDLIN(2).NE.'N')GOTO 9200
  516. C ANNOTATE COMMAND SEEN
  517.     IGOTIT=1
  518.     ICODE=2
  519.     DO 9001 N=1,80
  520.     CMLN(N)=Char(32)
  521. 9001    CONTINUE
  522. C    CALL IN2AS(PROW,FORM)
  523.     CALL REFLEC(PCOL,PROW,IRX)
  524.     WRITE(CELRW(1:5),9002)IRX
  525. 9002    FORMAT(I5.5)
  526.     ICM=17
  527.     DO 9040 N=1,3
  528.     IXX=ICHAR(NMSH(N))
  529.     IF(IXX.GT.96)IXX=IXX-32
  530.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9040
  531.     CMLN(ICM)=CHAR(IXX)
  532.     ICM=ICM+1
  533. 9040    CONTINUE
  534.     ICM=ICM-1
  535.     DO 9003 N=1,5
  536.     CMLN(N+ICM)=CELNAM(N)
  537. 9003    CONTINUE
  538.     CMLN(ICM+6)='.'
  539.     CMLN(ICM+7)='A'
  540.     CMLN(ICM+8)='N'
  541.     CMLN(ICM+9)='N'
  542.     CMLN(ICM+10)=' '
  543.     CMLN(80)=13
  544.     DO 9008 N=1,16
  545.     CMLN(N)=EDNAM(N)
  546. 9008    CONTINUE
  547. C NOW HAVE "EDIT name.ANN"
  548. c built... go fire it up for creation or modification of annotation...
  549.     DO 9150 N=17,ICM+9
  550.     IF(CMLN(N).EQ.' ')CMLN(N)='0'
  551. 9150    CONTINUE
  552.     DO 9162 NN=1,77
  553.     N=78-NN
  554.     IF(ICHAR(CMLN(N)).GT.32)GOTO 9164
  555. 9162    CONTINUE
  556. C FINDING END OF REAL STRING THIS WAY
  557. 9164    CONTINUE
  558.     CMLN(N+1)=Char(13)
  559. C ADD C.R., THEN NULL
  560.     CMLN(N+2)=Char(0)
  561.     CMLN(N+3)=Char(0)
  562.     N=SYSTEM(CMLN2(5))
  563.     GOTO 9990
  564. 9200    CONTINUE
  565.     IF(CMDLIN(1).NE.'?'.AND.(CMDLIN(1).NE.'Q'.OR.CMDLIN(2)
  566.      1  .NE.'U'.OR.CMDLIN(3).NE.'E')) GOTO 9300
  567. C QUERY COMMAND SEEN
  568.     IGOTIT=1
  569.     ICODE=2
  570.     DO 9237 N=1,18
  571. 9237    ANNAMS(N)=CHAR(32)
  572.     CALL REFLEC(PCOL,PROW,IRX)
  573.     WRITE(CELRW(1:5),9002)IRX
  574.     ICM=0
  575.     do 9238 n=1,18
  576.     annams(n)=char(32)
  577. 9238    continue
  578.     DO 9240 N=1,3
  579. C NOTE ANNOTATION NAMES ARE DIFFERENT HERE FROM VAX...
  580. C USE NAMnnnnn.ANN WHERE nnnnn IS CELL HASH AND "NAM" COMES
  581. C FROM 1ST 3 CHARS OF SHEET TITLE.
  582.     IXX=ICHAR(NMSH(N))
  583.     IF(IXX.GT.96)IXX=IXX-32
  584.     IF(IXX.LT.65.OR.IXX.GT.90)GOTO 9240
  585.     ICM=ICM+1
  586.     ANNAMS(ICM)=CHAR(IXX)
  587. 9240    CONTINUE
  588.     DO 9241 N=1,5
  589.     ANNAMS(ICM+N)=CELNAM(N)
  590. 9241    CONTINUE
  591.     ANNAMS(ICM+6)='.'
  592.     ANNAMS(ICM+7)='A'
  593.     ANNAMS(ICM+8)='N'
  594.     ANNAMS(ICM+9)='N'
  595.     DO 9250 N=1,18
  596.     IF(ANNAMS(N).EQ.' ')ANNAMS(N)='0'
  597. 9250    CONTINUE
  598.     ANNAMS(ICM+10)=' '
  599. C GO TO 9210 IF NO FILE
  600.     INQUIRE (FILE=ANNAM,EXIST=LEXIST)
  601.     IF(.NOT.LEXIST)GOTO 9210
  602.     OPEN(UNIT=2,FILE=ANNAM,ACCESS='SEQUENTIAL',STATUS='OLD')
  603.     DO 9030 N=1,20
  604.     READ(2,9031,END=9032,ERR=9032)WRK
  605. 9031    FORMAT(128A1)
  606.     CALL UVT100(1,N+2,1)
  607.     CALL UVT100(12,2,0)
  608.     call swrt(wrk,79)
  609. c    WRITE(6,9035)WRK
  610. 9035    FORMAT(128A1)
  611. 9030    CONTINUE
  612. 9032    CONTINUE
  613. C THIS DISPLAYS ALL THE ANNOTATION WE HAVE...
  614.     CLOSE(UNIT=2)
  615.     CALL UVT100(1,LLCMD,1)
  616.     CALL UVT100(12,2,0)
  617.     CALL VWRT('Push Return key to return to sheet>',35)
  618.     READ(11,2400,END=9990,ERR=9990)IJUNK
  619.     GOTO 9990
  620. 9210    CONTINUE
  621.     ICODE=3
  622.     CALL UVT100(1,LLDSP,1)
  623.     call uvt100(12,2,0)
  624.     CALL SWRT('No Annotation found on thic cell.',33)
  625. c    WRITE(6,9211)
  626. c9211    FORMAT(' No annotation found on this cell.')
  627. 9300    CONTINUE
  628. C
  629. 9990    CONTINUE
  630.     RETURN
  631.     END
  632. c -h- usrfct.for    Fri Aug 22 13:36:30 1986    
  633. C USER FUNCTION ROUTINE
  634. C GENERATES PARSING AND EXECUTION OF ROUTINE CALLS OF FORM
  635. C  *U FNAME (ARGUMENTS)
  636. C WHERE LINE (80 BYTES) CONTAINS COMMAND LINE AND ALL
  637. C ARGUMENTS MAY BE PARSED.
  638. C CALLED FROM CMND
  639. C
  640. C VAX VERSION: MOST MATRIX ROUTINES AVAILABLE
  641. C BUT ASSUMES SUBSTANTIAL SPACE AVAILABLE.
  642. C
  643. c available parsing aid:
  644. c call varscn(line,ibgn,lend,lstchr,id1,id2,ivalid)
  645. c where line(ibgn... lend) is scanned. If variable found
  646. c ivalid=1 else ivalid=0. id1,id2 are dims in xvbls for
  647. c variable found if any. lstchr is last char found+1...
  648. C OTHER USEFUL ROUTINES IN THE SHEET:
  649. C GN(LAST,LEND,NUMBER,LINE)
  650. C  LOOKS FROM LINE(LAST) THRU LINE(LEND) FOR A NUMBER AND
  651. C  RETURNS ANY NUMBER IN "NUMBER" ARG. ASSUMES "LINE" IS A
  652. C  BYTE ARRAY. (NO INDICATION OF WHERE THE NUMBER WAS FOUND
  653. C  HOWEVER). THROWS OUT LEADING SPACES, TERMINATES ON A NON
  654. C  NUMERIC.
  655. C INDEX(LINE,CHAR)
  656. C  EXPECTS LINE TO BE NULL TERMINATED AND RETURNS EITHER
  657. C  THE SUBSCRIPT (COUNTING FROM 1) OF CHAR IN LINE OR THE
  658. C  MAX SUBSCRIPT IN LINE (I.E., WHERE IT HIT THE NULL TERMINATOR).
  659. C  NOTE THIS DIFFERS FROM THE "STANDARD" VERSION OF INDEX WHICH
  660. C  RETURNS 0 FOR "NOT FOUND" -- THIS VERSION RETURNS MAX LENGTH
  661. C  FOR "NOT FOUND". STOPS AT 512 BYTES HOWEVER...
  662. C  PARSING IS UP TO USER. NOTE VARSCN MAY BE CALLED TO PARSE
  663. C VARIABLE NAMES. SUPPLIED VERSION CALLS IDATE WHICH RETURNS
  664. C SYSTEM DATE IN RSX OR VMS AS INTEGER DAY, MONTH, AND YEAR.
  665. C  THIS RETURNS HERE IN AC T, U, AND V
  666. C
  667.     SUBROUTINE USRFCT(LINE,RETCD,WRK2)
  668.     CHARACTER*1 LINE(80)
  669.     INTEGER RETCD
  670.     CHARACTER*1 AVBLS(20,27),WRK(128),VBLS(8,1,1)
  671.     CHARACTER*1 WRK2(128)
  672.     InTeGer*4 TYPE(1,1),VLEN(9)
  673.     EXTERNAL INDX
  674.     REAL*8 XAC,XVBLS(1,1)
  675.     REAL*8 TAC,UAC,VAC,WAC,YAC
  676.     REAL*8 TMP,XXXX
  677.     INTEGER*4 JVBLS(2,1,1)
  678.     EQUIVALENCE(WAC,AVBLS(1,23)),(YAC,AVBLS(1,25))
  679.     EQUIVALENCE(XAC,AVBLS(1,27))
  680.     EQUIVALENCE(TAC,AVBLS(1,20))
  681.     EQUIVALENCE(UAC,AVBLS(1,21))
  682.     EQUIVALENCE(VAC,AVBLS(1,22))
  683.     EQUIVALENCE(VBLS(1,1,1),JVBLS(1,1,1))
  684.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  685.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  686. CCC    InTeGer*4 XTNCNT,XTCFG,IPSET
  687. CCC    CHARACTER*1 XTNCMD(80)
  688. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  689. C ***<<<< RDD COMMON START >>>***
  690.     InTeGer*4 RRWACT,RCLACT
  691. C    COMMON/RCLACT/RRWACT,RCLACT
  692.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  693.      1  IDOL7,IDOL8
  694. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  695. C     1  IDOL7,IDOL8
  696.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  697. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  698.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  699. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  700. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  701. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  702.     InTeGer*4 KLVL
  703. C    COMMON/KLVL/KLVL
  704.     InTeGer*4 IOLVL,IGOLD
  705. C    COMMON/IOLVL/IOLVL
  706. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  707. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  708.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  709.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  710.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  711. C ***<<< RDD COMMON END >>>***
  712. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  713. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  714. CCC    InTeGer*4 RRWACT,RCLACT
  715. CCC    COMMON/RCLACT/RRWACT,RCLACT
  716. C ***<<< XVXTCD COMMON START >>>***
  717.     CHARACTER*1 OARRY(100)
  718.     InTeGer*4 OSWIT,OCNTR
  719. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  720. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  721.     InTeGer*4 IPS1,IPS2,MODFLG
  722. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  723.        InTeGer*4 XTCFG,IPSET,XTNCNT
  724.        CHARACTER*1 XTNCMD(80)
  725. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  726. C VARY FLAG ITERATION COUNT
  727.     INTEGER KALKIT
  728. C    COMMON/VARYIT/KALKIT
  729.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  730.     InTeGer*4 RCMODE,IRCE1,IRCE2
  731.  
  732. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  733. C     1  IRCE2
  734. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  735. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  736. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  737. C RCFGX ON.
  738. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  739. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  740. C  AND VM INHIBITS. (SETS TO 1).
  741.     INTEGER*4 FH
  742. C FILE HANDLE FOR CONSOLE I/O (RAW)
  743. C    COMMON/CONSFH/FH
  744.     CHARACTER*1 ARGSTR(52,4)
  745. C    COMMON/ARGSTR/ARGSTR
  746.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  747.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  748.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  749.      3  IRCE2,FH,ARGSTR
  750. C ***<<< XVXTCD COMMON END >>>***
  751. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  752. CCC    COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  753. C LOOP CONTROL FOR VARY FUNCTION. SET ZERO IN SPREDSHT AND
  754. C MUST BE SET POSITIVE HERE IF WE NEED ITERATIONS.
  755. C (IMPLEMENT FOR VAX ONLY)
  756. CCC    INTEGER KALKIT
  757. CCC    COMMON/VARYIT/KALKIT
  758. C ARGUMENTS COME IN IN ARGUMENTS IN LINE
  759. C RESULTS GO INTO PERCENT (XAC) AND WHEREVER ELSE DESIRED...
  760. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  761. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  762.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  763.     COMMON/D2R/NRDSP,NCDSP
  764.     CHARACTER*1 FNAMS(6,24)
  765. C FNAMS IS NAME OF FUNCTION CALLED.
  766.     DATA FNAMS /'I','D','A','T','E','0',
  767.      1  'M','T','X','E','Q','0',
  768.      2  'M','O','V','E','V','0',
  769.      3  'M','D','E','T','0','0',
  770.      4  'M','P','R','O','D','0',
  771.      5  'M','A','D','D','V','0','M','S','U','B','V','0',
  772.      7  'M','M','P','Y','T','0','M','M','P','Y','C','0',
  773.      9  'V','A','R','Y','0','0','X','Q','T','C','M','0',
  774.      2  'S','T','R','V','L','0','H','E','R','E','0','0',
  775.      4  'Y','R','M','O','D','0','J','D','A','T','E','0',
  776.      6  'J','T','O','C','H','0','D','A','T','E','0','0',
  777.      1  'W','K','D','Y','S','0','W','K','D','I','N','0',
  778.      2  'F','F','T','F','W','0','F','F','T','R','V','0',
  779.      3  'L','I','N','E','F','0','D','B','0','0','0','0',
  780.      4  'S','T','0','0','0','0'/
  781. C NULL TERMINATE ANY NAMES (ALLOWS 5 CHARACTERS)
  782. C START LOOKING PAST THE *U
  783. C  GET FUNCTION NAME AND GO TO PROCESS EACH FUNCTION SEPARATELY
  784. C GET NONBLANK CHAR FOR FUNCTION NAME START
  785. C NO-OP THE XQTCM FUNCTION FOR PDP11-OVERLAIN VERSIONS BY ZAPPING
  786. C THE NAME SO IT CAN'T EVER BE CALLED.
  787.     K=3
  788. 30    IF(LINE(K).NE.' ')GOTO 40
  789.     K=K+1
  790.     IF(K.LT.60)GOTO 30
  791. 40    CONTINUE
  792. C UNCOMMENT THE DO 100 STMT IF DIM 2 OF FNAMS > 1
  793.     N=1
  794. C **** BE SURE THE 2ND BOUND ON N IS THE SAME AS THE DIMENSION OF
  795. C ****  FNAMS   **************************
  796. C    DO 7771 N=1,24
  797. C    DO 7771 NN=1,6
  798. C    IF(FNAMS(NN,N).EQ.'0')FNAMS(NN,N)=0
  799. C7771    CONTINUE
  800.     DO 100 N=1,24
  801.     KF=N
  802.     DO 110 NN=1,6
  803. C CHECK FOR '0' IN FUNCTION NAME AND SKIP ON THAT... 48 IS ASCII /0/
  804.     IF(LINE(K+NN-1).NE.FNAMS(NN,N).AND.ICHAR(FNAMS(NN,N)).NE.48)
  805.      1  GOTO 100
  806. 110    CONTINUE
  807.     GOTO 200
  808. 100    CONTINUE
  809. C UNRECOGNIZED FUNCTION... IGNORE
  810. 300    RETCD=3
  811.     RETURN
  812. 200    CONTINUE
  813. C NOW HAVE FOUND FUNCTION IDENTIFIED BY KF. CALL IT AND ALLOW TO WORK
  814.     GOTO (1100,1200,1300,1400,1500,1600,1700,1800,
  815.      1  1900,2000,2100,2200,2300,2400,2500,2600,2700,
  816.      2  2900,3000,3100,3200,3300,3400,3500),KF
  817.     GOTO 300
  818. 1100    CONTINUE
  819. C IDATE FUNCTION
  820. C RETURNS MONTH, DAY, YEAR IN AC'S T,U,V
  821. C RETURN 4/1/85 (APRIL FOOLS DAY)
  822. C    IDA=1
  823. C    IMO=4
  824. C    IYR=85
  825. C    CALL IDATE(IMO,IDA,IYR)
  826.     CALL DATE(IYR,IMO,IDA)
  827. C CALL supplied GET-DATE FUNCTION AND HOPE IT'S OK
  828.     TAC=IMO
  829.     UAC=IDA
  830.     IYR=IYR-1900
  831.     VAC=IYR
  832. C RETURN A FLOATING VALUE OF DATE FORM AS YYMMDD SO IT CAN BE
  833. C USED FOR SORTING AND SIMILAR APPLICATIONS. COULD BE USED ALSO
  834. C FOR INTERVALS IF A JULIAN DATE WERE RETURNED, BUT THIS WILL DO
  835. C FOR COMPARISONS AND ORDERING.
  836.     XAC=JULMDY(IYR,IMO,IDA)
  837. C    XAC=VAC*10000.+TAC*100.+UAC
  838.     RETURN
  839. 1200    CONTINUE
  840. C MATRIX EQUATION. NOTE WE MUST NOW START SCAN FOR ARGUMENTS...
  841. C K+5 IS START OF ARG LIST. START AT K+6 TO ALLOW ( TO BE THERE...
  842. C FORMAT DESIRED:
  843. C  *U MTXEQ(A1:A2,X1:X2,B1:B2) GENERATING SOLUTION MATRIX X1:X2
  844. C  FROM MATRICES A,B AND SOLVING EQUATION AX=B WHERE A IS AN N BY
  845. C  N SQUARE MATRIX, AND X AND B ARE N BY M MATRICES.
  846.     RETCD=1
  847. C COLLECT ARGUMENTS. NOTE THAT VARSCN AND GN TRASH POINTERS PASSED
  848. C TO THEM IN IBGN, LEND, SO MAKE UP EVERY TIME. USE VARSCN TO
  849. C COLLECT POINTERS TO THE SHEET ARRAY FIRST OFF COMMAND LINE,
  850. C THEN PROCESS IN OUR MAGICAL MYSTICAL ROUTINE...
  851.     IBGN=K+6
  852.     LEND=IBGN+20
  853. C GET LOCATIONS OF MATRICES A, X, AND B (FOR AX=B EQN)
  854. C A MUST BER N BY N, SQUARE. X,B ARE N BY M.
  855.     CALL PMTX2(RETCD,3,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  856.      1   IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  857.     N=IABS(ID1B-ID1A)+1
  858. C CHECK THAT MATRIX A IS SQUARE
  859.     IF(N.NE.(IABS(ID2B-ID2A)+1))GOTO 300
  860. C CHECK THAT MATRIX X AND B HAVE THE SAME DIMENSIONS
  861.     IF((IDYA-IDXA).NE.(IDCA-IDBA))GOTO 300
  862.     IF((IDYB-IDXB).NE.(IDCB-IDBB))GOTO 300
  863.     M=IABS(IDYA-IDXA)+1
  864. C CHECK THAT THE X AND B MATRIX DIMENSIONS ARE N BY M
  865. C WHERE THE N IS THE SAME AS FOR THE A MATRIX
  866.     NN=IABS(IDYB-IDXB)+1
  867.     IF(NN.NE.N)GOTO 300
  868. C NOW HAVE DIMENSIONS FOR ALL THIS STUFF...
  869. C SINCE MTXEQU TRASHES ITS' B MATRIX, COPY IT INTO X MATRIX
  870. C AND THEN CALL...
  871.     DO 1210 NN=IDBA,IDCA
  872.     DO 1210 MM=IDBB,IDCB
  873.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  874.     CALL XVBLST(NN-IDBA+IDXA,MM-IDBB+IDXB,XVBLS(1,1))
  875. C    XVBLS(NN-IDBA+IDXA,MM-IDBB+IDXB)=XVBLS(NN,MM)
  876. 1210    CONTINUE
  877. C NOW ALL THE ARGUMENTS ARE SET UP... GO DO THE WORK.
  878. C CALL UTILITY ROUTINE, THEN DONE...
  879.     CALL MTXEQU(ID1A,ID2A,IDXA,IDXB,N,M,XAC)
  880.     RETURN
  881. 1300    CONTINUE
  882. C MOVEV  MTX1 MTX2  MOVE MTX1 VALUES TO MTX2
  883.     RETCD=1
  884.     IBGN=K+6
  885.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  886.      1  IR2B,IC2B,KK,KK,KK,KK)
  887. C CHECK FOR SAME SIZE MATRICES
  888.     IF((IC1T-IC1B).NE.(IC2T-IC2B))GOTO 300
  889.     IF((IR1T-IR1B).NE.(IR2T-IR2B))GOTO 300
  890. C DO THE COPY HERE (EASIER THAN CALLING SOMETHING...)
  891.     DO 1301 NN=IR1T,IR1B
  892.     DO 1301 MM=IC1T,IC1B
  893.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  894.     CALL XVBLST(NN-IR1T+IR2T,MM-IC1T+IC2T,XVBLS(1,1))
  895. C    XVBLS(NN-IR1T+IR2T,MM-IC1T+IC2T)=XVBLS(NN,MM)
  896. 1301    CONTINUE
  897.     RETURN
  898. 1400    CONTINUE
  899. C MDET  - DETERMINANT OF SQUARE MATRIX
  900. C  1 ARGUMENT, VIZ., MATRIX COORDS
  901.     RETCD=1
  902. C ACCOUNT FOR "MDET" BEING 4 CHARS NOT 5
  903.     IBGN=K+5
  904.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  905.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  906. C CALL A DETERMINANT ROUTINE TO DO THE WORK
  907. C NOTE IT CHECKS FOR SQUARE MATRIX INTERNALLY AND RETURNS 0 IF NOT
  908. C SQUARE...
  909.     CALL MDET(XVBLS,IR1T,IC1T,IR1B,IC1B,XAC)
  910.     RETURN
  911. 1500    CONTINUE
  912. C MPROD A,B,C  C=A*B MATRIX WISE
  913.     IBGN=K+6
  914.     RETCD=1
  915.     IMXX=3
  916.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  917.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  918. C A=N BY M
  919. C B=M BY L
  920. C C=N BY L
  921.     N=1+ID1B-ID1A
  922.     M=1+ID2B-ID2A
  923. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  924.     L=1+IDYA-IDXA
  925. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  926. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  927. C DIMENSIONS LOOK OK NOW SO DO THE WORK
  928. C USE SLIGHTLY MODIFIED GMPRD
  929.     CALL GMPRD(ID1A,ID2A,IDXA,IDXB,
  930.      1  IDBA,IDBB,N,M,L)
  931.     RETURN
  932. 1600    CONTINUE
  933. C MADDV A,B,C  C=A+B
  934.     IMXX=3
  935.     IBGN=K+6
  936.     RETCD=1
  937.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  938.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  939.     N=1+ID1B-ID1A
  940.     M=1+ID2B-ID2A
  941. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  942. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  943. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  944. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  945. C USE MODIFIED GMADD
  946.     CALL GMADD(ID1A,ID2A,IDXA,IDXB,
  947.      1  IDBA,IDBB,M,N)
  948.     RETURN
  949. 1700    CONTINUE
  950. C MSUBV A,B,C  C=A-B
  951.     IMXX=3
  952.     IBGN=K+6
  953.     RETCD=1
  954.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  955.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  956.     N=1+ID1B-ID1A
  957.     M=1+ID2B-ID2A
  958. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  959. C    IF(N.NE.(1+IDCA-IDBA))GOTO 300
  960. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  961. C    IF(M.NE.(1+IDCB-IDBB))GOTO 300
  962.     CALL GMSUB(ID1A,ID2A,IDXA,IDXB,
  963.      1  IDBA,IDBB,M,N)
  964.     RETURN
  965. 1800    CONTINUE
  966. C MMPYT A,B,C  C=AT*B
  967. C GET 3 MATRICES
  968.     IMXX=3
  969.     IBGN=K+6
  970.     RETCD=1
  971.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  972.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  973. C TRANSPOSE DIMENSIONS OF A...
  974.     M=1+ID1B-ID1A
  975.     N=1+ID2B-ID2A
  976. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  977.     L=1+IDYA-IDXA
  978. C    IF(N.NE.(1+IDCB-IDBB))GOTO 300
  979. C    IF(L.NE.(1+IDCA-IDBA))GOTO 300
  980.     CALL GTPRD(ID1A,ID2A,IDXA,IDXB,
  981.      1  IDBA,IDBB,N,M,L)
  982.     RETURN
  983. 1900    CONTINUE
  984. C MMPYC A,B,K  B=A*K (K=CONSTANT)
  985. C FOR MPY BY CONSTANT WE GET MATRICES IN ORDER A,C, THEN AC WITH CONST
  986. C IN IT LAST...
  987.     IBGN=K+6
  988.     RETCD=1
  989.     IMXX=2
  990.     CALL PMTX2(RETCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  991.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  992.     IF(LINE(IBGN-1).NE.',')GOTO 300
  993.     LEND=IBGN+20
  994.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,IDCA,IDCB,IVALID)
  995.     IF(IVALID.EQ.0)GOTO 300
  996. C NOW HAVE EVERYTHING OF ARGS... CHECK DIMENSIONS OF MATRICES....
  997.     N=1+ID1B-ID1A
  998.     M=1+ID2B-ID2A
  999. C    IF(N.NE.(1+IDYA-IDXA))GOTO 300
  1000. C    IF(M.NE.(1+IDYB-IDXB))GOTO 300
  1001.     CALL XVBLGT(IDCA,IDCB,XXXX)
  1002.     DO 1901 NN=ID1A,ID1B
  1003.     DO 1901 MM=ID2A,ID2B
  1004.     CALL XVBLGT(NN,MM,XVBLS(1,1))
  1005.     XVBLS(1,1)=XVBLS(1,1)*XXXX
  1006.     CALL XVBLST(NN-ID1A+IDXA,MM-ID2A+IDXB,XVBLS(1,1))
  1007. C    XVBLS(NN-ID1A+IDXA,MM-ID2A+IDXB)=XVBLS(NN,MM)
  1008. C     1    *XVBLS(IDCA,IDCB)
  1009. 1901    CONTINUE
  1010.     RETURN
  1011. C *U VARY X,A,W,I,P;Q;R;S;T
  1012. C  REPEATEDLY COMPUTE SHEET FOR I ITERATIONS (DEFAULTS TO 1
  1013. C  IF NONE GIVEN) AND VARY AC P,Q,R,S, T (POSITIONAL...WHATEVER
  1014. C  IS NAMED) UNTIL CONDITION THAT AC X (WHATEVER IS NAMED THERE)
  1015. C  IS MADE EQUAL TO AC A AS CLOSELY AS POSSIBLE. DOES MULTI-DIMENSIONAL
  1016. C  STEPPING SEARCH SAVING AC'S AND MODIFYING. ACTUALLY WILL HANDLE ANY
  1017. C  CELL. UP TO 8 DIMENSIONS PERMITTED (ARBITRARY LIMIT).
  1018. C  NOTE THAT RECALCULATE SPECIAL VARY FLAG WILL BE SET HERE IF
  1019. C  VARYING MORE THAN ONCE...
  1020. C  WILL VARY ONE OF THE AC'S IN THE LIST P,Q,R,S,T... BY INITIAL
  1021. C  FRACTION W (AN ARBITRARY "STEP SIZE" FRACTION) AND COMPUTE THE
  1022. C  GRADIENT OF (X-A) WRT THAT AC, THEN WILL REPLACE ALL AC'S AND
  1023. C  VARY THAT AC BY W * THE GRADIENT, MEANING THAT AS THE GRADIENT
  1024. C  DECREASES, THE VARIANCE DOES ALSO. LAST GRADIENTS ARE SAVED AND
  1025. C  USED AS INITIAL VARIANCES, SO THAT THE W FRACTION IS AN INITIAL
  1026. C  GUESS. HOWEVER IT ALSO IS A LIMIT SO NO STEP VARIES AN AC BY
  1027. C  MORE FRACTIONALLY THAN W.
  1028. C   ONCE THIS IS DONE ANOTHER ONE OF THE P,Q,R,S,T,... LIST IS
  1029. C  CHOSEN CIRCULARLY AND THE PROCESS REPEATS. THIS MAY CONTINUE
  1030. C  INDEFINITELY TO LOOK FOR CONVERGENCE.
  1031. C   NOTE THAT X AND A MAY BE ANY CELL AND NEED NOT BE ACCUMULATORS.
  1032. C  HOWEVER ALL OTHER CELLS TO VARY MUST BE AC'S AND MUST BE THE
  1033. C  INDEPENDENT VARIABLES. CALCULATIONS ELSEWHERE ON THE SHEET
  1034. C  (PERHAPS LATER IN THE SAME CELL...)MUST ESTABLISH DEPENDENT
  1035. C  VARIABLES OR BOUNDARY OR NORMALIZATION CONDITIONS.
  1036. 2000    CONTINUE
  1037.     RETCD=1
  1038. C SPLIT OFF THESE FUNCTIONS INTO A COMMON SUBROUTINE
  1039.     CALL VVARY(LINE,RETCD,K)
  1040.     RETURN
  1041. 2100    CONTINUE
  1042. C EXECUTE COMMAND. FILL IN COMMAND FROM GIVEN FUNCTION AND
  1043. C CALL XQTCMD TO DO IT. SETS UP NECESSARY VARIABLES FIRST.
  1044. C ASSUME THE COMMAND LINE MUST BE ALONE ON LINE AFTER THIS CALL...
  1045.     KK=1
  1046.     KKK=K+6
  1047.     DO 2101 NN=KKK,80
  1048.     XTNCMD(KK)=LINE(NN)
  1049.     IF(ICHAR(XTNCMD(KK)).LE.0)GOTO 2102
  1050.     KK=KK+1
  1051. 2101    CONTINUE
  1052. 2102    CONTINUE
  1053.     XTNCMD(KK+1)=0
  1054.     XTNCMD(KK+2)=0
  1055.     XTNCNT=KK
  1056.     XTCFG=1
  1057.     IPSET=1
  1058.     CALL XQTCMD(ICODE)
  1059.     RETURN
  1060. 2200    CONTINUE
  1061. C RETURN PACKED FORMULA STRING TO EXTRACT UP TO 8 CHARS OF
  1062. C FORMULA.
  1063. C START AT K+6
  1064.     XAC=0.
  1065.     IBGN=K+6
  1066.     IEND=IBGN+20
  1067.     CALL VARSCN(LINE,IBGN,IEND,LSTC,I1,I2,IVLD)
  1068.     IF(IVLD.LE.0)RETURN
  1069. C GET START, LENGTH NOW IN FORMULA...
  1070.     IBGN=LSTC+1
  1071.     IEND=IBGN+20
  1072.     CALL GN(IBGN,IEND,ISTART,LINE)
  1073.     IBGN=INDX(LINE,ICHAR(';'))
  1074. C LOOK FOR ';' CHAR AS START OF 2ND NUMBER
  1075.     IF(IBGN.GT.50.OR.ISTART.LE.0.OR.ISTART.GT.80)RETURN
  1076. C BUMP IBGN PAST THE ; CHAR
  1077.     IBGN=IBGN+1
  1078.     IEND=80
  1079.     CALL GN(IBGN,IEND,ILN,LINE)
  1080.     ILN=MIN0(ILN,8)
  1081.     IF(ILN.LE.0)RETURN
  1082. C READ IN FORMULA INTO WRK ARRAY
  1083. C    IRX=(I2-1)*60+I1
  1084.     CALL REFLEC(I2,I1,IRX)
  1085.     CALL WRKFIL(IRX,WRK2,0)
  1086.     CALL CE2A(WRK2,WRK)
  1087.     KZ=0
  1088.     DO 991 NN=1,ILN
  1089.     K=ICHAR(WRK(ISTART+NN-1))
  1090. C    K=K.AND.127
  1091.     IF(K.EQ.0)KZ=1
  1092.     IF(KZ.EQ.1)K=0
  1093. C STOP THE ENCODE ON SEEING ANY NULLS
  1094.     TMP=K
  1095.     XAC=XAC*128.D0+TMP
  1096. 991    CONTINUE
  1097. C XAC RETURNS WITH ENCODED VALUE.
  1098.     RETURN
  1099. 2300    CONTINUE
  1100. C RETURN PRESENT LOCATION IN THE MATRIX.
  1101.     TAC=PROW
  1102.     UAC=PCOL
  1103.     XAC=(PCOL-1)*60+PROW
  1104.     VAC=4*FORMFG+2*RCFGX+RCONE
  1105. C    VAC=(DROW-1)*20+DCOL
  1106. C RESULT IN % IS PHYS SHEET HASHCODE
  1107. C RESULT IN V ACCUMULATOR IS DISPLAY SHEET LOC HASHCODE
  1108. C T AND U ACCUMULATORS GET PHYS COL, ROW OFFSET.
  1109.     WAC=RRWACT
  1110.     YAC=RCLACT
  1111. C W AND Y GET LIMITS CURRENTLY USED
  1112.     RETURN
  1113. 2400    CONTINUE
  1114. C YRMOD
  1115.     RETCD=1
  1116.     IBGN=K+6
  1117.     LEND=IBGN+20
  1118.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1119.     IF(IVALID.EQ.0)GOTO 9300
  1120.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1121.     IBGN=LSTCHR+1
  1122.     LEND=IBGN+20
  1123.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1124.     IF(IVALID.EQ.0)GOTO 9300
  1125.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1126.     IBGN=LSTCHR+1
  1127.     LEND=IBGN+20
  1128.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  1129.     IF(IVALID.EQ.0)GOTO 9300
  1130. C
  1131. C V1, V2, V3 ARE YR, MONTH, DAY FOR RETURN OF JULIAN DATE
  1132. C
  1133.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  1134.     IYR=XVBLS(1,1)
  1135.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  1136.     IMO=XVBLS(1,1)
  1137.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  1138.     IDA=XVBLS(1,1)
  1139. C RETURN JULIAN DATE FROM Y, M, D GIVEN
  1140.     XAC=JULMDY(IYR,IMO,IDA)
  1141.     RETURN
  1142. 2500    CONTINUE
  1143. C JDATE
  1144.     RETCD=1
  1145.     IBGN=K+6
  1146.     LEND=IBGN+20
  1147. C GET V1 WHICH HAS VARIABLE WITH THE STRING IN IT
  1148.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1149.     IF(IVALID.EQ.0)GOTO 9300
  1150. C RETURN JULIAN DATE NOW AFTER FETCHING FORMULA.
  1151. C    IRX=(ID2A-1)*60+ID1A
  1152.     CALL REFLEC(ID2A,ID1A,IRX)
  1153.     CALL WRKFIL(IRX,WRK,0)
  1154.     XAC=JULIAN(WRK)
  1155.     RETURN
  1156. 2600    CONTINUE
  1157. C JTOCH
  1158.     RETCD=1
  1159.     IBGN=K+6
  1160.     LEND=IBGN+20
  1161. C V1 = JULIAN DATE
  1162. C V2 IS WHERE TO STORE ASCII DATE STRING AS FORMULA.
  1163.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1164.     IF(IVALID.EQ.0)GOTO 9300
  1165.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1166.     IBGN=LSTCHR+1
  1167.     LEND=IBGN+20
  1168.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1169.     IF(IVALID.EQ.0)GOTO 9300
  1170.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  1171.     IJUL=XVBLS(1,1)
  1172. C    IRX=(ID2B-1)*60+ID1B
  1173.     CALL REFLEC(ID2B,ID1B,IRX)
  1174.     CALL WRKFIL(IRX,WRK,0)
  1175.     DO 2502 N=1,110
  1176. 2502    WRK(N)=0
  1177.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  1178.     CALL WRKFIL(IRX,WRK,1)
  1179. C WRITE THE FORMULA BACK OUT
  1180.     TAC=IMO
  1181.     UAC=IDA
  1182.     VAC=IYR
  1183. C RETURN T,U,V AS M,D,Y ALSO
  1184.     RETURN
  1185. 2700    CONTINUE
  1186. C DATE
  1187.     RETCD=1
  1188.     IBGN=K+5
  1189.     LEND=IBGN+20
  1190.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1191.     IF(IVALID.EQ.0)GOTO 9300
  1192.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1193.     IBGN=LSTCHR+1
  1194.     LEND=IBGN+20
  1195.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1196.     IF(IVALID.EQ.0)GOTO 9300
  1197.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1198.     IBGN=LSTCHR+1
  1199.     LEND=IBGN+20
  1200.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1C,ID2C,IVALID)
  1201.     IF(IVALID.EQ.0)GOTO 9300
  1202.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1203.     IBGN=LSTCHR+1
  1204.     LEND=IBGN+20
  1205.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1D,ID2D,IVALID)
  1206.     IF(IVALID.EQ.0)GOTO 9300
  1207.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  1208.     IYR=XVBLS(1,1)
  1209.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  1210.     IMO=XVBLS(1,1)
  1211.     CALL XVBLGT(ID1C,ID2C,XVBLS(1,1))
  1212.     IDA=XVBLS(1,1)
  1213. C    IRX=(ID2D-1)*60+ID1D
  1214.     CALL REFLEC(ID2D,ID1D,IRX)
  1215.     CALL WRKFIL(IRX,WRK,0)
  1216.     DO 2702 N=1,110
  1217. 2702    WRK(N)=0
  1218.     IJUL=JULMDY(IYR,IMO,IDA)
  1219.     CALL JULASC(IJUL,WRK,IYR,IMO,IDA)
  1220.     CALL WRKFIL(IRX,WRK,1)
  1221.     GOTO 9300
  1222. 2900    CONTINUE
  1223.     RETCD=1
  1224. C WKDYS - GIVE WEEKDAYS (M-F) BETWEEN 2 JULIAN DATES THAT MUST
  1225. C BE IN CELLS.
  1226.     IBGN=K+6
  1227.     LEND=IBGN+20
  1228.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1229.     IF(IVALID.EQ.0)GOTO 9300
  1230.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1231.     IBGN=LSTCHR+1
  1232.     LEND=IBGN+20
  1233.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1234.     IF(IVALID.EQ.0)GOTO 9300
  1235.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  1236.     IYR=XVBLS(1,1)
  1237.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  1238.     IMO=XVBLS(1,1)
  1239. C IYR HOLDS START JULIAN DATE, IMO HOLDS END ONE
  1240.     CALL WKDY(IYR,IMO,IDA)
  1241. C IDA = NUMBER WORK DAYS BETWEEN THE DATES
  1242.     XAC=IDA
  1243. C RETURN DAYS
  1244.     GOTO 9300
  1245. 3000    CONTINUE
  1246.     RETCD=1
  1247. C WKDIN - GIVEN A JULIAN DATE AND A NUMBER WORKDAYS, RETURN THE
  1248. C ENDING JULIAN DATE AFTER THAT NUMBER JULIAN DAYS.
  1249.     IBGN=K+6
  1250.     LEND=IBGN+20
  1251.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1252.     IF(IVALID.EQ.0)GOTO 9300
  1253.     IF(LINE(LSTCHR).NE.',')GOTO 9300
  1254.     IBGN=LSTCHR+1
  1255.     LEND=IBGN+20
  1256.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1257.     IF(IVALID.EQ.0)GOTO 9300
  1258.     CALL XVBLGT(ID1A,ID2A,XVBLS(1,1))
  1259.     IYR=XVBLS(1,1)
  1260.     CALL XVBLGT(ID1B,ID2B,XVBLS(1,1))
  1261.     IMO=XVBLS(1,1)
  1262. C IYR = START DATE, JULIAN. IMO = NUMBER DAYS. RETURN END DATE JULIAN.
  1263.     CALL WRKINT(IYR,IMO,IDA)
  1264. C IDA = RETURN JULIAN DATE
  1265.     XAC=IDA
  1266.     GOTO 9300
  1267. 3100    CONTINUE
  1268. C FFTFW
  1269.     ISI=1
  1270.     GOTO 3210
  1271. 3200    CONTINUE
  1272. C FFTRV
  1273.     ISI=-1
  1274. 3210    CONTINUE
  1275.     RETCD=1
  1276. C MERGED FFT CODE
  1277. C *U FFTFW V1:V2 DOES FFT OF RANGE GIVEN (1-DIM)
  1278. C DITTO FFTRV BUT ONE IS REVERSE AND ONE IS FORWARD FFT
  1279. C REAL*8 FFT ROUTINE USED.
  1280.     IBGN=K+6
  1281.     CALL PMTX2(RETCD,1,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,
  1282.      1  IV,IV,IV,IV,IV,IV,IV,IV)
  1283.     IC=0
  1284.     IR=1
  1285.     IF(IR1T.EQ.IR1B)GOTO 3220
  1286.     IC=1
  1287.     IR=0
  1288. 3220    CONTINUE
  1289.     KK=IABS(IR1T-IR1B)+1
  1290.     KKK=IABS(IC1T-IC1B)+1
  1291.     IV=MAX0(KK,KKK)
  1292. C IV = NO. POINTS.
  1293.     CALL FOUREA(IR1T,IC1T,IC,IR,IV,ISI)
  1294. C THAT'S ALL FOR FFT. REPLACES CELLS IN PLACE...
  1295.     GOTO 9300
  1296. 3300    CONTINUE
  1297. C LINEF
  1298. C *U LINEF VY1:VY2[,VX1:VX2]
  1299. C WHERE X COORDS CAN BE SKIPPED...
  1300.     IBGN=K+6
  1301.     RETCD=1
  1302. C JUST GET 2 MATRICES' VALUES. IF RETCD=3 ON RETURN, 2ND MATRIX MUST HAVE
  1303. C BEEN MISSING SO FLAG IT THAT WAY.
  1304.     CALL PMTX2(RETCD,2,LINE,IBGN,IR1T,IC1T,IR1B,IC1B,IR2T,IC2T,
  1305.      1  IR2B,IC2B,KK,KK,KK,KK)
  1306.     IF(RETCD.NE.1)IR2T=-1
  1307.     RETCD=1
  1308.     KK=IABS(IR1T-IR1B)+1
  1309.     KKK=IABS(IC1T-IC1B)+1
  1310.     IV=MAX0(KK,KKK)
  1311.     KK=0
  1312.     IF(IR1T.EQ.IR1B)GOTO 3320
  1313.     KK=1
  1314. 3320    CONTINUE
  1315.     CALL LINFIT(IR2T,IC2T,KK,IR1T,IC1T,IV,TAC,UAC,XAC,WAC)
  1316. C RETURN A VALUE IN T, B VALUE IN U, AND DEL VALUE IN %.
  1317. C FOR Y = A + BX
  1318. C W AC RETURNS CORRELATION COEFFICIENT.
  1319.     GOTO 9300
  1320. 3400    CONTINUE
  1321. C *U DBxxxx FUNCTIONS PARSED EXTERNALLY
  1322. C (SAVES MUCH SPACE AND EASES MODIFICATION...)
  1323.     RETCD=1
  1324.     CALL DTRFCT(LINE(K+2),RETCD)
  1325.     GOTO 9300
  1326. 3500    CONTINUE
  1327. C *U STxxxx FUNCTIONS
  1328.     RETCD=1
  1329. C K SHOULD BE SUBSCRIPT OF THE 'S' OF "ST" SO SKIP BY THE
  1330. C "ST" PART AND JUST PASS THE REST OF THE FUNCTION NAME AT THE
  1331. C START OF THE STRING...
  1332.     CALL SCIFCT(LINE(K+2),RETCD)
  1333. C HANDLE ALL *U STXXXX FUNCTIONS IN SEPARATE ROUTINE FOR EASE OF
  1334. C MOVING IT AROUND. (MIGHT EVEN GO BACK TO PDP11!)
  1335. C    GOTO 9300
  1336. 9300    RETURN
  1337.     END
  1338. c -h- scifct.fam
  1339. C SCIENTIFIC FUNCTION CALLER
  1340. C This version is a dummy placeholder.
  1341. C The SCIFCT subroutine exists to allow AnalytiCalc to call just
  1342. C about *ANY* Fortran callable routine.
  1343. C   The operation is to use a formula in AnalytiCalc which includes
  1344. c a call of form:
  1345. c  *U STxxxxxx range;range;range;range;range;...;range>outrange;outrange;outrange
  1346. c so that the "xxxxxx" part is the function name to be called.
  1347. c  input ranges are the parts of the sheet for input to the function; these
  1348. c are internally copied to a large array (defined here) which is a normal
  1349. c Fortran array. They are converted to integer*4 as needed if the function
  1350. c being called needs this. Once all conversion is done, the subroutine is
  1351. c called using an argument list built up by this call list. At the end,
  1352. c the output ranges are filled in from the internal Fortran array.
  1353. c   Because Fortran callable subroutines (e.g. those in the SSP) may pass
  1354. c their return arguments in ANY of their arguments, seeing a ; will increment
  1355. c the output range counter.
  1356. c
  1357. c To add more:
  1358. c  * Select desired sizes for work area (must be big enough to hold ALL
  1359. c  arguments used), max number of arguments per function, etc.
  1360. c  * Add new function name and characteristics to tables. Note that the
  1361. c  name, integer/float stuff for all args, which arg is first OUTPUT arg,
  1362. c  and map of output args, all are needed. Don't make first output arg
  1363. c  bigger than the max. number of args.
  1364. c  * Add another call and element in the computed GOTO for each function
  1365. c  desired.
  1366. c  * Build and enjoy.
  1367. c
  1368. c   Internally we need tables of
  1369. c      * Function names (up to 6 characters long per classical Fortran rules)
  1370. c      * Number of arguments needed per function
  1371. c      * Integer/real flags for arguments' data types
  1372. c      * First output argument number (user convenience and less error
  1373. c           prone than having to have a bunch of ;;;;'s to force the
  1374. c           outputrange to come from the right area
  1375. c      * Length of the Fortran array used for each input argument
  1376. c Note: Provision is made for "scratch array" arguments, but is a bit
  1377. c  crude. However, if extra space is needed, user can specify a larger
  1378. c  input area and the larger chunk of scratch space will be present.
  1379. c  Unused argument areas will generally be zeroed on each call.
  1380. c   It is perfectly reasonable to have input-only functions (e.g. plots)
  1381. c   or several subroutines called in sequence for a function.
  1382. c
  1383.     SUBROUTINE SCIFCT(LINE,RETCD)
  1384.     Integer BigSpc
  1385.     Parameter (BigSpc=256)
  1386.     Parameter (MaxArgs=10)
  1387.     Parameter (NFCT=3)
  1388. c NFCT is number of functions included in the list. Update the parameter
  1389. c and the tables together (please!)
  1390.     INTEGER RETCD
  1391.     Character*1 LINE(80)
  1392.     Real*8 ArgAry(BigSpc)
  1393.     INTEGER*4 IARGAR(2,BIGSPC)
  1394.     EQUIVALENCE(IARGAR(1,1),ARGARY(1))
  1395.     Integer*4 ArgCtr,IntPar
  1396.     Integer*4 ArgPtr(MaxArgs)
  1397.     Integer*4 NARGin(NFct)
  1398. c nargin is number input args needed.
  1399.     Integer*4 OutArg(MaxArgs,NFct)
  1400.     Integer*4 OutBgn(NFct)
  1401. c OutArg is 0 for no output, 1 for output area
  1402.     Integer*4 RevStr(MaxArgs,NFct)
  1403. c RevStr will be nonzero to reverse storage of arrays
  1404. c from normal row-first to column-first order.
  1405.     Integer*4 IsReal(MaxArgs,NFCT)
  1406. c
  1407. C Since there are some subs that need dummy argument scratch
  1408. c areas, encode IsReal as follows:
  1409. c  0 = Real
  1410. c  -1 = Integer
  1411. c  +nn = Use argument nn's VALUE (after grabbing it) for
  1412. c        size of area to allocate. Always allocate floats
  1413. c        since they're longer.
  1414. c
  1415. c Note: Due to the way the program allocates scratch array, the
  1416. c  arguments with size info for dummy arrays must be present
  1417. c  ahead of the scratch space arguments.
  1418. c
  1419. C Argument coordinate lists
  1420.     Integer*4 InCord(4,MaxArgs)
  1421.     Integer*4 InType(MaxArgs)
  1422.     Integer*4 OutCor(4,MaxArgs)
  1423.     REAL*8 R8WRK,R8WRK2
  1424.     INTEGER*4 I4WRK,I4WRK2
  1425.     Integer*4 OutTyp(MaxArgs)
  1426. c
  1427.     Character*6 WrkFnm
  1428.     Character*1 WFNm(6)
  1429.     Equivalence(WFNm(1),WrkFnm)
  1430.     Integer*4 IniOut(NFCT)
  1431.     Integer*4 AryPtr
  1432.     Character*6 FName(NFCT)
  1433.     Character*1 FNameB(6,NFCT)
  1434.     Equivalence(Fname(1),FNameB(1,1))
  1435. c allows access of function names by byte, but data stmts to set up
  1436. c as full names...
  1437. c    This example has only 2 functions:
  1438. c  *U STDLLSQ   and
  1439. c  *U STCHISQ
  1440. c        from the Scientific Subroutine Package library...
  1441.     Data FnameB/
  1442.      1  'D','L','L','S','Q',0,
  1443.      2  'C','H','I','S','Q',0,
  1444.      3  'V','E','C','N','O','R' /
  1445.     DATA IsReal/
  1446.      1  0,0,-1,-1,-1,0,5,0,-1,0,
  1447.      2  0,-1,-1,0,-1,-1,2,3,0,0,
  1448.      3  0,-1,0,0,0,0,0,0,0,0  /
  1449.     DATA OutBgn/
  1450.      1  6,4,3 /
  1451.     DATA OutArg/
  1452.      1  0,0,0,0,0,1,0,0,1,1,
  1453.      2  0,0,0,1,1,1,0,0,0,0,
  1454.      3  0,0,1,0,0,0,0,0,0,0 /
  1455. c Note OutArg is just which output arguments are really
  1456. c output data. 1 means they are, 0 means they're not.
  1457. c
  1458. C NARGIN is min number input arguments that must be present.
  1459.     Data NARGin/10,8,3/
  1460.     Data RevStr/
  1461.      1  0,0,0,0,0,0,0,0,0,0,
  1462.      2  0,0,0,0,0,0,0,0,0,0,
  1463.      3  0,0,0,0,0,0,0,0,0,0/
  1464. C
  1465. C FIRST, before we spend a lot of effort grabbing arguments, make
  1466. c  sure we know about the function to be called. If we don't, just
  1467. c  return an error.
  1468.     KK=0
  1469.     DO 101 N=1,NFCT
  1470.     DO 110 NN=1,6
  1471.     IF(Ichar(FNAMEB(NN,N)).LE.0)GOTO 110
  1472.     IF(LINE(NN).NE.FNAMEB(NN,N)) GOTO 112
  1473. 110    CONTINUE
  1474. C WE FELL THRU AND FOUND THE NAME. SAVE ITS' INDEX.
  1475.     KK=N
  1476. 112    CONTINUE
  1477. 101    CONTINUE
  1478.     IF(KK.GT.0)GOTO 115
  1479. 114    RETCD=3
  1480.     RETURN
  1481. 115    CONTINUE
  1482.     NFUNCT=KK
  1483. c A little setup...
  1484.     ArgCtr=1
  1485.     IntPar=1
  1486. c integer "parity", used to pack integer args in work array
  1487.     Aryptr=1
  1488.     Do 1 n=1,MaxArgs
  1489.     Argptr(n)=1
  1490.     Do 11 nn=1,4
  1491.     InCord(nn,n)=0
  1492.     OutCor(nn,n)=0
  1493. 11    Continue
  1494. 1    CONTINUE
  1495.     DO 2 N=1,BigSpc
  1496.     ArgAry(N)=0.0D0
  1497. 2    Continue
  1498. C arrange for all uninitialized numbers to contain zeroes
  1499.     RETCD=1
  1500. C HANDLE *U STXXXX FUNCTIONS. LINE ARRAY PASSED IN HERE
  1501. C STARTS AFTER THE "ST" SO WE CAN DECODE IT.
  1502. c if we can't get the function, return RETCD=3...
  1503. c
  1504. c Now grab the arguments and store them in InCord, Intype, OutCor, OutTyp
  1505.     K=INDXQ(LINE,32)
  1506. C FIND STUFF AFTER SPACE
  1507.     K=K+1
  1508.     NArg=1
  1509.     IBGN=1
  1510. 100    Continue
  1511.     LEND=IBGN+20
  1512. C GET LOC OF MATRIX A (MUST BE SQUARE)
  1513.     ID1B=0
  1514.     ID2B=0
  1515.     ID1A=0
  1516.     ID2A=0
  1517.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1518.     IF(IVALID.EQ.0)GOTO 300
  1519.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1000
  1520.     IBGN=LSTCHR+1
  1521.     LEND=IBGN+20
  1522.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1523.     IF(IVALID.EQ.0)GOTO 300
  1524. 1000    CONTINUE
  1525. C GMTX GETS ARGS FOR ONE RANGE
  1526.     InCord(1,NArg)=ID1A
  1527.     InCord(2,NArg)=ID2A
  1528.     INCord(3,NARG)=ID1B
  1529.     INCORD(4,NARG)=ID2B
  1530.     IBGN=LSTCHR+1
  1531.     NARG=NARG+1
  1532.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 100
  1533. C
  1534. 300    CONTINUE
  1535. C NOW HAVE ALL ARGS FOR INPUT COLLECTED
  1536.     INARGS=NARG
  1537.     If(INargs.lt.NARGin(NFunct)) GOTO 114
  1538. c Flag error if not enough input args presented.
  1539.     K=INDXQ(LINE,62)
  1540. C FIND STUFF AFTER > CHARACTER
  1541.     IF(K.EQ.0.OR.K.GT.70)GOTO 500
  1542. C MUST HAVE A > OR no outputs are present.
  1543. C This is perfectly legal; outputs like graphs or auxiliary
  1544. C files (unknown to rest of program) are possible too.
  1545.     K=K+1
  1546.     NArg=1
  1547.     IBGN=1
  1548. 400    Continue
  1549.     LEND=IBGN+20
  1550. C GET LOC OF MATRIX A (MUST BE SQUARE)
  1551.     ID1B=0
  1552.     ID2B=0
  1553.     ID1A=0
  1554.     ID2A=0
  1555. C TEST FOR NULL ARGUMENT (;; PAIR)
  1556.     IF(LINE(K+IBGN-1).EQ.';')GOTO 450
  1557.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  1558.     IF(IVALID.EQ.0)GOTO 500
  1559.     IF(LINE(K+LSTCHR-1).NE.':')GOTO 1500
  1560.     IBGN=LSTCHR+1
  1561.     LEND=IBGN+20
  1562.     CALL VARSCN(LINE(K),IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  1563.     IF(IVALID.EQ.0)GOTO 500
  1564. 1500    CONTINUE
  1565.     IBGN=LSTCHR+1
  1566.     GOTO 455
  1567. 450    CONTINUE
  1568.     IBGN=IBGN+1
  1569.     LSTCHR=IBGN
  1570. C PASS ;
  1571. 455    CONTINUE
  1572. C GMTX GETS ARGS FOR ONE RANGE
  1573.     OUTCor(1,NArg)=ID1A
  1574.     OUTCor(2,NArg)=ID2A
  1575.     OUTCor(3,NARG)=ID1B
  1576.     OUTCor(4,NARG)=ID2B
  1577.     NARG=NARG+1
  1578.     IF(LINE(K+LSTCHR-1).EQ.';')GOTO 400
  1579. C    GOTO 500
  1580. C
  1581. 500    CONTINUE
  1582. C NOW HAVE OUTPUT ARGUMENT LIST COLLECTED
  1583. C BEGIN COLLECTING DATA
  1584.     NARG=1
  1585.     IntPar=1
  1586. 2000    CONTINUE
  1587.     IACNTR=ARGCTR
  1588. C  GET INPUT DATA INTO OUR BIG ARRAY
  1589.     IF(INCORD(1,NARG).LE.0)GOTO 3000
  1590.     ARGPTR(NARG)=ARGCTR
  1591.     IF(INCORD(3,NARG).NE.0)GOTO 2011
  1592. C SINGLE ARGUMENT; GRAB IT
  1593.     nn=incord(1,narg)
  1594.     mm=incord(2,narg)
  1595.     call typget(nn,mm,itype)
  1596.     If(Itype.ne.4) then
  1597.       CALL XVBLGT(NN,MM,R8WRK)
  1598.     Else
  1599.       Call JVBLGT(NN,MM,I4wrk)
  1600.       R8WRK=I4WRK
  1601.     End If
  1602. c    CALL XVBLGT(INCORD(1,NARG),INCORD(2,NARG),R8WRK)
  1603.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  1604.       INTPAR=1
  1605.       I4WRK=R8WRK
  1606.       IARGAR(IntPar,ARGCTR)=I4WRK
  1607.     ELSE
  1608.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1609.       IntPar=1
  1610. C if we last packed the second word of an integer, bump to next
  1611.       ARGARY(ARGCTR)=R8WRK
  1612.     END IF
  1613.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1614.     NARG=NARG+1
  1615.     GOTO 2000
  1616. 2011    CONTINUE
  1617. C 2-D AREA
  1618.     IntPar=1
  1619.     DO 2020 LNN=INCORD(1,NARG),INCORD(3,NARG)
  1620.     DO 2020 LMM=INCORD(2,NARG),INCORD(4,NARG)
  1621.     NN=LNN
  1622.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  1623.     MM=LMM
  1624.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  1625.     call typget(nn,mm,itype)
  1626.     If(Itype.ne.4) then
  1627.       CALL XVBLGT(NN,MM,R8WRK)
  1628.     Else
  1629.       Call JVBLGT(NN,MM,I4wrk)
  1630.       R8WRK=I4WRK
  1631.     End If
  1632.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  1633.       I4WRK=R8WRK
  1634.       IARGAR(IntPar,ARGCTR)=I4WRK
  1635.       IntPar=3-IntPar
  1636. c if IntPar is 1 make it 2; if it's 2, make it 1
  1637.     ELSE
  1638.       If(IntPar.ne.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1639.       IntPar=1
  1640. C if we last packed the second word of an integer, bump to next
  1641.       ARGARY(ARGCTR)=R8WRK
  1642.     END IF
  1643.     If(IntPar.eq.1)ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1644. 2020    CONTINUE
  1645.     NARG=NARG+1
  1646.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1647.     IntPar=1
  1648. C
  1649. C FIX UP DUMMY ARGUMENTS
  1650. C
  1651.     IF(ISREAL(NARG,NFUNCT).GT.0.AND.ISREAL(NARG,NFUNCT)
  1652.      1  .LE.MAXARGS) THEN
  1653. c If user allocated more space than the dummy calc, use bigger
  1654. c allocation. However, add a little more and check for array
  1655. c overflow.
  1656.       ARGCTR=MAX0(ARGCTR,IACNTR+IARGAR(1,ISREAL(NARG,NFUNCT)))
  1657.       ARGCTR=ARGCTR+30
  1658.       ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1659. C ADD A LITTLE FOR GOOD LUCK
  1660.     END IF
  1661.     GOTO 2000
  1662. 3000    CONTINUE
  1663. C NOW SHOULD BE READY TO CALL THIS STUFF...
  1664. C GENERATE CALLS LIKE THE TEMPLATES BELOW. NO NEED TO MODIFY
  1665. C THE FUNCTIONS, BUT WE DO NEED TO MESS WITH THIS STUFF BECAUSE
  1666. C I DON'T KNOW OFFHAND HOW TO DO A DYNAMIC CALLING LIST IN FORTRAN
  1667. C THAT'LL WORK ON STACK IMPLEMENTATIONS.
  1668. c
  1669. c Add more numbers to the list here to get more function calls.
  1670. c
  1671.     GOTO (4001,4002,4003),NFUNCT
  1672.     RETCD=3
  1673.     RETURN
  1674. c *************** BEGINNING OF CALLS ****************
  1675. 4001    CONTINUE
  1676. C DLLSQ FUNCTION.... 10 ARGS
  1677.     CALL DLLSQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  1678.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  1679.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)),
  1680.      3  ARGARY(ARGPTR(9)),ARGARY(ARGPTR(10)))
  1681.     GOTO 5000
  1682. 4002    CONTINUE
  1683. C CHISQ FUNCTION.... 8 ARGS
  1684.     CALL CHISQ(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  1685.      1  ARGARY(ARGPTR(3)),ARGARY(ARGPTR(4)),ARGARY(ARGPTR(5)),
  1686.      2  ARGARY(ARGPTR(6)),ARGARY(ARGPTR(7)),ARGARY(ARGPTR(8)))
  1687.     GOTO 5000
  1688. 4003    CONTINUE
  1689. C Vector Norm function
  1690.     CALL VECNOR(ARGARY(ARGPTR(1)),ARGARY(ARGPTR(2)),
  1691.      1  ARGARY(ARGPTR(3)))
  1692. C Use this for debugging too...
  1693. c
  1694. c insert more function calls here... they all look alike except for
  1695. c function name.
  1696. c
  1697. c  It's also completely permissible to call several Fortran subroutines
  1698. c  in sequence here if it makes sense; it's up to the user. This code
  1699. c  just gives a way to call unmodified Fortran callable code and have
  1700. c  it make sense in the AnalytiCalc context. ANY Fortran callable code
  1701. c  is OK.
  1702. c
  1703. c *****************end of calls *****************
  1704. c
  1705. 5000    CONTINUE
  1706. C NOW GET ARGUMENTS BACK TO DUMP TO SHEET
  1707.     KARG=0
  1708.     DO 5100 NARG=OUTBGN(NFUNCT),MAXARGS
  1709.     KARG=KARG+1
  1710.     IF(OUTARG(NARG,NFUNCT).LE.0)GOTO 5100
  1711.     IF(OUTCOR(1,KARG).EQ.0)GOTO 5100
  1712. C +++
  1713.     ARGCTR=ARGPTR(NARG)
  1714.     IF(OUTCOR(3,KARG).NE.0)GOTO 6014
  1715. C SINGLE ARGUMENT; GRAB IT
  1716.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  1717.       I4WRK=IARGAR(1,ARGCTR)
  1718.       R8WRK=I4WRK
  1719.     ELSE
  1720.       R8WRK=ARGARY(ARGCTR)
  1721.     END IF
  1722.     nn=outcor(1,karg)
  1723.     mm=outcor(2,karg)
  1724.     Call typget(nn,mm,itype)
  1725.     If (Itype.ne.4) then
  1726.       CALL XVBLST(NN,MM,R8WRK)
  1727.     Else
  1728.       I4WRK=R8WRK
  1729.       CALL JVBLST(nn,mm,I4WRK)
  1730.     End If
  1731.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1732.     GOTO 5100
  1733. 6014    CONTINUE
  1734. C 2-D AREA
  1735.     DO 6020 LNN=OUTCOR(1,KARG),OUTCOR(3,KARG)
  1736.     DO 6020 LMM=OUTCOR(2,KARG),OUTCOR(4,KARG)
  1737.     NN=LNN
  1738.     IF(REVSTR(NARG,NFUNCT).NE.0)NN=LMM
  1739.     MM=LMM
  1740.     IF(REVSTR(NARG,NFUNCT).NE.0)MM=LNN
  1741.     IF(ISREAL(NARG,NFUNCT).LT.0) THEN
  1742.       I4WRK=IARGAR(1,ARGCTR)
  1743.       R8WRK=I4WRK
  1744.     ELSE
  1745.       R8WRK=ARGARY(ARGCTR)
  1746.     END IF
  1747.     Call typget(nn,mm,itype)
  1748.     If (Itype.ne.4) then
  1749.       CALL XVBLST(NN,MM,R8WRK)
  1750.     Else
  1751.       I4WRK=R8WRK
  1752.       CALL JVBLST(nn,mm,I4WRK)
  1753.     End If
  1754. c    CALL XVBLST(NN,MM,R8WRK)
  1755.     ARGCTR=MIN0(ARGCTR+1,BigSpc)
  1756. 6020    CONTINUE
  1757. C +++
  1758. 5100    CONTINUE
  1759. C AT LAST, DONE
  1760.     RETURN
  1761.     END
  1762.     Subroutine VecNor(InRng,NVEC,Val)
  1763. C test subroutine
  1764. c Computes norm of input range, where NVEC is number of
  1765. c elements in the INRNG array.
  1766.     REAL*8 InRng
  1767.     Dimension InRng(1)
  1768.     Integer*4 NVEC
  1769.     Real*8 Val,X
  1770. C    VAL=0.0d0
  1771.     If(NVEC.LE.0)val=-1.0
  1772.     If(NVEC.LE.0)return
  1773. c return -1 if bad dimensions.
  1774.     X=0.0D0
  1775.     Do 1 n=1,nvec
  1776.     x=x+InRng(n)*InRng(n)
  1777. 1    Continue
  1778.     x=dsqrt(x)
  1779.     Val=X
  1780.     Return
  1781.     End
  1782. c -h- JunkDum.for
  1783. c completely dummy versions of dllsq and chisq
  1784. C REMOVE these if you want to use the real ones (from
  1785. c the SSP library)
  1786.     Subroutine DLLSQ(A,B,C,D,E,F,G,H,I,J)
  1787.     RETURN
  1788.     END
  1789.     SUBROUTINE CHISQ(A,B,C,D,E,F,G,H)
  1790.     RETURN
  1791.     END
  1792. c -h- uvtgen.for    Fri Aug 22 13:36:30 1986    
  1793. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  1794. C ALL RIGHTS RESERVED
  1795. C
  1796. C    VT100 VIDEO DISPLAY COMMAND PROGRAM. CALLING SEQUENCE IS
  1797. C    CALL UVT100(CMD,N1,N2THE MANDS IN
  1798. C    THE PARAMETER LIST BELOW, AND N1 AND N2 ARE OPTIONAL PARAMETERS
  1799. C    DEPENDING UPON CMD. SEE THE UVT100 USER'S MANUAL FOR MORE DETAILS.
  1800. C
  1801. C
  1802. C BLACK AND WHITE SCREEN MODULE FOR ANSI TERMINALS
  1803. C ALSO COLOR SCREEN MODULE.
  1804. C COMMANDS 20 AND 21 SWITCH: 20 SETS B+W, 21 SETS COLOR MODE
  1805. C
  1806. C THIS VERSION MODIFIED FOR USE WITH PORTACALC.
  1807. C  ENTRIES NOT USED ARE DELETED, AND ALSO CODE ADDED TO SUPPORT COLOR
  1808. C  CRT'S THAT ARE BASICALLY VT100-LIKE WITH EXTENSIONS, OR VT100'S OR
  1809. C  EMULATORS WITH AVO OPTION.
  1810. C
  1811. C  OPERATION:
  1812. C    ON B+W VT100'S (WITH ADVANCED VIDEO), THE SET GRAPHICS CODES
  1813. C WILL BE USED AS FOLLOWS:
  1814. C  ALTERNATE ROWS WILL BE DISPLAYED IN BOLD
  1815. C  (ROW 3 TO 22 ONLY HOWEVER; THE REST IS NOT MATH AREA)
  1816. C COMMAND AND DISPLAY ROWS (23 AND 24 NORMALLY) WILL BE BOLDED ALWAYS.
  1817. C
  1818. C  IN COLOR MODE:
  1819. C    ON ED, SET BACKGROUND COLOR TO DARK BLUE
  1820. C    ALTERNATE ROWS WILL BE SET TO YELLOW OR GREEN
  1821. C  COLUMN LABEL ROW, LABEL ROW, AND ROW LABELS, AND COMMAND PROMPTS,
  1822. C  IN A DIFFERENT COLOR FOR EACH. DETERMINED AND SET AT TIME OF
  1823. C  CALL TO CURSOR POSITION.
  1824. C
  1825. C    AUTHOR:    GLENN EVERHART
  1826. C
  1827.       SUBROUTINE UVT100 ( CMD, N1, N2 )
  1828.       IMPLICIT INTEGER ( A - Z )
  1829.       DIMENSION PRL ( 6 )
  1830. C NOTE WE DECLARE THESE VARIABLES USED IN PORTACALC. THEY ARE ALL IN
  1831. C COMMONS, SO WE ADD NOTHING TO LENGTH OF THIS PROGRAM BY ADDING THEM.
  1832.     CHARACTER*1 FVLD
  1833.     DIMENSION FVLD(1,1)
  1834.     COMMON /FVLDC/FVLD
  1835. C ***<<<< RDD COMMON START >>>***
  1836.     InTeGer*4 RRWACT,RCLACT
  1837. C    COMMON/RCLACT/RRWACT,RCLACT
  1838.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1839.      1  IDOL7,IDOL8
  1840. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1841. C     1  IDOL7,IDOL8
  1842.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1843. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1844.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1845. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1846. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1847. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1848.     InTeGer*4 KLVL
  1849. C    COMMON/KLVL/KLVL
  1850.     InTeGer*4 IOLVL,IGOLD
  1851. C    COMMON/IOLVL/IOLVL
  1852. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1853. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1854.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1855.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1856.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1857. C ***<<< RDD COMMON END >>>***
  1858. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1859. CCC    InTeGer*4 LLCMD,LLDSP
  1860. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1861.     InTeGer*4 TYPE(1,1),VLEN(9)
  1862.     REAL*8 XVBLS(1,1)
  1863.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1864.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1865.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1866. C ICPOS COMMON HAS PHYS COORDS BEING DISPLAYED. MUST QUERY FVLD TO
  1867. C SEE WHETHER TO INTENSIFY THE FIELD FOR NEGATIVE...
  1868. C ***<<< XVXTCD COMMON START >>>***
  1869.     CHARACTER*1 OARRY(100)
  1870.     InTeGer*4 OSWIT,OCNTR
  1871. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1872. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1873.     InTeGer*4 IC1POS,IC2POS,MODFLG
  1874. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1875.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1876.        CHARACTER*1 XTNCMD(80)
  1877. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1878. C VARY FLAG ITERATION COUNT
  1879.     INTEGER KALKIT
  1880. C    COMMON/VARYIT/KALKIT
  1881.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1882.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1883. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1884. C     1  IRCE2
  1885. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1886. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1887. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1888. C RCFGX ON.
  1889. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1890. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1891. C  AND VM INHIBITS. (SETS TO 1).
  1892.     INTEGER*4 FH
  1893. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1894. C    COMMON/CONSFH/FH
  1895.     CHARACTER*1 ARGSTR(52,4)
  1896. C    COMMON/ARGSTR/ARGSTR
  1897.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IC1POS,IC2POS,MODFLG,
  1898.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1899.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1900.      3  IRCE2,FH,ARGSTR
  1901. C ***<<< XVXTCD COMMON END >>>***
  1902. CCC    InTeGer*4 IC1POS,IC2POS,MODFLG
  1903. CCC    COMMON/ICPOS/IC1POS,IC2POS,MODFLG
  1904. C CONTROLS TO SET VARIOUS VISUAL ATTRIBUTES
  1905. C NORMAL, BOLD
  1906.     InTeGer*4 N1SV,N2SV,N222
  1907.     CHARACTER*1 CLSV(8)
  1908. c        CHARACTER*1 ULIT(8)
  1909. c    CHARACTER*1 NORMIT(4)
  1910.     CHARACTER*1 OUTBUF(16)
  1911. C    CHARACTER*1 NORMIT(4),BOLDIT(8),OUTBUF(16),BOLDUL(10)
  1912.     CHARACTER*2 OBF3
  1913.     CHARACTER*3 OBF6
  1914.     EQUIVALENCE (OBF3,OUTBUF(3)),(OBF6,OUTBUF(6))
  1915.     InTeGer*4 COLSW
  1916. C COLOR SCHEME CODED DATA ABOVE...
  1917.     DATA N222/0/
  1918.     DATA COLSW/0/
  1919. C LEAVE IN THE BOLDING FOR NEGATIVE NUMBERS
  1920. c    DATA NORMIT/'','[','0','m'/
  1921. C SET ATTRIBUTE 4 (UNDERLINE) RATHER THAN 1 (BOLD) FOR ALTERNATE LINES.
  1922. c fill in initial escape character (27 decimal)
  1923.       OUTBUF ( 1 ) = Char(27)
  1924.       DO 20000  I = 2, 16
  1925. c fill in spaces in out buffer (32 decimal = ascii space)
  1926.       OUTBUF ( I ) = Char(32)
  1927. 20000 CONTINUE
  1928. 20001 CONTINUE
  1929. C CMD 20 TURNS COLOR ON, 21 TURNS IT OFF.
  1930.       IF ( CMD .NE. 1) GOTO 20002
  1931. C CURSOR POSITION.
  1932. C SHIP OUT APPROPRIATE CHARACTERISTICS.
  1933.  
  1934. 7701    CONTINUE
  1935. 1754    CONTINUE
  1936. 1500    CONTINUE
  1937. 7711    CONTINUE
  1938.       OUTBUF ( 2 ) = '['
  1939.       IF (.NOT.( N1 .GT. 0 . AND . N1 .LE. (LLDSP+1) )) GOTO 20004
  1940.        WRITE(OBF3(1:2),10,ERR=20004)N1
  1941. C      ENCODE ( 2, 10, OUTBUF ( 3 ) ) N1
  1942. 20004 CONTINUE
  1943.       OUTBUF ( 5 ) = ';'
  1944. C ALLOW WIDE DISPLAYS FOR MACHINES LIKE THE RAINBOW...
  1945. C NOTE: USES MSDOS FORTRAN V3.2 FEATURE OF  I3.3 FORMAT...
  1946.       IF (.NOT.( N2 .GT. 0 . AND . N2 .LT. 233)) GOTO 20006
  1947.        WRITE(OBF6(1:3),105,ERR=20006)N2
  1948. C      ENCODE ( 3, 105, OUTBUF ( 6 ) ) N2
  1949. C FIX THE ABOVE FOR 132 COLUMN MAX ON RAINBOW. NO NEED TO LIMIT TO 80 COLS ON
  1950. C MACHINES THAT CAN HANDLE 132 OR MORE, BUT IBM MAY GOOF UP UNLESS LIMIT IS
  1951. C IN EFFECT. (LOSE LOSE)
  1952.     IF(OUTBUF(4).EQ.' ')OUTBUF(4)='0'
  1953.     IF(OUTBUF(7).EQ.' ')OUTBUF(7)='0'
  1954.     IF(OUTBUF(3).EQ.' ')OUTBUF(3)='0'
  1955.     IF(OUTBUF(6).EQ.' ')OUTBUF(6)='0'
  1956. 20006 CONTINUE
  1957.       OUTBUF ( 9 ) = 'H'
  1958.       LEN = 9
  1959.       GOTO 20003
  1960. 20002 CONTINUE
  1961.       IF ( CMD .NE. 11 ) GOTO 20036
  1962. C ERASE DISPLAY
  1963. C ALWSAYS ERASE WHOLE DISPLAY HERE.
  1964.     OUTBUF(1)=27
  1965.     call swrt(outbuf,1)
  1966.     call swrt('[0;0H',5)
  1967.     call swrt(outbuf,1)
  1968.     CALL SWRT('[2J',3)
  1969.     RETURN
  1970. 20036 CONTINUE
  1971.       IF ( CMD .NE. 12 ) GOTO 20042
  1972. C ERASE LINE
  1973. C EITHER ERASE WHOLE LINE BY DOING CR FIRST, OR JUST END OF LINE
  1974. C IF HE USED CODE 2.
  1975. C CAN'T HANDLE ERASING START ONLY, BUT ANALYTICALC NEVER TRIES THIS.
  1976. C DO C.R. FIRST IF CALLED FOR
  1977. 22001    CONTINUE
  1978.     if(n1.EQ.2)goto 20044
  1979. cc just emit line
  1980.     outbuf(1)=27
  1981.     outbuf(2)='['
  1982.     outbuf(3)='K'
  1983.     len=3
  1984.     goto 20003
  1985. C ERASE ALL BY RETURN, ERASE SEQ
  1986. 20044    outbuf(1)=13
  1987.     outbuf(2)=27
  1988.     outbuf(3)='['
  1989.     outbuf(4)='K'
  1990.       LEN = 4
  1991.       GOTO 20003
  1992. 20042 CONTINUE
  1993.       IF ( CMD .NE. 13 ) GOTO 20048
  1994. C SET GRAPHICS RENDITION (7=REVERSE VIDEO, 0=NORMAL,4=UNDERSCORE,1=BOLD
  1995. C  5=BLINK) (PORTACALC CALLS WITH 0 OR 7 (VT100 W/O AVO))
  1996. C    IF(MODFLG.NE.1)GOTO 22002
  1997. 22002    CONTINUE
  1998.     OUTBUF(1)=27
  1999.     call swrt(outbuf,1)
  2000.     IF(N1.EQ.7)CALL SWRT('[7m',3)
  2001.     if(n1.ne.7)call swrt('[0m',3)
  2002.     return
  2003. 20048 CONTINUE
  2004. c      IF (.NOT.( CMD .EQ. 15 )) GOTO 20054
  2005. C SCS. IGNORE THIS ... NEVER REALLY USED.
  2006.     RETURN
  2007. 20003 CONTINUE
  2008. 20073 CONTINUE
  2009. C USE A FORTRAN WRITE SO THIS WILL WORK ON VAX OR PDP11 (OR WHATEVER...)
  2010. C  UNIT 6 MUST BE THE TERMINAL...
  2011.     CALL SWRT(OUTBUF,LEN)
  2012. 10    FORMAT ( I2 )
  2013. 105    FORMAT(I3.3)
  2014.       RETURN
  2015.       END
  2016. c -h- varout.for    Fri Aug 22 13:37:17 1986    
  2017.     SUBROUTINE VAROUT (INDXX,IX2)
  2018. C COPYRIGHT (C) 1983 GLENN EVERHART
  2019. C ALL RIGHTS RESERVED
  2020. C 60=MAX REAL ROWS
  2021. C 301=MAX REAL COLS
  2022. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2023. C VBLS AND TYPE DIMENSIONED 60,301
  2024. C
  2025. C **************************************************
  2026. C *                                                *
  2027. C *       SUBROUTINE   VAROUT                      *
  2028. C *                                                *
  2029. C **************************************************
  2030. C
  2031. C
  2032. C
  2033. C  OUTPUTS THE VALUE OF THE VARIABLE POINTED TO BY INDXX.
  2034. c modified version - multiple precision calls diked out - gce
  2035. C
  2036. C  ASCII     A1 FORMAT UNLESS THE ASCII VALUE IS LESS THAN 32.
  2037. C            IN SUCH CASES, 32 IS ADDED TO THE VALUE AND THE
  2038. C            CHARACTER IS OUTPUT  SO THAT IT IS PRECEDED BY THE
  2039. C            CHARACTER '^'.
  2040. C
  2041. C  DECIMAL   A COMPUTED F FORMAT.
  2042. C
  2043. C  HEXADECIMAL  LEADING ZEROES, "BASE 16" QUE.
  2044. C
  2045. C  INTEGER   I12 FORMAT
  2046. C
  2047. C  OCTAL     LEADING ZEROES, "BASE 8" QUE
  2048. C
  2049. C  REAL      D25.18 FORMAT
  2050. C
  2051. C
  2052. C  VAROUT CALLS
  2053. C
  2054. C ERRMSG   PRINTS OUT ERROR MESSAGES
  2055. C MOUT     OUTPUTS MULTIPLE PRECISION NUMBERS
  2056. C
  2057. C
  2058. C
  2059. C
  2060. C
  2061. C VAROUT IS CALLED BY CALC AND POSTVL
  2062. C
  2063. C
  2064. C
  2065. C  VARIABLE   USE
  2066. C
  2067. C  DEC        HOLDS NUMBER OF DIGITS TO THE RIGHT OF THE
  2068. C             DECIMAL POINT IN F FORMAT SPECIFICATION.
  2069. C  DFORM(11)  HOLDS FORMAT SPECIFICATION FOR F FORMAT
  2070. C             (OUTPUTTING VALUE OF VARIABLES WITH DECIMAL DATA TYPE).
  2071. C  DIGITS     HOLDS THE ASCII CHARACTERS FOR VARIOUS DIGITS.
  2072. C  EIGHT(8)   USED TO PICK OFF REAL*8 'S FROM VBLS.
  2073. C             ALSO HOLDS HEXADECIMAL DIGITS IF # IS DATA TYPE HEX.
  2074. C  FOUR(4)    USED TO PICK OFF INTEGER*4'S FROM VBLS.
  2075. C  I,K        HOLDS TEMPORARY VALUES.
  2076. C  I1         HOLDS THE FIRST DIGIT IN CREATING AN F FORMAT SPECIFICATION.
  2077. C  I2         HOLDS THE SECOND DIGIT IN CREATING AN F FORMAT SPEC.
  2078. C  INDXX      POINTS TO VARIABLE BEING OUTPUT.
  2079. C  IPT        POINTER FOR DFORM.
  2080. C  ISV        POINTER FOR VECTOR SIGN(2).
  2081. C  ITWO       TWO IS USED TO PICK OFF A BYTE OF THE INTEGER
  2082. C  TWO(2)     REPRESENTATION. THEN ITWO IS USED AS
  2083. C             THE VALUE. THIS IS DONE BECAUSE OTHERWISE
  2084. C             SOME COMPILERS WOULD FORCE A SIGN EXTEND.
  2085. C  L          TEMPORARY VALUES. POINTER FOR EIGHT(8).
  2086. C  LEVIN(11)  HOLDS PRINTABLE ASCII CHARACTERS WHICH REPRESENT
  2087. C             AN OCTAL NUMBER. EQUIVALENCED WITH EIGHT(8).
  2088. C  M1         HOLDS HIGH ORDER HEXADECIMAL DIGIT.
  2089. C  M2         HOLDS LOW ORDER HEXADECIMAL DIGIT.
  2090. C  MAG        HOLDS THE MAGNITUDE OF A REAL*8 NUMBER
  2091. C  P10        REAL*8 THAT HOLDS POWERS OF 10. (DECIMAL)
  2092. C  RETCD      HOLDS RETURN CODE FROM CALL TO MOUT.
  2093. C  RPAR       ')'
  2094. C  SIGN(2)    HOLDS PRINTABLE ASCII CHARACTERS FOR OUTPUTTING THE
  2095. C             SIGN OF A NUMBER.
  2096. C  STAR1      HOLDS A SINGLE CHARACTER.
  2097. C  VBLS(100,27)  HOLDS VALUE FOR EACH VARIABLE.
  2098. C  WIDTH      WIDTH SPECIFICATION FOR F FORMAT.
  2099. C
  2100. C
  2101. C
  2102. C    SUBROUTINE VAROUT (INDXX,IX2)
  2103. C
  2104. C NOTE THAT VAROUT IS USED TO DUMP ONLY VALUES FROM AVBLS, NOT
  2105. C VBLS (IX2=1 ALWAYS AT CALLS). THUS DON'T BOTHER TO PICK UP
  2106. C ANY FURTHER INFO FROM VBLS HERE.
  2107.     REAL*8 REAL,MAG,P10
  2108. C
  2109.     INTEGER*4 INT,L,K
  2110. C
  2111.     InTeGer*4 ITWO,INDXX
  2112.     InTeGer*4 TYPE(1,1),WIDTH,DEC,VLEN(9),RETCD
  2113. C
  2114.     CHARACTER*1 AVBLS(20,27),STAR1,EIGHT(8),FOUR(4)
  2115.     CHARACTER*1 VBLS(8,1,1)
  2116.     CHARACTER*1 TWO(2)
  2117.     CHARACTER*1 DFORM(11),DIGITS(16,3),LEVIN(11)
  2118.     CHARACTER*11 DFORM1
  2119.     EQUIVALENCE(DFORM1(1:1),DFORM(1))
  2120.     CHARACTER*1 SIGN(2)
  2121.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2122. C ***<<< XVXTCD COMMON START >>>***
  2123.     CHARACTER*1 OARRY(100)
  2124.     InTeGer*4 OSWIT,OCNTR
  2125. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  2126. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  2127.     InTeGer*4 IPS1,IPS2,MODFLG
  2128. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  2129.        InTeGer*4 XTCFG,IPSET,XTNCNT
  2130.        CHARACTER*1 XTNCMD(80)
  2131. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2132. C VARY FLAG ITERATION COUNT
  2133.     INTEGER KALKIT
  2134. C    COMMON/VARYIT/KALKIT
  2135.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2136.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2137. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2138. C     1  IRCE2
  2139. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2140. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2141. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2142. C RCFGX ON.
  2143. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2144. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2145. C  AND VM INHIBITS. (SETS TO 1).
  2146.     INTEGER*4 FH
  2147. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2148. C    COMMON/CONSFH/FH
  2149.     CHARACTER*1 ARGSTR(52,4)
  2150. C    COMMON/ARGSTR/ARGSTR
  2151.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2152.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2153.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2154.      3  IRCE2,FH,ARGSTR
  2155. C ***<<< XVXTCD COMMON END >>>***
  2156. CCC    InTeGer*4 OSWIT,OCNTR
  2157. C NOTE: OSWIT NONZERO MEANS OUTPUT TO OARRY.
  2158. C OSWIT=2 MEANS NO ZEROING OF OARRY; NOTHING MUCH COMES OUT.
  2159. CCC    CHARACTER*1 OARRY(100)
  2160. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  2161. C
  2162.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  2163.     COMMON /DIGV/ DIGITS
  2164.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2165. C
  2166.     EQUIVALENCE (TWO,ITWO)
  2167.     EQUIVALENCE (REAL,EIGHT),(INT,FOUR),(EIGHT,LEVIN)
  2168. C
  2169.     DATA SIGN/' ','-'/
  2170.     DATA DFORM /'(', '1', 'X', ',', 'F', ' ', ' ', '.', ' ', ' ',
  2171.      ;  ')'/
  2172.     DATA ITWO/0/
  2173. C
  2174. C
  2175. C
  2176.     CALL TYPGET(INDXX,IX2,K)
  2177. C    K=TYPE(INDXX,IX2)
  2178.     IF (K.GT.0) GOTO 10
  2179. C MODIFY TO ELIMINATE CALL TO ERRMSG HERE. JUST COMPLAIN LOCALLY.
  2180.     CALL SWRT('Invalid type argument',21)
  2181.     oarry(1)=13
  2182.     oarry(2)=10
  2183.     call swrt(oarry,2)
  2184. C    CALL ERRMSG (16)
  2185.     GOTO 10000
  2186. 10    GOTO (100,200,300,400,500,600,700,800,900),K
  2187.     STOP 10
  2188. C
  2189. C
  2190. C
  2191. C
  2192. C **************************************************
  2193. C **************        ASCII        ***************
  2194. C **************************************************
  2195. 100    STAR1=AVBLS(1,INDXX)
  2196.     IF(OSWIT.NE.0)GOTO 6006
  2197.     IF (ICHAR(STAR1).LT.32) GOTO 110
  2198. 102    Continue
  2199.     Rewind 11
  2200.     WRITE (11,103) STAR1
  2201.     Rewind 11
  2202. 103    FORMAT (1X,A1)
  2203.     RETURN
  2204. 110    STAR1=CHAR(ICHAR(STAR1)+32)
  2205.     Rewind 11
  2206.     WRITE (11,112) STAR1
  2207.     Rewind 11
  2208. 112    FORMAT (1X,'^',A1)
  2209.     RETURN
  2210. 6006    OARRY(1)=STAR1
  2211.     OCNTR=1
  2212.     RETURN
  2213. C
  2214. C
  2215. C
  2216. C
  2217. C
  2218. C **************************************************
  2219. C ****************  DECIMAL   **********************
  2220. C **************************************************
  2221. 200    CONTINUE
  2222.     DO 208 I=1,8
  2223. 208    EIGHT(I)=AVBLS(I,INDXX)
  2224.     MAG=DABS(REAL)
  2225.     IF (MAG.LT.1.D0) GOTO 240
  2226. C
  2227. C
  2228. C COUNT THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  2229.     P10=1.D0
  2230.     DO 210 I=1,38
  2231.     P10=10.D0*P10
  2232.     IF (P10.GT.MAG) GOTO 212
  2233. 210    CONTINUE
  2234. C
  2235. C I COUNTS THE # OF DIGITS TO THE LEFT OF THE DECIMAL POINT
  2236.     I=39
  2237. 212    DEC=0
  2238.     WIDTH=17
  2239.     IF(I.GT.15)WIDTH=I+2
  2240.     IF(I.LE.15)DEC=15-I
  2241. C
  2242. C
  2243. C  CREATE PROPER FORMAT STATEMENT
  2244. 215    I1=WIDTH/10
  2245.     I2=WIDTH-I1*10
  2246.     IF (I2.EQ.0) I2=10
  2247.     DFORM(6)=DIGITS(I1,1)
  2248.     DFORM(7)=DIGITS(I2,1)
  2249.     I1=DEC/10
  2250.     I2=DEC-I1*10
  2251.     IF (I1.EQ.0) I1=10
  2252.     IF (I2.EQ.0) I2=10
  2253.     IPT=9
  2254.     IF (I1.EQ.0) GOTO 220
  2255.     DFORM(9)=DIGITS(I1,1)
  2256.     IPT=IPT+1
  2257. 220    DFORM(IPT)=DIGITS(I2,1)
  2258.     DFORM(IPT+1)=RPAR
  2259.     nnn=ipt+2
  2260.     if(nnn.ge.11)goto 223
  2261.     do 224 nnnn=nnn,11
  2262. 224    dform(nnnn)=' '
  2263. 223    continue
  2264. C
  2265. C
  2266. C
  2267. C
  2268. C  OUTPUT REAL USING NEWLY CREATED
  2269. C  FORMAT STATEMENT HELD BY DFORM
  2270.     IF(OSWIT.NE.0)GOTO 6009
  2271.     Rewind 11
  2272.     WRITE (11,DFORM,ERR=10000) REAL
  2273.     Rewind 11
  2274.     GOTO 10000
  2275. 6009    CONTINUE
  2276.     IF(OSWIT.EQ.2) GOTO 6101
  2277.     IF(OSWIT.GT.3)GOTO 7101
  2278.     DO 6010 OCNTR=1,106
  2279. 6010    OARRY(OCNTR)=0
  2280. 6101    CONTINUE
  2281. C FORGET THE ENCODE ... NEVER USED
  2282. C6101    ENCODE(100,DFORM,OARRY)REAL
  2283. 7101    OCNTR=100
  2284.     GOTO 10000
  2285. C
  2286. C
  2287. C  REAL LESS THAN 1.D0
  2288. 240    P10=1.D0
  2289.     DO 245 I=1,38
  2290.     P10=P10*.1D0
  2291.     IF (MAG.GE.P10) GOTO 250
  2292. 245    CONTINUE
  2293.     I=0
  2294. C
  2295. C I-1 REPRESENTS THE NUMBER OF LEADING ZEROS
  2296. 250    DEC=14+I
  2297.     WIDTH=DEC+3
  2298.     GOTO 215
  2299. C
  2300. C
  2301. C **************************************************
  2302. C *************  HEXADECIMAL  **********************
  2303. C **************************************************
  2304. C  HEXADECIMAL
  2305. 300    CONTINUE
  2306.     DO 302 I=1,4
  2307. 302    FOUR(I)=AVBLS(I,INDXX)
  2308.     ISV=1
  2309.     IF (INT.LT.0) ISV=2
  2310.     INT=IABS(INT)
  2311.     L=8
  2312.     DO 304 I=1,4
  2313. C PICK UP A VALUE, THEN USE InTeGer*4 EQUIVALENT
  2314. C TO WORK WITH SO SIGN DOESN'T GET EXTENED.
  2315.     TWO(1)=ICHAR(FOUR(I))
  2316.     M1=ITWO/16
  2317.     M2=ITWO-M1*16
  2318.     IF(M1.EQ.0)M1=16
  2319.     IF(M2.EQ.0)M2=16
  2320.     EIGHT(L)=DIGITS(M2,3)
  2321.     L=L-1
  2322.     EIGHT(L)=DIGITS(M1,3)
  2323.     L=L-1
  2324. 304    CONTINUE
  2325.     IF(OSWIT.NE.0)GOTO 6011
  2326.     Rewind 11
  2327.     WRITE (11,310,ERR=10000) SIGN(ISV), EIGHT
  2328.     Rewind 11
  2329. 310    FORMAT (1X,1A1,8A1,2X,'(BASE 16)')
  2330.     GOTO 10000
  2331. 6011    CONTINUE
  2332.     IF(OSWIT.EQ.2)GOTO 6102
  2333.     IF(OSWIT.GT.3)GOTO 7102
  2334.     DO 6013 OCNTR=1,106
  2335. 6013    OARRY(OCNTR)=0
  2336. 6102    CONTINUE
  2337. C FORGET UNUSED ENCODE
  2338. C6102    ENCODE(8,6012,OARRY)SIGN(ISV),EIGHT
  2339. 6012    FORMAT(A1,8A1)
  2340. 7102    OCNTR=9
  2341.     GOTO 10000
  2342. C
  2343. C
  2344. C **************************************************
  2345. C ***************   INTEGER   **********************
  2346. C **************************************************
  2347. 400    DO 404 I=1,4
  2348. 404    FOUR(I)=AVBLS(I,INDXX)
  2349.     IF(OSWIT.NE.0)GOTO 6014
  2350.     Rewind 11
  2351.     WRITE (11,410,ERR=10000) INT
  2352.     Rewind 11
  2353. 410    FORMAT (1X,I12)
  2354.     GOTO 10000
  2355. 6014    CONTINUE
  2356.     IF(OSWIT.EQ.2)GOTO 6103
  2357.     IF(OSWIT.GT.3)GOTO 7104
  2358.     DO 6015 OCNTR=1,106
  2359. 6015    OARRY(OCNTR)=0
  2360. 6103    CONTINUE
  2361. C6103    ENCODE(12,410,OARRY)INT
  2362. 7104    OCNTR=12
  2363.     GOTO 10000
  2364. C
  2365. C
  2366. C **************************************************
  2367. C ***********    MULTIPLE PRECISION   **************
  2368. C **************************************************
  2369. C  MULTIPLE PRECISION
  2370. C  M10
  2371. 500    CONTINUE
  2372. C
  2373. C  M8
  2374. 600    CONTINUE
  2375. C
  2376. C  M16
  2377. 700    continue
  2378. c700    CALL MOUT (INDXX,RETCD)
  2379.     GOTO 10000
  2380. C
  2381. C
  2382. C **************************************************
  2383. C ****************   OCTAL   ***********************
  2384. C **************************************************
  2385. C  OCTAL
  2386. 800    DO 804 I=1,4
  2387. 804    FOUR(I)=AVBLS(I,INDXX)
  2388.     ISV=1
  2389.     IF (INT.LT.0) ISV=2
  2390.     K=IABS(INT)
  2391.     DO 810 I=1,11
  2392.     L=K-K/8*8
  2393. C TAKE ABSOLUTE VALUE IN CASE FIRST IABS DIDN'T WORK ON -2**31
  2394.     L=IABS(L)
  2395.     IF(L.EQ.0)L=9
  2396.     LEVIN (12-I)=DIGITS(L,2)
  2397.     K=K/8
  2398. 810    CONTINUE
  2399.     IF(OSWIT.NE.0)GOTO 6016
  2400.     Rewind 11
  2401.     WRITE (11,820,ERR=10000) SIGN(ISV), LEVIN
  2402.     Rewind 11
  2403. 820    FORMAT (1X,1A1,11A1,2X,'(BASE 8)')
  2404.     GOTO 10000
  2405. 6016    CONTINUE
  2406.     IF(OSWIT.EQ.2)GOTO 6100
  2407.     IF(OSWIT.GT.3)GOTO 7105
  2408.     DO 6018 OCNTR=1,106
  2409. 6018    OARRY(OCNTR)=0
  2410. 6100    CONTINUE
  2411. C6100    ENCODE(12,6017,OARRY)SIGN(ISV),LEVIN
  2412. 6017    FORMAT(12A1)
  2413. 7105    OCNTR=12
  2414.     GOTO 10000
  2415. C
  2416. C
  2417. C
  2418. C
  2419. C
  2420. C **************************************************
  2421. C ***************    REAL    ***********************
  2422. C **************************************************
  2423. 900    DO 904 I=1,8
  2424. 904    EIGHT(I)=AVBLS(I,INDXX)
  2425.     IF(OSWIT.NE.0)GOTO 6019
  2426.     Rewind 11
  2427.     WRITE (11,910,ERR=10000) REAL
  2428.     Rewind 11
  2429. 910    FORMAT (1X,D25.18)
  2430.     GOTO 10000
  2431. 6019    CONTINUE
  2432.     IF (OSWIT.EQ.2)GOTO 6020
  2433.     IF(OSWIT.GT.3)GOTO 7106
  2434.     DO 6321 OCNTR=1,106
  2435. 6321    OARRY(OCNTR)=Char(0)
  2436. 6020    CONTINUE
  2437. C    ENCODE(28,6021,OARRY)REAL
  2438. 6021    FORMAT(D25.18)
  2439. 7106    OCNTR=28
  2440. 10000    RETURN
  2441.     END
  2442. c -h- vblget.for    Fri Aug 22 13:37:17 1986    
  2443.         SUBROUTINE VBLGET(ID1,ID2,ID3,IVAL)
  2444. C
  2445. C VBLGET - GET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  2446. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLGT TO GET
  2447. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  2448.         InTeGer*4 ID1,ID2,ID3
  2449.         CHARACTER*1 IVAL,LL(8)
  2450.         REAL*8 XX
  2451.         EQUIVALENCE(LL(1),XX)
  2452.         CALL XVBLGT(ID2,ID3,XX)
  2453.         IVAL=LL(ID1)
  2454.         RETURN
  2455.         END
  2456. c -h- vblset.for    Fri Aug 22 13:37:17 1986    
  2457.         SUBROUTINE VBLSET(ID1,ID2,ID3,IVAL)
  2458. C VBLSET - SET BYTE OF 3 DIM VBLS ARRAY, ORIGINALLY
  2459. C  DIMENSIONED (8,60,301). HANDLE BY CALLING XVBLST TO GET
  2460. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  2461.         InTeGer*4 ID1,ID2,ID3
  2462.         CHARACTER*1 IVAL,LL(8)
  2463.         REAL*8 XX
  2464.         EQUIVALENCE(LL(1),XX)
  2465. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONE WE WANT. THEN...
  2466.         CALL XVBLGT(ID2,ID3,XX)
  2467.         LL(ID1)=IVAL
  2468. C PUT BACK THE 8 BYTES.
  2469.         CALL XVBLST(ID2,ID3,XX)
  2470.         RETURN
  2471.         END
  2472. c -h- wassig.fdd    Fri Aug 22 13:44:20 1986    
  2473.     SUBROUTINE WASSIG(IUNIT,NAME)
  2474. C
  2475. C
  2476.     CHARACTER*1 NAME(50)
  2477.     InTeGer*4 IUNIT
  2478.     CHARACTER*20 WK
  2479.     CHARACTER*1 WK1(20)
  2480.     EQUIVALENCE(WK(1:1),WK1(1))
  2481. C JUST TRY AND NULL FILL A NAME TO USE.
  2482.     DO 1 N=1,20
  2483.     WK1(N)=' '
  2484. 1    CONTINUE
  2485.     DO 2 N=1,20
  2486.     II=ICHAR(NAME(N))
  2487.     IF(II.LT.32)GOTO 3
  2488.     WK1(N)=CHAR(II)
  2489. C1    CONTINUE
  2490. 2    CONTINUE
  2491. 3    OPEN(IUNIT,FILE=WK(1:20),STATUS='NEW',
  2492.      1  ACCESS='SEQUENTIAL',FORM='FORMATTED')
  2493.     RETURN
  2494.     END
  2495. c -h- wrkfil.f40    Fri Aug 22 13:44:46 1986    
  2496.     SUBROUTINE WRKFIL(NREC,ARRAY,IFUNC)
  2497. C COPYRIGHT 1983 GLENN C.EVERHART
  2498. C ALL RIGHTS RESERVED
  2499. C WORKFILE PSEUDO-MAINTAINER
  2500. C
  2501. C THIS ROUTINE IS INTENDED TO PERMIT THE SCRATCH FILE OF
  2502. C PORTACALC TO BE DISPENSED WITH BY USING A LARGE IN-MEMORY
  2503. C ARRAY. A BITMAP WILL SET UP WHEN THE ELEMENT IS INIT'ED AND
  2504. C THE DEFAULT ELEMENT WILL BE COMPUTED AND RETURNED
  2505. C IF AN UNINITIALIZED ELEMENT IS USED.
  2506. C
  2507. c nrc was i*4. make it i*2 here
  2508.     INTEGER NRC
  2509. C    InTeGer*4 NRC2(2)
  2510. C    EQUIVALENCE(NRC2(1),NRC)
  2511. C RECORD NUMBER TO ACCESS
  2512.     INTEGER NREC
  2513.     CHARACTER*1 ARRAY(128)
  2514.     INTEGER IFUNC
  2515. C ***<<<< RDD COMMON START >>>***
  2516.     InTeGer*4 RRWACT,RCLACT
  2517. C    COMMON/RCLACT/RRWACT,RCLACT
  2518.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2519.      1  IDOL7,IDOL8
  2520. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2521. C     1  IDOL7,IDOL8
  2522.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2523. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2524.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2525. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2526. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2527. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2528.     InTeGer*4 KLVL
  2529. C    COMMON/KLVL/KLVL
  2530.     InTeGer*4 IOLVL,IGOLD
  2531. C    COMMON/IOLVL/IOLVL
  2532. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2533. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2534.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2535.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2536.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2537. C ***<<< RDD COMMON END >>>***
  2538. CCC    InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2539. CCC    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2540. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2541. C
  2542. C ***<<< NULETC COMMON START >>>***
  2543.     InTeGer*4 ICREF,IRREF
  2544. C    COMMON/MIRROR/ICREF,IRREF
  2545.     InTeGer*4 MODPUB,LIMODE
  2546. C    COMMON/MODPUB/MODPUB,LIMODE
  2547.     InTeGer*4 KLKC,KLKR
  2548.     REAL*8 AACP,AACQ
  2549. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2550.     InTeGer*4 NCEL,NXINI
  2551. C    COMMON/NCEL/NCEL,NXINI
  2552.     CHARACTER*1 NAMARY(20,301)
  2553. C    COMMON/NMNMNM/NAMARY
  2554.     InTeGer*4 NULAST,LFVD
  2555. C    COMMON/NULXXX/NULAST,LFVD
  2556.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2557.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2558. C ***<<< NULETC COMMON END >>>***
  2559. CCC    InTeGer*4 NCEL,NXINI
  2560. CCC    COMMON/NCEL/NCEL,NXINI
  2561.     InTeGer*4 MFID(2),MFMOD(2)
  2562.     InTeGer*2 IFID(8,2048)
  2563.     COMMON/IFIDC/IFID
  2564. CCC    InTeGer*4 RRWACT,RCLACT
  2565. C MFLAST = 1 OR 2 FOR LAST BUFFER USED. MFBASE IS HOLDER FOR "BASE ADDR"
  2566. C IN ARRAY TO USE IN SCANS.
  2567.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  2568.     COMMON/VBCTL/MFLAST,MFBASE,MVLASE,MVBASE
  2569. CCC    COMMON/RCLACT/RRWACT,RCLACT
  2570.     CHARACTER*1 LFID(16,2048)
  2571.     EQUIVALENCE(IFID(1,1),LFID(1,1))
  2572. C ***<<< KLSTO COMMON START >>>***
  2573.     InTeGer*4 DLFG
  2574. C    COMMON/DLFG/DLFG
  2575.     InTeGer*4 KDRW,KDCL
  2576. C    COMMON/DOT/KDRW,KDCL
  2577.     InTeGer*4 DTRENA
  2578. C    COMMON/DTRCMN/DTRENA
  2579.     REAL*8 EP,PV,FV
  2580.     DIMENSION EP(20)
  2581.     INTEGER*4 KIRR
  2582. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2583.     InTeGer*4 LASTOP
  2584. C    COMMON/ERROR/LASTOP
  2585.     CHARACTER*1 FMTDAT(9,76)
  2586. C    COMMON/FMTBFR/FMTDAT
  2587.     CHARACTER*1 EDNAM(16)
  2588. C    COMMON/EDNAM/EDNAM
  2589. c    InTeGer*4 MFID(2),MFMOD(2)
  2590. C    COMMON/FRM/MFID,MFMOD
  2591.     InTeGer*4 JMVFG,JMVOLD
  2592. C    COMMON/FUBAR/JMVFG,JMVOLD
  2593.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2594.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2595. C ***<<< KLSTO COMMON END >>>***
  2596. CCC    COMMON/FRM/MFID,MFMOD
  2597.     CHARACTER*1 LI,IBYTE
  2598. C DEFFMT IS THE DEFAULT FORMAT FOR NUMERICS. INITIALLY IT WILL BE F9.2
  2599.     CHARACTER*1 DVFMT(12),DEFFMT(10)
  2600.     EQUIVALENCE(DVFMT(2),DEFFMT(1))
  2601.     COMMON/DEFVBX/DVFMT
  2602. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  2603. C AREAS WITH DATA.)
  2604. CCC    CHARACTER*1 FMTDAT(9,76)
  2605. CCC    COMMON/FMTBFR/FMTDAT
  2606. C
  2607. C IFUNC SPECIFIES WHAT TO DO:
  2608. C    =0    READ INTO ARRAY
  2609. C    =1    WRITE FROM ARRAY INTO WRKARY
  2610. C    =2    INITIALIZE (JUST CLEARS BITMAP HERE)(OPEN)
  2611. C    =3    CLOSE (CLEARS BITMAP HERE)
  2612.     CHARACTER*1 DTBL1(9,9,8)
  2613. C BIG WASTEFUL TABLE TO INIT OPERATION TYPE DATA. TRY TO REUSE SPACE.
  2614.     InTeGer*2 BTBL(6,6,8)
  2615. C REUSE SPACE BY MAKING LFID AND IT OVERLAY EACH OTHER.
  2616. C NO NEED TO WASTE IT.
  2617.     INTEGER DTBLIN
  2618. C DTBLIN FLAGS THAT DTBL1 WAS ALREADY INITED, SO ONLY DOES SO ONCE.
  2619.     EQUIVALENCE(LFID(1,1),BTBL(1,1,1))
  2620.     InTeGer*2 BTBL1(6,6)
  2621.     InTeGer*2 BTBL2(6,6),BTBL3(6,6),BTBL4(6,6),BTBL5(6,6)
  2622.     InTeGer*2 BTBL6(6,6),BTBL7(6,6),BTBL8(6,6)
  2623.     EQUIVALENCE(BTBL(1,1,1),BTBL1(1,1)),(BTBL(1,1,2),BTBL2(1,1))
  2624.     EQUIVALENCE(BTBL(1,1,3),BTBL3(1,1)),(BTBL(1,1,4),BTBL4(1,1))
  2625.     EQUIVALENCE(BTBL(1,1,5),BTBL5(1,1)),(BTBL(1,1,6),BTBL6(1,1))
  2626.     EQUIVALENCE(BTBL(1,1,7),BTBL7(1,1)),(BTBL(1,1,8),BTBL8(1,1))
  2627.     COMMON /DECIDE/ DTBL1
  2628.     DATA DTBLIN/0/
  2629.     IF(IFUNC.NE.50)GOTO 34
  2630.     IF(DTBLIN.NE.0)RETURN
  2631.     DTBLIN=1
  2632. C FLAG WE DID THIS INITIALIZATION ONCE. SINCE BUFFER IS CLEARED WE MUST
  2633. C *** NOT *** DO IT AGAIN.
  2634. C ONLY INIT DTBL1 ENTRIES NOT CORRESPONDING TO MULTIPLE PRECISION DATA
  2635. C TYPES (WHICH ARE NOT SUPPORTED HERE)
  2636. C CALL SEPARATE ROUTINE TO CLEAR OUT THIS STUFF ONE-TIME. OVERLAY SAME.
  2637. C NOTE LOTS OF SILLY ARGUMENTS TO SUBROUTINE SINCE MS FORTRAN DISALLOWS
  2638. C EQUIVALENCES TO DUMMY ARGUMENTS.
  2639.     CALL WTBINI(IFID,LPGMXF,BTBL1,BTBL2,BTBL3,BTBL4,BTBL5,BTBL6,
  2640.      1  BTBL7,BTBL8)
  2641. C
  2642. C14      CONTINUE
  2643. CC FILE IS NOW CLEARED
  2644.     RETURN
  2645. 34    IF(IFUNC.LT.0.OR.IFUNC.GT.3)RETURN
  2646.     JFUN=IFUNC+1
  2647.     GOTO (1000,2000,3000,4000),JFUN
  2648. 1000    CONTINUE
  2649. C READ
  2650.     CALL FVLDGT(NREC,1,IBYTE)
  2651.     IF(ICHAR(IBYTE).NE.0)GOTO 1001
  2652. C UNINITIALIZED ARRAY ELEMENT: SET IT UP.
  2653. C JUST LEAVES DUMMY CELL CONTENTS WHERE NOTHING IS REALLY INIT'D.
  2654.     DO 1003 N=1,128
  2655. 1003    ARRAY(N)=char(0)
  2656.     ARRAY(1)='P'
  2657.     ARRAY(2)='#'
  2658.     ARRAY(3)='0'
  2659.     ARRAY(5)='0'
  2660.     ARRAY(4)='#'
  2661.     ARRAY(118)=CHAR(15)
  2662. C NOTE ARRAY(119) (WHICH BECOMES FVLD) IS 0 TOO.
  2663.     DO 1004 N=1,9
  2664. 1004    ARRAY(N+119)=DEFFMT(N)
  2665. C RETURN THE DEFAULT FORMAT NOW.
  2666.     RETURN
  2667. 1001    CONTINUE
  2668. C HERE HAVE TO GET THE WHOLE THING REALLY
  2669.     DO 1053 N=1,128
  2670. 1053    ARRAY(N)=char(0)
  2671.     ARRAY(119)=IBYTE
  2672.     ARRAY(118)=CHAR(15)
  2673.     ARRAY(1)=char(48)
  2674. C LET ARRAY INITIALLY BE SET SENSIBLY..
  2675.     DO 1054 N=1,9
  2676. 1054    ARRAY(N+119)=DEFFMT(N)
  2677. C WE MAY MODIFY FORMAT LATER TOO...
  2678. C NOW HAVE A NON-DEFAULT ELEMENT TO READ... GO THROUGH SYMBOL TBL LOGIC
  2679. C FOR THESE, WE USE 16-BYTE "CELLS" WHICH HAVE THE FOLLOWING FORMAT:
  2680. C    ID    2 BYTES (CELL ADDRESS, MUST BE 1 OR MORE FOR VALID)
  2681. C    FLAG    1 BYTE  (TYPE OF CELL:
  2682. C                0 = UNUSED
  2683. C                1 = 1 OF 1 CELLS
  2684. C                2 = NONTERMINAL OF MORE THAN 1 CELL
  2685. C                3 = LAST OF >1 CELLS
  2686. C    FORMAT    1 BYTE  (INDEX OF FORMAT STRING FOR THIS CELL; FORMATS
  2687. C                ARE STORED RESIDENT, UP TO 76 OF THEM,
  2688. C                SET BY DF COMMAND.)
  2689. C    FORMULA    12 BYTES  (FORMULA TEXT)
  2690. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  2691. C    IPM=(LPGMXF*64/2048)+1
  2692. C    IBF=64
  2693. CC    IBF=(2048+31)/32
  2694. C IBF IS NO. OF ENTRIES IN A BUFFER. OF 512 BYTES
  2695. C    IBF=32
  2696.     IBF=32
  2697. C    LLL=(LPGMXF)/IBF
  2698. C    LLL=LPGMXF
  2699. C IPM IS NO. PAGES MAX IN FILS
  2700.     IPM=LPGMXF/16
  2701. C EACH BUFFER HAS 16KB SO MAX PAGES IS (FILE LENGTH)/16
  2702. C    IPM=LLL
  2703.     IF(IPM.LT.2)IPM=2
  2704. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  2705.     IHASH=NREC
  2706. C    JHASH=IMASK(IHASH,2047)
  2707.     JHASH=MOD(IHASH,1024)
  2708. C    JHASH=IMASK(IHASH,1023)
  2709. C    JHASH=MOD(IHASH,2048)
  2710.     IF(LPGMOD.NE.0)GOTO 5305
  2711. C    IPAG=(IHASH/2048)+1
  2712.     IPAG=(IHASH/1024)+1
  2713.     IPAG=MOD(IPAG,IPM)+1
  2714.     GOTO 5306
  2715. 5305    CONTINUE
  2716. C SPEED OPTIMAL PACK
  2717.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  2718.     IPAG=FPG
  2719.     IPAG=MOD(IPAG,IPM)
  2720.     IPAG=IPAG+1
  2721. C    IPAG=1+(IHASH*IPM)/18060
  2722. 5306    CONTINUE
  2723. C HERE DECIDED IF PAGE IS WHAT WE NEED.
  2724. C
  2725. C    IF(IPAG.LE.0)IPAG=1
  2726. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  2727.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 853
  2728.     IF(MFID(1).NE.0)GOTO 852
  2729.     MFID(1)=IPAG
  2730.     GOTO 853
  2731. 852    IF(MFID(2).EQ.0)MFID(2)=IPAG
  2732. 853    CONTINUE
  2733.     IF(MFID(1).EQ.IPAG) GOTO 850
  2734.     IF(MFID(2).EQ.IPAG)GOTO 851
  2735.     GOTO 854
  2736. 850    CONTINUE
  2737. C PAGE 1 IS THE ONE WE NEED.
  2738.     MFLAST=1
  2739.     MFBASE=0
  2740.     GOTO 1400
  2741. 851    CONTINUE
  2742. C NEED SECOND PAGE
  2743.     MFLAST=2
  2744.     MFBASE=1024
  2745. C BASE IS HASFWAY ALONG FILE...
  2746.     GOTO 1400
  2747. 854    CONTINUE
  2748. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  2749.     MFLAST=3-MFLAST
  2750.     MFBASE=1024-MFBASE
  2751. C SIMILAR LOGIC SAYS MFBAS4E IS EITHER 0 OR 1024. INITIALIZED IN
  2752. C WSSET TO 0.
  2753. C NOTE THAT IF MFLAST=1,MBFN=1 AND IF MFLAST=2,NEW MFLAST=1
  2754. C THIS GIVES BUFFER TO REPLACE... (LRU)
  2755. C
  2756. C IF MFLAST=2 REPLACE BUFFER 1, ELSE REPLACE BUFFER 0
  2757. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  2758. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  2759. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  2760. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  2761. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  2762. C WIN.....
  2763.     IF(LPGMXF.LE.32)GOTO 1400
  2764. C    IF(LPGMXF.LE.(2048/64))GOTO 1400
  2765. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  2766. C    IBF=32
  2767. CC    IBF=(1024+31)/32
  2768. C    IF(IBF.LT.1)IBF=1
  2769. C IBF IS BLK FACTOR FOR ONE WRITE
  2770. C WRITE 512 BYTES AT A TIME.
  2771.     L=1+MFBASE
  2772.     LLBK=(MFID(MFLAST)-1)*IBF+1
  2773.     LHBK=MFID(MFLAST)*IBF
  2774.     DO 1170 N=LLBK,LHBK
  2775.     IF(MFMOD(MFLAST).EQ.0)GOTO 1170
  2776.     LL=L+31
  2777.     WRITE(7,REC=N,ERR=1170)((IFID(K,KK),K=1,8),KK=L,LL)
  2778.     L=L+32
  2779. 1170    CONTINUE
  2780. C NOW READ IN THE DATA
  2781.     MFMOD(MFLAST)=0
  2782. C MARK PAGE UNTOUCHED. READING DOES NOT ALTER DATA SO NO NEED
  2783. C TO WRITE OUT UNLESS MODIFIED.
  2784.     MFID(MFLAST)=IPAG
  2785.     L=1+MFBASE
  2786.     LLBK=(MFID(MFLAST)-1)*IBF+1
  2787.     LHBK=MFID(MFLAST)*IBF
  2788.     DO 1171 N=LLBK,LHBK
  2789.     LL=L+31
  2790.     READ(7,REC=N,ERR=1171)((IFID(K,KK),K=1,8),KK=L,LL)
  2791.     L=L+32
  2792. 1171    CONTINUE
  2793. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  2794. 1400    CONTINUE
  2795. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  2796. C BUFFER.
  2797.     IARSUB=1
  2798. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  2799. C FROM START...
  2800.     IFLAG=0
  2801.     IFMT=0
  2802.     DO 2500 NN=1,1024
  2803. c    N=MOD((NN+JHASH-1),1024)
  2804.     N=MOD((NN+JHASH),1024)
  2805.     N=N+1+MFBASE
  2806. C    N=IMASK((NN+JHASH-1),1023)+1+MFBASE
  2807.     KKKKK=IFID(1,N)
  2808.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 2505
  2809.     IF(KKKKK.NE.NREC)GOTO 2500
  2810.     IFLAG=ICHAR(LFID(3,N))
  2811.     IF(IFMT.EQ.0)IFMT=ICHAR(LFID(4,N))
  2812.     DO 2502 K=1,12
  2813.     LI=LFID(K+4,N)
  2814. C COPY FORMULA TEXT INTO ARRAY. END ON NULLS...
  2815.     IF(ICHAR(LI).LE.0)GOTO 2505
  2816.     ARRAY(IARSUB)=LI
  2817. c null out following characters since -1's could be misinterpreted as data
  2818.     array(iarsub+1)=0
  2819.     array(iarsub+2)=0
  2820.     IARSUB=IARSUB+1
  2821. 2502    CONTINUE
  2822.     IF(IFLAG.EQ.1.OR.IFLAG.EQ.3)GOTO 2505
  2823. 2500    CONTINUE
  2824. 2505    CONTINUE
  2825. C GET FORMAT NOW...
  2826.     IF(IFMT.LE.0)RETURN
  2827.     DO 2510 N=1,9
  2828. 2510    ARRAY(119+N)=FMTDAT(N,IFMT)
  2829.     GOTO 5000
  2830. 2000    CONTINUE
  2831. C WRITE
  2832. C NOW SET INIT'D BIT; WRITE ARRAY ELEMENT OUT.
  2833. C FIRST FIND FORMAT AREA OR SET IT UP.
  2834.     IFMT=0
  2835.     LFF=0
  2836. C FAKE OUT THE SAVING OF FVLD INFO IN THIS ARRAY TOO.
  2837. C THIS IS INCOMPLETE AND NO LITTLE OF A KLUDGE BUT THE CODE WILL
  2838. C GENERALLY SET THEM TOGETHER, AND THIS GUARANTEES THAT IF
  2839. C FURTHER SETS TRY TO SET FVLD TO ARRAY(119), THEY'LL WORK AS
  2840. C THEY SHOULD.
  2841. C HERE SET MAX ARRAY ELEMENTS USED
  2842. C EXPECT (ID2-1)*60+ID1
  2843. C ID1 IS 60 DIM, ID2 IS 301 DIM
  2844. C    NRC2(2)=0
  2845. C    NRC2(1)=NREC
  2846. C JUST EQUATE NRC TO NREC
  2847. C ALLOW LATER FOR OVER 32768 ELEMENTS... NO NEED TO JUST YET
  2848. C WHEN WE DO, REPLACE NRC2 STUFF (WHOSE PURPOSE IS TO AVOID
  2849. C SIGN EXTENSIONS).
  2850. C NEXT KEEP TRACK OF LOWER RIGHT CORNER OF AREA IN USE.
  2851.     NRC=NREC-1
  2852.     IRUSED=MOD(NRC,60)+1
  2853.     ICUSED=((NRC-IRUSED+1)/60)+1
  2854.     IF(ICUSED.GT.RCLACT)RCLACT=ICUSED
  2855.     IF(IRUSED.GT.RRWACT)RRWACT=IRUSED
  2856. C SET RRWACT, RCLACT
  2857.     IF(ICHAR(ARRAY(119)).NE.0)CALL FVLDST(NREC,1,ARRAY(119))
  2858.     DO 2011 N=1,76
  2859.     IF(ICHAR(FMTDAT(1,N)).LE.0.AND.LFF.EQ.0)LFF=N
  2860. C SAVE FIRST FREE FORMAT AREA IN CASE THIS IS A NEW FORMAT...
  2861.     DO 2010 M=1,9
  2862.     IF(ARRAY(M+119).NE.FMTDAT(M,N))GOTO 2011
  2863. 2010    CONTINUE
  2864.     IFMT=N
  2865.     GOTO 2012
  2866. 2011    CONTINUE
  2867. C ON FALL THROUGH, WE FOUND NOTHING FOR IT...
  2868. C USE HIS FORMAT UNLESS WE HAVE NO ROOM, IN WHICH CASE USE LAST AREA
  2869.     IF(LFF.EQ.0)LFF=76
  2870.     IFMT=LFF
  2871.     DO 2013 N=1,9
  2872. 2013    FMTDAT(N,LFF)=ARRAY(119+N)
  2873. C SAVE FORMAT DATA WE NOW POINT TO...
  2874. 2012    CONTINUE
  2875. C NOW THE HARDER PART... MUST WRITE THE ARRAY'S FORMULA TOO...
  2876. C    IPM=(LPGMXF*64/2048)+1
  2877.     IBF=32
  2878. C    IBF=(2048+31)/32/2
  2879. C    LLL=(LPGMXF*2)/IBF
  2880. C    IPM=LLL
  2881.     IPM=LPGMXF/16
  2882. C IPM = NO. PAGES IN FILE. LPGMXF/(LENGTH OF ONE MEM BUFFER IN K).
  2883.     IF(IPM.LT.2)IPM=2
  2884. C FORCE IPM (MAX MEM PAGE) TO BE IN VALID RANGE
  2885.     IHASH=NREC
  2886. C    JHASH=IMASK(IHASH,1023)
  2887.     JHASH=MOD(IHASH,1024)
  2888.     IF(LPGMOD.NE.0)GOTO 5307
  2889.     IPAG=(IHASH/1024)+1
  2890.     IPAG=MOD(IPAG,IPM)+1
  2891.     GOTO 5308
  2892. 5307    CONTINUE
  2893. C SPEED OPTIMAL PACK
  2894.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FLOAT(LPGMOD)
  2895.     IPAG=FPG
  2896.     IPAG=MOD(IPAG,IPM)
  2897.     IPAG=IPAG+1
  2898. C    IPAG=1+(IHASH*IPM)/18060
  2899. 5308    CONTINUE
  2900. C ***
  2901. C DETERMINE FIRST THAT NEITHER PAGE NUMBER IS ZERO.
  2902.     IF(IPAG.EQ.MFID(1).OR.IPAG.EQ.MFID(2))GOTO 953
  2903.     IF(MFID(1).NE.0)GOTO 952
  2904.     MFID(1)=IPAG
  2905.     GOTO 953
  2906. 952    IF(MFID(2).EQ.0)MFID(2)=IPAG
  2907. 953    CONTINUE
  2908.     IF(MFID(2).EQ.IPAG)GOTO 951
  2909.     IF(MFID(1).NE.IPAG) GOTO 954
  2910. 950    CONTINUE
  2911. C PAGE 1 IS THE ONE WE NEED.
  2912.     MFLAST=1
  2913.     MFBASE=0
  2914.     GOTO 2400
  2915. 951    CONTINUE
  2916. C NEED SECOND PAGE
  2917.     MFLAST=2
  2918.     MFBASE=1024
  2919. C BASE IS HASFWAY ALONG FILE...
  2920.     GOTO 2400
  2921. 954    CONTINUE
  2922. C HERE FIGURE OUT WHICH BUFFER IS TO BE REPLACED.
  2923.     MFLAST=3-MFLAST
  2924.     MFBASE=1024-MFBASE
  2925. C ***
  2926. C NOW MFID HAS MEMORY PAGE CURRENTLY PRESENT, IPAG IS DESIRED ONE FOR THIS
  2927. C FORMULA. NOTE WHILE WE USE A HASHCODE TO SEARCH FOR FORMULAS, ALL SEGMENTS
  2928. C OF A FORMULA MUST BE PLACED IN ONE MEMORY PAGE. THUS, IT IS POSSIBLE TO
  2929. C RUN OUT OF SPACE IF THE MEMORY BUFFER GETS TOO SMALL. CURRENT HASH
  2930. C CODE TRIES TO SPREAD THE FORMULAS OUT, BUT BIG MEMORY BUFFERS ALWAYS
  2931. C WIN.....
  2932.     IF(LPGMXF.LE.32)GOTO 2400
  2933. C WRITE WHATEVER'S IN MEMORY TO FILE AND READ THE NEW PAGE IN.
  2934. C    IBF=(1024+31)/32
  2935. C    IBF=32
  2936. C IBF IS BLK FACTOR
  2937.     L=1+MFBASE
  2938.     LLBK=(MFID(MFLAST)-1)*IBF+1
  2939.     LHBK=MFID(MFLAST)*IBF
  2940.     DO 2170 N=LLBK,LHBK
  2941.     IF(MFMOD(MFLAST).EQ.0)GOTO 2170
  2942.     LL=L+31
  2943.     WRITE(7,REC=N,ERR=2170)((IFID(K,KK),K=1,8),KK=L,LL)
  2944.     L=L+32
  2945. 2170    CONTINUE
  2946. C NOW READ IN THE DATA
  2947. C MARK NEW PAGE TOUCHED SINCE WE WILL DO SO HERE
  2948. C    MFMOD=1
  2949.     MFID(MFLAST)=IPAG
  2950.     L=1+MFBASE
  2951.     LLBK=(MFID(MFLAST)-1)*IBF+1
  2952.     LHBK=MFID(MFLAST)*IBF
  2953.     DO 2171 N=LLBK,LHBK
  2954.     LL=L+31
  2955.     READ(7,REC=N,ERR=2171)((IFID(K,KK),K=1,8),KK=L,LL)
  2956.     L=L+32
  2957. 2171    CONTINUE
  2958. C DATA ALL SHOULD BE THERE NOW... OK, GO AHEAD.
  2959. 2400    CONTINUE
  2960. C NOW HAVE THE DESIRED MEMORY PAGE; READ THE FORMULA INTO ARRAY
  2961. C BUFFER.
  2962.     MFMOD(MFLAST)=1
  2963.     IARSUB=1
  2964. C FOR SIMPLICITY FORGET THE HASHCODE WITHIN MEMORY BUFFERS, JUST SEARCH
  2965. C FROM START...
  2966. C OMIT THE ZEROING WHEN READING IN FROM FILE EXCEPT IN /MERGE MODE
  2967.     IF(NXINI.NE.0)GOTO 6233
  2968.     DO 1490 NN=1,1024
  2969.     N=MOD((NN+JHASH),1024)+1+MFBASE
  2970. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  2971.     KKKKK=IFID(1,N)
  2972.     IF(NN.GT.2.AND.KKKKK.EQ.-1)GOTO 6233
  2973. C SKIP ZEROING ONCE WE ENCOUNTER A VIRGIN CELL SINCE WE WOULD ALWAYS
  2974. C CLEAR TO NONVIRGIN STATUS AFTERWARDS.
  2975.     IF(KKKKK.NE.NREC)GOTO 1490
  2976. C ZERO OLD RECORDS OF THIS ONE...
  2977.     NCEL=NCEL-1
  2978.     IF(NCEL.LT.0)NCEL=0
  2979.     DO 1498 KK=1,8
  2980. 1498    IFID(KK,N)=0
  2981. 1490    CONTINUE
  2982. 6233    CONTINUE
  2983.     IFLAG=0
  2984.     DO 1500 NN=1,1024
  2985.     N=MOD((NN+JHASH),1024)+1+MFBASE
  2986. C    N=IMASK((NN+JHASH),1023)+1+MFBASE
  2987.     KKKKK=IFID(1,N)
  2988.     IF(KKKKK.NE.-1.AND.KKKKK.NE.0
  2989.      1     .AND.KKKKK.NE.NREC)GOTO 1500
  2990. C FOUND A NULL NODE...
  2991. C FILL IT IN NOW.
  2992.     NCEL=NCEL+1
  2993.     IFID(1,N)=NREC
  2994.     IFLAG=1
  2995.     LFID(4,N)=CHAR(IFMT)
  2996.     LFID(3,N)=CHAR(IFLAG)
  2997. c zero new elements to ensure no extra -1's get handled as
  2998. c data. Important because they could be mistaken for cell codings now.
  2999.     do 4502 k=1,12
  3000. 4502    lfid(k+4,n)=CHAR(0)
  3001.     DO 1502 K=1,12
  3002.     LI=ARRAY(IARSUB)
  3003.     IF(ICHAR(LI).LE.0)GOTO 1505
  3004. C CHOP IT OFF AT 109 ALSO...
  3005.     IF(IARSUB.GT.109)GOTO 1560
  3006.     LFID(K+4,N)=LI
  3007.     IARSUB=IARSUB+1
  3008. 1502    CONTINUE
  3009. C NONTERMINAL COPY...NEED ANOTHER CELL. FIRST TEST FOR EXACT FIT,
  3010. C HOWEVER.
  3011.     IF(ICHAR(ARRAY(IARSUB)).LE.0)GOTO 1560
  3012.     IFLAG=2
  3013.     LFID(3,N)=CHAR(IFLAG)
  3014. C NOW GO GET MORE SPACE FOR NEXT NODE.
  3015. C NOTE IT COULD RUN OUT, BUT JUST PUNT THAT.
  3016.     GOTO 1500
  3017. 1560    CONTINUE
  3018.     IF(IFLAG.EQ.1)IFLAG=3
  3019.     LFID(3,N)=CHAR(IFLAG)
  3020. C SETS UP EITHER 1 OR 3 FOR TERMINAL NODES
  3021.     GOTO 1505
  3022. C ESCAPE FROM LOOP ON ENDS...
  3023. 1500    CONTINUE
  3024. C HERE WE RAN OUT OF ROOM. TOO BAD...CAN'T REALLY HELP IT OR
  3025. C DO MUCH. JUST FORGET IT.
  3026. C HOWEVER, PRINT A MESSAGE ON SCREEN AT LEAST...
  3027.     CALL UVT100(1,1,1)
  3028.     CALL SWRT('Formula file overflowed. Try larger file.',41)
  3029. 1505    CONTINUE
  3030. C DONE NOW.
  3031.     GOTO 5000
  3032. 3000    CONTINUE
  3033. C OPEN (CLR BITMAP)
  3034.     MFID(1)=0
  3035.     MFID(2)=0
  3036.     MFBASE=0
  3037.     MFLAST=1
  3038.     GOTO 5000
  3039. 4000    CONTINUE
  3040. C CLOSE (CLR BITMAP)
  3041.     CLOSE(7,STATUS='DELETE')
  3042.     MFBASE=0
  3043.     MFLAST=1
  3044.     MFID(1)=0
  3045.     MFID(2)=0
  3046. 5000    RETURN
  3047.     END
  3048. c -h- xvblgt.f40    Fri Aug 22 13:45:23 1986    
  3049.         SUBROUTINE XVBLGT(ID1,ID2,XX)
  3050. C
  3051. C XVBLGT - LOAD 8 BYTES GIVEN DIMENSIONS FOR GETTING THEM
  3052. C 2 DIM ARRAY, DIM'D (60,301)
  3053.         InTeGer*4 ID1,ID2
  3054.         REAL*8 XX
  3055.     InTeGer*4 TYPE(1,1),VLEN(9)
  3056.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1),VT(8)
  3057.     REAL*8 XXV(1,1),XVT
  3058.     EQUIVALENCE(XVT,VT(1))
  3059.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  3060.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  3061.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  3062.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  3063. C ***<<<< RDD COMMON START >>>***
  3064.     InTeGer*4 RRWACT,RCLACT
  3065. C    COMMON/RCLACT/RRWACT,RCLACT
  3066.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  3067.      1  IDOL7,IDOL8
  3068. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  3069. C     1  IDOL7,IDOL8
  3070.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3071. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3072.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3073. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3074. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3075. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  3076.     InTeGer*4 KLVL
  3077. C    COMMON/KLVL/KLVL
  3078.     InTeGer*4 IOLVL,IGOLD
  3079. C    COMMON/IOLVL/IOLVL
  3080. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  3081. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  3082.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3083.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3084.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  3085. C ***<<< RDD COMMON END >>>***
  3086. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3087. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3088. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3089. C NEXT BITMAPS IMPLEMENT FVLD
  3090.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  3091.     CHARACTER*1 FVXX(6792)
  3092.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  3093.     EQUIVALENCE (FV4(1),FVXX(4529))
  3094.         Common/FVLDM/FVXX
  3095. c        COMMON/FVLDM/FV1,FV2,FV4
  3096.         CHARACTER*1 LBITS(8)
  3097.         COMMON/BITS/LBITS
  3098. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  3099. C TYPES OF AC'S STORAGE:
  3100.         CHARACTER*1 ITYP(2264),LWK
  3101.         InTeGer*4 IATYP(27)
  3102.     INTEGER*2 LL(4)
  3103.     REAL*8 XA
  3104.     EQUIVALENCE(LL(1),XA)
  3105.         COMMON/TYP/IATYP,ITYP
  3106. C ***<<< NULETC COMMON START >>>***
  3107.     InTeGer*4 ICREF,IRREF
  3108. C    COMMON/MIRROR/ICREF,IRREF
  3109.     InTeGer*4 MODPUB,LIMODE
  3110. C    COMMON/MODPUB/MODPUB,LIMODE
  3111.     InTeGer*4 KLKC,KLKR
  3112.     REAL*8 AACP,AACQ
  3113. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  3114.     InTeGer*4 NCEL,NXINI
  3115. C    COMMON/NCEL/NCEL,NXINI
  3116.     CHARACTER*1 NAMARY(20,301)
  3117. C    COMMON/NMNMNM/NAMARY
  3118.     InTeGer*4 NULAST,LFVD
  3119. C    COMMON/NULXXX/NULAST,LFVD
  3120.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  3121.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  3122. C ***<<< NULETC COMMON END >>>***
  3123. CCC    InTeGer*4 ICREF,IRREF
  3124. CCC    COMMON/MIRROR/ICREF,IRREF
  3125.         InTeGer*2 LVALBF(5,800)
  3126.         InTeGer*4 MPAG(2),MPMOD(2)
  3127.         COMMON/VB/MPAG,LVALBF,MPMOD
  3128. C
  3129. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  3130. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  3131. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  3132. C AREAS WITH DATA.
  3133. C ***<<< KLSTO COMMON START >>>***
  3134.     InTeGer*4 DLFG
  3135. C    COMMON/DLFG/DLFG
  3136.     InTeGer*4 KDRW,KDCL
  3137. C    COMMON/DOT/KDRW,KDCL
  3138.     InTeGer*4 DTRENA
  3139. C    COMMON/DTRCMN/DTRENA
  3140.     REAL*8 EP,PV,FV
  3141.     DIMENSION EP(20)
  3142.     INTEGER*4 KIRR
  3143. C    COMMON/ERNPER/EP,PV,FV,KIRR
  3144.     InTeGer*4 LASTOP
  3145. C    COMMON/ERROR/LASTOP
  3146.     CHARACTER*1 FMTDAT(9,76)
  3147. C    COMMON/FMTBFR/FMTDAT
  3148.     CHARACTER*1 EDNAM(16)
  3149. C    COMMON/EDNAM/EDNAM
  3150.     InTeGer*4 MFID(2),MFMOD(2)
  3151. C    COMMON/FRM/MFID,MFMOD
  3152.     InTeGer*4 JMVFG,JMVOLD
  3153. C    COMMON/FUBAR/JMVFG,JMVOLD
  3154.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  3155.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  3156. C ***<<< KLSTO COMMON END >>>***
  3157. CCC        CHARACTER*1 FMTDAT(9,76)
  3158. CCC        COMMON/FMTBFR/FMTDAT
  3159.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  3160. C AN ACCUMULATOR. GET IT.
  3161.     DO 7801 IV=1,8
  3162. 7801    VT(IV)=AVBLS(IV,ID1)
  3163.     XX=XVT
  3164.     RETURN
  3165. 7800    CONTINUE
  3166. C FILTER OUT TOO-LARGE ID1, ID2 THAT ARE "REFLECTED" UP
  3167. C        ID=(ID2-1)*60+ID1
  3168.     CALL REFLEC(ID2,ID1,ID)
  3169.         XX=0.
  3170. C NOTE THAT HERE IF FVLD IS 0, THIS MEANS RESULT IS 0 REGARDLESS OF
  3171. C OTHER STUFF...RETURN 0 IMMEDIATELY.
  3172. C NOTE TRICK CALL WHICH SIGNALS ANY INITIALIZATION GETS EVALUATED.
  3173.     CALL FVLDGT(ID,0,LWK)
  3174.     IF(ICHAR(LWK).EQ.0)RETURN
  3175. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  3176.     IBF=8
  3177. C    IBF=(800+49)/50/2
  3178. C    IF(IBF.LT.1)IBF=1
  3179. C
  3180. C    LLL=(IPGMAX*2)/IBF
  3181.     LLL=IPGMAX/4
  3182. C WAS IPGMAX*2
  3183.     IPM=LLL
  3184.     IF(IPM.LE.2)IPM=2
  3185.     IHASH=ID
  3186.         JHASH=MOD(IHASH,400)+1
  3187.     IF(IPGMOD.NE.0)GOTO 3402
  3188.         IPAG=(IHASH/400)+1
  3189.         IPAG=MOD(IPAG,IPM)+1
  3190.     GOTO 3403
  3191. 3402    CONTINUE
  3192. C SPEED-OPTIMIZING PACKING
  3193.     FPG=IPGMOD
  3194. C    IF(FPG.LE.0)FPG=FPG+65536.
  3195.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  3196.     IPAG=FPG
  3197.     IPAG=MOD(IPAG,IPM)
  3198.     IPAG=IPAG+1
  3199. C    IPAG=1+(IHASH*IPM)/18060
  3200. 3403    CONTINUE
  3201. C        IF(IPAG.LE.0)IPAG=1
  3202. C TAKE CARE OF EMPTY INITIAL BUFFER...
  3203.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 851
  3204.     IF(MPAG(1).NE.0)GOTO 850
  3205.     MPAG(1)=IPAG
  3206.     GOTO 851
  3207. 850    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  3208. 851    CONTINUE
  3209.     IF(MPAG(1).EQ.IPAG)GOTO 852
  3210.     IF(MPAG(2).NE.IPAG)GOTO 853
  3211. C MPAG(2)=IPAG
  3212.     MVLAST=2
  3213.     MVBASE=400
  3214.     GOTO 1000
  3215. 852    CONTINUE
  3216.     MVLAST=1
  3217.     MVBASE=0
  3218.     GOTO 1000
  3219. 853    CONTINUE
  3220. C SWITCH BUFFER USED LEAST RECENTLY
  3221.     MVLAST=3-MVLAST
  3222.     MVBASE=400-MVBASE
  3223. C
  3224. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  3225. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  3226. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  3227. C COMPILER AND MACHINE ALLOW.
  3228.     IF(IPGMAX.LE.8)GOTO 1000
  3229. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  3230. C TO DISK AND BRING IN THE ONE DESIRED.
  3231. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  3232.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  3233.         IRCHI=MPAG(MVLAST)*IBF
  3234.         L=1+MVBASE
  3235.         DO 500 N=IRCLO,IRCHI
  3236.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  3237.         LLL=L+49
  3238.         WRITE(13,REC=N,ERR=500)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  3239.         L=L+50
  3240. 500     CONTINUE
  3241.     MPMOD(MVLAST)=0
  3242. C MARK NEW PAGE UNMODIFIED IN THIS READ PROGRAM
  3243.         MPAG(MVLAST)=IPAG
  3244. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  3245.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  3246.         IRCHI=MPAG(MVLAST)*IBF
  3247.         L=1+MVBASE
  3248.         DO 501 N=IRCLO,IRCHI
  3249.         LLL=L+49
  3250.         READ(13,REC=N,END=501,ERR=501)((LVALBF(KKK,K),KKK=1,5),K=L,LLL)
  3251.         L=L+50
  3252. 501     CONTINUE
  3253. 1000    CONTINUE
  3254. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  3255. C SET THE VALUE INTO IT AS REQUIRED...
  3256. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  3257.         IH1=JHASH-1
  3258.         DO 2 MMN=JHASH,400
  3259.     N=MMN+MVBASE
  3260.     NN=N
  3261. C SKIP OUT IF WE SEE VIRGIN CELLS, LEAVING XX=0.
  3262.     KKKKK=LVALBF(1,N)
  3263.     IF(KKKKK.EQ.-1)GOTO 3332
  3264.         IF(KKKKK.EQ.ID)GOTO 4
  3265. 2       CONTINUE
  3266.         IF(IH1.LT.1)RETURN
  3267.         DO 3 MMN=1,IH1
  3268.     N=MMN+MVBASE
  3269. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  3270.     NN=N
  3271.     KKKKK=LVALBF(1,N)
  3272.     IF(KKKKK.EQ.-1)GOTO 3332
  3273.         IF(KKKKK.EQ.ID)GOTO 4
  3274. 3       CONTINUE
  3275. 3332    XX=0.
  3276.         RETURN
  3277. C RETURN IF CAN'T FIND VALUE...TOO BAD
  3278. 4       CONTINUE
  3279. C GET VALUE AS 4 16-BIT WORDS
  3280.         DO 5 M=1,4
  3281. 5       LL(M)=LVALBF(M+1,NN)
  3282.         XX=XA
  3283.         RETURN
  3284.         END
  3285. c -h- xvblst.f40    Fri Aug 22 13:45:23 1986    
  3286.         SUBROUTINE XVBLST(ID1,ID2,XX)
  3287. C
  3288. C XVBLST - STORE 8 BYTES IN VARIABLES ARRAY
  3289. C GIVEN DIMENSIONS FOR LOCATING THEM
  3290.         InTeGer*4 ID1,ID2
  3291.     InTeGer*4 TYPE(1,1),VLEN(9)
  3292.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1),VT(8)
  3293.     REAL*8 XVT
  3294.     EQUIVALENCE(VT(1),XVT)
  3295.     REAL*8 XXV(1,1)
  3296.     EQUIVALENCE(XXV(1,1),VBLS(1,1,1))
  3297.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  3298.         REAL*8 XX
  3299. C ***<<<< RDD COMMON START >>>***
  3300.     InTeGer*4 RRWACT,RCLACT
  3301. C    COMMON/RCLACT/RRWACT,RCLACT
  3302.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  3303.      1  IDOL7,IDOL8
  3304. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  3305. C     1  IDOL7,IDOL8
  3306.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3307. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3308.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3309. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3310. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3311. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  3312.     InTeGer*4 KLVL
  3313. C    COMMON/KLVL/KLVL
  3314.     InTeGer*4 IOLVL,IGOLD
  3315. C    COMMON/IOLVL/IOLVL
  3316. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  3317. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  3318.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3319.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3320.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  3321. C ***<<< RDD COMMON END >>>***
  3322. CCC        InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3323. CCC        COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3324. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3325. C NEXT BITMAPS IMPLEMENT FVLD
  3326.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  3327.     CHARACTER*1 FVXX(6792)
  3328.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  3329.     EQUIVALENCE (FV4(1),FVXX(4529))
  3330.         Common/FVLDM/FVXX
  3331. c        COMMON/FVLDM/FV1,FV2,FV4
  3332.         CHARACTER*1 LBITS(8)
  3333.         COMMON/BITS/LBITS
  3334. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  3335. C TYPES OF AC'S STORAGE:
  3336.         CHARACTER*1 ITYP(2264)
  3337. C ***<<< NULETC COMMON START >>>***
  3338.     InTeGer*4 ICREF,IRREF
  3339. C    COMMON/MIRROR/ICREF,IRREF
  3340.     InTeGer*4 MODPUB,LIMODE
  3341. C    COMMON/MODPUB/MODPUB,LIMODE
  3342.     InTeGer*4 KLKC,KLKR
  3343.     REAL*8 AACP,AACQ
  3344. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  3345.     InTeGer*4 NCEL,NXINI
  3346. C    COMMON/NCEL/NCEL,NXINI
  3347.     CHARACTER*1 NAMARY(20,301)
  3348. C    COMMON/NMNMNM/NAMARY
  3349.     InTeGer*4 NULAST,LFVD
  3350. C    COMMON/NULXXX/NULAST,LFVD
  3351.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  3352.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  3353. C ***<<< NULETC COMMON END >>>***
  3354. CCC    InTeGer*4 ICREF,IRREF
  3355. CCC    COMMON/MIRROR/ICREF,IRREF
  3356.         InTeGer*4 IATYP(27)
  3357.         COMMON/TYP/IATYP,ITYP
  3358. C
  3359. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  3360. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  3361. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  3362. C AREAS WITH DATA.
  3363.         CHARACTER*1 LLTST
  3364. C ***<<< KLSTO COMMON START >>>***
  3365.     InTeGer*4 DLFG
  3366. C    COMMON/DLFG/DLFG
  3367.     InTeGer*4 KDRW,KDCL
  3368. C    COMMON/DOT/KDRW,KDCL
  3369.     InTeGer*4 DTRENA
  3370. C    COMMON/DTRCMN/DTRENA
  3371.     REAL*8 EP,PV,FV
  3372.     DIMENSION EP(20)
  3373.     INTEGER*4 KIRR
  3374. C    COMMON/ERNPER/EP,PV,FV,KIRR
  3375.     InTeGer*4 LASTOP
  3376. C    COMMON/ERROR/LASTOP
  3377.     CHARACTER*1 FMTDAT(9,76)
  3378. C    COMMON/FMTBFR/FMTDAT
  3379.     CHARACTER*1 EDNAM(16)
  3380. C    COMMON/EDNAM/EDNAM
  3381.     InTeGer*4 MFID(2),MFMOD(2)
  3382. C    COMMON/FRM/MFID,MFMOD
  3383.     InTeGer*4 JMVFG,JMVOLD
  3384. C    COMMON/FUBAR/JMVFG,JMVOLD
  3385.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  3386.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  3387. C ***<<< KLSTO COMMON END >>>***
  3388. CCC        COMMON/FMTBFR/FMTDAT
  3389.         InTeGer*2 LVALBF(5,800)
  3390.         InTeGer*4 MPAG(2),MPMOD(2)
  3391.         COMMON/VB/MPAG,LVALBF,MPMOD
  3392.     InTeGer*4 MFLAST,MFBASE,MVLAST,MVBASE
  3393.     COMMON/VBCTL/MFLAST,MFBASE,MVLAST,MVBASE
  3394.         InTeGer*2 LL(4)
  3395.         REAL*8 XA
  3396.         EQUIVALENCE(XA,LL(1))
  3397. CCC    InTeGer*4 NCEL,NXINI
  3398. CCC    COMMON/NCEL/NCEL,NXINI
  3399.     IF(ID1.GT.27.OR.ID2.GT.1)GOTO 7800
  3400. C AN ACCUMULATOR. SET IT.
  3401.     XVT=XX
  3402.     DO 7801 IV=1,8
  3403. 7801    AVBLS(IV,ID1)=VT(IV)
  3404.     RETURN
  3405. 7800    CONTINUE
  3406. C        ID=(ID2-1)*60+ID1
  3407.     CALL REFLEC(ID2,ID1,ID)
  3408. C SET UP HASH CODE NOW FOR THE WAY WE NEED...
  3409. C       IPM=(IPGMAX*200/800)
  3410.     IF(ID.LE.0)RETURN
  3411. C CALL FVLDGT TO TELL IF ANYTHING IS SET FOR THE CELL...
  3412.     CALL FVLDGT(ID1,ID2,LLTST)
  3413.     IF(ICHAR(LLTST).NE.0)GOTO 3419
  3414.     CALL FVLDST(ID1,ID2,Char(252))
  3415. c 252 = -4 to 8 bits
  3416. C TRICK ... SET UP SIGN BIT IN FVLD SO XVBLGT CAN FIND OUT IF
  3417. C VARIABLE HAS EVER BEEN WRITTEN AND EXIT IF NOT. INDEPENDENT OF
  3418. C USUAL SETTING OF FVLD SINCE IT USES "SIGN" BIT ONLY.
  3419. 3419    CONTINUE
  3420.     IBF=8
  3421. C    IBF=(800+49)/50/2
  3422. C    IF(IBF.LT.1)IBF=1
  3423.     LLL=IPGMAX/4
  3424. C 4000 BYTES PER BUFFER (400 CELLS AT 10 PER CELL)
  3425. C    LLL=(IPGMAX*2)/IBF
  3426. C WAS IPGMAX*2
  3427.     IPM=LLL
  3428.     IF(IPM.LE.2)IPM=2
  3429.     IHASH=ID
  3430.         JHASH=MOD(IHASH,400)+1
  3431.     IF(IPGMOD.NE.0)GOTO 3400
  3432. C SPACE-OPTIMIZING PACKING
  3433.         IPAG=(IHASH/400)+1
  3434.         IPAG=MOD(IPAG,IPM)+1
  3435.     GOTO 3401
  3436. 3400    CONTINUE
  3437. C SPEED-OPTIMIZING PACKING
  3438.     FPG=FLOAT(IPGMOD)
  3439. C    IF(FPG.LE.0.)FPG=FPG+65536.
  3440.     FPG=FLOAT(IHASH)*FLOAT(IPM)/FPG
  3441.     IPAG=FPG
  3442.     IPAG=MOD(IPAG,IPM)
  3443.     IPAG=IPAG+1
  3444. C    IPAG=1+(IHASH*IPM)/18060
  3445. 3401    CONTINUE
  3446. C        IF(IPAG.LE.0)IPAG=1
  3447.     IF(IPAG.EQ.MPAG(1).OR.IPAG.EQ.MPAG(2))GOTO 850
  3448.     IF(MPAG(1).NE.0)GOTO 851
  3449.     MPAG(1)=IPAG
  3450.     GOTO 850
  3451. 851    IF(MPAG(2).EQ.0)MPAG(2)=IPAG
  3452. 850    CONTINUE
  3453.     IF(MPAG(1).EQ.IPAG)GOTO 852
  3454.     IF(MPAG(2).NE.IPAG)GOTO 853
  3455. C MPAG(2) = IPAG
  3456.     MVLAST=2
  3457.     MVBASE=400
  3458.     GOTO 1000
  3459. 852    CONTINUE
  3460.     MVLAST=1
  3461.     MVBASE=0
  3462.     GOTO 1000
  3463. 853    CONTINUE
  3464. C NEED NEW PAGE. FIX TO USE LEAST RECENTLY USED PAGE FOR SWAPOUT.
  3465.     MVLAST=3-MVLAST
  3466. C MVLAST = 1 OR 2
  3467.     MVBASE=400-MVBASE
  3468. C MVBASE = 0 OR 400. INITIALLY 0.
  3469. C        IF(MPAG.EQ.0)MPAG=IPAG
  3470. C THE ABOVE ACCOUNTS FOR MEMORY FREE... WE TREAT FILE AS IPM
  3471. C "PAGES" THE SIZE OF THE MEMORY AREA EACH. THIS MAKES IT RELATIVELY
  3472. C EASY TO ALTER THE PROGRAM TO HANDLE MORE MEMORY TO THE EXTENT THE
  3473. C COMPILER AND MACHINE ALLOW.
  3474.     IF(IPGMAX.LE.8)GOTO 1000
  3475. C IF HERE, WE NEED A PAGE NOT IN MEMORY. SWAP THE CURRENT MEMORY PAGE
  3476. C TO DISK AND BRING IN THE ONE DESIRED.
  3477. C FILES ARE OPENED ALREADY HERE... USE LUN 9 HERE.
  3478.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  3479.         IRCHI=MPAG(MVLAST)*IBF
  3480.         L=1+MVBASE
  3481.         DO 500 N=IRCLO,IRCHI
  3482.     IF(MPMOD(MVLAST).EQ.0)GOTO 500
  3483.         LLL=L+49
  3484.         WRITE(13,REC=N,ERR=500)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  3485.         L=L+50
  3486. 500     CONTINUE
  3487. C MARK NEW PAGE MODIFIED SINCE WE WILL TOUCH IT HERE
  3488.     MPMOD(MVLAST)=1
  3489.         MPAG(MVLAST)=IPAG
  3490. C NOW READ IN THE DESIRED RECORD, HAVING SET THE DESIRED IN-MEMORY FLAG
  3491.         IRCLO=(MPAG(MVLAST)-1)*IBF+1
  3492.         IRCHI=MPAG(MVLAST)*IBF
  3493.         L=1+MVBASE
  3494.         DO 501 N=IRCLO,IRCHI
  3495.         LLL=L+49
  3496.         READ(13,REC=N,END=501,ERR=501)((LVALBF(KK,K),KK=1,5),K=L,LLL)
  3497.         L=L+50
  3498. 501     CONTINUE
  3499. 1000    CONTINUE
  3500. C NOW THE PAGE NEEDED IS IN MEMORY (OR MAY HAVE BEEN ALL ALONG)
  3501. C SET THE VALUE INTO IT AS REQUIRED...
  3502. C NOW START LOOKING AT HASH ADDRESS FOR VARIABLE...LINEAR SEARCH AFTERWARDS
  3503.     MPMOD(MVLAST)=1
  3504.     IF(NXINI.NE.0)GOTO 111
  3505.         IH1=JHASH-1
  3506.         DO 1 MMN=JHASH,400
  3507.     N=MMN+MVBASE
  3508. C WHILE ZEROING THE ARRAY, START AT THE HASH ADDRESS AND STOP THE ZEROING
  3509. C ONCE WE ENCOUNTER A VIRGIN RECORD. THIS WILL HOPEFULLY REDUCE OVERALL
  3510. C TIME MOST TIMES FOR ZEROING THE ARRAY.
  3511.     KKKKK=LVALBF(1,N)
  3512.     IF(KKKKK.EQ.-1)GOTO 111
  3513.         IF(KKKKK.NE.ID)GOTO 1
  3514. C ZERO ALL REFS TO THIS CELL WE'RE ABOUT TO WRITE.
  3515. C **** THIS IS QUITE TIME CONSUMING... OMIT IF POSSIBLE...
  3516.         LVALBF(1,N)=0
  3517. 1       CONTINUE
  3518.         IF(IH1.LT.1)RETURN
  3519.         DO 33 MMN=1,IH1
  3520.     N=MMN+MVBASE
  3521.     NN=N
  3522.     KKKKK=LVALBF(1,N)
  3523.     IF(KKKKK.EQ.-1)GOTO 111
  3524.         IF(KKKKK.NE.ID)GOTO 33
  3525.     LVALBF(1,N)=0
  3526. 33    CONTINUE
  3527. 111    CONTINUE
  3528. C SINCE ZERO VALUES ARE RETURNED BY DEFAULT, DON'T BOTHER STORING THEM
  3529.     IF(XX.EQ.0.)RETURN
  3530.         IH1=JHASH-1
  3531.         DO 2 MMN=JHASH,400
  3532.     N=MMN+MVBASE
  3533.     NN=N
  3534.     KKKKK=LVALBF(1,N)
  3535.     IF(KKKKK.EQ.-1)GOTO 4
  3536.         IF(KKKKK.EQ.0)GOTO 4
  3537.     IF(KKKKK.EQ.ID)GOTO 4
  3538. 2       CONTINUE
  3539.         IF(IH1.LT.1)RETURN
  3540.         DO 3 MMN=1,IH1
  3541.     N=MMN+MVBASE
  3542.     NN=N
  3543. C LOOK BEFORE THE HASHCODE IF NO FREE CELLS AFTER IT.
  3544.     KKKKK=LVALBF(1,N)
  3545.     IF(KKKKK.EQ.-1)GOTO 4
  3546.         IF(KKKKK.EQ.0)GOTO 4
  3547.     IF(KKKKK.EQ.ID)GOTO 4
  3548. 3       CONTINUE
  3549. C TELL USER VALUE AREA OVERFLOWED, USING ROW 1 END
  3550.     CALL UVT100(1,1,1)
  3551.     CALL SWRT('Value Table Storage overflowed. Try larger file.',48)
  3552.         RETURN
  3553. C RETURN IF CAN'T FIND VALUE...TOO BAD
  3554.  
  3555. 4       CONTINUE
  3556. C SAVE VALUE AS 4 16-BIT WORDS
  3557.         XA=XX
  3558. C SAVE ID AND VALUE IN CELL...
  3559.     LVALBF(1,NN)=ID
  3560.         DO 5 M=1,4
  3561. 5       LVALBF(M+1,NN)=LL(M)
  3562.         RETURN
  3563.         END
  3564. c -h- zero.for    Fri Aug 22 13:46:23 1986    
  3565.     SUBROUTINE ZERO
  3566. C COPYRIGHT (C) 1983 GLENN EVERHART
  3567. C ALL RIGHTS RESERVED
  3568. C 60=MAX REAL ROWS
  3569. C 301=MAX REAL COLS
  3570. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3571. C VBLS AND TYPE DIMENSIONED 60,301
  3572. C **************************************************
  3573. C *                                                *
  3574. C *         SUBROUTINE  ZERO                       *
  3575. C *                                                *
  3576. C **************************************************
  3577. C
  3578. C
  3579. C
  3580. C  ZEROS OUT ALL VARIABLES EXCEPT %
  3581. C
  3582. C
  3583. C ZERO CALLS IABS
  3584. C
  3585. C
  3586. C ZERO IS CALLED BY CMND
  3587. C
  3588. C
  3589. C
  3590. C   VARIABLE    USE
  3591. C
  3592. C      I      POINTS TO VARIABLE
  3593. C      J      INDEXES DOWN ELEMENTS OF A VARIABLE
  3594. C
  3595. C
  3596. C
  3597. C    SUBROUTINE ZERO
  3598. C
  3599.     InTeGer*4  TYPE(1,1),VLEN(9)
  3600. C
  3601.     CHARACTER*1  AVBLS(20,27)
  3602.     CHARACTER*1 VBLS(8,1,1)
  3603. C
  3604.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  3605. C
  3606. C
  3607. C
  3608. C JUST ZERO THE ACCUMULATORS HERE ... LEAVE REGULAR SHEET STUFF ALONE.
  3609. C    TYPE(1,1)=IABS(TYPE(1,1))
  3610.     VBLS(1,1,1)=0
  3611. C ZERO OUT ACCUMULATORS
  3612.     DO 1 I=1,27
  3613.     DO 1 J=1,20
  3614. 1    AVBLS(J,I)=0
  3615.     RETURN
  3616.     END
  3617. c -h- zneg.for    Fri Aug 22 13:46:23 1986    
  3618.     INTEGER FUNCTION ZNEG(INDXX)
  3619. C COPYRIGHT (C) 1983 GLENN EVERHART
  3620. C ALL RIGHTS RESERVED
  3621. C 60=MAX REAL ROWS
  3622. C 301=MAX REAL COLS
  3623. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3624. C VBLS AND TYPE DIMENSIONED 60,301
  3625. C **************************************************
  3626. C *                                                *
  3627. C *        InTeGer*4 FUNCTION ZNEG(INDXX)          *
  3628. C *                                                *
  3629. C **************************************************
  3630. C
  3631. C DETERMINES IF VARIABLE POINTED TO BY INDXX IS ZERO OR NEGATIVE
  3632. C OR UNDEFINED AS OPPOSED TO BEING DEFINED AND POSITIVE
  3633. C
  3634. C     RETURNS      1   IF TRUE (ZERO OR NEGATIVE OR UNDEFINED)
  3635. C                  0   IF FALSE (POSITIVE)
  3636. C
  3637. C ZNEG CALLS ERRMSG TO PRINT ERROR MESSAGES.
  3638. C
  3639. C ZNEG IS CALLED BY CALC AND CMND.
  3640. C
  3641. C   VARIABLE       USE
  3642. C
  3643. C     INDXX      POINTER TO VARIABLE BEING TESTED
  3644. C     I,K        HOLDS TEMPORARY VALUES
  3645. C     ZNEG       RETURN VALUE
  3646. C     INT        HOLD INTEGER*4 VALUES
  3647. C     REAL       HOLD REAL*8 VALUES
  3648. C
  3649. C
  3650. C
  3651. C    INTEGER FUNCTION ZNEG*4(INDXX)
  3652.     REAL*8 REAL
  3653. C
  3654.     INTEGER*4 INT
  3655. C
  3656.     InTeGer*4 TYPE(1,1),VLEN(9),INDXX
  3657. C
  3658.     CHARACTER*1 AVBLS(20,27),FOUR(4),EIGHT(8)
  3659.     CHARACTER*1 VBLS(8,1,1)
  3660. C
  3661.     EQUIVALENCE (EIGHT,REAL),(FOUR,INT)
  3662. C
  3663.     COMMON/V/ TYPE,AVBLS,VBLS,VLEN
  3664. C
  3665. C DEFAULT SETTING OF TRUE
  3666.     ZNEG=1
  3667.     CALL TYPGET(INDXX,1,K)
  3668. C    K=TYPE(INDXX,1)
  3669.     IF(K.GT.0)GO TO 50
  3670. C
  3671. C VARIABLE UNDEFINED
  3672.     CALL UVT100(1,1,1)
  3673.     CALL SWRT('Undefined Vbl',13)
  3674. C    CALL ERRMSG(16)
  3675.     GO TO 10000
  3676. C
  3677. 50    GOTO(100,200,300,300,400,400,400,300,200),K
  3678.     STOP 50
  3679. C
  3680. C ASCII
  3681. 100    IF(AVBLS(1,INDXX).LE.0)GO TO 10000
  3682.     GO TO 9998
  3683. C
  3684. C DECIMAL AND REAL
  3685. 200    DO 210 I=1,8
  3686. 210    EIGHT(I)=AVBLS(I,INDXX)
  3687.     IF(REAL.LE.0.D0)GO TO 10000
  3688.     GO TO 9998
  3689. C
  3690. C INTEGER, HEX, AND OCTAL
  3691. 300    DO 310 I=1,4
  3692. 310    FOUR(I)=AVBLS(I,INDXX)
  3693.     IF(INT.LE.0)GO TO 10000
  3694.     GO TO 9998
  3695. C
  3696. C MULTIPLE PRECISION
  3697. 400    IF(ICHAR(AVBLS(20,INDXX)).NE.0) GOTO 10000
  3698.     GO TO 9998
  3699. C
  3700. 9998    ZNEG=0
  3701. 10000    RETURN
  3702.     END
  3703.