10 REM Observe - A program to record 20 REM - astronomical 30 REM - observations 40 REM Author - Steven Flintham 50 REM - March 1989 60 REM Version - 1.00 (Public Domain) 70 MODE 7:VDU 23;8202;0;0;0; 80 PROCdisable:PROCinit 90 ON ERROR MODE 7:CLOSE #0:REPORT:PRINT" at line ";ERL:PROCenable:END 100 REPEAT 110 choice%=FNmenu 120 IF choice%=0 THEN PROCnew_file 130 IF choice%=1 THEN PROCold_file 140 IF choice%=2 THEN PROCenter_obs 150 IF choice%=3 THEN PROCview_obs 160 IF choice%=4 THEN PROCamend_obs 170 IF choice%=5 THEN PROCclose_file 180 UNTIL FALSE 190 END 200 DEF PROCdisable 210 *FX229,1 220 *FX4,2 230 ENDPROC 240 DEF PROCenable 250 *FX229,0 260 *FX4,0 270 ENDPROC 280 DEF PROCinit 290 T%=FALSE:REM SET TO TRUE IF TELETEXT ADAPTER AND ATS CONNECTED AND TUNED IN 300 IF T% THEN PROCsetup 310 name%=30:object%=30:date%=10:time%=5:vis%=1:inst%=39:notes%=255:extra%=5:rsize%=FNrec_size 320 name$="Steven Flintham":instrument$="8x40 Miranda binoculars" 330 mfsize%=10240:mrec%=(mfsize%-extra%)/rsize% 340 file$="None!":rec%=0 350 CLOSE #0 360 ENDPROC 370 DEF FNdate 380 LOCAL A%,X%,Y%,block% 390 *TTXON 400 block%=&0A00 410 A%=&7A:X%=block% MOD 256 420 Y%=block% DIV 256:?block%=22 430 CALL &FFF1 440 *TTXOFF 450 IF block%?10=&FF THEN ="NO DATE! " 460 block%?11=13 470 REPEAT 480 UNTIL FNdate_ok($(block%+1)) 490 =$(block%+1) 500 DEF PROCoscli($&700) 510 X%=0:Y%=7:CALL &FFF7 520 ENDPROC 530 DEF PROCsetup 540 *HOFF 550 *BBC1 560 REPEAT 570 *PAGE 100 580 *TRANSFER 7800 590 UNTIL FNdate<>"NO DATE! " 600 ENDPROC 610 DEF FNGMT 620 LOCAL A%,X%,Y%,block%,time$ 630 REPEAT 640 *TTXON 650 block%=&A00 660 A%=&7A:X%=block% MOD 256 670 Y%=block% DIV 256:?block%=15 680 CALL &FFF1 690 *TTXOFF 700 time$=FNpad(2,block%?11)+":" 710 time$=time$+FNpad(2,block%?12)+":" 720 time$=time$+FNpad(2,block%?13) 730 UNTIL FNtime_ok(time$) 740 =time$ 750 DEF FNpad(pad%,num%) 760 LOCAL text$ 770 text$=STR$~(num%) 780 REPEAT 790 IF LEN(text$)ASC":" AND ASC(MID$(t$,pos%,1))ASC"9" THEN ok%=FALSE 870 NEXT 880 =ok% 890 DEF FNrec_size 900 =name%+2+object%+2+date%+2+time%+2+vis%+2+inst%+2+notes%+2 910 DEF FNmenu 920 PROCtitle 930 PRINT CHR$129;"0)";CHR$131;"Open a new file of observations" 940 PRINT CHR$129;"1)";CHR$131;"Open an old file of observations" 950 PRINT CHR$129;"2)";CHR$131;"Enter some new observations" 960 PRINT CHR$129;"3)";CHR$131;"View the stored observations" 970 PRINT CHR$129;"4)";CHR$131;"Amend the stored observations" 980 PRINT CHR$129;"5)";CHR$131;"Close the current file" 990 PRINT'CHR$131;"Which option do you require?";CHR$129; 1000 REPEAT 1010 *FX21,0 1020 key%=GET-48 1030 UNTIL key%>=0 AND key%<=5 1040 PRINT STR$(key%); 1050 =key% 1060 DEF PROCtitle 1070 IF file$="None!" THEN rec%=0 1080 VDU 26,12 1090 PRINTTAB(0,0);CHR$129;CHR$157;CHR$131;CHR$141;"Astronomical Observations Database"; 1100 PRINTTAB(0,1);CHR$129;CHR$157;CHR$131;CHR$141;"Astronomical Observations Database"; 1110 PRINTTAB(0,2);CHR$131;CHR$157;CHR$129;"by Steven Flintham";TAB(24,2);"File:";file$;SPC(9-LEN(file$)); 1120 PRINTTAB(0,23);CHR$129;CHR$157;CHR$131;:IF T% THEN PRINT "G.M.T. : ";FNGMT;" Date : ";FNdate;:PRINTTAB(0,22);CHR$131;CHR$157;CHR$129; 1130 PRINT "Observations in file : ";STR$(rec%);" / ";STR$(mrec%);" "; 1140 VDU 28,0,20,39,4 1150 ENDPROC 1160 DEF PROCnew_file 1170 IF file$<>"None!" THEN PRINT''CHR$131;"A file is already open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1180 PRINT''CHR$131;"Press RETURN on its own to quit." 1190 PRINT'CHR$131;"Please enter the directory for the new ";CHR$131;"file. The directory is "; 1200 file$=FNinput2(1)+"." 1210 IF file$="." THEN file$="None!":ENDPROC 1220 PRINT'CHR$131;"Please enter the filename for the new ";CHR$131;"file. The filename is "; 1230 file$=file$+FNinput2(7) 1240 IF LEN(file$)=2 THEN file$="None!":ENDPROC 1250 file%=OPENIN(file$) 1260 IF file%<>0 THEN IF NOT FNsure THEN CLOSE #file%:file$="None!":ENDPROC 1270 CLOSE #file% 1280 PRINT'CHR$131;"Please wait whilst I create the file..."; 1290 PROCoscli("SAVE "+file$+" 0000 + "+STR$~((mrec%*rsize%)+extra%)) 1300 rec%=0 1310 file%=OPENUP(file$) 1320 PRINT'CHR$131;"File created. Press SPACE." 1330 *FX21,0 1340 REPEAT UNTIL GET=32 1350 ENDPROC 1360 DEF FNinput(len%):=FNinput3(len%,FALSE) 1370 DEF FNinput2(len%):=FNinput3(len%,TRUE) 1380 DEF FNinput3(length%,blank%) 1390 LOCAL pos%,vpos% 1400 pos%=POS:vpos%=VPOS 1410 ?&C00=&30 1420 ?&C01=&0C 1430 ?&C02=length% 1440 ?&C03=32 1450 ?&C04=127 1460 A%=0:X%=&00:Y%=&0C:CALL &FFF1 1470 IF LEN($&C30)=0 AND NOT blank% THEN PRINTTAB(pos%,vpos%);:GOTO 1410 1480 =$&C30 1490 DEF FNsure 1500 PRINT:=FNyesno("Are you sure?") 1510 DEF FNyesno(text$) 1520 PRINT CHR$131;text$;" (Y/N) "; 1530 REPEAT 1540 key$=CHR$((GET AND &DF)) 1550 UNTIL key$="Y" OR key$="N" 1560 IF key$="Y" THEN PRINT "Yes" ELSE PRINT "No" 1570 =(key$="Y") 1580 DEF PROCclose_file 1590 IF file$="None!" THEN PRINT''CHR$131;"No file is open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1600 PRINT:IF NOT FNsure THEN ENDPROC 1610 PRINT'CHR$131;"I am closing the file..." 1620 PTR #file%=0 1630 PRINT #file%,rec% 1640 CLOSE #file% 1650 file$="None!" 1660 PRINT'CHR$131;"The file is now closed. Press SPACE." 1670 *FX21,0 1680 REPEAT UNTIL GET=32 1690 ENDPROC 1700 DEF PROCold_file 1710 IF file$<>"None!" THEN PRINT''CHR$131;"A file is already open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1720 PRINT''CHR$131;"Press RETURN on its own to quit." 1730 PRINT'CHR$131;"Please enter the directory of the old ";CHR$131;"file. The directory is "; 1740 file$=FNinput2(1)+"." 1750 IF file$="." THEN file$="None!":ENDPROC 1760 PRINT'CHR$131;"Please enter the filename of the old ";CHR$131;"file. The filename is "; 1770 file$=file$+FNinput2(7) 1780 IF LEN(file$)=2 THEN file$="None!":ENDPROC 1790 file%=OPENIN(file$) 1800 IF file%=0 THEN file$="None!":CLOSE #file%:PRINT'CHR$131;"This file does not exist. Press SPACE.";:PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1810 CLOSE #file%:file%=OPENUP(file$) 1820 INPUT #file%,rec% 1830 PRINT'CHR$131;"File re-opened. Press SPACE." 1840 *FX21,0 1850 REPEAT UNTIL GET=32 1860 ENDPROC 1870 DEF PROCplace_head(at%) 1880 PTR #file%=extra%+(rsize%*at%) 1890 ENDPROC 1900 DEF PROCenter_obs 1910 IF file$="None!" THEN PRINT''CHR$131;"No file is open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1920 IF rec%=mrec% THEN PRINT''CHR$131;"The file is full. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 1930 PROCtitle 1940 PROCplace_head(rec%) 1950 PRINT CHR$131;"Press RETURN for the default which is ";CHR$131;"shown in";CHR$129;"red";CHR$131;"if available." 1960 PRINT'CHR$131;"Press ESCAPE to return to the menu." 1970 ON ERROR IF ERR=17 THEN PROCdisable:GOTO 90 ELSE MODE 7:CLOSE #0:REPORT:PRINT" at line ";ERL:PROCenable:END 1980 *FX229,0 1990 PRINT'CHR$129;"Observer:";name$ 2000 PRINT CHR$131;"Observer:";:P%=POS:V%=VPOS:obs$=FNinput2(name%) 2010 IF obs$="" THEN obs$=name$:PRINTTAB(P%,V%);name$ 2020 PRINTTAB(0,V%+2);CHR$131;"Object:";:obj$=FNinput(object%) 2030 IF T% THEN D$=FNdate 2040 REPEAT 2050 PROCtitle 2060 satis%=TRUE 2070 PRINT:IF T% THEN PRINT CHR$129;"Date:";D$ 2080 PRINT CHR$131;"Date:";:P%=POS:V%=VPOS 2090 IF T% THEN date$=FNinput2(date%) ELSE date$=FNinput(date%) 2100 IF date$="" THEN PRINTTAB(P%,V%);D$:date$=D$ ELSE I$=date$:date$=FNconvert(date$):IF I$<>date$ THEN PRINT CHR$131;"Date:";date$'';:satis%=FNyesno("Is this alright?") 2110 UNTIL FNdate_ok(date$) AND satis% 2120 REPEAT 2130 PROCtitle 2140 satis%=TRUE 2150 PRINT'CHR$131;"Time:";:time$=FNinput(time%) 2160 T$=time$:time$=FNt_conv(time$):IF T$<>time$ THEN PRINT CHR$131;"Time:";time$'';:satis%=FNyesno("Is this alright?") 2170 UNTIL satis% 2180 PRINT'CHR$131;"Visibility? (1) Excellent to"'CHR$131;"(5) Very poor" 2190 REPEAT:PRINT CHR$131;"Visibility:";:vis$=FNinput(vis%) 2200 UNTIL VAL(vis$)>=1 AND VAL(vis$)<=5 2210 PRINT'CHR$129;"Instrument:"'CHR$129;instrument$ 2220 PRINT CHR$131;"Instrument:"'CHR$131;:P%=POS:V%=VPOS:inst$=FNinput2(inst%) 2230 IF inst$="" THEN inst$=instrument$:PRINTTAB(P%,V%);inst$ 2240 PROCtitle 2250 VDU 26:FOR line%=3 TO 20:PRINTTAB(0,line%);CHR$131;:NEXT:VDU 28,1,20,39,4,30 2260 PRINT "Notes:";:notes$=FNinput(notes%) 2270 PRINT'"Storing observation..." 2280 *FX229,1 2290 ON ERROR MODE 7:CLOSE #0:REPORT:PRINT" at line ";ERL:PROCenable:END 2300 PROCwrite_data 2310 PRINT'"Observation stored. Press SPACE." 2320 *FX21,0 2330 REPEAT UNTIL GET=32 2340 rec%=rec%+1 2350 ENDPROC 2360 DEF PROCwrite_data 2370 PRINT #file%,obs$:PRINT #file%,obj$ 2380 PRINT #file%,date$:PRINT #file%,time$ 2390 PRINT #file%,vis$:PRINT #file%,inst$ 2400 PRINT #file%,notes$ 2410 ENDPROC 2420 DEF PROCread_data 2430 INPUT #file%,obs$:INPUT #file%,obj$ 2440 INPUT #file%,date$:INPUT #file%,time$ 2450 INPUT #file%,vis$:INPUT #file%,inst$ 2460 INPUT #file%,notes$ 2470 ENDPROC 2480 DEF FNconvert(conv$) 2490 LOCAL new$,pos%,char$,pos1%,pos2%,day$,month$,year$,div% 2500 new$="" 2510 FOR pos%=1 TO LEN(conv$) 2520 char$=MID$(conv$,pos%,1) 2530 IF char$="/" THEN new$=new$+"/" 2540 IF char$=":" THEN new$=new$+"/" 2550 IF char$="." THEN new$=new$+"/" 2560 IF char$<>"/" AND char$<>":" AND char$<>"." THEN new$=new$+char$ ELSE div%=div%+1 2570 NEXT 2580 IF div%<>2 THEN ="01/01/1989" 2590 pos1%=INSTR(new$,"/") 2600 pos2%=INSTR(new$,"/",pos1%+1) 2610 day$=LEFT$(new$,pos1%-1) 2620 month$=MID$(new$,pos1%+1,pos2%-pos1%-1) 2630 year$=MID$(new$,pos2%+1) 2640 IF LEN(day$)>2 THEN day$=RIGHT$(day$,2) 2650 IF LEN(day$)=0 THEN day$="01" 2660 IF LEN(day$)=1 THEN day$="0"+day$ 2670 IF LEN(month$)=0 THEN month$="01" 2680 IF LEN(month$)=1 THEN month$="0"+month$ 2690 IF LEN(month$)>2 THEN month$=RIGHT$(month$,2) 2700 IF LEN(year$)>4 THEN year$=RIGHT$(year$,4) 2710 IF LEN(year$)=2 THEN year$="19"+year$ 2720 IF LEN(year$)<4 THEN year$="1989" 2730 =day$+"/"+month$+"/"+year$ 2740 DEF FNdate_ok(check$) 2750 IF LEN(check$)<>10 THEN =FALSE 2760 pos1%=INSTR(check$,"/") 2770 pos2%=INSTR(check$,"/",pos1%+1) 2780 IF pos1%<>3 THEN =FALSE 2790 IF pos2%<>6 THEN =FALSE 2800 day%=VAL(LEFT$(check$,2)) 2810 month%=VAL(MID$(check$,4,2)) 2820 year%=VAL(RIGHT$(check$,4)) 2830 IF year%<1989 THEN =FALSE 2840 IF month%<1 OR month%>12 THEN =FALSE 2850 dim%=FNd_i_m(month%) 2860 IF month%=2 THEN =FNfeb_ok(day%,year%) 2870 IF day%<1 OR day%>dim% THEN =FALSE 2880 =TRUE 2890 DEF FNfeb_ok(d%,y%) 2900 dim%=28 2910 IF y%/4=INT(y%/4) AND y%/100<>INT(y%/100) THEN dim%=29 2920 IF y%/4=INT(y%/4) AND y%/400=INT(y%/400) THEN dim%=29 2930 IF d%<1 OR d%>dim% THEN =FALSE 2940 =TRUE 2950 DEF FNd_i_m(mon%) 2960 RESTORE 2970 FOR read%=1 TO mon%:READ d%:NEXT 2980 =d% 2990 DATA 31,28,31,30,31,30,31,31,30,31,30,31 3000 DEF FNt_conv(t$) 3010 new$="" 3020 FOR pos%=1 TO LEN(t$) 3030 char$=MID$(t$,pos%,1) 3040 IF char$="/" OR char$="." OR char$=":" THEN new$=new$+":" ELSE new$=new$+char$ 3050 NEXT 3060 pos%=INSTR(new$,":") 3070 hour%=VAL(LEFT$(new$,pos%-1)) 3080 min%=VAL(MID$(new$,pos%+1)) 3090 IF hour%<0 THEN hour%=0 3100 IF hour%>23 THEN hour%=23 3110 IF min%<0 THEN min%=0 3120 IF min%>59 THEN min%=59 3130 hour$=STR$(hour%):min$=STR$(min%) 3140 IF LEN(hour$)=1 THEN hour$="0"+hour$ 3150 IF LEN(min$)=1 THEN min$="0"+min$ 3160 =hour$+":"+min$ 3170 DEF PROCview_obs 3180 IF file$="None!" THEN PRINT''CHR$131;"No file is open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 3190 IF rec%=0 THEN PRINT''CHR$131;"There are no stored observations."'CHR$131;"Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 3200 view%=0 3210 REPEAT 3220 PROCplace_head(view%) 3230 PROCread_data 3240 PROCtitle 3250 PRINTTAB(0,0);CHR$131;"Observation:";STR$(view%+1) 3260 PRINTTAB(0,1);CHR$131;"Observer:";obs$ 3270 PRINTTAB(0,2);CHR$131;"Object:";obj$ 3280 PRINTTAB(0,3);CHR$131;"Date:";date$ 3290 PRINTTAB(0,4);CHR$131;"Time:";time$ 3300 PRINTTAB(0,5);CHR$131;"Visibility (1=Excellent,5=Very poor):";vis$ 3310 PRINTTAB(0,6);:PROCprint("Instrument:"+inst$,131) 3320 PRINTTAB(0,8);CHR$131;"Notes:";:PROCprint(notes$,131) 3330 PRINTTAB(0,16);CHR$131;"(N)ext record,(L)ast record,(M)enu"; 3340 REPEAT 3350 *FX21,0 3360 key$=CHR$((GET AND &DF)) 3370 UNTIL key$="N" OR key$="L" OR key$="M" 3380 IF key$="N" AND view%0 THEN view%=view%-1 3400 UNTIL key$="M" 3410 ENDPROC 3420 DEF PROCprint(p$,C%) 3430 LOCAL W%,K%,L%,P%,r$,w$ 3440 W%=39:VDU C% 3450 REPEAT K%=INSTR(p$," ") 3460 IF K%=0 K%=LEN(p$) 3470 w$=LEFT$(p$,K%):P%=POS 3480 p$=RIGHT$(p$,LENp$-K%) 3490 IF P%+K%>W% OR P%>W% PRINT:VDU C%:P%=0 3500 FOR L%=1 TO LEN w$ 3510 VDU ASC(MID$(w$,L%)):NEXT 3520 UNTIL p$="":ENDPROC 3530 DEF PROCamend_obs 3540 IF file$="None!" THEN PRINT''CHR$131;"No file is open. Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 3550 IF rec%=0 THEN PRINT''CHR$131;"There are no stored observations."'CHR$131;"Press SPACE.":PROCoscli("FX21,0"):REPEAT UNTIL GET=32:ENDPROC 3560 PROCtitle 3570 PRINT CHR$131;"Press RETURN to quit." 3580 PRINT'CHR$131;"Which record do you want to amend?" 3590 REPEAT 3600 PRINT'CHR$131;"Amend record ";:amend$=FNinput2(LEN(STR$(rec%))) 3610 UNTIL amend$="" OR (VAL(amend$)>=1 AND VAL(amend$)<=rec%) 3620 IF amend$="" THEN ENDPROC 3630 amend%=VAL(amend$)-1 3640 PROCtitle 3650 PROCplace_head(amend%) 3660 PROCread_data 3670 PRINT CHR$131;"Press RETURN to leave item alone." 3680 PRINT'CHR$131;"Observer:";obs$ 3690 PRINT CHR$131;"Observer:";:P%=POS:V%=VPOS:o$=FNinput2(name%) 3700 IF o$<>"" THEN obs$=o$ ELSE PRINTTAB(P%,V%);obs$ 3710 PRINT'CHR$131;"Object:";obj$ 3720 PRINT CHR$131;"Object:";:P%=POS:V%=VPOS:o$=FNinput2(object%) 3730 IF o$<>"" THEN obj$=o$ ELSE PRINTTAB(P%,V%);obj$ 3740 REPEAT 3750 satis%=TRUE 3760 PROCtitle 3770 PRINT CHR$131;"Date:";date$ 3780 PRINT CHR$131;"Date:";:P%=POS:V%=VPOS:d2$=FNinput2(date%) 3790 IF d2$="" THEN PRINTTAB(P%,V%);date$:d2$=date$ 3800 d3$=FNconvert(d2$) 3810 IF d2$<>d3$ THEN PRINT CHR$131;"Date:";d3$'';:satis%=FNyesno("Is this alright?") 3820 UNTIL satis% AND FNdate_ok(d3$) 3830 date$=d3$ 3840 REPEAT 3850 PROCtitle 3860 satis%=TRUE 3870 PRINT CHR$131;"Time:";time$ 3880 PRINT CHR$131;"Time:";:P%=POS:V%=VPOS:t2$=FNinput2(time%) 3890 IF t2$="" THEN PRINTTAB(P%,V%);time$:t2$=time$ 3900 t3$=FNt_conv(t2$) 3910 IF t3$<>t2$ THEN PRINT CHR$131;"Time:";t3$'';:satis%=FNyesno("Is this alright?") 3920 UNTIL satis% 3930 time$=t3$ 3940 PRINT'CHR$131;"Visibility (1=Excellent,5=Very poor):";vis$ 3950 REPEAT 3960 PRINT CHR$131;"Visibility:";:P%=POS:V%=VPOS:v$=FNinput2(vis%) 3970 UNTIL (VAL(v$)>=1 AND VAL(v$)<=5) OR v$="" 3980 IF v$="" THEN PRINTTAB(P%,V%);vis$ ELSE vis$=v$ 3990 PRINT'CHR$131;"Instrument:"'CHR$131;inst$ 4000 PRINT CHR$131;"Instrument:"'CHR$131;:P%=POS:V%=VPOS:in$=FNinput2(inst%) 4010 IF in$="" THEN PRINTTAB(P%,V%);inst$ ELSE inst$=in$ 4020 PROCtitle 4030 VDU 26:FOR line%=3 TO 20:PRINTTAB(0,line%);CHR$131;:NEXT:VDU 28,1,20,39,4,30 4040 PRINT "Notes:";notes$ 4050 PRINT'"Notes:";:P%=POS:V%=VPOS:n$=FNinput2(notes%) 4060 IF n$="" THEN PRINTTAB(P%,V%);notes$ ELSE notes$=n$ 4070 PRINT'"Storing observation..." 4080 PROCplace_head(amend%) 4090 PROCwrite_data 4100 PRINT'"Observation stored. Press SPACE." 4110 *FX21,0 4120 REPEAT UNTIL GET=32 4130 ENDPROC