CHDIR ".\programs\samples\thebob\biochart"

'****************************************************************************'
'------------------------- B I O C H A R T . B A S --------------------------'
'------------- Copyright (C) 2007 by Bob Seguin (Freeware)-------------------'
'****************************************************************************'

DEFINT A-Z
DECLARE SUB PrintSTRING (x, y, Prnt$)
DECLARE SUB Graphics ()
DECLARE SUB ChartGFX ()
DECLARE SUB Birthday ()
DECLARE SUB ChartBD ()
DECLARE SUB PutNUMS (x, Num)

DECLARE FUNCTION GetDATE$ ()

DIM SHARED NumBOX(300)
DIM SHARED Box(12000)
DIM SHARED FontBOX(6000)
DIM SHARED xBOX(1 TO 9)
DEF SEG = VARSEG(FontBOX(0))
BLOAD "brsmssb.fnt", VARPTR(FontBOX(0))
DEF SEG = VARSEG(NumBOX(0))
BLOAD "brsnums.bsv", VARPTR(NumBOX(0))
DEF SEG

CONST Degree! = 3.14159 / 180
CONST Physical! = 90 / 23
CONST Emotional! = 90 / 28
CONST Intellectual! = 90 / 33
CONST Intuitive! = 90 / 38

DIM SHARED DATE2$, Birthdate$
DIM SHARED Hour!
DIM SHARED Months(1 TO 12) AS INTEGER
RESTORE MonthDATA
FOR n = 1 TO 12: READ Months(n): NEXT n
RESTORE xDATA
FOR n = 1 TO 8: READ xBOX(n): NEXT n

SCREEN 12
GOSUB SetPALETTE
DATE2$ = DATE$

Graphics
Birthday

DO
k$ = UCASE$(INKEY$)
SELECT CASE k$
CASE "B"
PUT (162, 176), Box, PSET
B$ = GetDATE$
IF B$ = "NULL" THEN
SYSTEM
ELSE
Birthdate$ = B$
ChartBD
END IF
CASE "T"
PUT (162, 181), Box(3500), PSET
B$ = GetDATE$
IF B$ = "NULL" THEN DATE2$ = DATE$ ELSE DATE2$ = B$
LINE (194, 419)-(294, 434), 0, BF
PrintSTRING 196, 420, "DATE: " + DATE2$
ChartBD
CASE CHR$(27): EXIT DO
END SELECT
LOOP

SYSTEM

xDATA:
DATA 379, 386, 402, 409, 425, 432, 439, 446

MonthDATA:
DATA 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31

SetPALETTE:
RESTORE SetPALETTE
DATA 0, 0, 21, 21, 8, 43, 24, 10, 48, 26, 11, 53
DATA 28,12,58, 32, 13, 63, 63, 63, 21, 42, 42, 42
DATA 63, 0, 0, 21, 31, 63, 52, 41, 63, 55, 55, 55
DATA 0, 0, 42, 63, 21, 63, 32, 32, 42, 63, 63, 63
RESTORE SetPALETTE
OUT &H3C8, 0
FOR n = 1 TO 48
READ Colr
OUT &H3C9, Colr
NEXT n
RETURN

SUB Birthday

OPEN "brbd.dta" FOR BINARY AS #1
IF LOF(1) THEN
CLOSE #1
OPEN "brbd.dta" FOR INPUT AS #1
INPUT #1, Birthdate$
CLOSE #1
ELSE
CLOSE #1
PUT (162, 176), Box, PSET
B$ = GetDATE$
IF B$ = "NULL" THEN
SYSTEM
ELSE
Birthdate$ = B$
END IF
END IF
ChartBD

END SUB

SUB ChartBD

LINE (220, 89)-(420, 102), 0, BF
PrintSTRING 240, 89, "For a person born"
PrintSTRING 340, 89, Birthdate$
OPEN "brbd.dta" FOR OUTPUT AS #1
PRINT #1, Birthdate$
CLOSE #1
ChartGFX

Hour! = VAL(MID$(TIME$, 1, 2)) * .83
LINE (310 + Hour!, 110)-(310 + Hour!, 426), 11
LINE (310 + Hour!, 426)-(338, 426), 11
PSET (310, 410), 7: DRAW "D16L12"

Month$ = MID$(DATE2$, 1, 2)
Day$ = MID$(DATE2$, 4, 2)
Year$ = MID$(DATE2$, 7, 4)
M$ = MID$(Birthdate$, 1, 2)
D$ = MID$(Birthdate$, 4, 2)
y$ = MID$(Birthdate$, 7, 4)
FirstMONTH = Months(VAL(M$)) - VAL(D$) + 1
FOR n = (VAL(M$) + 1) TO 12
BalMONTHS = BalMONTHS + Months(n)
IF n = 2 AND ((VAL(y$) MOD 4) = 0) THEN BalMONTHS = BalMONTHS + 1
NEXT n
FirstYEAR = FirstMONTH + BalMONTHS
FOR n = (VAL(y$) + 1) TO (VAL(Year$) - 1)
IF n MOD 4 = 0 THEN Yr = 366 ELSE Yr = 365
TDays = TDays + Yr
NEXT n
TDays = TDays + FirstYEAR

FOR n = 1 TO VAL(Month$) - 1
Days = Days + Months(n)
IF n = 2 THEN
IF VAL(Year$) MOD 4 = 0 THEN Days = Days + 1
END IF
NEXT n

TDays = TDays + Days + VAL(Day$) - 1

VIEW SCREEN (10, 110)-(630, 410)

'EMOTIONAL
PreviousX = 320 - (((TDays MOD 28) + 28) * 20)
PreviousY = 260
C! = 0
FOR x = 320 - (((TDays MOD 28) + 28) * 20) TO 630 STEP 5
LINE (PreviousX, PreviousY)-(x, 260 + SIN(C! * Degree!) * 150), 8
PreviousX = x
PreviousY = 260 + SIN(C! * Degree!) * 150
C! = C! - Emotional!
NEXT x

'INTELLECTUAL
PreviousX = 320 - (((TDays MOD 33) + 33) * 20)
PreviousY = 260
C! = 0
FOR x = 320 - (((TDays MOD 33) + 33) * 20) TO 630 STEP 5
LINE (PreviousX, PreviousY)-(x, 260 + SIN(C! * Degree!) * 150), 6
PreviousX = x
PreviousY = 260 + SIN(C! * Degree!) * 150
C! = C! - Intellectual!
NEXT x

PreviousX = 10
PreviousY = 260
C! = 0
'PHYSICAL
PreviousX = 320 - (((TDays MOD 23) + 23) * 20)
PreviousY = 250
FOR x = 320 - (((TDays MOD 23) + 23) * 20) TO 630 STEP 5
LINE (PreviousX, PreviousY)-(x, 260 + SIN(C! * Degree!) * 150), 9
PreviousX = x
PreviousY = 260 + SIN(C! * Degree!) * 150
C! = C! - Physical!
NEXT x


'INTUITIVE
PreviousX = 320 - (((TDays MOD 38) + 38) * 20)
PreviousY = 260
C! = 0
FOR x = 320 - (((TDays MOD 38) + 38) * 20) TO 630 STEP 5
LINE (PreviousX, PreviousY)-(x, 260 + SIN(C! * Degree!) * 150), 13
PreviousX = x
PreviousY = 260 + SIN(C! * Degree!) * 150
C! = C! - Intuitive!
NEXT x

VIEW

END SUB

DEFSNG A-Z
SUB ChartGFX

LINE (5, 106)-(634, 414), 7, BF
LINE (9, 109)-(631, 170), 1, BF
LINE (9, 170)-(631, 230), 2, BF
LINE (9, 230)-(631, 290), 3, BF
LINE (9, 290)-(631, 350), 2, BF
LINE (9, 350)-(631, 411), 1, BF
LINE (9, 109)-(631, 411), 7, B
FOR x = 30 TO 610 STEP 20
LINE (x, 110)-(x, 410), 7
IF x = 330 THEN PAINT (x - 10, 260), 7
NEXT x
LINE (10, 260)-(630, 260), 7

END SUB

DEFINT A-Z
FUNCTION GetDATE$
i = 1: Interval! = .25: Colr = 15
DO
WAIT &H3DA, 8: WAIT &H3DA, 8, 8
IF i < 9 THEN LINE (xBOX(i) + 1, 201)-(xBOX(i) + 6, 202), Colr, B
k$ = INKEY$
SELECT CASE k$
CASE "0" TO "9"
IF i < 9 THEN
LINE (xBOX(i) + 1, 201)-(xBOX(i) + 6, 202), 15, BF
PutNUMS xBOX(i), VAL(k$)
D$ = D$ + k$
i = i + 1
END IF
CASE CHR$(13) 'Enter
IF LEN(D$) = 8 THEN
mm$ = MID$(D$, 1, 2)
dd$ = MID$(D$, 3, 2)
yy$ = MID$(D$, 5, 4)
IF VAL(mm$) > 0 AND VAL(mm$) < 13 THEN
IF VAL(dd$) > 0 AND VAL(dd$) < 32 THEN
IF VAL(yy$) > 1900 AND VAL(yy$) < 3000 THEN
GetDATE$ = mm$ + "-" + dd$ + "-" + yy$
ELSE
GetDATE$ = "NULL"
END IF
ELSE
GetDATE$ = "NULL"
END IF
ELSE
GetDATE$ = "NULL"
END IF
ELSE
GetDATE$ = "NULL"
END IF
EXIT FUNCTION
CASE CHR$(8) 'Backspace
IF i > 1 THEN
IF i < 9 THEN LINE (xBOX(i), 193)-(xBOX(i) + 6, 202), 15, BF
i = i - 1
LINE (xBOX(i), 193)-(xBOX(i) + 6, 202), 15, BF
D$ = MID$(D$, 1, LEN(D$) - 1)
END IF
END SELECT

IF TIMER > StartTIME! + Interval! THEN
StartTIME! = TIMER
IF Colr = 15 THEN Colr = 7 ELSE Colr = 15
END IF

LOOP

END FUNCTION

SUB Graphics
DEF SEG = VARSEG(Box(0))
BLOAD "brsheads.bsv", VARPTR(Box(0))
DEF SEG
PUT (78, 32), Box
PUT (20, 440), Box(7000)
PUT (10, 6), Box(10000)
PUT (500, 6), Box(11200)

PrintSTRING 196, 420, "DATE: " + DATE2$
PrintSTRING 342, 420, "TIME: " + TIME$
PrintSTRING 12, 460, "Press [B] to enter a new birth date"
PrintSTRING 270, 460, "Press [T] to enter a target date"
PrintSTRING 520, 460, "Press [ESC] to QUIT"

ChartGFX

DEF SEG = VARSEG(Box(0))
BLOAD "brsinpt.bsv", VARPTR(Box(0))
DEF SEG

END SUB

SUB PrintSTRING (x, y, Prnt$)

FOR i = 1 TO LEN(Prnt$)
Char$ = MID$(Prnt$, i, 1)
IF Char$ = " " THEN
x = x + FontBOX(1)
ELSE
Index = (ASC(Char$) - 33) * FontBOX(0) + 2
PUT (x, y), FontBOX(Index)
x = x + FontBOX(Index)
END IF
NEXT i

END SUB

SUB PutNUMS (x, Num)
PUT (x, 191), NumBOX(Num * 30)
END SUB
