Program also reads Real Time Clock, System Software Clock, Printer Port Status signals by direct hardware access. Certain Interrupt Controller Channels (timer tick, keyboard input) are temporarily disabled to insure timing accuracy. Software timing loops are calibrated against real time and so become hardware-independent.
Operation is automatic (mode 0) by default. Other manually selectable modes:
In the following listing, many of the two-character variable names and all numeric labels are still testimony of the original Tandy program version, carried into the PC world unchanged (and bugless!)
For unresolved problems with our server(s), the following listing may appear incomplete
CONST Version$ = "9.1.06(VF2WD)"
'9.1.06: VF2WD: wavelength calib 2005, new coef for useT2,etc..
'18.11.05 RS plot for monit
'9.11.05 count number Z% shown in monit mode
'28.9.05 NeJu%=0 para usar lampara Ne Juergen
'22.9.05 new label "rpt" for manually choosing new option. AT OWN RISK!
'21.9.05 spcfiles (s*.dat) van al \dat; no more than mxspc% are produced
'22.09.04: new limits defined
'25.03.02: 2nd measT2 per block now #7 and #14
'01.11.01: mean%=0 in dark1; monit2 entry if DT, DST modified
'31.10.01: replaced strg comparison (HVon$, Eve$, etc.) by numerics...
'31.10.01: version tested with JMPQ version
'30.10.01: NeJu%=-1, default; varios ajustes (ver "Datos Bicho 2001")
'28.08.01: Obtoff or HVoff status check at entry of subroutines
' spcfile named correctly
'10.8.01: atras, a los viejos W's hasta se resuelve el prob de los "anchos"
'09.8.01: IF SD > SX OR AC > -330 ... instead of -350
'16.1.01: updated W(); Empty line in log at start, etc.
'02.01.01, VT: Fd updated for each OH pkseekd
'02.01.01: with SPCFILE, etc. 6.1.1: par, par() faltaba
'28.12.00: P0% & constant term ref(T2) updated; ESC logged with date and time
'02.10.99; P0% = 0; "shut" repl by "shutter"
'28.9.99: update "14.9.99(VF2VO)" to include dif F2VN home/hill
'21.5.99: "autosamp" for mode 0
'14.9.99 all HV/obt status changes to LOG
'9.9.99 reordered instructions prior to "START!"; plotRot with LINE
'8.9.99 jm corregido; first REF & P0% to log file; routine CHKDARK
'7.9.99: rutina de backlash (juego muerto, op 7); falta updateo 17.5.99
'02.9.99: VF2VO: reemplazado 2 stops del programa por GOTO emergexit,
' para una salida segura. ESCAPE in log.
'30.4.99: algunos comentarios de peligro... M$(0)="auto sampling"
'13.4.99: improved P6vsT2 coeffs for useT2 (based on -8.8...18degC)
'13.4.99: display BUG in 8170 removed: edge values displayed correctly
'11.4.99: T2av log format
'9.4.99: HVoff after night with cap on
' T2av is always output instead of T2
'other previous versions: see older MED.BAS versions!
dark = -50 'dark count criterion dummy init
tdark = -2000
CONST bas% = &H237, bitT1% = 1, bitT2% = 128, ovfl% = 4, L100% = 100
CONST adi1% = bas% + 1, adi2% = bas% + 2, adi3% = bas% + 4, adi4% = bas% + 3
CONST ado1% = bas% + 1, ado2% = bas% + 3, adostp% = bas% + 2
CONST obtoff% = 128, nofchg% = 64, HVEN% = 8, cstart% = 16, rdy% = 64
CONST obtEN% = 255 - obtoff, fchg% = 255 - nofchg, HVoff% = 255 - HVEN, rst% = 255 - cstart
CONST tpd& = 1573040
CONST ticfr# = tpd / 24 / 3600 '18.2 Hz
CONST cspt! = 100 / ticfr 'centiseconds per tick
CONST bda% = &H408 'BIOS data area address
CONST uplim% = 2, lolim% = 4, bolim% = uplim OR lolim, prdy% = 88'printer ready status
DEFINT I-J
ON ERROR GOTO repair
DIM scsc AS STRING * 2, ssec AS STRING * 2, smin AS STRING * 2, shou AS STRING * 2
DIM sday AS STRING * 2, smon AS STRING * 2
DIM CJ AS INTEGER, CR AS INTEGER
DIM wx(13), wy(13)
wx(0) = 618: wy(0) = 186'for Amiga
wx(1) = 319: wy(1) = 199: wx(2) = 639: wy(2) = 199: wx(3) = 719: wy(3) = 347
wx(4) = 639: wy(4) = 399: wx(7) = 319: wy(7) = 199: wx(8) = 639: wy(8) = 199
wx(9) = 639: wy(9) = 349: wx(10) = 639: wy(10) = 349: wx(11) = 639
wy(11) = 479: wx(12) = 639: wy(12) = 479: wx(13) = 319: wy(13) = 199
REDIM DD(5, 1000)
DIM C1(1), C2(1), K1(1), K2(1), ICLOH!(1), ICLO2!(1)
DIM CNO2(1), KNO2(1), ICO2!(1), CNOH(1), KNOH(1), ICOH!(1)
hz% = 20: hz0% = 1: ix = -1: T2av = 999
WIDTH LPRINT 255: dire$ = "c:\binary"
lgd$ = "c:\log\": flog$ = lgd$ + "medir.log"
DIM m$(7): m$(1) = "sampling": m$(0) = "autosamp": m$(2) = "monitoring"
m$(3) = "Neon peaks": m$(4) = "spectrum": m$(5) = "narrow scan"
m$(6) = "OH peaks": m$(7) = "backlash"
DIM LI$(4): LI$(2) = "upper": LI$(4) = "lower"
DIM dow$(7): dow$(1) = "dom": dow$(2) = "lun": dow$(3) = "mar"
dow$(4) = "mie": dow$(5) = "jue": dow$(6) = "vie": dow$(7) = "sab"
st$ = STRING$(11, 42): B6$ = SPACE$(6): B8$ = SPACE$(8): c$ = "COUNT"
L$ = "LIMIT": O$ = "OKAY": F$ = "FILTER ": S$ = "STEPS FROM "
LF% = 14: P0% = 0
DIM S(L100), W(LF%): DT = 5: DTDEF% = 20: back2def% = 20: SX = .005
V% = 9: EM% = 14: Z% = 1: LI% = 0: Tsw = -28: TT = Tsw: LN% = 40
PF% = P0% + 4960
LX% = PF% + 10
SS = 0: DIM K(LF%, 1, 1), prf%(1)
ctspc% = 0: mxspc% = 14
hou0% = -1: day0% = -1: stCO% = -1: stHV% = -1: stobt% = -1
factT1 = 106.987: CO% = 4: sal1% = 255: sal2% = 255
OPEN "c:\frar.bat" FOR OUTPUT AS #1
PRINT #1, "@echo off"
CLOSE #1
OUT &H21, 0 'all hardware interrupts active
DEF SEG = 0: prp% = PEEK(bda) + 256 * PEEK(bda + 1) + 1
CLS 'prp% is printer port status address
vid% = PEEK(&H410) AND &H30
IF vid% = 0 THEN
PRINT "EGA(?)"
IF PEEK(&H487) <> 0 OR PEEK(&H488) <> 0 THEN mode% = 11
END IF
IF vid% = 16 THEN mode% = 1
IF vid% = 32 THEN mode% = 2
IF vid% = 48 THEN mode% = 3
SCREEN mode%
Trang = 210 'rot Temp range, vertical
RSmax = 250
T11 = -45: TO1 = 50: TH1 = 120'lower border
T10 = 30: Tr0(1) = TO1 + Trang: Tr0(0) = TH1 + Trang 'upper border
T1sc = wy(mode%) / (T11 - T10)
Trsc = -wy(mode%) / Trang 'rot temp scale factor for plot
RSsc = -wy(mode%) / RSmax
sal1% = sal1% AND HVoff
GOSUB OUT1: tHV = TIMER 'shutter and HV off by default
GOSUB recd
entry:
IF COMMAND$ = "" THEN
GOSUB newsc
inco: INPUT "COUNT GATE (CO%; 0-7)"; CO%: IF CO% > 7 THEN GOTO inco
INPUT "1-norm, 2-monit, 3-Ne peaks, 4-spect, 5-monoc, 6-OH peaks, 7-juego muerto "; op%
ELSE
log$ = "Automatic program start " + DATE$ + " " + TIME$
END IF
GOSUB rstcnt: GOSUB stcnt
GOSUB initvar1
IF log$ <> "" THEN GOSUB recd
log$ = "Program version V." + Version + ", with P0 =" + STR$(P0%)
del& = 7: GOSUB delay 'init math routines insures correct timing
j1:
OUT &H21, 3
GOSUB inicl: OUT &H70, 0: sec% = INP(&H71)
IF sec% < 89 THEN
IF (sec% AND 15) <> 9 THEN sec% = sec% + 1 ELSE sec% = sec% + 7
ELSE 'BCD coded seconds treated as if binary
sec% = 0
END IF
del& = 200000: GOSUB caldel 'del& must be beyond reach during caldel
IF K& = del& + 1 THEN PRINT "machine too fast / RTC clock too slow"
lpms = K& / 1000: PRINT USING "###.# loops per msec "; lpms; : OUT &H21, 0
log$ = log$ + B6$ + STR$(lpms) + " loops per msec": GOSUB recd
del2& = 2.4 * lpms: del1& = 2 * del2&
IF lpms < 3 THEN
LOCATE 12, 40: PRINT "machine too slow!": SOUND 1500, 10
del& = 3000 * lpms: GOSUB delay
END IF
GOSUB recd
CV% = CO%: LOCATE 12, 35: PRINT "V."; Version;
LZ% = 2 * LE% + 2
DIM a(6, 3), G%(3), R(EM%), P(EM%), V(V%), E(L100 + 1, EM%), D(LZ% * 14 + 1)
GOSUB chkflt
IF op% = 0 THEN
IF filt% = 3 THEN GOSUB fchg
IF filt% = 1 THEN GOSUB fchg 'try to get F2
IF filt% = 3 THEN log$ = "WRONG " + F$ + "!!!": GOSUB recd 'if power off
END IF
GOSUB initvar2
GOSUB acqT1
IF (erc% AND 16) = 16 THEN FOR i = 1 TO V% - 1: V(i) = 400: NEXT: GOTO normin
FOR i = 1 TO V% - 2: GOSUB acqT1: NEXT
GOSUB evalT1: IF op% <> 2 AND op% <> 0 THEN GOSUB HVdel: GOSUB obtdel 'peligro!
normin: GOSUB newsc: G% = 0
GOSUB acqT1: GOSUB evalT1: LOCATE 1, 1: PRINT CR + 32768!; CJ + 32768!; P, B8$
GOSUB hotPM: GOSUB sync
IF op% = 2 THEN GOTO monit
log$ = CHR$(18) + CHR$(14) + "DATE: " + dat$ + LEFT$(TIME$, 5) + CHR$(15) + " " + m$(op%)
GOSUB recd
SP = 4800: IF MT% = 0 THEN GOSUB range ELSE GOSUB verirep
GOSUB recd
IF MT% = -1 THEN
IF op% = 0 THEN
log$ = log$ + " MOTOR OFF ": GOSUB recd
DT = 45
GOTO monit2 'no trucho sampling in auto mode
END IF
END IF
IF op% <= 1 THEN GOTO 2600
IF op% = 2 THEN GOTO monit
IF op% = 3 THEN GOTO neon
IF op% = 4 THEN LE% = 100: GOTO 2600
IF op% = 5 THEN LE% = 100: GOTO monoc
IF op% = 6 THEN GOTO neon
IF op% = 7 THEN GOTO juego
PRINT "illegal mode"; op%: END
2600 RF% = prf%(filn%)
IF filn% = 0 THEN S0 = K(RF%, 0, 0) ELSE S0 = 0
GOSUB measT2: Q = T2: GOSUB measT2
IF ABS(T2 - Q) > .15 THEN GOTO 2600 ELSE T2 = (T2 + Q) / 2
LOCATE 1, 1: PRINT SPACE$(160); : stCO% = -1: stHV% = -1: stobt% = -1
IF MT% = -1 THEN log$ = log$ + " MOTOR OFF": GOSUB recd
CO% = CV%
log$ = "CO=" + STR$(CO%) + " T1=" + STR$(PC) + " T2=" + STR$(INT(T2av * 100) / 100) + " "
IF op% > 0 THEN GOTO sigamos
GOSUB getsun
hora = TIMER
IF (hora < Eve) AND (hora > Morn) THEN
GOSUB obtoff
IF hora < HVtime THEN GOSUB HVoff 'added for early morning HV cutoff
log$ = log$ + " waiting for the night... " + Eve$ + " - " + Morn$: GOSUB recd
GOTO monit
END IF
IF (sal1% AND HVEN) <> HVEN THEN GOTO monit
GOSUB useT2: cryf% = 0
IF (sal1% AND obtoff) = obtoff THEN
GOSUB chkdark
GOSUB obtdel
log$ = log$ + TIME$ + ": sera no necesario? ": GOSUB recd
END IF
sigamos:
GOSUB sync
log$ = log$ + shou + ":" + smin + ":" + ssec: GOSUB recd
IF LE% < 30 THEN
acpt% = -2: psea% = 0: DP = 0: SD = 0: AC = 0: GOSUB 8270
pk% = 7: GOSUB chksig
IF ZA < 3 * dark THEN GOTO monit
ELSE
IF op% = 4 THEN
S(1) = 200 '150'20
FOR i = 2 TO LE%
NON% = 100 - INT(S(i - 1) * .0165): S(i) = S(i - 1) + NON%
NEXT
END IF
END IF
ID = 4: Z% = 1
D(1) = 1: D(0) = 100 * Z(6) + Z(7) + .01 * Z(4)
lote:
IF op% < 2 THEN
hora$ = TIME$: hora = TIMER
IF (hora > Morn) AND (hora < Eve) THEN
GOSUB obtoff
log$ = log$ + " SUNRISE! " + hora$ + ", " + sday + "." + smon + "." + yea$
GOSUB recd: GOTO fin
END IF
END IF
IF LE% < 30 THEN
EM% = 2: LOCATE 1, 72: PRINT D(1);
IF LI% = 0 THEN
IF Z% = 1 THEN
IF (INP(prp%) AND 120) = prdy THEN
LPRINT CHR$(15); "TIME";
FOR i = 1 TO LE%: LPRINT TAB(12 * i); S(i); : NEXT
LPRINT TAB(105); "TEMP.OH"; TAB(117); "TEMP.O2";
LPRINT CHR$(18); CHR$(14); USING " ## "; D(1);
LPRINT CHR$(15)
del& = 1000 * lpms: GOSUB delay
END IF
CO% = CV%
END IF
END IF
ELSE
EM% = 14
END IF
GOSUB acqT1: GOSUB evalT1: GOSUB hotPM
IF LE% < 30 THEN LOCATE 1, 76: PRINT LI% + 1
FOR ID = LE% TO 1 STEP -1: SP = S(ID): GOSUB sample: NEXT
IF LE% >= 30 THEN LOCATE 1, 76: PRINT Z% + 1
GOSUB evalT1: GOSUB hotPM
Z% = Z% + 1: IF Z% > EM% THEN GOSUB evalote
FOR ID = 1 TO LE%: SP = S(ID): GOSUB sample: NEXT
IF LE% >= 30 THEN LOCATE 1, 76: PRINT Z% + 1
GOSUB evalT1: GOSUB hotPM
Z% = Z% + 1: IF Z% > EM% THEN GOSUB evalote
GOTO lote
evalote: FOR ID = 1 TO LE%: GOSUB aveE: NEXT
GOSUB csec
FOR i = 1 TO LE%
IF LE% < 30 THEN j = 2 * i + LI% * LZ% ELSE j = 2 * i
D(j) = S(i): D(j + 1) = E(i, 0)
NEXT
IF LE% >= 30 THEN GOSUB grablk
IF (INP(prp%) AND 120) = prdy THEN
LPRINT CHR$(15); shou; smin; "."; ssec; scsc; " ";
IF LE% < 30 THEN
FOR i = 1 TO LE%: LPRINT TAB(12 * i); E(i, 0); : NEXT
ELSE
LPRINT ""
FOR i = 1 TO LE%
LPRINT S(i); ": "; E(i, 0); "+-"; E(i, 1),
IF LPOS(0) > 105 THEN LPRINT ""
NEXT
LPRINT ""
END IF
END IF
IF LE% >= 30 THEN GOTO 4002
IF ix = -1 THEN GOSUB initbin
ix = ix + 1: foc = 2 ^ (4 - CO%) 'cf. FO!!!
Fd = E(4, 0) * foc
DD(0, ix) = Fd
DD(1, ix) = hou% * 3600! + min% * 60! + sec% - start
IF hou% > 15 THEN DD(1, ix) = DD(1, ix) - 86400
IF Fd < Umb THEN
P = E(7, 0) - E(5, 0) + C2(filn%) * E(4, 0)
IF P THEN x = (E(6, 0) - E(4, 0) * C1(filn%)) / P
DD(2, ix) = (E(1, 0) + E(2, 0) + E(3, 0)) * foc - ICLO2!(filn%) * Fd
DD(4, ix) = (E(5, 0) + E(6, 0) + E(7, 0)) * foc - ICLOH!(filn%) * Fd
ELSE
P = E(7, 0) - E(5, 0) + E(4, 0) * KNOH(filn%) + DU2OH(filn%) / foc
IF P THEN x = (E(6, 0) - E(4, 0) * CNOH(filn%) + DU1OH(filn%)) / P / foc
DD(2, ix) = (E(1, 0) + E(2, 0) + E(3, 0)) * foc - ICLO2!(filn%) * Umb - ICO2!(filn%) * (Fd - Umb)
DD(4, ix) = (E(5, 0) + E(6, 0) + E(7, 0)) * foc - ICLOH!(filn%) * Umb - ICOH!(filn%) * (Fd - Umb)
END IF
IF P THEN
j = 1
IF x < 0 THEN
P = -999
ELSEIF x > 5 THEN
P = 999
ELSE
GOSUB polyn
END IF
IF (INP(prp%) AND 120) = prdy THEN LPRINT TAB(105); P;
GOSUB plTrot
ELSE
IF (INP(prp%) AND 120) = prdy THEN LPRINT TAB(105); "***";
END IF
IF ABS(P) <> 999 THEN DD(5, ix) = P ELSE DD(5, ix) = 0
LOCATE 3, 75: PRINT USING "######"; DD(4, ix);
LOCATE 4, 75: PRINT USING "######"; DD(2, ix);
LOCATE 5, 75: PRINT USING "######"; DD(0, ix);
FOR i = 1 TO LE%
LOCATE 6 + i, 75: PRINT USING "######"; E(i, 0);
NEXT i
LOCATE 1, 39: PRINT USING "####.# "; P;
IF Fd <= Umb THEN
P = E(1, 0) - E(3, 0) + K2(filn%) * E(4, 0)
IF P THEN x = (E(2, 0) - E(4, 0) * K1(filn%)) / P
ELSE
P = E(1, 0) - E(3, 0) + E(4, 0) * KNO2(filn%) + DU2O2(filn%) / foc
IF P THEN x = (E(2, 0) - E(4, 0) * CNO2(filn%) + DU1O2(filn%)) / P / foc
END IF
IF P THEN
j = 2
IF x < 0 THEN
P = -999
ELSEIF x > 5 THEN
P = 999
ELSE
GOSUB polyn
END IF
IF (INP(prp%) AND 120) = prdy THEN LPRINT TAB(117); P: del& = 300 * lpms: GOSUB delay
GOSUB plTrot
ELSE
IF (INP(prp%) AND 120) = prdy THEN LPRINT "": del& = 300 * lpms: GOSUB delay
END IF
IF ABS(P) <> 999 THEN DD(3, ix) = P ELSE DD(3, ix) = 0
PRINT USING "####.#"; P;
4002 GOSUB evalT1
IF LE% < 30 THEN
D(LZ% * (LI% + 1)) = 100 * Z(6) + Z(4)
D(LZ% * (1 + LI%) + 1) = 100 * Z(3) + Z(2) + .01 * Z(1)
ELSE
GOSUB verirep
END IF
GOSUB hotPM
IF LE% >= 30 THEN RETURN darkcnt 'after spectrum, monitor
LI% = LI% + 1
IF LI% = 7 THEN GOSUB measT2 'this is new: 25.03.02/upd 03.04.02
IF LI% > 13 THEN
GOSUB grablk: LI% = 0: GOSUB measT2
log$ = "T1=" + STR$(PC) + " T2=" + STR$(INT(T2av * 100) / 100) + " "
GOSUB verirep
IF op% = 0 AND MT% = -1 THEN RETURN monit
IF acpt$ <> "*" THEN Fd = E(4, 0): GOSUB 8260 ELSE acpt$ = " "
GOSUB sync: D(0) = 100 * Z(6) + Z(7) + .01 * Z(4): D(1) = D(1) + 1
END IF
Z% = 1: RETURN
verify: log$ = log$ + "VERIFY REF: "
IF MT% = -1 THEN log$ = log$ + " MOTOR OFF": GOTO recd
NO% = PF% - PS%: GOSUB MPP
IF (INP(adi4) AND bolim) = uplim THEN
IF PS% = PF% THEN
log$ = log$ + "OK": GOSUB recd
LOCATE 1, 60: PRINT O$ + B8$
ELSE
log$ = log$ + STR$(PS% - PF%): GOSUB recd
LOCATE 1, 60: PRINT "OFFS="; PS% - PF%;
END IF
GOTO 7020
END IF
NO% = 1 'advance step by step
FOR atp% = 1 TO 1000
GOSUB MPP
IF (INP(adi4) AND bolim) = uplim THEN
IF PS% <> PF% THEN
LOCATE 1, 60: PRINT "OFFS="; PS% - PF%;
log$ = log$ + STR$(PS% - PF%) + " " + S$ + " " + LI$(lim%) + " " + L$
ELSE
LOCATE 1, 60: PRINT O$ + B8$
log$ = log$ + "OK"
END IF
GOSUB recd
GOTO 7020
END IF
IF PS% = PF% - LN% THEN
log$ = log$ + "MORE THAN" + STR$(-LN%) + " " + S$ + " " + LI$(lim%) + " " + L$: GOSUB recd
LOCATE 1, 60: PRINT "REF>"; -LN%; : GOTO 7020
END IF
NEXT atp%
MT% = -1: PS% = 0
7020 rfd% = ABS(PS% - PF%)
IF rfd% > 2 THEN VF% = -1 ELSE VF% = 1
IF rfd% > 1 THEN VOK% = -1 'VOK% <>-1 means: ref has always been OK
NO% = FIX(SP - PS%): GOSUB MPP: RETURN
monit:
DT = 5: DST = 2
monit2:
updct% = 0: pix% = 0
IF op% = 2 THEN CLS
stCO% = -1: stHV% = -1: stobt% = -1 'force screen update
EM% = 14
log$ = CHR$(18) + CHR$(14) + " " + m$(2)
GOSUB recd
TA = Z(3) + 60 * Z(4) - DT + DST
8000 GOSUB sync: LOCATE 1, 1
PRINT sday; "."; smon; ". ("; dow$(Z(5)); ") "; shou; ":"; smin; ":"; ssec;
IF Eve$ <> "" THEN LOCATE 1, 25: PRINT Eve$; " - "; Morn$;
GOSUB watchcnt
mi% = Z(3) + 60 * Z(4)
IF (mi% < TA + DT) AND (mi% >= TA) THEN GOTO 8003
updct% = updct% + 1
IF updct% > back2def% THEN DT = DTDEF%: updct% = 0
TA = mi%: GOSUB measT2
IF log$ <> "" THEN GOSUB recd
IF (INP(prp%) AND 120) = prdy THEN
LPRINT CHR$(15);
LPRINT USING shou + ":" + smin + " ###.## " + c$ + ":######.## +-####.# (CO=#) T2:###.##"; PC; RS; VR; CO%; T2av
del& = 500 * lpms: GOSUB delay
END IF
OPEN flog$ FOR APPEND AS #4
PRINT #4, USING shou + ":" + smin + " ###.## ######.## +-####.# (CO=#) T2:###.##"; PC; RS; VR; CO%; T2av
CLOSE #4
CO% = CV%
8003 IF hot% = 0 THEN IF PC > TT THEN GOSUB HVoff: hot% = 1: GOSUB obtoff
IF hot% = 1 AND ovf% = 0 THEN
IF PC < Tsw - 1 THEN
hot% = 0
IF hidark% = 1 THEN
IF TIMER < thid THEN thid = thid - 86399
IF TIMER > thid + 1800 THEN IF op% > 0 THEN GOSUB HVdel
ELSE
IF HVovf% = 0 THEN IF op% > 0 THEN GOSUB HVdel
END IF
IF (sal1% AND HVEN) = HVEN THEN
TT = Tsw
IF op% <> 0 AND op% <> 2 THEN GOTO normin
END IF
END IF
END IF
IF Eve$ = "" THEN GOSUB getsun
IF (sal1% AND HVEN) <> HVEN THEN
hora = TIMER
IF (op% = 0) AND ((hora > HVtime) OR (hora < Morn)) THEN
IF PC < Tsw - 1 THEN
hot% = 0
IF hidark% = 1 THEN
IF TIMER < thid THEN thid = thid - 86399
IF TIMER > thid + 1800 THEN GOSUB HVdel
ELSE
IF HVovf% = 0 THEN GOSUB HVdel
END IF
END IF
END IF
END IF
GOSUB acqT1: GOSUB evalT1
PSET (pix%, (PC - T10) * T1sc)
pix% = pix% + 1: IF pix% > wx(mode%) THEN pix% = 0: scr% = scr% + 1
IF scr% = 5 THEN scr% = 0: GOSUB newsc
IF (INP(adi4) AND rdy) <> rdy THEN GOSUB watchcnt: GOTO 8000
GOSUB 720: GOSUB 940
LOCATE 10, 1
PRINT USING "## ######## "; Z%; ZA;
IF mean% THEN
mean% = 0
PRINT USING "AVE: #######.## +- ######.##"; RS; VR
PRINT B8$;
IF RS <= RSmax THEN
PSET (pct%, (RS - RSmax) * RSsc - 75)
pct% = pct% + 1: IF pct% > wx(mode%) THEN pct% = 0: GOSUB newsc
END IF
IF monl% THEN
log$ = log$ + "DARK COUNT " + STR$(RS) + "+-" + STR$(VR) + " CO=" + STR$(CO%)
log$ = log$ + " " + TIME$
GOSUB recd
monl% = monl% - 1
IF monl% = 0 THEN RETURN 'mean-only flag: exit GOSUB monit with mean
END IF
END IF
GOSUB count: GOSUB measT2
PSET (pix%, (T2av - T10) * T1sc): GOSUB watchcnt
IF in$ = "" THEN in$ = INKEY$
IF in$ = CHR$(27) THEN
in$ = ""
log$ = log$ + "ESCAPE from monit " + DATE$ + " " + TIME$
GOSUB recd
STOP
END IF
IF UCASE$(in$) = "C" THEN in$ = "": GOSUB CMT
IF in$ = "S" THEN in$ = "": GOSUB set
IF op% > 0 THEN
IF in$ = "F" THEN
in$ = ""
LOCATE 2, 1: PRINT "Searching bckgr pos..."
IF MT% = 0 THEN GOSUB range
IF S(4) = 0 THEN GOSUB useT2
SP = S(4): GOSUB 7020
log$ = "backgrd pos." + STR$(PS%): GOSUB recd: GOSUB newsc
END IF
IF in$ = "P" THEN TA = mi% + 1
IF in$ = "M" THEN in$ = "": LE% = 7: op% = 0: GOTO normin
END IF
in$ = ""
IF op% > 1 OR hot% = 1 THEN GOTO 8000 'hot% flag inhibits night sampling
hora$ = TIME$: hora = TIMER
IF (hora >= Eve) OR ((hora < Eve) AND (hora < Morn)) THEN
IF (sal1% AND HVEN) <> HVEN THEN GOTO 8000
IF MT% = -1 THEN GOSUB range
IF MT% = -1 THEN GOTO 8000
GOSUB chkdark
GOSUB obtdel
pk% = 7: GOSUB chksig
IF ZA < 3 * dark THEN GOTO 8000
log$ = log$ + " START! " + hora$ + ", " + sday + "." + smon + "." + yea$
GOSUB recd
LE% = 7: GOTO normin
END IF
IF (sal1% AND obtoff) <> obtoff THEN
GOSUB HVoff: GOSUB obtoff: cryf% = 0
log$ = log$ + " soft boot! " + hora$ + ", " + sday + "." + smon + "." + yea$
GOSUB recd
SHELL "c:\rebootb"
END IF
GOTO 8000
8060 GOSUB runcnt
8065 GOSUB watchcnt
IF (INP(adi4) AND rdy) = 0 THEN GOTO 8065
GOSUB 720: LOCATE 1, hz% + 7: PRINT ZA; B6$; : SWAP hz%, hz0%: E(ID, Z%) = ZA
RETURN
sample: NO% = FIX(SP - PS%)
8110 GOSUB MPP
8115 LOCATE 1, hz%: PRINT PS%; B8$; : GOSUB 8060: RETURN
8170 IF op% = 7 THEN GOTO jm 'jm
Z% = 1: EM% = 14: SP = S(RF%) + 4 * W(RF%): ID = 8
IF op% <= 1 AND MT% = 1 THEN
IF RF% <= LE% THEN CO% = 2 ELSE CO% = 0
END IF
GOSUB sample
FOR Z% = 1 TO EM%: NO% = -W(RF%)
LOCATE 1, 76: PRINT Z%
FOR ID = 7 TO 0 STEP -1: GOSUB 8110: NEXT
NO% = W(RF%): Z% = Z% + 1: ID = 0: GOSUB 8115
LOCATE 1, 76: PRINT Z%
FOR ID = 1 TO 8: GOSUB 8110: NEXT
IF Z% < EM% THEN Z% = Z% + 1: ID = 8: GOSUB 8115: Z% = Z% - 1
GOSUB acqT1
NEXT
Z% = 1: FOR ID = 0 TO 8: GOSUB aveE: NEXT
parab: 'jm
Y1 = 0: X1 = 0: X2 = 0: X3 = 0: X4 = 0: Z1 = 0: Z2 = 0
IF RF% > LE% THEN Fd = 0
FO = Fd / 2 ^ (CV% - CO%)
FOR i = 0 TO 8
IF E(i, 0) > FO THEN
E(i, 0) = LOG(E(i, 0) - FO)
ELSE
SD = 1000 * SX: DP = 5555: GOTO 8250
END IF
NEXT
FOR i = 0 TO 8
YI = E(i, 0): Y1 = Y1 + YI: X1 = X1 + i: I2 = i * i: I3 = I2 * i
I4 = I3 * i: X2 = X2 + I2: X3 = X3 + I3: X4 = X4 + I4
Z1 = Z1 + YI * i: Z2 = Z2 + YI * I2
NEXT
XA = X3 - X1 * X2 / 9: XB = X2 - X1 * X1 / 9: XC = X4 - X2 * X2 / 9
XN = XA - XB * XC / XA: KA = Z1 - Z2 * XB / XA + Y1 / 9 * (X2 * XB / XA - X1)
KA = KA / XN: KB = Z2 - KA * XC - Y1 * X2 / 9: KB = KB / XA
KC = Y1 - KA * X2 - KB * X1: KC = KC / 9: YP = KC - KB * KB / 4 / KA
AC = YP / KA: XP = -KB / 2 / KA: SD = 0
FOR i = 0 TO 8
X2 = i * i
par = KA * X2 + KB * i + KC
DY = (E(i, 0) - par) ^ 2: SD = SD + DY
par(i) = par
NEXT
DP = (XP - 4) * W(RF%)
IF RF% = 12 AND ABS(DP) > 30 THEN NeJu% = -1
8250 IF op% <= 1 THEN CO% = CV%
EM% = 2: RETURN
8260 acpt$ = " ": acpt% = acpt% - 1: SRF0 = S(RF%)
IF (Fd * 2 ^ (4 - CO%) < 1500) OR op% > 1 THEN
psea% = -1: GOSUB 8170
ELSE
psea% = 0: DP = 0: SD = 0: AC = 0: GOTO 8270
END IF
parlog:
SS = S(RF%) - INT(S(RF%)): SRF = INT(S(RF%)) + DP
'IF SD > SX OR AC > -350 OR AC < -2000 THEN GOTO 8270
IF SD > SX OR AC > -330 OR AC < -2000 THEN GOTO 8270
acpt% = 0: S(RF%) = SRF: acpt$ = "*": log$ = log$ + "* ": DP = DP - SS
IF op% <= 1 THEN
FOR i = 1 TO LE%
IF i <> RF% THEN
S(i) = K(i, 0, filn%) + K(i, 1, filn%) * (S(RF%) - S0)
END IF
NEXT i
END IF
8270
IF op% <= 1 AND acpt% <= -2 THEN
GOSUB useT2: log$ = log$ + "$ ": acpt% = 0: acpt$ = "$"
END IF
LOCATE 1, 58: PRINT acpt$;
arg = AC * KA
IF arg < 88 AND arg > 0 THEN expac = EXP(arg) ELSE expac = -99.99999
IF acpt$ = "$" OR psea% = -1 THEN
IF (INP(prp%) AND 120) = prdy THEN
LPRINT log$ + "REF#"; RF%; S(RF%); " DP="; DP; " SD="; SD; " WIDTH="; -AC;
LPRINT "HEIGHT="; expac; : IF op% <= 1 THEN LPRINT ""
END IF
OPEN flog$ FOR APPEND AS #4
PRINT #4, log$ + "REF#"; RF%; S(RF%); DP; SD; -AC; expac; : log$ = ""
IF op% <= 1 THEN PRINT #4, ""
CLOSE #4
END IF
LOCATE 15, 74
IF acpt$ <> " " THEN
PRINT USING "#####.#"; S(RF%) - SRF0;
ELSE
PRINT SPACE$(7);
END IF
IF psea% = -1 THEN
LOCATE 16, 74: PRINT USING "#####.#"; DP;
LOCATE 17, 73: PRINT USING "##.#^^^^"; SD;
LOCATE 18, 75: PRINT USING "######"; -AC;
ELSE
LOCATE 16, 74: PRINT SPACE$(7);
LOCATE 17, 73: PRINT B8$;
LOCATE 18, 75: PRINT B6$;
END IF
IF op% > 1 THEN IF psea% THEN GOSUB spcfile
RETURN
plTrot: 'rot temps to screen
j = j - 1: G% = G% + 1 - j: IF G% = wx(mode%) THEN G% = 0: GOSUB newsc
IF yvor(j) = 0 THEN
PSET (G%, (P - Tr0(j)) * Trsc)
ELSE
LINE (G%, (P - Tr0(j)) * Trsc)-(xvor(j), yvor(j))
END IF
xvor(j) = G%: yvor(j) = (P - Tr0(j)) * Trsc
RETURN
count:
GOSUB runcnt 'runcnt respects CO's explicit value
watchcnt:
IF (INP(adi3) AND ovfl) = 0 THEN RETURN 'do nothing unless ovflow
GOSUB rstcnt: sal1% = (sal1% AND &HF8) OR cstart: OUT ado1, sal1%
' note implicit CO=0 !
DO
IF (INP(adi3) AND ovfl) = ovfl THEN
GOSUB HVoff: ovf% = 1: GOSUB obtoff: SOUND 3300, 1: RETURN
END IF
LOOP WHILE (INP(adi4) AND rdy) = 0
GOSUB 720
FOR j = 0 TO CV%: ZA = ZA * 2: CO% = j
IF ZA > 128000 THEN j = CV%
NEXT
log$ = log$ + "CO=" + STR$(CO%): GOSUB recd
GOTO count
neon: 'Ne or OH peak calibration (one pass, for OH; op%=6)
IF MT% = 0 THEN GOSUB range
LE% = 7: GOSUB sync: NeJu% = -1: IF log$ <> "" THEN GOSUB recd
IF MT% = -1 THEN log$ = "MOTOR OFF": GOSUB recd
LOCATE 1, 1: PRINT SPACE$(160); : stCO% = -1: stHV% = -1: stobt% = -1
IF op% = 6 THEN
RF% = prf%(filn%): IF S(RF%) = 0 THEN GOSUB measT2: GOSUB useT2
pk% = 7
ELSE
IF S(LE% + 1) = 0 THEN
GOSUB measT2: S(LE% + 1) = T2av
FOR i = LE% + 1 TO LF%
S(i) = K(i, 0, filn%) + S(LE% + 1) * K(i, 1, filn%)
NEXT i
END IF
pk% = LE% + 6
END IF
GOSUB chksig
siempre: IF op% = 6 THEN
FOR RF% = 7 TO 5 STEP -1
GOSUB pkseekOH
NEXT RF%
GOSUB verirep
FOR RF% = 5 TO 7
GOSUB pkseekOH
NEXT RF%
CV% = 4: CO% = CV%: RF% = 6: op% = 0: GOTO normin
ELSE
FOR RF% = LF% TO LE% + 1 STEP -1: GOSUB pkseek: NEXT
GOSUB verirep
FOR RF% = LE% + 1 TO LF%: GOSUB pkseek: NEXT
GOSUB verirep
GOTO siempre
END IF
pkseek:
IF NeJu% AND RF% = 12 THEN RETURN
CN% = CO%
IF RF% = 5 OR RF% = LE% + 4 OR RF% = LE% + 7 THEN CO% = CO% + 1
GOSUB 8260: GOSUB measT2: GOSUB evalT1: GOSUB sync
log$ = "CO=" + STR$(CO%) + " " + shou + ":" + smin + ":" + ssec
log$ = log$ + " T2=" + STR$(INT(T2av * 100) / 100) + " T1=" + STR$(PC): GOSUB recd
CO% = CN%: GOTO hotPM: RETURN
pkseekOH:
ID = 4: SP = S(ID): Z% = 0
GOSUB sample: Fd = E(4, 0)
GOSUB pkseek
RETURN
T1:
CJ = -32768: cto% = CJ: OUT &H21, 3 'disable keyboard and timer tick
IF (INP(adi4) AND bitT1) <> 0 THEN
WHILE (INP(adi4) AND bitT1) <> 0
cto% = cto% + 1: IF cto% > 32766 THEN GOTO emerg1
WEND
crit% = 0: GOSUB cou1: CR = CJ: CJ = -32768: crit% = bitT1: GOSUB cou1
ELSE
WHILE (INP(adi4) AND bitT1) = 0
cto% = cto% + 1: IF cto% > 32766 THEN GOTO emerg1
WEND
crit% = bitT1: GOSUB cou1: CR = CJ: CJ = -32768: crit% = 0: GOSUB cou1
SWAP CR, CJ
END IF
OUT &H21, 0 'enable all IRQ's
IF (erc% AND 16) = 16 THEN erc% = erc% - 16
RETURN
T2:
CJ = -32768: cto% = CJ: ju = 0: OUT &H21, 3 'disable keyboard and timer tick
IF (INP(adi4) AND bitT2) <> 0 THEN
WHILE (INP(adi4) AND bitT2) <> 0
cto% = cto% + 1: IF cto% > 32766 THEN GOTO emerg2
WEND
crit% = 0: GOSUB cou2: CR = CJ: CJ = -32768: crit% = bitT2: GOSUB cou2
ELSE
WHILE (INP(adi4) AND bitT2) = 0
cto% = cto% + 1: IF cto% > 32766 THEN GOTO emerg2
WEND
crit% = bitT2: GOSUB cou2: CR = CJ: CJ = -32768: crit% = 0: GOSUB cou2
SWAP CR, CJ: ju = 1
END IF
OUT &H21, 0 'enable all IRQ's
IF (erc% AND 32) = 32 THEN erc% = erc% - 32
RETURN
cou1:
WHILE (INP(adi4) AND bitT1) = crit%
CJ = CJ + 1: IF CJ > 32766 THEN GOTO emerg2
WEND: RETURN
cou2:
WHILE (INP(adi4) AND bitT2) = crit%
CJ = CJ + 1: IF CJ > 32766 THEN GOTO emerg2
WEND: RETURN
emerg1: erc% = erc% OR 16: CJ = 30000: CR = -28000: GOTO emerg
emerg2: erc% = erc% OR 32: CJ = -5000: CR = -15000
emerg:
OUT &H21, 0: GOSUB HVoff: hot% = 1: GOSUB obtoff: SOUND 2000, 10
RETURN
stcnt: sal1% = sal1% OR cstart: GOTO OUT1 'start count
rstcnt:
sal1% = sal1% AND rst: GOSUB OUT1 'reset
LOCATE 3, 1
erc% = erc% XOR (erc% AND 15) 'delete counter error flags
IF (INP(adi4) AND rdy) <> 0 THEN PRINT "NO ready signal": erc% = erc% OR 1
x% = INP(adi1): IF x% <> 0 THEN PRINT "NO reset in 1st counter"; x%: erc% = erc% OR 2
x% = INP(adi2): IF x% <> 0 THEN PRINT "NO reset in 2nd counter"; x%: erc% = erc% OR 4
x% = INP(adi3) AND 7
IF x% <> 0 THEN PRINT "NO reset in 3rd counter"; x%: erc% = erc% OR 8
' aqui hay que salir, marcando el tipo de error
IF (erc% AND 15) > 0 THEN
SOUND 2500, 10: t0 = TIMER
IF t0 > 86394 THEN t0 = t0 - 86400
WHILE TIMER - t0 < 5: WEND
END IF
RETURN
OUT1: sal1% = (sal1% AND &HF8) OR CO%: OUT ado1, sal1%: GOSUB status
IF al$ <> "" THEN
log$ = log$ + TIME$ + al$: GOSUB recd
al$ = ""
END IF
RETURN
OUT2: OUT ado2, sal2%: RETURN
HVdel:
GOSUB sync
WHILE TIMER < tHV + 30
IF TIMER < tHV THEN tHV = tHV - 86399 'midnight correction
WEND
HVEN:
IF (sal1% AND obtoff) <> obtoff THEN
SOUND 700, 10: log$ = log$ + " attempt to HVEN with shutter enabled"
GOSUB recd: RETURN
END IF
IF PC > -20 THEN
SOUND 4000, 2
log$ = log$ + " attempt to HVEN with T1=" + STR$(PC) + ">-20"
GOSUB recd: RETURN
END IF
IF TT > -20 THEN TT = Tsw
sal1% = sal1% OR HVEN: GOSUB rstcnt
sal1% = (sal1% AND &HF8) OR cstart: OUT ado1, sal1%
' note implicit CO=0 !
DO
IF (INP(adi3) AND ovfl) = ovfl THEN
GOSUB HVoff: HVovf% = 1: SOUND 1300, 1
log$ = log$ + " HVEN aborted because of overflow"
GOSUB recd: RETURN
END IF
LOOP WHILE (INP(adi4) AND rdy) = 0
HVovf% = 0
GOSUB 720
IF ZA > 200 THEN
GOSUB HVoff: hidark% = 1: SOUND 4300, 5
thid = TIMER
log$ = log$ + " dark count too high (ZA=" + STR$(ZA) + ")...HVEN aborted."
GOSUB recd: RETURN
END IF
hidark% = 0: log$ = log$ + TIME$ + " HV EN": GOSUB recd
RETURN
HVoff:
IF (sal1% AND HVEN) <> HVEN THEN RETURN
tHV = TIMER
al$ = " HV off"
sal1% = sal1% AND HVoff: GOTO OUT1
obtoff:
IF (sal1% AND obtoff) = obtoff THEN RETURN
tobt = TIMER
al$ = " shutter off"
sal1% = sal1% OR obtoff: GOTO OUT1
obtdel:
IF (sal1% AND obtoff) <> obtoff THEN RETURN
GOSUB sync
WHILE TIMER < tobt + 20
IF TIMER < tobt THEN tobt = tobt - 86399 'midnight correction
WEND
obtEN:
IF (sal1% AND obtoff) <> obtoff THEN RETURN
al$ = " shutter EN"
sal1% = sal1% AND obtEN: GOTO OUT1
fchg:
tx = TIMER: sal1% = sal1% AND fchg: GOSUB OUT1
del& = 500 * lpms: GOSUB delay
sal1% = sal1% OR nofchg: GOSUB OUT1: GOSUB chkflt
LOCATE 24, 49: PRINT F$; filt%;
PRINT USING "###.##"; TIMER - tx;
RETURN
MPP:
IF MT% = -1 THEN PS% = PS% + NO%: GOTO exMPP'shortcut if motor off
IF NO% > 0 THEN
sal1% = sal1% OR 32: IF PS% + NO% > LX% THEN NO% = LX% - PS%
lim% = 2 'select limit switch
ELSE
sal1% = sal1% AND 223: IF PS% + NO% < LN% THEN NO% = LN% - PS%
lim% = 4 'select limit switch
END IF
PS% = PS% + NO% 'expected final position
OUT ado1, sal1%: OUT &H21, 3 'direct access to ado1 saves time
del& = del1&: GOSUB delay: mppcnt% = ABS(NO%)
nxtstp:
IF mppcnt% = 0 THEN GOTO exMPP
IF (INP(adi4) AND lim%) <> 0 GOTO salMPP
OUT adostp, 0: mppcnt% = mppcnt% - 1: GOSUB delay
del& = del2&
GOTO nxtstp
salMPP:
PS% = PS% - SGN(NO%) * mppcnt%
exMPP:
OUT &H21, 0: IF in$ = "" THEN in$ = INKEY$
IF in$ = CHR$(27) THEN
in$ = ""
log$ = log$ + "ESCAPE from exMPP " + DATE$ + " " + TIME$
GOSUB recd
STOP
END IF
IF UCASE$(in$) = "C" THEN in$ = "": GOSUB CMT
in$ = ""
RETURN
range:
GOSUB 90
IF MT% = 0 THEN
log$ = log$ + "MT%=0 after gosub 90"
GOTO emergexit
END IF
IF MT% = -1 THEN RETURN
log$ = LI$(lim%) + " " + L$ + "=" + STR$(PF%) + "; "
NO% = -5100: GOSUB MPP: LOCATE 2, 1: PRINT "range="; PF% - PS%;
log$ = log$ + LI$(lim%) + " " + L$ + "=" + STR$(PS%) + "; "
log$ = log$ + "free scan range=" + STR$(PF% - PS%) + " steps "
PRINT "limits: "; PS%; PF%
GOSUB verirep
RETURN
inicl:
reg% = &HA
DO
GOSUB rdcmos: by0% = by% AND 128
LOOP WHILE by0% = 0 'wait for clock update
WHILE by0% <> 0
GOSUB rdcmos: by0% = by% AND 128
WEND 'wait for clock ready to read
RETURN
rdcmos:
OUT &H70, reg%: by% = INP(&H71): RETURN
clock:
GOSUB inicl
reg% = 4: GOSUB retr: hou% = bo%
reg% = 2: GOSUB retr: min% = bo%
reg% = 0: GOSUB retr: sec% = bo%
IF hou% <> hou0% THEN
hou0% = hou%
reg% = 7: GOSUB retr: day% = bo%
IF day% <> day0% THEN
reg% = 8: GOSUB retr: mon% = bo%
reg% = 9: GOSUB retr: yea% = bo%
reg% = &H32: GOSUB retr
IF yea% < 80 THEN IF bo% <> 20 THEN bo% = 20
yea% = bo% * 100 + yea%
END IF
END IF
RETURN
retr:
GOSUB rdcmos
IF by% < 10 THEN bo% = by% ELSE bo% = 10 * (by% \ 16) + (by% AND 15)
RETURN
sync:
GOSUB clock
tic& = (3600! * hou% + 60! * min% + sec%) * ticfr
DEF SEG = VARSEG(tic&): hi% = PEEK(VARPTR(tic&) + 2)
mi0% = PEEK(VARPTR(tic&) + 1): r0% = PEEK(VARPTR(tic&))
OUT &H21, 3
DEF SEG = 0: POKE &H46E, hi%: POKE &H46D, mi0%: POKE &H46C, r0%
OUT &H21, 0
Z(2) = sec%
IF sec% > 9 THEN ssec = LTRIM$(STR$(sec%)) ELSE ssec = "0" + LTRIM$(STR$(sec%))
Z(3) = min%
IF min% > 9 THEN smin = LTRIM$(STR$(min%)) ELSE smin = "0" + LTRIM$(STR$(min%))
Z(4) = hou%
IF hou% > 9 THEN shou = LTRIM$(STR$(hou%)) ELSE shou = "0" + LTRIM$(STR$(hou%))
Z(1) = 0: scsc = "00"
IF day% <> day0% THEN
day0% = day%
Z(6) = day%
IF day% > 9 THEN sday = LTRIM$(STR$(day%)) ELSE sday = "0" + LTRIM$(STR$(day%))
Z(7) = mon%
IF mon% > 9 THEN smon = LTRIM$(STR$(mon%)) ELSE smon = "0" + LTRIM$(STR$(mon%))
Z(8) = yea%: yea$ = LTRIM$(STR$(yea%))
GOSUB julian
Z(5) = ((jd& + 1) MOD 7) + 1
DATE$ = smon + "-" + sday + "-" + yea$
dat$ = sday + "." + smon + "." + yea$ + "(" + dow$(Z(5)) + ")"
log$ = log$ + " " + dat$
END IF
RETURN
julian:
jd& = 367& * yea% - INT(7 * (yea% + INT((mon% + 9) / 12)) / 4) + INT(275 * mon% / 9) + day% + 1721014
RETURN
csec:
OUT &H21, 3
DEF SEG = 0: r1% = PEEK(&H46C): mi1% = PEEK(&H46D): hi1% = PEEK(&H46E)
OUT &H21, 0
w1& = r1%: DEF SEG = VARSEG(w1&)
POKE VARPTR(w1&) + 1, mi1%: POKE VARPTR(w1&) + 2, hi1%
rr& = w1& - tic&
IF rr& < 0 THEN rr& = rr& + tpd
cs% = rr& * cspt
IF cs% >= 100 THEN
sec% = sec% + cs% \ 100: cs% = cs% MOD 100
IF sec% > 59 THEN
min% = min% + sec% \ 60: sec% = sec% MOD 60
IF min% > 59 THEN
hou% = hou% + min% \ 60: min% = min% MOD 60
IF hou% > 23 THEN
hou% = 0 'new day
END IF
Z(4) = hou%
IF hou% > 9 THEN shou = LTRIM$(STR$(hou%)) ELSE shou = "0" + LTRIM$(STR$(hou%))
END IF
Z(3) = min%
IF min% > 9 THEN smin = LTRIM$(STR$(min%)) ELSE smin = "0" + LTRIM$(STR$(min%))
END IF
Z(2) = sec%
IF sec% > 9 THEN ssec = LTRIM$(STR$(sec%)) ELSE ssec = "0" + LTRIM$(STR$(sec%))
END IF
IF cs% > 9 THEN scsc = LTRIM$(STR$(cs%)) ELSE scsc = "0" + LTRIM$(STR$(cs%))
Z(1) = cs%
RETURN
status:
IF (sal1% AND 7) <> stCO% THEN
stCO% = sal1% AND 7: LOCATE 24, 1: PRINT "CO="; stCO%;
END IF
IF (sal1% AND HVEN) <> stHV% THEN
stHV% = sal1% AND HVEN: LOCATE 24, 8: PRINT "HV ";
IF stHV% <> 0 THEN PRINT "enabled"; ELSE PRINT "OFF ";
END IF
IF (sal1% AND obtoff) <> stobt% THEN
stobt% = sal1% AND obtoff: LOCATE 24, 20: PRINT "shutter ";
IF stobt% = obtoff THEN PRINT "closed "; ELSE PRINT "enabled";
END IF
LOCATE 24, 49: PRINT TIME$; " "; : RETURN
spec:
op% = 4: LE% = 100: GOTO normin
norm:
op% = 1: LE% = 7: GOTO normin
CMT: SOUND 500, 5: LOCATE 1, 1
Q$ = "": PRINT CHR$(219); : tget = TIMER
getch:
a$ = INKEY$
IF a$ <> CHR$(13) THEN
IF a$ <> "" THEN
tget = TIMER
IF a$ = CHR$(8) THEN
Q$ = LEFT$(Q$, LEN(Q$) - 1)
LOCATE , POS(1) - 1
ELSE
PRINT a$; : Q$ = Q$ + a$
END IF
END IF
IF TIMER - tget < 30 THEN GOTO getch
END IF
log$ = log$ + TIME$ + " - " + Q$: LOCATE 1, 1: PRINT SPACE$(160);
GOTO recd
delay:
sec% = -1 'impossible sec% avoids EXIT
caldel:
FOR K& = 1 TO del&
OUT &H70, 0: IF sec% = INP(&H71) THEN EXIT FOR
NEXT K&
RETURN
recd:
IF (INP(prp%) AND 120) = prdy THEN LPRINT log$
IF recd% = 0 THEN
OPEN flog$ FOR APPEND AS #4
IF LOF(4) > 20000 THEN
CLOSE #4
GOSUB sync
NAME flog$ AS lgd$ + "m" + RIGHT$(yea$, 2) + smon + sday + ".log"
ELSE
CLOSE #4
END IF
recd% = -1
END IF
OPEN flog$ FOR APPEND AS #4: PRINT #4, log$: CLOSE #4
log$ = ""
RETURN
monoc:
CO% = 0: ZAMIN = 150
S(1) = 20
FOR i = 2 TO LE%
NON% = 100 - INT(S(i - 1) * .0165): S(i) = S(i - 1) + NON%
NEXT
nextin: INPUT "center position"; po0%
IF po0% < 0 OR po0% > PF% THEN GOTO nextin
IF po0% <> 0 THEN
log$ = log$ + "center pos:" + STR$(po0%): GOSUB recd
FOR i = 1 TO LE%
IF S(i) > po0% THEN ID = i - 1: GOTO max
NEXT i
ID = LE% - 1
GOTO max
END IF
FOR ID = LE% TO 1 STEP -1
SP = S(ID): GOSUB sample
IF ZA > ZAMIN THEN
IF ZA < ZA0 THEN GOTO max ELSE ZA0 = ZA
END IF
NEXT
GOSUB obtoff
GOTO monit
max:
ID = ID + 1
ILOC = 12: IF ID > ILOC THEN B1 = S(ID - ILOC) ELSE B1 = S(1)
ILOC = 5: IF ID > ILOC THEN B2 = S(ID - ILOC) ELSE B2 = S(1)
ILOC = -5: IF ID < LE% + ILOC THEN B3 = S(ID - ILOC) ELSE B3 = S(LE%)
ILOC = -15: IF ID < LE% + ILOC THEN B4 = S(ID - ILOC) ELSE B4 = S(LE%)
pas = (B2 - B1) / (10 - 1): S(1) = B1
IF pas > 0 THEN
FOR i = 2 TO 10: S(i) = S(i - 1) + pas: NEXT i
ini = 11
ELSE
ini = 2
END IF
IF B4 > B3 THEN
pas = (B3 - B2) / (91 - ini)
FOR i = ini TO 90: S(i) = S(i - 1) + pas: NEXT i
pas = (B4 - B3) / 10: FOR i = 91 TO 100: S(i) = S(i - 1) + pas: NEXT i
ELSE
pas = (B3 - B2) / 90: FOR i = ini TO 100: S(i) = S(i - 1) + pas: NEXT i
END IF
CO% = CV%
GOTO 2600
90 MT% = 0: PR% = INP(adi4) AND bolim
IF PR% = bolim THEN
MT% = -1: LOCATE 23, 1: PRINT "BOTH "; L$; "S!"; : GOTO 120
END IF
IF PR% = uplim THEN GOTO 115
100 PS% = 10: NO% = LX%: GOSUB MPP: PS% = PF%
IF (INP(adi4) AND uplim) <> uplim THEN MT% = -1
GOTO 120
115 PS% = LX%: NO% = -40: GOSUB MPP
IF (INP(adi4) AND uplim) <> uplim THEN GOTO 100 ELSE MT% = -1
120 IF MT% = -1 THEN
LOCATE 24, 37: PRINT "MOTOR OFF";
ELSE
MT% = 1
LOCATE 24, 37: PRINT " ";
END IF
RETURN
polyn: P = a(G%(j), j)
FOR i = G%(j) - 1 TO 0 STEP -1: P = P * x + a(i, j): NEXT: RETURN
hotPM: IF hot% = 0 THEN
IF PC > TT THEN
sal1% = (sal1% AND HVoff) OR obtoff: hot% = 1
GOSUB rstcnt: GOSUB stcnt
tobt = TIMER: tHV = tobt
IF LI% > 2 THEN GOSUB grablk: LI% = 0
RETURN monit
END IF
END IF
RETURN
acqT1: GOSUB T1: R = factT1 * (CR + 65536! + CJ) / (CR + 32768!)
IF R <= 314 THEN PRINT "T1 GLITCH": SOUND 1800, 10: RETURN
V(L%) = R: L% = L% + 1: IF L% > V% THEN L% = 0
RETURN
evalT1:
KL% = 0: KH% = 0: LO = V(0): hig = LO
FOR K% = 1 TO V%
IF V(K%) < LO THEN LO = V(K%): KL% = K%
IF V(K%) > hig THEN hig = V(K%): KH% = K%
NEXT
IF LO = hig THEN RM = V(0): GOTO 700
RM = 0: FOR K% = 0 TO V%
IF K% = KL% THEN GOTO 685
IF K% <> KH% THEN RM = RM + V(K%)
685 NEXT
RM = RM / (V% - 1)
700 x = LOG(RM - 314): j = 0: GOSUB polyn
P = 1 / P: PC = .01 * INT(100 * (P - 273.16))
LOCATE 24, 60: PRINT USING "###.##"; PC;
RETURN
'counter status:
720 x% = INP(adi3)
phot& = INP(adi1): DEF SEG = VARSEG(phot&)
POKE VARPTR(phot&) + 1, INP(adi2): POKE VARPTR(phot&) + 2, x% AND 3
IF (x% AND ovfl) = ovfl THEN POKE VARPTR(phot&) + 2, 4
ZA = phot&
RETURN
measT2:
GOSUB T2: Y = (CR + 32768!) / (CJ - CR): x = LOG(Y): j = 3: GOSUB polyn
T2 = INT((1 / P - 273.16) * 100) / 100
IF T2av = 999 THEN T2av = T2 ELSE T2av = (2 * T2av + T2) / 3
LOCATE 24, 70: PRINT USING "###.##"; T2av;
RETURN
880 SQ = 0: SM = 0: FOR i = 1 TO EM%: SM = SM + R(i): NEXT
RS = SM / EM%: FOR i = 1 TO EM%: SQ = SQ + (R(i) - RS) ^ 2: NEXT
VR = SQR(SQ / EM% / (EM% - 1)): RETURN
runcnt:
GOSUB rstcnt 'OUT ado1, 8 OR 128
IF ((INP(adi3) AND 3) <> 0) OR (INP(adi2) <> 0) OR (INP(adi1) <> 0) THEN
PRINT st$; " NO RESET! "; st$;
log$ = log$ + " NO RESET! ": GOSUB recd
GOSUB 720: PRINT ZA
IF (erc% AND 15) <> 15 THEN
IF ZA THEN i = i + 1: IF i > 10 THEN RETURN monit ELSE GOTO runcnt
END IF
END IF
GOSUB stcnt 'OUT ado1, 24 OR CO% OR 128
IF (INP(adi4) AND rdy) = rdy THEN
LOCATE 20, 40: PRINT st$; " NO COUNT START "; st$
log$ = log$ + " NO COUNT START ": GOSUB recd
IF (erc% AND 15) <> 15 THEN GOTO runcnt
END IF
IF ID = LE% THEN IF Z% = EM% THEN GOTO sync
IF ID = LE% - 1 THEN GOSUB acqT1 'last chance to read T1 w/o fu-ing csec
RETURN
940 R(Z%) = ZA: P(Z%) = PC: Z% = Z% + 1: IF Z% > EM% THEN GOSUB 730: Z% = 1
RETURN
730 MX = R(1): MN = MX: IL = 1: IH = 1
FOR i = 2 TO EM%
IF MN > R(i) THEN MN = R(i): IL = i
IF MX < R(i) THEN MX = R(i): IH = i
NEXT
IF IL = IH THEN GOTO 785
SQ = 0: SM = 0: FOR i = 1 TO EM%
IF i = IH OR i = IL THEN GOTO 775
SM = SM + R(i): SQ = SQ + R(i) * R(i)
775 NEXT
RS = SM / (EM% - 2): GOTO 790
785 RS = R(1): VR = 0: GOTO 795
790 VR = SQR((SQ - (EM% - 2) * RS * RS) / (EM% - 2) / (EM% - 3))
795 mean% = -1
RETURN
aveE: FOR i = 1 TO EM%: R(i) = E(ID, i): NEXT: GOSUB 880
IF EM% > 5 THEN IF VR > .1 * RS THEN GOSUB 730
E(ID, 0) = RS: E(ID, 1) = VR: RETURN
grablk:
fou$ = sday + smon + RIGHT$(yea$, 2) + shou + "." + smin + LTRIM$(STR$(CO%))
IF LE% < 30 THEN fs% = 56 * LZ% ELSE fs% = 8 * LE%
CLOSE
DEF SEG = VARSEG(D(0)): BSAVE dire$ + "\" + fou$, VARPTR(D(2)), fs%
log$ = "FILE: " + fou$ + "; " + m$(op%)
IF op% = 0 OR op% = 1 THEN log$ = log$ + STR$(D(1)): GOSUB savebin
GOSUB recd
RETURN
chkflt:
Q% = INP(adi4) AND 24
IF Q% = 8 THEN log$ = F$ + " IR1": filt% = 1: filn% = 0
IF Q% = 16 THEN log$ = F$ + " IR2": filt% = 2: filn% = 1
IF Q% = 24 THEN log$ = F$ + " #3": filt% = 3: filn% = 1
IF Q% = 0 THEN
del& = 300 * lpms: GOSUB delay
LOCATE 24, 49: PRINT F$; " changing "; : chgfi% = 1: GOTO chkflt
END IF
GOSUB recd
IF chgfi% = 1 THEN LOCATE 24, 49: PRINT B8$; B8$; : chgfi% = -1
RETURN
newsc:
CLS : stCO% = -1: stHV% = -1: stobt% = -1: GOSUB status: LOCATE 1, 1: RETURN
EN:
GOSUB HVdel: GOTO obtdel
chksig:
SP = S(pk%): ID = 8: CN% = CO%: CO% = 4: GOSUB sample: CO% = CN%
sal1% = (sal1% AND &HF8) OR CO% 'if CO% had been modified, sal1 must know!
IF ZA < 3 * dark THEN
cry$ = "NO SIGNAL! Tapa cerrada????": LOCATE 2, 1: PRINT cry$;
IF cryf% = 0 THEN log$ = log$ + " " + cry$: GOSUB recd: cryf% = 1
SOUND 2490, 10: SOUND 165, 20: SOUND 3950, 50
END IF
RETURN
darkcnt:
Z% = 1: GOSUB obtoff: SOUND 1000, 1
CO% = 4: CV% = CO%: DT = 2: DST = 2: GOTO monit2
dark1:
Z% = 1: mean% = 0: GOSUB obtoff: CO% = 4: CV% = CO%: DT = 10: DST = 10
IF monl% <= 0 THEN monl% = 1
GOTO monit2
fin:
IF LI% > 0 THEN GOSUB grablk
GOSUB newsc: LOCATE 2, 1: PRINT " T E R M I N O la noche !";
monl% = 3: GOSUB dark1 'several turns of dark
frar$ = sday + smon + RIGHT$(yea$, 2) + shou
OPEN "c:\frar.bat" FOR OUTPUT AS #1
PRINT #1, "rar m -rr d:\results\" + frar$ + " " + dire$
PRINT #1, "vopt c:"
CLOSE #1
GOSUB HVoff
NO% = -PS%: GOSUB MPP'parking at normal incidence; 22.9.04
SHELL "c:\rebootb"
'no life after boot!
useT2:
S(RF%) = K(0, 0, filn%) + T2av * K(0, 1, filn%)
FOR i = 1 TO LE%
IF i <> RF% THEN
S(i) = K(i, 0, filn%) + K(i, 1, filn%) * (S(RF%) - S0)
END IF
NEXT
RETURN
initbin:
dia$ = sday
IF hou% <= 15 THEN
dia$ = LTRIM$(STR$(VAL(sday) - 1))
IF LEN(dia$) = 1 THEN dia$ = "0" + dia$
END IF
fsci$ = "c:\data.sci\prov\p" + dia$ + smon + RIGHT$(yea$, 2) + ".bin"
IF DIR$(fsci$) <> "" THEN
CLOSE
DEF SEG = VARSEG(DD(0, 0)): BLOAD fsci$, 0
range = DD(4, 0): ilast = DD(5, 0): ix = ilast - 1
IF DD(1, 0) <> 0 AND DD(2, 0) <> 0 THEN
start = DD(1, 0) - INT(DD(1, 0) / 100) * 100
IF start > 15 THEN start = start - 24!
start = start * 3600 + INT(DD(2, 0) / 100) * 60
start = start + DD(2, 0) - INT(DD(2, 0) / 100) * 100
END IF
ELSE
DD(1, 0) = hou%: DD(2, 0) = min% * 100! + sec%: ix = 0
start = hou% * 3600! + min% * 60! + sec%
IF hou% > 15 THEN start = start - 86400
END IF
RETURN
savebin:
DD(4, 0) = DD(1, ix): DD(5, 0) = ix + 1: CLOSE
DEF SEG = VARSEG(DD(0, 0)): BSAVE fsci$, 0, 24 * (ix + 1)
RETURN
repair:
log$ = log$ + " ERROR IN LINE:" + STR$(ERL) + " Type:" + STR$(ERR)
IF ERR = 6 THEN log$ = log$ + " " + STR$(r0%) + STR$(r1%)
GOSUB recd
SOUND 167, 10: SOUND 250, 10: SOUND 167, 10
RESUME NEXT
getsun:
OPEN "c:\sundat.txt" FOR INPUT AS #1
WHILE NOT EOF(1)
LINE INPUT #1, a$
IF LEFT$(a$, 5) = LEFT$(DATE$, 5) THEN
Eve$ = MID$(a$, 12, 8): Morn$ = RIGHT$(a$, 8)
GOTO thatsit
END IF
WEND
thatsit:
CLOSE #1
IF Eve$ = "" THEN
log$ = log$ + "no Sun data available"
GOTO emergexit
END IF
hora$ = Eve$: GOSUB conv2sec: Eve = hora
HVtime = Eve - 3600 * 4
'time to switch High Voltage on
hora$ = Morn$: GOSUB conv2sec: Morn = hora
RETURN
conv2sec:
hora = 3600! * VAL(LEFT$(hora$, 2)) + 60! * VAL(MID$(hora$, 4, 2)) + VAL(RIGHT$(hora$, 2))
RETURN
verirep: GOSUB verify: IF VF% = -1 THEN GOTO range
RETURN
set:
GOSUB sync: LOCATE 24, 1
INPUT "input new time (hh:mm:ss) and hit Enter to set"; true$
IF LEN(true$) = 8 THEN
GOSUB csec: prev$ = shou + ":" + smin + ":" + ssec + "." + scsc
TIME$ = true$
log$ = log$ + " old time: " + prev$ + "; new time: " + true$
GOSUB newsc: GOTO recd
END IF
GOSUB newsc: RETURN
initvar1:
READ LE%
prf%(0) = 7: prf%(1) = 6 'LE% + 6, '5 - 7 for airglow, LE%+1 - LE%+7 for Ne
FOR F% = 0 TO 1
FOR i = 0 TO LF%: FOR j = 0 TO 1: READ K(i, j, F%): NEXT: NEXT
NEXT F%
'F1
DATA 7,4730.43,2.8084,2031.7,2.1,2265.2,1.92941,2477.5,1.793,3261.3
DATA 1.39855,3652.0,1.25264,4281.7,1.07779,4774.0,1
DATA 983.4,12.347,1167.98,.60316,2439.62,.3895,3345.95,.29692,3712.25
DATA .27253,4090.17,.24882,4523.23,.21045
'N3VST2
DATA 2954.9822, 3.996840
'F2 ojo, se refieren ahora a N3, despues se modificaran a prf%(filn%)
'S1VSN3
DATA -1953.0699, 1.374493
'S2VSN3
DATA -1360.2429, 1.250080
'S3VSN3
DATA -871.4017, 1.154303
'S4VSN3
DATA 651.9126, 0.898848
'S5VSN3
DATA 1311.6655, 0.808404
'S6VSN3
DATA 2265.4609, 0.694083
'S7VSN3
DATA 2993.5865, 0.612715
'N1VSN3
DATA -4969.0234, 2.121085
'N2VSN3
DATA -2349.1557, 1.462325
'N3VSN3
DATA 0,1
'N4VSN3
DATA 1376.8963, 0.800048
'N5VSN3
DATA 1904.5043, 0.735643
'N6VSN3
DATA 2430.3990, 0.675511
'N7VSN3
DATA 2993.5865, 0.612715
'conversion to Reference peak:
F% = 1'for F2
iref = prf%(F%): K(0, 1, F%) = K(0, 1, F%) * K(iref, 1, F%)
K(0, 0, F%) = K(0, 0, F%) * K(iref, 1, F%) + K(iref, 0, F%)
K(0, 0, F%) = 4316.484 '(9.1.06)
K(0, 1, F%) = 2.772851 '(9.1.06)
kq1 = K(iref, 1, F%): kq0 = K(iref, 0, F%)
FOR i = 1 TO LF%
IF i <> LE% + 1 THEN
K(i, 1, F%) = K(i, 1, F%) / kq1
K(i, 0, F%) = K(i, 0, F%) - K(i, 1, F%) * kq0
ELSE
iref = LE% + 1: kq1 = K(iref, 1, F%): kq0 = K(iref, 0, F%)
END IF
NEXT i
READ K(LE% + 1, 0, 1), K(LE% + 1, 1, 1)
'N1VST2.1:
DATA 1298.6928, 8.480846
Umb = 800
C1(0) = 1.07426: C2(0) = -.0235163: K1(0) = .870303: K2(0) = .0578625
C1(1) = 1.01563: C2(1) = .0827399: K1(1) = .885753: K2(1) = .0554719
ICLOH!(0) = 3.067797: ICLO2!(0) = 2.609154
ICLOH!(1) = 2.978852: ICLO2!(1) = 2.655499
ICO2!(0) = 2.631356: ICOH!(0) = 3.067797
ICO2!(1) = 2.732946: ICOH!(1) = 3.319233
CNO2(0) = .8771186: KNO2(0) = 4.237288E-02
CNO2(1) = .9187742: KNO2(1) = 4.215922E-02
CNOH(0) = 1.040678: KNOH(0) = -.2135593
CNOH(1) = 1.161092: KNOH(1) = -.3131992
FOR i = 0 TO 1
DU1O2(i) = (CNO2(i) - K1(i)) * Umb
DU2O2(i) = (K2(i) - KNO2(i)) * Umb
DU1OH(i) = (CNOH(i) - C1(i)) * Umb
DU2OH(i) = (C2(i) - KNOH(i)) * Umb
NEXT i
RETURN
initvar2:
RESTORE Wi
FOR i = 1 TO LF%: READ W(i): NEXT
Wi:
'old:
DATA 50,50,40,30,15,15,14,25,20,12,10,10,10,10
'new, pero...
'DATA 50,50,40,30,24,18,15,52,40,32,24,18,17,15
FOR j = 0 TO 3: IF j = 1 AND filn% = 1 THEN RESTORE ShaF2
IF j = 3 THEN RESTORE calT2
READ G%(j): FOR i = 0 TO G%(j): READ a(i, j): NEXT: NEXT
DATA 3,7.6377125E-4,5.55366104E-4,-3.76855492E-5,1.98012609E-6
DATA 3,40.1392,229.911,-59.6237,6.64293
DATA 3,20.0144,272.093,-82.4147,9.69917
'Shagaev for F2....
ShaF2:
'SHAGOHF2
DATA 4,38.987,208.4552,-68.7006,12.70881,-.9778372
'SHAGO2F2
DATA 6,13.94857,236.0101,-21.88959,-45.82103,26.40504,-6.000724
DATA .5106456
calT2:
DATA 2,3.297524E-3,4.311662E-4,9.858838E-5
RETURN
emergexit:
LOCATE 12, 1
log$ = log$ + CHR$(13) + CHR$(10) + "Error FATAL !"
PRINT STRING$(80, "-")
PRINT log$
PRINT STRING$(80, "-")
GOSUB recd
GOSUB emerg
END
juego:
leadjm% = 200
IF MT% = 0 THEN GOSUB range
LE% = 7: GOSUB sync: NeJu% = -1: IF log$ <> "" THEN GOSUB recd
IF MT% = -1 THEN log$ = "MOTOR OFF": GOSUB recd
LOCATE 1, 1: PRINT SPACE$(160); : stCO% = -1: stHV% = -1: stobt% = -1
IF S(LE% + 1) = 0 THEN
GOSUB measT2: S(LE% + 1) = T2av
FOR i = LE% + 1 TO LF%
S(i) = K(i, 0, filn%) + S(LE% + 1) * K(i, 1, filn%)
NEXT i
END IF
pk% = LE% + 6
GOSUB chksig
DO
RF% = 13: GOSUB backlash
RF% = 10: GOSUB backlash
LOOP
backlash:
GOSUB pkseek
log$ = "backlash "
IF acp1$ = "*" AND acpt$ = "*" THEN
log$ = log$ + "= " + STR$(DP - dp1) + " steps"
LOCATE 16, 30: PRINT "backlash ="; : PRINT USING "#####.#"; DP - dp1;
ELSE
log$ = log$ + " unknown"
LOCATE 16, 30: PRINT B8$; B8$; B8$;
END IF
GOSUB recd
GOSUB verirep
RETURN
jm:
NO% = S(RF%) + 4 * W(RF%) + leadjm% - PS%: GOSUB MPP
EM% = 14
FOR Z% = 1 TO EM%
NO% = -leadjm% + W(RF%): GOSUB MPP
LOCATE 1, 76: PRINT Z%
NO% = -W(RF%)
FOR ID = 8 TO 0 STEP -1: GOSUB 8110: NEXT
Z% = Z% + 1: NO% = -leadjm%: GOSUB MPP
NO% = leadjm% - W(RF%): GOSUB MPP
LOCATE 1, 76: PRINT Z%
NO% = W(RF%)
FOR ID = 0 TO 8: GOSUB 8110: NEXT
IF Z% < EM% THEN NO% = leadjm%: GOSUB MPP
GOSUB acqT1
NEXT
FOR ID = 0 TO 8: GOSUB aveEimpar: NEXT
GOSUB parab: EM% = 14: GOSUB parlog: GOSUB recd
acp1$ = acpt$: S(RF%) = SRF0
dp1 = DP
FOR ID = 0 TO 8: GOSUB aveEpar: NEXT
GOSUB parab: EM% = 14
RETURN
aveEimpar:
EM% = EM% / 2:
FOR i = 1 TO EM%: R(i) = E(ID, 2 * i - 1): NEXT
GOSUB 880
IF EM% > 5 THEN IF VR > .1 * RS THEN GOSUB 730
E(ID, 0) = RS: E(ID, 1) = VR: EM% = 2 * EM%
RETURN
aveEpar:
EM% = EM% / 2:
FOR i = 1 TO EM%: R(i) = E(ID, 2 * i): NEXT
GOSUB 880
IF EM% > 5 THEN IF VR > .1 * RS THEN GOSUB 730
E(ID, 0) = RS: E(ID, 1) = VR: EM% = 2 * EM%
RETURN
chkdark:
now = TIMER
IF tdark > now THEN tdark = tdark - 86400
IF now >= tdark + 1800 THEN
obt% = (sal1% AND obtoff) 'shutter status
IF obt% <> obtoff THEN GOSUB obtoff: del& = 500 * lpms: GOSUB delay
ID = 8: Z% = 0: CN% = CO%: CO% = 4: GOSUB 8060: CO% = CN%
sal1% = (sal1% AND &HF8) OR CO%: tdark = now
dark = ZA: log$ = log$ + " dark=" + STR$(dark): GOSUB recd
IF obt% <> obtoff THEN GOSUB obtdel
END IF
RETURN
spcfile:
IF ctspc% < mxspc% THEN
fsc$ = "C:\dat\s" + shou + smin + LTRIM$(STR$(RF%)) + ".dat"
OPEN fsc$ FOR OUTPUT AS #8
x = INT(SRF0) - 4 * W(RF%) 'corrected ...INT(SRF0)
FOR ID = 0 TO 8
'FOR Z% = 1 TO EM%
'PRINT #8, x, E(ID, Z%)
' NEXT Z%
PRINT #8, x, E(ID, 0), 0
PRINT #8, x, par(ID), 1
x = x + W(RF%)
NEXT ID
CLOSE #8
ctspc% = ctspc% + 1
END IF
RETURN
rpt:
RESTORE
FOR i = 0 TO LF%: S(i) = 0: NEXT i
GOTO entry