Enrico Barsanti
PROGRAMMA IN GW-BASIC
Il seguente programma, con tutti i dati necessari per il calcolo, applica il metodo e i punti descritti in Pianeti.
0 REM - PIANETI - REL.6 - gennaio 1988 - di ENRICO BARSANTI
1 REM - REVISIONE LUGLIO 1991
2 REM - REL.1 DEL 1981, PER TI59
3 REM - REL.2 DEL 1981, PER SINCLAIR ZX80
4 REM - REL.3 DEL 1984, PER COMMODOR 16
5 REM - REL.5 DEL 1986, PER APPLE II
6 REM - REL.6 DEL 1988, PER IBM PC
8 DIM X(28), M$(11):
10 GOTO 10000: REM - PROGRAMMA PRINCIPALE
100 REM
110 REM - SUBROUTINES
120 REM
130 REM ======================
140 REM - PAUSA
150 REM ======================
160 LOCATE 16, 1: PRINT "Un tasto per continuare...";
170 INK$ = INPUT$(1): RETURN
200 REM ======================
210 REM - TRASF. DA GG.MMSS A GG.DDDD
220 REM ======================
230 H0 = ABS(H): H1 = (H0 - INT(H0)) * 100: H2 = INT(H1 + .001)
240 H3 = INT(H0) + H2 / 60 + (H1 - H2) / 36
250 IF H < 0 THEN H3 = -H3
260 H = H3: RETURN
300 REM ======================
310 REM - TRASF. DA GG.DDDD A GG.MMSS
320 REM ======================
330 H0 = ABS(H): H1 = (H0 - INT(H0)) * 60: H2 = INT(H1 + .001)
335 H3 = INT(H0) + H2 / 100 + (H1 - H2) * .006
340 IF H < 0 THEN H3 = -H3
350 H = H3: RETURN
400 REM ======================
410 REM - RIDUZIONE AMBITO DA 0 A 2*PI
420 REM ======================
430 S1 = S1 / P2: S1 = (S1 - INT(S1)) * P2
440 IF S1 >= 0 THEN RETURN
450 S1 = S1 + P2: RETURN
500 REM ======================
510 REM - PRESENTA ORE FORMATO HH:MM:SS
520 REM ======================
525 K$ = "": IF VAL(J$) < 0 THEN K$ = "-"
530 J$ = RIGHT$(J$, LEN(J$) - 1)
535 FOR I = 1 TO LEN(J$)
540 IF MID$(J$, I, 1) = "." THEN J$ = RIGHT$("00" + LEFT$(J$, I - 1), 2) + ":" +
RIGHT$("00" + MID$(J$, I + 1, 2), 2) + ":" + RIGHT$("00" + MID$(J$, I + 3, 2), 2)
545 NEXT
570 IF LEN(J$) < 3 THEN J$ = RIGHT$("00" + J$, 2) + ":" + "00" + ":" + "00"
575 J$ = K$ + J$
580 RETURN
600 REM ======================
610 REM - ARROTONDAMENTO
620 REM ======================
630 H1 = ABS(H): H2 = (H1 - INT(H1)) * P
640 H3 = INT(H2): IF H2 - H3 >= .5 THEN H3 = H3 + 1
650 J$ = RIGHT$("0000" + MID$(STR$(H3), 2), LEN(STR$(P)) - 2)
660 K$ = "": IF H < 0 THEN K$ = "-"
670 J$ = K$ + MID$(STR$(INT(H1)), 2) + "." + J$: RETURN
700 REM ======================
710 REM - INTESTAZIONE
720 REM ======================
730 CLS : PRINT TAB(32); : COLOR 0, 7: PRINT " P I A N E T I ": COLOR 7, 0
735 PRINT : PRINT TAB(21); "PROGRAMMA PER IL CALCOLO DELLE
ORBITE"
737 PRINT TAB(25); "E DELLE POSIZIONI PLANETARIE": PRINT
738 PRINT TAB(26); "(c) ENRICO BARSANTI - 1981"
740 RETURN
750 REM ======================
752 REM - SCELTE
754 REM ======================
756 PRINT : PRINT "SCELTE:"
758 PRINT : PRINT "1 - Dati su monitor"
760 PRINT "2 - Dati su stampante"
765 PRINT "3 - Fine": PRINT "? "; : LOCATE , , 1
770 A$ = INKEY$: IF A$ < "1" OR A$ > "3" THEN 770
775 IF A$ = "3" THEN SYSTEM
777 IF A$ = "2" THEN STAMP$ = "SI"
778 IF STAMP$ <> "SI" THEN RETURN
781 GOSUB 800: REM - INIT STAMPANTE
782 PRINT : PRINT "Grafico di pianeti n.? <1-9> "; : LOCATE , , 1
785 A$ = INKEY$: IF A$ < "1" OR A$ > "9" THEN 785
790 N = VAL(A$)
795 RETURN
800 REM ======================
810 REM - STAMPANTE
820 REM ======================
830 REM - INIT PER TESTO
840 REM - WIDTH "LPT1:", 80
850 REM - OPEN "LPT1:" AS #1
860 REM - PRINT #1, CHR$ (17);: REM - SELECT
870 REM - PRINT #1, CHR$ (27) "@": REM - CLEAR
880 RETURN
900 REM - INIT PER GRAFICA
910 REM - PRINT CHR$(27); "3"; CHR$(28)
920 REM - PRINT CHR$(9); "G2"
930 RETURN
940 REM - DISINIT STAMPANTE
950 REM - PRINT #1, CHR$ (27) "@": REM - CLEAR
965 REM - CLOSE #1
970 RETURN
1000 REM
1010 REM - STAMPA SU MONITOR
1020 REM
1030 REM ======================
1040 REM - SCRIVE ORA E GIORNO
1050 REM ======================
1060 IF STAMP$ = "SI" THEN 2000
1070 CLS : COLOR 0, 7: PRINT " Ore "; H$; " T.U. di "; G$(D); G; M$(M - 1); A; " ":
COLOR 7, 0: PRINT
1080 RETURN
1090 REM ======================
1100 REM - SCRIVE DATI TERRA/SOLE
1110 REM ======================
1120 IF STAMP$ = "SI" THEN 2110
1130 PRINT "TEMPO SIDERALE ="; RIGHT$(SP$ + TS$, 9); " EQUAZ.TEMPO
="; RIGHT$(SP$ + ET$, 9); " TEMPO VERO ="; RIGHT$(SP$ + TV$, 9)
1140 PRINT "INCL. EQUATORE ="; RIGHT$(SP$ + IO$, 9); " A.R. SOLE =";
RIGHT$(SP$ + AR$, 9); " DECL. SOLE ="; RIGHT$(SP$ + DE$, 9)
1150 PRINT "LONG.ORB.TERRA ="; RIGHT$(SP$ + LO$, 9); " DIST. SOLE =";
RIGHT$(SP$ + RV$, 9): PRINT
1152 REM ======================
1155 REM - SCRIVE INTESTAZIONE DATI PIANETI
1157 REM ======================
1160 W$ = "¦": REM - LINEA VERTICALE
1170 COLOR 0, 7: PRINT " PIANETA"; W$; " A.R. "; W$; " DECL. "; W$;
"DS.TE"; W$; "DS.SO"; W$; "IN.OR"; W$; "LNG.EL"; W$; "LAT.EL"; W$; "LNG.GE"; W$;
"LAT.GE"; W$; "LNG.OR"; : COLOR 7, 0
1180 RETURN
1190 REM ======================
1200 REM - SCRIVE DATI PIANETI
1210 REM ======================
1220 IF STAMP$ = "SI" THEN 2200
1230 W$ = "¦": REM - LINEA VERTICALE
1240 PRINT LEFT$(A$ + SP$, 8); W$; AR$; W$; RIGHT$(SP$ + DE$, 9); W$;
RIGHT$(SP$ + DT$, 5); W$;
1250 PRINT RIGHT$(SP$ + RV$, 5); W$; RIGHT$(SP$ + IO$, 5); W$;
1260 PRINT RIGHT$(SP$ + LE$, 6); W$; RIGHT$(SP$ + TE$, 6); W$;
RIGHT$(SP$ + LG$, 6); W$;
1270 PRINT RIGHT$(SP$ + TG$, 6); W$; RIGHT$(SP$ + LO$, 6);
1280 RETURN
1290 REM ======================
1300 REM - SCRIVE LINEA ORIZZONTALE
1310 REM ======================
1320 W$ = "-": FOR I = 1 TO 80: PRINT W$; : NEXT
1330 RETURN
2000 REM
2010 REM - STAMPA SU CARTA
2020 REM
2030 REM ======================
2040 REM - SCRIVE ORA E GIORNO
2050 REM ======================
2060 LPRINT " Ore "; H$; " T.U. di "; G$(D); G; M$(M - 1); A: LPRINT
2070 RETURN
2080 REM ======================
2090 REM - SCRIVE DATI TERRA/SOLE
2100 REM ======================
2110 LPRINT "TEMPO SIDERALE ="; RIGHT$(SP$ + TS$, 9); " EQUAZ.TEMPO
="; RIGHT$(SP$ + ET$, 9); " TEMPO VERO ="; RIGHT$(SP$ + TV$, 9)
2120 LPRINT "INCL. EQUATORE ="; RIGHT$(SP$ + IO$, 9); " A.R. SOLE =";
RIGHT$(SP$ + AR$, 9); " DECL. SOLE ="; RIGHT$(SP$ + DE$, 9)
2130 LPRINT "LONG.ORB.TERRA ="; RIGHT$(SP$ + LO$, 9); " DIST. SOLE
="; RIGHT$(SP$ + RV$, 9): LPRINT
2135 REM ======================
2137 REM - SCRIVE INTESTAZIONE DATI PIANETI
2139 REM ======================
2140 W$ = "¦": REM - LINEA VERTICALE
2150 LPRINT " PIANETA"; W$; " A.R. "; W$; " DECL. "; W$; "DS.TE"; W$;
"DS.SO"; W$; "IN.OR"; W$; "LNG.EL"; W$; "LAT.EL"; W$; "LNG.GE"; W$; "LAT.GE"; W$;
"LNG.OR";
2155 LPRINT "--------+--------+---------+-----+-----+-----+------+------+------+------+------";
2160 RETURN
2170 REM ======================
2180 REM - SCRIVE DATI PIANETI
2190 REM ======================
2200 W$ = "¦": REM - LINEA VERTICALE
2210 LPRINT LEFT$(A$ + SP$, 8); W$; AR$; W$; RIGHT$(SP$ + DE$, 9); W$;
RIGHT$(SP$ + DT$, 5); W$;
2220 LPRINT RIGHT$(SP$ + RV$, 5); W$; RIGHT$(SP$ + IO$, 5); W$;
2230 LPRINT RIGHT$(SP$ + LE$, 6); W$; RIGHT$(SP$ + TE$, 6); W$;
RIGHT$(SP$ + LG$, 6); W$;
2240 LPRINT RIGHT$(SP$ + TG$, 6); W$; RIGHT$(SP$ + LO$, 6);
2250 RETURN
4000 REM
4010 REM - SUB DEI CALCOLI
4020 REM
4025 REM ======================
4030 REM - DETERMINAZIONE NUOVI DATI ORBITALI
4040 REM ======================
4050 X(0) = (X(0) + X(1) * GG) / 360: X(0) = (X(0) - INT(X(0))) * 360: REM -
LONG.MEDIA
4060 X(2) = X(2) + X(3) * GG: REM - LONG.PERIELIO
4070 X(4) = X(4) + X(5) * GG: REM - ECCENTRICITA'
4080 X(6) = X(6) + X(7) * GG: REM - LONG.NODO ASCENDENTE
4090 X(8) = X(8) + X(9) * GG: REM - INCLINAZ.ORBITA/INCLINAZ.EQUATORE
4100 X(11) = (X(0) - X(2)) / 360: X(11) = (X(11) - INT(X(11))) * P2: REM -
ANOMALIA MEDIA
4110 REM - RISOLUZ.EQUAZ.DI KEPLERO - 4110/4150
4120 S1 = X(11)
4130 X(18) = SIN(S1) * X(4) + X(11): IF ABS((S1) - X(18)) < .000001 THEN 4150
4140 S1 = X(18): GOTO 4130
4150 X(12) = X(18): REM - ANOMALIA ECCENTRICA
4160 S1 = 2 * ATN(SQR((1 + X(4)) / (1 - X(4))) * TAN(X(12) / 2)): GOSUB 430:
X(13) = S1: REM - ANOMALIA VERA
4170 S1 = X(13) + X(2) * PI / 180: GOSUB 430: X(14) = S1: REM -
LONG.ORBITALE VERA
4180 V = X(14): REM - LONG.ORBIT.IN RADIANTI PER GRAFICA
4190 X(15) = X(10) * (1 - X(4) * COS(X(12))): REM - RAGGIO VETTORE
4260 RETURN
5000 REM ======================
5010 REM - SOLO TERRA/SOLE
5020 REM ======================
5030 ASN = SIN(E) * SIN(X(14) + PI): X(16) = ATN(ASN / SQR(-ASN * ASN + 1)):
REM - DECLINAZIONE DEL SOLE
5040 ACS = COS(X(14) + PI) / COS(X(16)): X(17) = -ATN(ACS / SQR(-ACS *
ACS + 1)) + PI / 2: REM - ASCENSIONE RETTA SOLE
5050 IF X(16) >= 0 THEN 5070
5060 X(17) = P2 - X(17)
5070 X(18) = X(0)
5080 S1 = X(17) + PI: GOSUB 430: X(19) = X(0) - S1 * 180 / PI: REM -
EQU.TEMPO
5090 H9 = H9 + X(19) / 15: IF H9 < 0 THEN H9 = H9 + 24: REM - TEMPO VERO
5100 H = H9: GOSUB 330: H9 = H
5110 X(20) = X(15) * COS(X(14)): REM - X = COORD.CART.ECL.ELIOC.TERRA
5120 X(21) = X(15) * SIN(X(14)): REM - Y = COORD.CART.ECL.ELIOC.TERRA
5130 R = X(20): S = X(21)
5140 REM - TRASF.DA RADIANTI IN GRADI - 5135/5170
5150 FOR I = 11 TO 17
5160 IF I = 15 THEN 5180
5170 X(I) = X(I) * 180 / PI
5180 NEXT
5190 REM - TRASF.DA GRADI IN HH.MMSS - 5175/5190
5200 FOR I = 17 TO 19: H = X(I) / 15: GOSUB 330
5210 X(I) = H: NEXT: H = X(16): GOSUB 330: X(16) = H
5220 REM ======================
5230 REM - DATI PER LA STAMPA
5240 REM ======================
5242 P = 10000: H = X(8): GOSUB 600: IO$ = J$: REM - INCL.ORBITA
5244 H = X(14): GOSUB 600: LO$ = J$: REM - LONG.ORBITALE
5246 H = X(15): GOSUB 600: RV$ = J$: REM - RAGGIO VETTORE
5250 P = 10000
5260 H = X(8): GOSUB 330: GOSUB 600: GOSUB 530: IO$ = J$: REM -
INCL.EQUAT.
5270 H = X(17): GOSUB 600: GOSUB 530: AR$ = J$: REM - ASCENSIONE
RETTA
5280 H = X(16): GOSUB 600: GOSUB 530: DE$ = J$: REM - DECLINAZIONE
5290 H = X(18): GOSUB 600: GOSUB 530: TS$ = J$: REM - TEMPO SIDERALE
5300 H = X(19): GOSUB 600: GOSUB 530: ET$ = J$: REM - EQUAZIONE
TEMPO
5310 H = H9: GOSUB 600: GOSUB 530: TV$ = J$: REM - TEMPO VERO
5320 RETURN
6000 REM ======================
6010 REM - SOLO PIANETI
6020 REM ======================
6030 O = X(14) - X(6) * PI / 180: ASN = SIN(O) * SIN(X(8) * PI / 180)
6040 X(16) = ATN(ASN / SQR(-ASN * ASN + 1)): REM -
LAT.ECLIT.ELIOC.PIANETA
6050 PR = X(15) * COS(X(16)): REM - PROIEZ.RAGGIO VETTORE SU
ECLITTICA PER GRAFICA
6060 REM - CALCOLO LONG.ECLITTICALE ELIOCENTRICA - 6055/6090
6070 ACS = COS(O) / COS(X(16))
6080 X(17) = -ATN(ACS / SQR(-ACS * ACS + 1)) + PI / 2
6090 IF X(16) < 0 THEN X(17) = P2 - X(17)
6100 X(17) = X(17) + X(6) * PI / 180: S1 = X(17): GOSUB 430: X(17) = S1: REM -
LONG.ECLIT.ELIOC.PIANETA
6110 V = X(17): REM - LONG.ECL.ELIOC.IN RADIANTI PER GRAFICA
6120 X(18) = X(15) * COS(X(16)) * COS(X(17)): REM - X =
COORD.CART.ECLIT.ELIOC.PIANETA
6130 X(19) = X(15) * COS(X(16)) * SIN(X(17)): REM - Y =
COORD.CART.ECLIT.ELIOC.PIANETA
6140 X(20) = X(15) * SIN(X(16)): REM - Z =
COORD.CART.ECLIT.ELIOC.PIANETA
6150 X(21) = X(18) - R: REM - X = COORD.CART.ECLIT.GEOC.PIANETA
6160 X(22) = X(19) - S: REM - Y = COORD.CART.ECLIT.GEOC.PIANETA
6170 X(23) = X(20): REM - Z = COORD.CART.ECLIT.GOEC.PIANETA
6180 X(24) = SQR((ABS(X(21))) ^ 2 + (ABS(X(22))) ^ 2 + (ABS(X(23))) ^ 2): REM -
DISTANZA TERRA-PIANETA
6190 ASN = X(23) / X(24): X(26) = ATN(ASN / SQR(-ASN * ASN + 1)): REM -
LAT.ECLIT.GOEC.PIANETA
6200 X(25) = ABS(ATN(X(22) / X(21))): REM - LONG.ECLIT.GEOC.PIANETA
6210 REM - AGGIUSTAMENTO PER X(25) - 6185/6210
6220 IF X(21) < 0 AND X(22) > 0 THEN X(25) = PI - X(25)
6230 IF X(21) < 0 AND X(22) < 0 THEN X(25) = PI + X(25)
6240 IF X(21) > 0 AND X(22) < 0 THEN X(25) = P2 - X(25)
6250 REM - CALCOLO DICLINAZIONE - 6225/6240
6260 ASN = COS(E) * SIN(X(26)) + SIN(E) * COS(X(26)) * SIN(X(25))
6270 X(27) = ATN(ASN / SQR(-ASN * ASN + 1)): REM - DECL.PIANETA
6280 REM - CALCOLO ASCENSIONE RETTA - 6245/6270
6290 ACS = COS(X(26)) * COS(X(25)) / COS(X(27))
6300 X(28) = -ATN(ACS / SQR(-ACS * ACS + 1)) + PI / 2: REM - A.R.PIANETA
6310 IF SIN(X(25)) < TAN(E) * TAN(X(26)) THEN X(28) = P2 - X(28)
6320 REM - TRASF.RADIANTI IN GRADI - 6275/6310
6330 FOR I = 11 TO 17
6340 IF I = 15 THEN 6360
6350 X(I) = X(I) * 180 / PI
6360 NEXT: FOR I = 25 TO 28: X(I) = X(I) * 180 / PI: NEXT
6370 REM - TRASF.GG.DDDD IN GG.MMSS/HH.MMSS
6380 H = X(28) / 15: GOSUB 330: X(28) = H
6390 H = X(27): GOSUB 330: X(27) = H
6400 REM ======================
6410 REM - DATI PER LA STAMPA
6420 REM ======================
6422 P = 100: H = X(8): GOSUB 600: IO$ = J$: REM - INCL.ORBITA
6424 H = X(14): GOSUB 600: LO$ = J$: REM - LONG.ORBITALE
6426 H = X(15): GOSUB 600: RV$ = J$: REM - RAGGIO VETTORE
6430 P = 10000: H = X(28): GOSUB 600: GOSUB 530: AR$ = J$: REM - A.R.
6440 H = X(27): GOSUB 600: GOSUB 530: DE$ = J$: REM - DECLINAZ.
6450 P = 100: H = X(16): GOSUB 600: TE$ = J$: REM - LAT.ECL.ELIOC.
6460 H = X(17): GOSUB 600: LE$ = J$: REM - LONG.ECL.ELIOC.
6470 H = X(24): GOSUB 600: DT$ = J$: REM - DIST.TERRA
6480 H = X(26): GOSUB 600: TG$ = J$: REM - LAT.ECL.GEOC.
6490 H = X(25): GOSUB 600: LG$ = J$: REM - LONG.ECL.GEOC.
6500 RETURN
7000 REM
7010 REM = PARTE GRAFICA
7020 REM
7025 REM ======================
7030 REM = CERCHIO DI RIFERIMENTO
7040 REM ======================
7045 COL = 14: RIG = 13: IF SCRN = 12 THEN RIG = 16
7050 SCREEN SCRN
7055 IF SCRN = 2 THEN COL = 7: GOTO 7072
7071 COLOR 9, 1
7072 LOCATE 24, 72: PRINT "PREMERE";
7074 LOCATE 25, 72: PRINT "UN TASTO";
7075 LOCATE RIG, 6: PRINT "180 ";
7076 LOCATE RIG, 72: PRINT "0 ";
7080 FOR I = -1 TO 1
7090 PSET (CX + I, CY), COL
7095 PSET (CX, CY + I), COL
7100 NEXT
7105 PSET (CX + CY / FA + 2, CY), 11
7110 FOR I = 0 TO P2 STEP P2 / 36
7120 PSET (CX + COS(I) * CY / FA, CY - SIN(I) * CY), 11
7130 NEXT
7700 REM ======================
7710 REM = CALCOLO E STAMPA DELLA POSIZIONE DEI PIANETI
7720 REM ======================
7730 FOR I = 1 TO N
7740 F = COS(V(I)) * R(I): G = -SIN(V(I)) * R(I) * FA
7750 PSET (F + CX, G + CY)
7760 NEXT
7770 RETURN
8000 REM
8010 REM - CALENDARIO PERPETUO
8020 REM
8030 REM ======================
8035 REM - IMMISSIONE GIORNO, MESE E ANNO
8037 REM ======================
8039 GOSUB 700
8040 LOCATE 8, 1: PRINT "Scrivere la data per i calcoli."
8050 LOCATE 10, 22: PRINT " "
8055 LOCATE 10, 1: INPUT "Giorno (da 1 a 31): "; G: IF (G < 1 OR G > 31) OR G
<> INT(G) THEN 8050
8060 LOCATE 11, 20: PRINT " "
8065 LOCATE 11, 1: INPUT "Mese (da 1 a 12): "; M: IF (M < 1 OR M > 12) OR M
<> INT(M) THEN 8060
8070 IF G = 31 AND (M = 4 OR M = 6 OR M = 9 OR M = 11) THEN GOSUB 700:
GOTO 8040
8080 IF G > 29 AND M = 2 THEN GOSUB 700: GOTO 8040
8090 LOCATE 12, 1: INPUT "Anno (negativo se a.C.): "; A: IF A <> INT(A) THEN
LOCATE 12, 27: PRINT " ": GOTO 8090
8100 IF A = 0 THEN PRINT : PRINT "L'anno 0 non esiste": GOSUB 100: GOSUB
700: GOTO 8040
8110 IF A < 0 THEN A = A + 1
8120 IF NOT (G = 29 AND M = 2) THEN 8200
8130 IF INT(A / 4) * 4 = A GOTO 8160
8140 IF A <= 0 THEN A = A - 1
8145 PRINT
8150 PRINT "L'anno"; A; "non è bisestile.": GOSUB 100: GOSUB 700: GOTO 8040
8160 IF A <= 1582 THEN 8200
8170 IF INT(A / 100) * 100 <> A GOTO 8200
8180 IF INT(A / 400) * 400 = A GOTO 8200
8190 PRINT : PRINT "Nel calendario gregoriano": GOTO 8150
8200 IF A > 1582 OR (A = 1582 AND M > 10) OR (A = 1582 AND M = 10 AND G >
14) THEN 8270
8210 IF A < 1582 OR (A = 1582 AND M < 10) OR (A = 1582 AND M = 10 AND G <
5) THEN 8250
8220 LOCATE 8, 1: PRINT " "
8225 LOCATE 10, 1: PRINT "Il giorno"; G; "ottobre 1582 non esiste,"
8230 PRINT "perché soppresso dalla riforma"
8240 PRINT "gregoriana del calendario. ": GOSUB 100: GOSUB 700: GOTO
8040
8246 REM - ======================
8248 REM - CALCOLO DEI GIORNI GIULIANI
8249 REM - ======================
8250 IF M < 3 THEN C = INT((A + 4711) / 4) + (A + 4712) * 365 + 31 * (M - 1) + G:
GOTO 8310
8260 C = INT((A + 4712) / 4) + (A + 4712) * 365 - INT((M - 1) * .4 + 2.7) + 31 * (M -
1) + G: GOTO 8310
8270 IF M < 3 THEN 8300
8280 C = 365 * A + 31 * (M - 1) + G + INT(A / 4) - INT((M - 1) * .4 + 2.7)
8290 C = C - INT(A / 100) + INT(A / 400) + 1721060!: GOTO 8310
8300 C = 365 * A + 31 * (M - 1) + G + INT((A - 1) / 4) - INT((A - 1) / 100) + INT((A -
1) / 400) + 1721060!
8310 GG = C - 2415021.5#: D = C - INT(C / 7) * 7
8320 IF A <= 0 THEN A = A - 1
8330 LOCATE 14, 1: PRINT "**** "; G$(D); G; M$(M - 1); A; "****"
8390 REM - ======================
8400 REM - IMMISSIONE HH.MMSS
8405 REM - ======================
8410 LOCATE 16, 17: PRINT " ";
8415 LOCATE 16, 1: INPUT "Ora (HH.MMSS): "; H
8420 IF H < 0 OR H > 23.5959 THEN 8410
8425 J$ = STR$(H): JJ$ = ""
8430 FOR I = 1 TO LEN(J$)
8432 IF MID$(J$, I, 1) = "." THEN J$ = J$ + "00000": JJ$ = MID$(J$, I + 1, 4)
8435 NEXT
8440 IF VAL(JJ$) > 5959 THEN 8410
8445 IF VAL(RIGHT$(JJ$, 2)) > 59 THEN 8410
8450 GOSUB 500: H$ = J$
8460 GOSUB 200: H9 = H: GG = GG + H / 24: E = (C(8) + C(9) * GG) * PI / 180
8470 RETURN
9000 REM
9010 REM - SUB INIZIALIZZAZIONE
9020 REM
9021 REM ======================
9022 REM - INIT SISTEMA PER GRAFICA
9023 REM ======================
9024 PRINT : PRINT "SCEGLIERE TRA:"
9025 PRINT : PRINT " 1 - SCHEDA VIDEO VGA 640x480"
9026 PRINT : PRINT " 2 - SCHEDA VIDEO EGA 640x350"
9027 PRINT : PRINT " 3 - SCHEDA VIDEO CGA 640x200"
9028 PRINT : PRINT " 4 - SCHEDA VIDEO CGA 640x400"
9029 PRINT : PRINT " 5 - SCHEDA VIDEO HGC 720x348"
9030 A$ = INKEY$: A = VAL(A$): IF A < 1 OR A > 5 THEN 9030
9031 IF A = 1 THEN PX = 640: PY = 480: SCRN = 12
9032 IF A = 2 THEN PX = 640: PY = 350: SCRN = 9
9033 IF A = 3 THEN PX = 640: PY = 200: SCRN = 2
9035 IF A = 4 THEN PX = 640: PY = 400: SCRN = 3
9036 IF A = 5 THEN PX = 720: PY = 348: SCRN = 2
9037 X = PX: REM - Pixel di ascissa
9040 Y = PY: REM - Pixel di ordinata
9041 REM - FATTORE DI SCALA PER CERCHIO ======================
9042 CX = INT(X / 2) - 1: CY = INT(Y / 2) - 1
9043 PI = 3.14159265359#: P2 = PI * 2
9044 FA = 4 / 3 * Y / X: REM - Rapporto tra X e Y
9045 TT = CY * 3 / 4 * X / Y: TT = TT - TT * .1: REM - Fattore di scala
9047 REM ======================
9048 REM - INIT VARIABILI
9049 REM ======================
9050 SP$ = " "
9060 G$(0) = "Lunedì": G$(1) = "Martedì": G$(2) = "Mercoledì"
9070 G$(3) = "Giovedì": G$(4) = "Venerdì": G$(5) = "Sabato": G$(6) = "Domenica"
9080 M$(0) = "gennaio": M$(1) = "febbraio": M$(2) = "marzo": M$(3) = "aprile":
M$(4) = "maggio": M$(5) = "giugno"
9090 M$(6) = "luglio": M$(7) = "agosto": M$(8) = "settembre": M$(9) = "ottobre":
M$(10) = "novembre": M$(11) = "dicembre"
9100 REM ======================
9110 REM - DATI DEI PIANETI ALLE ORE 12 DEL 1900,0
9120 REM ======================
9130 REM - 0 = Longitudine Media - 1 = Variaz.giornaliera di 0
9140 REM - 2 = Longitudine Perielio - 3 = Variaz.giornaliera di 2
9150 REM - 4 = Eccentricità - 5 = Variaz.giornaliera di 4
9160 REM - 6 = Longitud.Nodo Ascendente - 7 = Variaz.giornaliera di 6
9170 REM - 8 = Inclinaz.Orbita/Equatore - 9 = Variaz.giornaliera di 8
9180 REM - 10 = Semiasse Maggiore Orbita
9200 REM ====================== MERCURIO
9210 A(0) = 182.2714806#: A(1) = 4.09237703#: A(2) = 75.89717222#: A(3) =
.00004253167541#
9220 A(4) = .20561494#: A(5) = 5.557837098D-10: A(6) = 47.14473611#
9230 A(7) = .00003243695338#: A(8) = 7.003013889#: A(9) = 4.759297285D-08:
A(10) = .3870984
9240 REM ====================== VENERE
9250 B(0) = 344.3697361#: B(1) = 1.602168729#: B(2) = 130.1405694#: B(3) =
.0000375714503#
9260 B(4) = .00681636#: B(5) = -1.474058864D-09: B(6) = 75.78809167#: B(7) =
.00002502471671#
9270 B(8) = 3.393636111#: B(9) = 3.428397597D-08: B(10) = .72333015#
9280 REM ====================== TERRA
9290 C(0) = 100.6825139#: C(1) = .9856473416#: C(2) = 101.2187: C(3) =
.00004693718153#
9300 C(4) = .0167498: C(5) = -1.165776865D-09: C(6) = 1: C(8) = 23.45229427#:
C(9) = -.00000035626284#: C(10) = 1
9310 REM ====================== MARTE
9320 D(0) = 294.2647833#: D(1) = .5240710815#: D(2) = 334.2183306#: D(3) =
.00005038725378#
9330 D(4) = .0933088: D(5) = 2.608733744D-09: D(6) = 48.7867: D(7) =
.00002127157959#
9340 D(8) = 1.850302778#: D(9) = -1.776941212D-08: D(10) = 1.5236781#
9350 REM ====================== GIOVE
9360 E(0) = 238.1323861#: E(1) = 8.312941779999999D-02: E(2) =
12.72097222#: E(3) = .00004407834816#
9370 E(4) = .04833475#: E(5) = 4.495003422D-09: E(6) = 99.44341389#: E(7) =
.00002766680356#
9380 E(8) = 1.308736111#: E(9) = -.0000001559510229#: E(10) = 5.202561
9390 REM ====================== SATURNO
9400 F(0) = 266.597875#: F(1) = .03349787498#: F(2) = 91.09821389#: F(3) =
.00005361850331#
9410 F(4) = .05589231#: F(5) = -9.459274469999999D-09: F(6) = 112.7904139#:
F(7) = .00002390677998#
9420 F(8) = 2.492519444#: F(9) = -.0000001072933303#: F(10) = 9.554747
9430 REM ====================== URANO
9440 G(0) = 244.2092389#: G(1) = .0117690225#: G(2) = 171.5486917#: G(3) =
.00004064155449#
9450 G(4) = .0463444: G(5) = -7.277207392D-10: G(6) = 73.47711111#: G(7) =
.00001365277968#
9460 G(8) = .7724638889#: G(9) = 1.711917256D-08: G(10) = 19.21814
9470 REM ====================== NETTUNO
9480 H(0) = 84.46401389#: H(1) = .006020148232#: H(2) = 46.72736389#: H(3) =
.00003900272264#
9490 H(4) = .00899704#: H(5) = 1.733059548D-10: H(6) = 130.6813889#: H(7) =
.00003008720055#
9500 H(8) = 1.779241667#: H(9) = -.0000002612898319#: H(10) = 30.10957
9510 REM ====================== PLUTONE
9520 I(0) = 93.2334772#: I(1) = .00397943#: I(2) = 224.01: I(4) = .250236
9530 I(6) = 109.74: I(8) = 17.17047: I(10) = 39.438712#
9540 RETURN
10000 REM
10010 REM - PRGM PRINCIPALE
10020 REM
10025 GOSUB 700: REM - INTESTAZIONE
10030 GOSUB 9000: REM - INIZIALIZZAZIONE
10035 GOSUB 700: REM - INTESTAZIONE
10040 GOSUB 750: REM - SCELTE
10050 GOSUB 8000: REM - CALENDARIO
10070 GOSUB 1000: REM - VISUAL. TEMPO E DATA
10080 FOR I = 0 TO 10: X(I) = C(I): NEXT: GOSUB 4000: GOSUB 5000
10090 V(3) = V: RV(3) = X(15): GOSUB 1100
10100 FOR I = 0 TO 10: X(I) = A(I): NEXT: GOSUB 4000: GOSUB 6000
10110 V(1) = V: RV(1) = PR: A$ = "MERCURIO": GOSUB 1200
10120 FOR I = 0 TO 10: X(I) = B(I): NEXT: GOSUB 4000: GOSUB 6000
10130 V(2) = V: RV(2) = PR: A$ = "VENERE": GOSUB 1200
10140 FOR I = 0 TO 10: X(I) = D(I): NEXT: GOSUB 4000: GOSUB 6000
10150 V(4) = V: RV(4) = PR: A$ = "MARTE": GOSUB 1200
10160 FOR I = 0 TO 10: X(I) = E(I): NEXT: GOSUB 4000: GOSUB 6000
10170 V(5) = V: RV(5) = PR: A$ = "GIOVE": GOSUB 1200
10180 FOR I = 0 TO 10: X(I) = F(I): NEXT: GOSUB 4000: GOSUB 6000
10190 V(6) = V: RV(6) = PR: A$ = "SATURNO": GOSUB 1200
10200 FOR I = 0 TO 10: X(I) = G(I): NEXT: GOSUB 4000: GOSUB 6000
10210 V(7) = V: RV(7) = PR: A$ = "URANO": GOSUB 1200
10220 FOR I = 0 TO 10: X(I) = H(I): NEXT: GOSUB 4000: GOSUB 6000
10230 V(8) = V: RV(8) = PR: A$ = "NUTTUNO": GOSUB 1200
10240 FOR I = 0 TO 10: X(I) = I(I): NEXT: GOSUB 4000: GOSUB 6000
10250 V(9) = V: RV(9) = PR: A$ = "PLUTONE": GOSUB 1200
10260 IF STAMP$ = "SI" THEN 10300
10270 PRINT : GOSUB 1300: GOSUB 1300: REM - LINEA ORIZZONTALE
10280 PRINT : PRINT "Grafico di quanti pianeti? <0=SCELTE> "; : LOCATE , , 1
10290 A$ = INKEY$: IF A$ < "0" OR A$ > "9" THEN 10290
10295 N = VAL(A$): IF N = 0 THEN 10035
10300 REM ======================
10302 REM - PROPORZIONALITA' IN GRAFICA
10305 REM ======================
10320 IF N = 1 THEN K = TT / RV(1) / 1.1
10330 IF N = 2 THEN K = TT / RV(2)
10340 IF N = 3 THEN K = TT / RV(3)
10350 IF N = 4 THEN K = TT / RV(4)
10360 IF N = 5 THEN K = TT / RV(5)
10370 IF N = 6 THEN K = TT / RV(6)
10380 IF N = 7 THEN K = TT / RV(7)
10390 IF N = 8 THEN K = TT / RV(8)
10400 IF N = 9 THEN K = TT / RV(9) / 1.1
10410 FOR I = 1 TO N
10420 R(I) = RV(I) * K: NEXT
10430 GOSUB 7000
10435 A$ = INKEY$: IF A$ = "" THEN 10435
10437 SCREEN 0: COLOR 7, 0
10438 IF STAMP$ <> "SI" THEN CLS : GOTO 10270
10450 GOSUB 940: REM - DISINIT STAMPANTE
10455 STAMP$ = ""
10460 GOTO 10035