' *********************************
' *       Biorhythmus 0.9         *
' * (c) 25.7.1992 by Henry Koenig *
' *  Bornheide 71, 2 Hamburg 53   *
' *********************************
SCREEN 1,640,256,2,2
WINDOW 1,,,0,1
DIM b$(2)
b$(1) = " ------------------+------------------ "
b$(2) = "                   +                   "
INPUT "Name: ",D$
INPUT "Geburtstag (Jahr): ",jahr$
INPUT "Geburtstag (Monat): ",monat
INPUT "Geburtstag (Tag): ",tag
INPUT "Druckausgabe (j/n) ";x$
IF x$="j" THEN
  gadr%=4                       ' Ausgabe auf den Drucker
  OPEN "O",#1,"PRT:"
ELSE
  gadr%=0                       ' keine Druckausgabe
END IF
F$ = STR$(monat)
G$ = STR$(tag)
aus$="Name: "+D$
GOSUB ausgabe
aus$="Geburtstag: "+STR$(tag)+"."+F$+"."+jahr$
GOSUB ausgabe
GOSUB vergangene.tage
vtgeb = x                       ' vergangene Tage bis zum Geburtstag
INPUT "Aktuelles Jahr: ",jahr$
INPUT "Aktueller Monat: ",monat
tag = 0
F$ = STR$(monat)
aus$="Jahr und Monat: "+F$+"/"+jahr$
GOSUB ausgabe
aus$=" "                        ' Leerzeile
GOSUB ausgabe
GOSUB vergangene.tage           ' Anzahl der vergangenen Tage berechnen
vtag = x                        ' vergangene Tage bis Heute
tage = vtag-vtgeb               ' Tage zwischen Heute und dem Geburtstag
GOSUB schaltjahr                ' auf Schaltjahr pruefen
GOSUB monatstage                ' Anzahl der Tage des akt. Monats
phys = tage-INT(tage/23)*23     ' physisch
emot = tage-INT(tage/28)*28     ' emot
in = tage-INT(tage/33)*33
aus$="      Negativ      0     Positiv       Tag"
GOSUB ausgabe
aus$=b$(1)
GOSUB ausgabe
FOR k = 1 TO motag              ' Anzahl der Tage des Monats
  L = 0
  M = 0                         ' Mittel loeschen
  IF k=5*INT(k/5) THEN
    L = 1
  END IF
  IF L=1 THEN
    b$(0) = b$(1)
  ELSE
    b$(0) = b$(2)
  END IF
  G = SIN((k+phys)/23*360*.0174553292#)
  M = INT(18*ABS(G))*SGN(G)
  P$ = "P"
  GOSUB grafikzeile
  G = SIN((k+emot)/28*360*.0174553292#)
  M = M+INT(18*ABS(G))*SGN(G)
  P$ = "E"
  GOSUB grafikzeile
  G = SIN((k+in)/33*360*.0174553292#)
  M = M+INT(18*ABS(G))*SGN(G)
  P$ = "I"
  GOSUB grafikzeile
  GOSUB mittelgrafik
  aus$=b$(0)
  aus$=aus$+SPACE$(3-LEN(STR$(k)))
  aus$=aus$+STR$(k)
  GOSUB ausgabe
NEXT k
aus$=b$(1)
GOSUB ausgabe
CLOSE #1
END
vergangene.tage:
  aktjahr = VAL(jahr$)          ' Jahr merken
  ht = tag                      ' Tag merken
  IF monat>=3 THEN              '  Monat >= Maerz?
    hj = aktjahr                ' Jahr merken
    hm = monat+1                ' Monat plus 1 merken
  ELSE                          ' Januar oder Februar
    hj = aktjahr-1              ' Jahr minus 1
    hm = monat+13               ' 13 Monate addieren
  END IF
  x = INT(365.25*hj)+INT(30.6*hm)+ht-122 ' bereits verg. Tage
  x = x-INT(hj/100)+INT(hj/400)
RETURN
schaltjahr:                     ' auf Schaltjahr pruefen
  IF aktjahr<>4*INT(aktjahr/4) THEN
    sjahr = 0                   ' kein Schaltjahr
    GOTO schaltjahr.ende
    END IF
  IF aktjahr<>100*INT(aktjahr/100) THEN
    sjahr = 1                   ' Schaltjahr
    GOTO schaltjahr.ende
  END IF
  IF aktjahr<>400*INT(aktjahr/400) THEN
    sjahr = 0                   '  kein Schaltjahr
    GOTO schaltjahr.ende
  END IF
  sjahr = 1                     '  Schaltjahr
schaltjahr.ende:
RETURN
monatstage:
  motag = 31                    ' 31 Tage vorbesetzen
  IF monat=4 OR monat=6 OR monat=9 OR monat=11 THEN
    motag = 30                  ' Monat hat 30 Tage
   END IF
  IF monat=2 THEN               '  Februar?
    motag = 28+sjahr            ' ja, dann 28 Tage + Schaltjahr
  END IF
RETURN
grafikzeile:                    ' Rhythmuszeile zusammensetzen
sp = 20+INT(18*ABS(G))*SGN(G)   ' Spaltenposition
b$(0) = LEFT$(b$(0),sp-1)+P$+MID$(b$(0),sp+1)
RETURN
mittelgrafik:                   ' Mittelwert ausgeben
  M = INT(M/3)                  ' Mittel der 3 Kurven
  P$ = "*"                      ' Kennung fuer das Mittel der Kurven
  sp = 20+M                     ' Spaltenposition
  b$(0) = LEFT$(b$(0),sp-1)+P$+MID$(b$(0),sp+1)
RETURN
ausgabe:                        ' Ausgabe auf Bildschirm und Drucker
  IF gadr%=4 THEN               ' Flag fuer Druckaugabe gesetzt?
    PRINT #1,aus$               ' Ausgabe auf den Drucker
  END IF
  PRINT aus$                    ' Bildschirmausgabe
RETURN
