Home Jensen Archive jWiki Jensen News Jensen Cloud Jensen Programming Jensen Family Tree JensenDiary
A 16 bit QBASIC program to calculate sun elevation from an Earth position.
It was made by Kai William Jensen (my grandfather) in the mid 90's for a payment bonus as he worked on a ship.
To run it you'll have to place the Kompas folder directly on C:/ and run C:/Kompas/AUTOEXEC.BAT.
You can also try this translation to JavaScript of the program
Note: It will change your encode and keyboard to danish.
- 10 DEFDBL A-Z
- 20 PI = 3.141592654#
- 30 DEF FNSINUS (X) = SIN(X * PI / 180)
- 40 DEF FNTANG (X) = TAN(X * PI / 180)
- 50 DEF FNCOSIN (X) = COS(X * PI / 180)
- 60 DEF FNACS (X) = ATN(SQR(1 - X * X) / X) * 180 / PI - 90 * (SGN(X) - 1)
- 70 DEF FNASN (X) = ATN(X / SQR(1 - X * X)) * 180 / PI
- 80 COLOR 14, 6, 4
- 90 CLS
- 100 PRINT "Almanak og kompasretning"
- 110 INPUT "Dato YY.MMDD"; E
- 120 V = E
- 130 INPUT "Tid hh.mmss"; K
- 140 Y = INT(E)
- 150 M = INT((E - Y) * 100)
- 160 D = E * 10000 - (INT(100 * E)) * 100
- 170 H = INT(K): U = INT((K - H) * 100): S = K * 10000 - (INT(100 * K)) * 100
- 180 P = SGN(Y / 4 - INT(Y / 4))
- 190 Z = INT((Y - 84) * 365.25 + .75)
- 200 N = (M - 1) * 30
- 210 IF M = 2 THEN N = N + 1
- 220 IF M > 2 THEN N = N + CINT(.6 * (M - 3) - P)
- 230 N = Z + N + D - 1
- 240 E = H * 3600# + U * 60 + S
- 250 T = N * 86400# + E
- 260 A = 31556926#
- 270 T = A * (T / A - INT(T / A))
- 280 F = .01674: I = 360 / A * (T - 252000#): J = I
- 290 L = J - 180 / PI * F * FNSINUS(J)
- 300 J = J + I - L
- 310 IF ABS(I - L) < .000001 THEN 330
- 320 GOTO 290
- 330 VV = (FNCOSIN(J) - F) / (1 - F * FNCOSIN(J))
- 340 IF VV = 0 THEN O = 90: GOTO 360
- 350 O = FNACS(VV)
- 360 IF I < 0 THEN O = -O
- 370 IF I > 180 THEN O = 360 - O
- 380 O = O - 77.28442: R = 23.447
- 390 B = FNASN(FNSINUS(R) * FNSINUS(O))
- 400 Q = ABS(B): GOSUB 590
- 410 IF B < 0 THEN PRINT "Dkl = S"; X; "�"; P; "'"
- 420 IF B >= 0 THEN PRINT "Dkl = N"; X; "�"; P; "'"
- 430 W = 180 / PI * ATN(FNCOSIN(R) * FNTANG(O))
- 440 IF O > 90 THEN W = W + 180
- 450 IF O > 270 THEN W = W + 180
- 460 C = (T - 6863040!) / A * 360 - W - 1.867
- 470 GG = (E / 240 + 180 + C) / 360
- 480 G = (GG - INT(GG)) * 360
- 490 Q = G
- 500 GOSUB 590
- 510 PRINT "GHA ="; X; "�"; P; "'"
- 520 Q = 12 - C / 15
- 530 GOSUB 590
- 540 PRINT "Mer. pass "; X; "t"; P; "m"
- 550 P = X * 100 + P
- 560 D = B
- 570 A = V
- 580 GOTO 600
- 590 X = INT(Q): P = (INT(600 * (Q - INT(Q)) + .5)) / 10: RETURN
- 600 IF P < 1200 THEN P = P + 40
- 610 PRINT "Dato"; A
- 620 PRINT "Hvor foreg�r kompasretningen i n�rheden af? Indtast:"
- 630 PRINT "1 for Marstal"
- 640 PRINT "2 for �r�sk�bing"
- 650 PRINT "3 for S�by"
- 660 PRINT "4 for Bagenkop"
- 670 PRINT "5 for andre steder"
- 680 INPUT K
- 690 ON ERROR GOTO 710
- 700 GOTO 730
- 710 IF ERR = 25 THEN COLOR 15, 6: PRINT "Printeren er ikke t�ndt eller tilsluttet": COLOR 14, 6
- 720 RESUME 730
- 730 INPUT "�nsker du udskrift? J/N "; UD$
- 735 IF UD$ = "j" THEN LPRINT : LPRINT : LPRINT
- 740 MV = 0: PRINT "Dato "; A: IF UD$ = "j" THEN LPRINT "Dato "; A
- 750 IF K = 1 THEN L = 17.7: PRINT "MARSTAL": B = 54.85: IF UD$ = "j" THEN LPRINT "MARSTAL"
- 760 IF K = 2 THEN L = 18.3: PRINT "�R�SK�BING": B = 54.9: IF UD$ = "j" THEN LPRINT "�R�SK�BING"
- 770 IF K = 3 THEN L = 18.9: PRINT "S�BY": B = 54.95: IF UD$ = "j" THEN LPRINT "S�BY"
- 780 IF K = 4 THEN L = 17.2: PRINT "BAGENKOP": B = 54.75: IF UD$ = "j" THEN LPRINT "BAGENKOP"
- 790 IF K > 4.5 THEN INPUT "Bredde i GRADER , MINUTER"; BG, BM: INPUT "L�ngde i GRADER , MINUTER"; LG, LM: INPUT "Misvisning i grader"; MV
- 800 IF K > 4.5 THEN B = BG + BM / 60: L = (15 - (LG + LM / 60)) * 4
- 810 IF (K > 4.5) AND (UD$ = "j") THEN LPRINT "Bredde"; BG; "�"; BM; "'", "L�ngde"; LG; "�"; LM; "'", "Misvisning"; MV; "�"
- 820 INPUT "Start GMT (hh(.mm))"; S
- 830 INPUT "Slut GMT (hh(.mm))"; E
- 840 PRINT " GMT Mv. pejling"
- 850 IF UD$ = "j" THEN LPRINT " GMT Mv. pejling"
- 860 G = 0
- 870 S = S + 1
- 880 E = E + 1
- 890 DEFSNG I
- 900 FOR I = S TO E STEP .01
- 910 IF (I - INT(I)) >= .6 THEN I = INT(I + 1)
- 920 F = I
- 930 F = INT(F) + (F - INT(F)) * 5 / 3
- 940 T = F - L / 60 - (P - 1200) / 60
- 950 T = 180 + 15 * T
- 960 IF T >= 360 THEN T = T - 360
- 970 C = FNCOSIN(T) * FNSINUS(B) - FNCOSIN(B) * FNTANG(D)
- 980 IF ABS(C) < .0001 THEN GOTO 1090
- 990 V = 180 / PI * ATN(FNSINUS(T) / C)
- 1000 IF T < 180 THEN GOTO 1040
- 1010 IF V > 0 THEN GOTO 1070
- 1020 Z = V + 180
- 1030 GOTO 1110
- 1040 IF V >= 0 THEN Z = 180 + V: GOTO 1110
- 1050 Z = 360 + V
- 1060 GOTO 1110
- 1070 Z = V
- 1080 GOTO 1110
- 1090 IF T < 180 THEN Z = 90
- 1100 Z = 270
- 1110 Z = INT(Z - MV + .5)
- 1120 IF ABS(Z - G) < 1 THEN GOTO 1160
- 1130 PRINT INT((I - 1) * 100); " "; Z
- 1140 IF UD$ = "j" THEN LPRINT INT((I - 1) * 100); " "; Z
- 1150 G = Z
- 1160 NEXT I
- 1170 INPUT "Listen er f�rdig. Vil du forts�tte? J/N "; FO$
- 1180 IF FO$ = "j" THEN GOTO 10
- 1190 IF FO$ = "n" THEN COLOR 14, 1: CLS : SYSTEM
- 1200 GOTO 1170
- 1210 END