'===========================================================================
' Subject: MISCELLANEOUS ROUTINES             Date: 01-12-97 (17:42)       
'  Author: Xtrance Coders Alliance            Code: QB, PDS                
'  Origin: harrys@castel.nl                 Packet: LIBRARY.ABC
'===========================================================================
DEFINT A-Z
'       This program is made by yours Mr. SN()W From
'
'               Xtance Coders Alliance 1997
'
'       E-mail: Mrsnow@freemail.nl
'       or
'       harryst@castel.nl
'
' Please send mail if you use any thing of this or if you have any comments
'
' For All BASIC Code from William Yu 1997
'
' --------------------------------------------------------------------------




DECLARE SUB Linein (LineColor%)
DECLARE SUB BACKPrint (Tekst$, HKleur%, wachtt%, keer%)
DECLARE SUB Capslock ()
DECLARE SUB CMosRestore (File$)
DECLARE SUB CMosSAVE (File$)
DECLARE SUB ComeTOgeter (Tekst$, HKleur%, wachtt%, keer%)
DECLARE SUB FLDEdit (FRow%, FCol%, FLength%, FFore%, FBack%, FRKey%, FTemp$)
DECLARE SUB Scroll ()
DECLARE SUB LichtKrant (Tekst$, Regel%, BKleur%, FKleur%)
DECLARE SUB BackShowGround (Tekst$)
DECLARE SUB Expand (UpRow%, LtCol%, LoRow%, RtCol%)
DECLARE SUB PassWordMenu (PassWord$, Plijn%, PRow%, BKleur%, FKleur%, Tekst$, WrongDelay, GOOD)
DECLARE SUB GOODPaSSWoRD ()
DECLARE SUB Sterren ()
DECLARE FUNCTION BeeldSchermKleur! ()
DECLARE SUB LicktKrant (Tekst$, Regel%, BKleur%, FKleur%)
DECLARE SUB wacht ()
DECLARE SUB ShowGif (File$)
DECLARE SUB ShowKlok ()
DECLARE SUB s.TekenKlok ()
DECLARE SUB s.Wijzers (Seconde$)
DECLARE SUB LineOut (LineColor%)
DECLARE SUB DELAYLINE (secs!)
DECLARE FUNCTION IS4DOS% ()
DECLARE FUNCTION DeleteDiskID% (drive$)
DECLARE FUNCTION RenameDiskID% (drive$, OldDiskID$, NewDiskID$)
DECLARE SUB GetDTAAddr (Segment%, Offset%)
DECLARE FUNCTION SetDiskID% (drive$, VolumeName$)
DECLARE FUNCTION Lo% (IntegerVar%)
DECLARE FUNCTION GetDiskID$ (drive$)
DECLARE FUNCTION Selecterror$ (Whitch%)
DECLARE SUB ViewFile (FileName$)
DECLARE FUNCTION DiskDrive$ ()
DECLARE FUNCTION CodeToets! ()
DECLARE FUNCTION gameaddaptor% ()
DECLARE FUNCTION HarDDisK$ ()
DECLARE FUNCTION ChkANSI% ()
DECLARE FUNCTION Path$ ()
DECLARE FUNCTION ProgramName$ ()
DECLARE FUNCTION BestandAanwezig% (bestand$)
DECLARE SUB BinCopy (Bestand1$, Bestand2$, FileCopyShow%, Regel%, Waar%, BKleur%, FKleur%, Car%)
DECLARE SUB Delay (del%, keer%)
DECLARE SUB DrawBox (UpRow%, LtCol%, LoRow%, RtCol%)
DECLARE SUB pause (ticks%)
DECLARE SUB Shadow (UpRow%, LtCol%, LoRow%, RtCol%)
DECLARE SUB GetDefaultDrive ()
DECLARE SUB GetDriveInfo ()
DECLARE SUB GetMEMoryInfo ()
DECLARE SUB fileread (FileName$, linecount%, a$())
DECLARE FUNCTION keycode% ()


TYPE ExtendedFCBRecord
	ExtFCB   AS STRING * 1
	Res1     AS STRING * 5
	Attr     AS STRING * 1
	drive    AS STRING * 1
	Name1    AS STRING * 11
	Unused1  AS STRING * 5
	Name2    AS STRING * 11
	Unused2  AS STRING * 9
END TYPE

TYPE StarType
  Angle AS INTEGER
  Speed AS INTEGER
  Brite AS INTEGER
  RealX AS INTEGER
  RealY AS INTEGER
  Dis   AS INTEGER
END TYPE

DEFINT A-Z
CONST False = 0
CONST true = -1

'$INCLUDE: 'QB.BI'
DIM SHARED inreg AS RegType
DIM SHARED outreg AS RegType
DIM SHARED InRegs AS RegType, OutRegs AS RegType
DIM SHARED drive, psp

TYPE Fixed
  Str AS STRING * 16384                          'kopieerbuffer
END TYPE

'----------------------------------
'BACKPrint "Erik", 7, 1, 1
'----------------------------------
'BackShowGround " TCP_LIB "
'----------------------------------
'i = BeeldSchermKleur
'IF i = 1 THEN PRINT "You got a COLOR monitor" ELSE PRINT "you got a Black/White monitor "
'----------------------------------
'BinCopy "C:\COMMAND.COM", "C:COM.COM", 1, 4, 10, 7, 0, 34
'----------------------------------
'Capslock 'if on then out or if out then on
'----------------------------------
'i = ChlAnsi
'IF i = 1 THEN PRINT "ANSi installed" ELSE PRINT "ANSi not installed"
'----------------------------------
'CMosSAVE "CMOS.DAT" 'Save CMOS in CMOS.DAT
'----------------------------------
'CMosRestore "CMOS.DAT" 'Restore CMOS
'----------------------------------
'ComeTOgeter "erik is okee", 1, 30, 100
'----------------------------------
'DELAY is using by COmeTOGeter and some other SUBS
'Also DELAYLINE
'DrawBox is using by EXAND
'FileRead is using by ViewFile
'GetDTAAddr <---- ???? for some sub
'GOODPaSSWoRD Used by PaSSWoRDMeNu
'GetFTime <--- Get the time from a file
'LO is used by ???
'Pause is used by EXPAND
'----------------------------------
'i = DeleteDiskID%("C:") 'Delete the C: LABEL
'----------------------------------
'Expand 1, 10, 20, 30
'----------------------------------
'FLDEdit 10, 10, 30, 7, 0, 10, a$
'PRINT a$ '< ----you; see; what; you; typted
'----------------------------------
'i = gameaddaptor
'IF i = 1 THEN PRINT "You got a gameaddaptor" ELSE PRINT "NO gameaddaptor installed"
'----------------------------------
'GetDefaultDrive
'PRINT CHR$(drive + 64) + ":\"
'----------------------------------
'i$ = GetDiskID("C:")
'PRINT i$ '< ---Your; drive; LABEL
'----------------------------------
'GetDefaultDrive
'GetDriveInfo '<--- get info about the drive
'----------------------------------
'GetMEMoryInfo '<--- get info about the drive
'----------------------------------
'i$ = HarDDisK$
'PRINT i$ '<-- see what for sort of drive you got
'----------------------------------
'i = IS4DOS
'IF i = 1 THEN PRINT "4DOS is INSTALLED" ELSE PRINT "4DOS is not installed"
'----------------------------------
'kee = keycode
'PRINT kee '< ---Look whit toets you hat toutched
'----------------------------------
'LichtKrant "erik is alwijs okee", 4, 6, 7
'----------------------------------
'LineOut 4 '<---- You will see
'It's very nice
'Linein 4 '<--- this go's in
'----------------------------------
'PassWordMenu "erik", 10, 10, 7, 1, "Please enter the PASSWORD", 1000 * 10, 1
'You must type 'erik'
'----------------------------------
'i$ = Path$
'PRINT i$ '<---you wil see the Path
'----------------------------------
'i$ = ProgrammName$
'PRINT i$ '<--- you wil see the name of the .EXE programm
'----------------------------------
'REBOOT '<--- wil reboot your system
'----------------------------------
'b$ = GetDiskID$("C:")
'i = RenameDiskID("C:", b$, "TCP_LIB")' <--- rename the label to TCP_LIB
'----------------------------------
'ResoreScreen Save$ <---- First use SaveScreen Save$
'----------------------------------
'Scroll '<---- Scroll the screen up and back down
'----------------------------------
'i$ = Selecterror$(75)
'PRINT i$ '<---it's print PATH/File acces error
'----------------------------------
'i = SetDiskID("C:", "TCP_LIB")
'----------------------------------
'ShowGif "C:\PROGRAMM\QBASIC\FOR_DEMO\GRAfisch\NEON.GIF"
'----------------------------------
'ShowKlok '<--- Shows a NICE clock
'----------------------------------
'Sterren '<--- Prints stars on the screen that walks to you
'----------------------------------
'ViewFile "C:\autoexec.bat"
'----------------------------------

SUB BACKPrint (Tekst$, HKleur%, wachtt, keer)
lijn = CSRLIN: row = POS(0)

FOR i = LEN(Tekst$) TO 1 STEP -1
a = ASC(MID$(Tekst$, i, 1))
IF a >= 65 AND a <= 90 THEN COLOR HKleur%, 0 ELSE COLOR 7, 0
IF a = 45 THEN COLOR 3, 0: IF a = 61 THEN COLOR HKleur%, 0
LOCATE lijn, row + i: PRINT MID$(Tekst$, i, 1)
Delay wachtt, keer
NEXT

END SUB

SUB BackShowGround (Tekst$)
FOR i = 80 TO 1990 STEP INT(LEN(Tekst$))
FOR t = 1 TO LEN(Tekst$)
PRINT MID$(Tekst$, t, 1);
NEXT t, i


END SUB

DEFSNG A-Z
FUNCTION BeeldSchermKleur
DEF SEG = 0
IF PEEK(&H463) = &HB4 THEN BeeldSchermKleur = 0 ELSE BeeldSchermKleur = 1
END FUNCTION

DEFINT A-Z
SUB BinCopy (Bestand1$, Bestand2$, FileCopyShow%, Regel%, Waar%, BKleur%, FKleur%, Car%)

Add% = 0  '0 = overschrijven. -1 = Toevoegen
CopyDate% = 1 '0 = huidige datum. -1 = datum van bronbestand
REDIM Buffer(0) AS Fixed                         ' fixed string in far heap

f1% = FREEFILE                                   ' handle #F1%
OPEN Bestand1$ FOR BINARY AS #f1% LEN = 4096     ' open bronbestand

f2% = FREEFILE                                   ' handle #F2%
IF NOT Add% THEN                                 ' overschrijven
  OPEN Bestand2$ FOR OUTPUT AS #f2%              ' voor alle zekerheid...
  CLOSE #f2%                                     '
  KILL Bestand2$                                 ' wissen
END IF

OPEN Bestand2$ FOR BINARY AS #f2% LEN = 4096     ' open doelbestand

IF Add% THEN                                     ' Toevoegen
  TotalBytes& = LOF(f1%) + LOF(f2%)              ' tel op
  SEEK #f2%, LOF(f2%) + 1                        ' append
ELSE
  TotalBytes& = LOF(f1%)
END IF

DO
  GET #f1%, , Buffer(0)                          ' lees dan 16Kb
  IF NOT EOF(f1%) THEN
    PUT #f2%, , Buffer(0)                        ' schrijf naar 2
  ELSE                                           ' hoeveel rest ?
    FOR x% = 1 TO (TotalBytes& - LOF(f2%)) STEP 4096
	IF TotalBytes& - LOF(f2%) >= 4096 THEN     ' blokken van 4Kb
	Temp$ = MID$(Buffer(0).Str, x%, 4096)
	ELSE
	Temp$ = MID$(Buffer(0).Str, x%, (TotalBytes& - LOF(f2%)))
	END IF
	PUT #f2%, , Temp$                          ' schrijf rest
    
    NEXT x%
  END IF
COLOR 7, 0
IF FileCopyShow = 1 THEN
COLOR BKleur%, FKleur%
LOCATE Regel%, Waar%
PRINT STRING$(INT(LOF(f2%) / (LOF(f1%) / 100)) / 2, Car%); '219
LOCATE Regel% + 1, Waar% + 20: PRINT INT(LOF(f2%) / (LOF(f1%) / 100)); "% Done  "
END IF

LOOP UNTIL EOF(f1%)
CLOSE 1, 2
END SUB

SUB Capslock
DEF SEG = 0
status% = PEEK(&H417)
POKE &H417, (status% XOR &H40)

END SUB

FUNCTION ChkANSI
 
inreg.ax = &H1A00
INTERRUPT &H2F, inreg, outreg
 
SELECT CASE outreg.ax MOD 256
	CASE 0
		ChkANSI = 0
	CASE 255
		ChkANSI = 1
END SELECT
 
 
END FUNCTION

SUB CMosRestore (File$)
DIM Byte AS STRING * 1
	 
OPEN File$ FOR BINARY AS #1
FOR CMOS = 1 TO LOF(1)
	  OUT &H70, CMOS - 1
		  GET #1, , Byte
	  OUT &H71, ASC(Byte)
NEXT: CLOSE 1

END SUB

SUB CMosSAVE (File$)
DIM Byte AS STRING * 1
	
OPEN File$ FOR OUTPUT AS #1
FOR CMOS = &H0 TO &H3F
	  OUT &H70, CMOS
		  DByte% = INP(&H71)
	  PRINT #1, CHR$(DByte%);
NEXT: CLOSE 1

END SUB

SUB ComeTOgeter (Tekst$, HKleur%, wachtt, keer)
lijn = CSRLIN + 1: row = POS(0)
Einde = LEN(Tekst$) / 2
AStart = 1
BStart = LEN(Tekst$)
FOR i = 1 TO Einde
GOSUB PrintA
GOSUB PrintB
AStart = AStart + 1
BStart = BStart - 1

Delay wachtt, keer
NEXT i
EXIT SUB


PrintA:
a = ASC(MID$(Tekst$, AStart, 1))
IF a >= 65 AND a <= 90 THEN COLOR HKleur%, 0 ELSE COLOR 7, 0
IF a = 45 THEN COLOR 3, 0: IF a = 61 THEN COLOR HKleur%, 0
LOCATE lijn, row + AStart: PRINT MID$(Tekst$, AStart, 1)
RETURN


PrintB:
a = ASC(MID$(Tekst$, BStart, 1))
IF a >= 65 AND a <= 90 THEN COLOR HKleur%, 0 ELSE COLOR 7, 0
IF a = 45 THEN COLOR 3, 0: IF a = 61 THEN COLOR HKleur%, 0
LOCATE lijn, row + BStart: PRINT MID$(Tekst$, BStart, 1)

RETURN

END SUB

SUB Delay (del, keer)
FOR k = 1 TO keer
FOR i = 1 TO del * 10
NEXT i
NEXT k

END SUB

SUB DELAYLINE (secs!)

    begin! = TIMER
    DO
    LOOP UNTIL TIMER - begin! > secs!
END SUB

FUNCTION DeleteDiskID% (drive$)

	DIM EFCB AS ExtendedFCBRecord
	DIM InRegsX AS RegTypeX, OutRegsX AS RegTypeX

	EFCB.ExtFCB = CHR$(&HFF)  'Set EFCB flag
	EFCB.Attr = CHR$(&H8)     'Vol label attribute
	EFCB.drive = CHR$(ASC(drive$) - 64)
	EFCB.Name1 = "*.*        "

	InRegsX.ax = &H1300        'Call find first FCB
	InRegsX.ds = VARSEG(EFCB)  'Load DS:DX with
	InRegsX.dx = VARPTR(EFCB)  'address of EFCB
	CALL INTERRUPTX(&H21, InRegsX, OutRegsX)

'Set error codes

	IF Lo(OutRegsX.ax) = 0 THEN     'Successful
		DeleteDiskID = -1 'True
	ELSE
		DeleteDiskID = 0  'False
	END IF

END FUNCTION

 SUB DrawBox (UpRow%, LtCol%, LoRow%, RtCol%) STATIC
    Wide% = (RtCol% - LtCol%) - 1
    LOCATE UpRow%, LtCol%
    PRINT CHR$(201); STRING$(Wide%, CHR$(205)); CHR$(187);
    FOR i% = UpRow% + 1 TO LoRow% - 1
	LOCATE i%, LtCol%
	PRINT CHR$(186); SPACE$(Wide%); CHR$(186);
    NEXT i%
    LOCATE LoRow%, LtCol%
    PRINT CHR$(200); STRING$(Wide%, CHR$(205)); CHR$(188);
 END SUB

 SUB Expand (UpRow%, LtCol%, LoRow%, RtCol%) STATIC
    RowCenter% = ((LoRow% - UpRow%) / 2) + UpRow%
    ColCenter% = ((RtCol% - LtCol%) / 2) + LtCol%
    UprRow% = RowCenter%: LeftCol% = ColCenter%
    LwrRow% = RowCenter%: RghtCol% = ColCenter%
    DO
	LeftCol% = LeftCol% - 1
	RghtCol% = RghtCol% + 1
	IF LeftCol% < LtCol% THEN LeftCol% = LtCol%
	IF RghtCol% > RtCol% THEN RghtCol% = RtCol%
	DrawBox UprRow%, LeftCol%, LwrRow%, RghtCol%
	IF LeftCol% = LtCol% AND RghtCol% = RtCol% THEN EXIT DO
    LOOP
    DO
	UprRow% = UprRow% - 1
	LwrRow% = LwrRow% + 1
	IF UprRow% < UpRow% THEN UprRow% = UpRow%
	IF LwrRow% >= LoRow% THEN LwrRow% = LoRow%
	DrawBox UprRow%, LeftCol%, LwrRow%, RghtCol%
	IF UprRow% = UpRow% AND LwrRow% = LoRow% THEN EXIT DO
	pause 1
    LOOP
    Shadow UpRow%, LtCol%, LoRow%, RtCol%
 END SUB

SUB fileread (FileName$, linecount%, a$()) STATIC
 filenumber% = FREEFILE
 OPEN FileName$ FOR INPUT AS filenumber%
 FOR i% = LBOUND(a$) TO UBOUND(a$)
  LINE INPUT #filenumber%, a$(i%)
  linecount% = i%
  IF EOF(filenumber%) THEN EXIT FOR
 NEXT i%
 IF NOT EOF(filenumber%) THEN linecount% = -1
END SUB

DEFSNG A-Z
SUB FLDEdit (FRow%, FCol%, FLength%, FFore%, FBack%, FRKey%, FTemp$) STATIC

'  Set boolean values
		CONST true = -1
		CONST False = 0

'  Set color, ephasize field, insert string, and set cursor
		FSet% = FCol% - 1
		COLOR FFore%, FBack%
		LOCATE FRow%, FCol%, 0
		PRINT FTemp$; SPACE$(FLength% - LEN(FTemp$));
		LOCATE FRow%, FCol%, 1

'  Check FRKey% and set page key functions
		IF FRKey% THEN
			PageSet% = true
		ELSE
			PageSet% = False
		END IF

'  Initialize return key code, stop, reset insert mode
		FRKey% = False
		FStop% = False
		FInsert% = False

'  Set Editor Output string to new Input string
		Fout$ = FTemp$

'  Start Parsing
		DO UNTIL FStop%

'  Sound alarm if called for
			IF Alarm% THEN
				SOUND 1000, 1
				SOUND 1500, 2
				SOUND 500, 1
				Alarm% = False
			END IF

'  Get a key to parse
			FIn$ = ""
			DO
			FIn$ = INKEY$
			LOOP WHILE FIn$ = ""

'  Start by parsing length of key string
			SELECT CASE LEN(FIn$)

'  Check for extended key, strip leading zero
				CASE 2
				FIn$ = RIGHT$(FIn$, 1)

'  Use ASCII value to select
					SELECT CASE ASC(FIn$)

'  Cursor Right
						CASE 77
							IF POS(0) < FSet% + (LEN(Fout$) + 1) THEN
								LOCATE , POS(0) + 1
							ELSE
								Alarm% = true
							END IF

'  Cursor Left
						CASE 75
							IF POS(0) > FSet% + 1 THEN
								LOCATE , POS(0) - 1
							ELSE
								Alarm% = true
							END IF

'  Delete
						CASE 83
							IF POS(0) - FSet% <= LEN(Fout$) THEN
								Shift$ = MID$(Fout$, (POS(0) - FSet%) + 1)
								Fout$ = LEFT$(Fout$, ((POS(0) - FSet%) - 1)) + Shift$
								FTempPos% = POS(0)
								LOCATE , , 0
								PRINT MID$(Fout$, POS(0) - FSet%); CHR$(32);
								LOCATE , FTempPos%, 1
							ELSE
								Alarm% = true
							END IF

'  Insert
						CASE 82
							IF FInsert% = False THEN
								FInsert% = true
								LOCATE , , , 0, 7
							ELSEIF FInsert% = true THEN
								FInsert% = False
								LOCATE , , , 7, 7
							END IF

'  Up, Down, PgUp, PgDn, Home, End
						CASE 59 TO 68, 71, 72, 73, 79, 80, 81
							IF PageSet% THEN
								FRKey% = ASC(FIn$)
								FStop% = true
							ELSE
								Alarm% = true
							END IF

'  Any other key is illegal so set alarm and loop
						CASE ELSE
							Alarm% = true

					END SELECT

'  Check for non-extended keys
				CASE 1

'  Use ASCII value to select
					SELECT CASE ASC(FIn$)

'  Backspace
						CASE 8
							IF POS(0) - FSet% > 1 THEN
								IF POS(0) - FSet% > LEN(Fout$) THEN
									Fout$ = LEFT$(Fout$, LEN(Fout$) - 1)
									FTempPos% = POS(0)
									LOCATE , POS(0) - 1, 0
									PRINT CHR$(32);
									LOCATE , FTempPos% - 1, 1
								ELSEIF POS(0) - FSet% <= LEN(Fout$) THEN
									Shift$ = MID$(Fout$, POS(0) - FSet%)
									Fout$ = LEFT$(Fout$, ((POS(0) - FSet%) - 2)) + Shift$
									FTempPos% = POS(0)
									LOCATE , POS(0) - 1, 0
									PRINT MID$(Fout$, POS(0) - FSet%); CHR$(32);
									LOCATE , FTempPos% - 1, 1
								END IF
							ELSE
								Alarm% = true
							END IF

'  Tab
						CASE 9
							IF PageSet% THEN
								FRKey% = ASC(FIn$)
								FStop% = true
							ELSE
								Alarm% = true
							END IF

'  Carriage Return
						CASE 13
							FRKey% = ASC(FIn$)
							FStop% = true

'  Escape
						CASE 27
							FRKey% = ASC(FIn$)
							FStop% = true

'  Check for additional uprintable input
						CASE IS < 32, IS > 125
							Alarm% = true

'  Found printable key
						CASE 32 TO 125

'  If not past end of maximum length take input.
							IF POS(0) <= FSet% + FLength% THEN

'  If position is less than current string length then check for insert
'  mode on and overwrite character if insert off or insert character if on.
								IF POS(0) - FSet% <= LEN(Fout$) THEN

'  Insert mode off?
									IF FInsert% = False THEN
										MID$(Fout$, POS(0) - FSet%, 1) = FIn$
										PRINT FIn$;

'  Insert mode on?
									ELSEIF FInsert% = true THEN

'  Check length of string plus input and take input if less than max lenth.
										IF LEN(Fout$) < FLength% THEN
											Shift$ = MID$(Fout$, POS(0) - FSet%)
											Fout$ = LEFT$(Fout$, (POS(0) - FSet%) - 1) + FIn$ + Shift$
											FTempPos% = POS(0)
											LOCATE , , 0
											PRINT MID$(Fout$, POS(0) - FSet%);
											LOCATE , FTempPos% + 1, 1

'  If string plus input too long sound alarm and return.
										ELSE
											Alarm% = true
										END IF
									END IF

'  If string position greater than current string length then add character.
								ELSEIF POS(0) - FSet% > LEN(Fout$) THEN
									Fout$ = Fout$ + FIn$
									PRINT FIn$;
								END IF

'  Cursor past end of field so input is illegal
							ELSE
								Alarm% = true
							END IF

'  Any other key is illegal so set alarm and loop
						CASE ELSE
							Alarm% = true

					END SELECT

			END SELECT

		LOOP

'  Exit, reset cursor, assign passed variable
		LOCATE , , 0, 7, 7
		FTemp$ = Fout$

	END SUB

DEFINT A-Z
FUNCTION gameaddaptor
   
DEF SEG = 0: GAME.ADAPTER% = PEEK(&H411) AND &H10
IF GAME.ADAPTER% = 0 THEN GAME.ADAPTER$ = "NO" ELSE GAME.ADAPTER$ = "YES --INSTALLED"
IF gameadapter$ = "NO" THEN gameaddaptor = 0 ELSE gameaddaptor = 1

END FUNCTION

SUB GetDefaultDrive

InRegs.ax = &H1900
CALL INTERRUPT(&H21, InRegs, OutRegs)
drive = (OutRegs.ax AND 255) + 1

END SUB

FUNCTION GetDiskID$ (drive$)
	DIM EFCB AS ExtendedFCBRecord
	DIM InRegsX AS RegTypeX, OutRegsX AS RegTypeX

'  Get Address of Data Transfer Area (DTA)

	CALL GetDTAAddr(Segment, Offset)

'  Call the Find First FCB function
'  using the Volume attribute

	EFCB.ExtFCB = CHR$(&HFF)   'Set EFCB flag
	EFCB.Attr = CHR$(&H8)      'Vol label attribute
	EFCB.drive = CHR$(ASC(drive$) - 64)
	EFCB.Name1 = "*.*        "
	InRegsX.ax = &H1100        'Call find first FCB
	InRegsX.ds = VARSEG(EFCB)  'Load DS:DX with
	InRegsX.dx = VARPTR(EFCB)  'address of EFCB
	CALL INTERRUPTX(&H21, InRegsX, OutRegsX)

	GetDiskID$ = ""

	IF Lo(OutRegsX.ax) = 0 THEN  'Successful
		VOL$ = ""
		DEF SEG = Segment       'Set Segment to DTA
		FOR i = Offset + 8 TO Offset + 18
			VOL$ = VOL$ + CHR$(PEEK(i))
		NEXT i
		DEF SEG
		GetDiskID$ = VOL$
	END IF
END FUNCTION

SUB GetDriveInfo

InRegs.ax = &H3600
InRegs.dx = drive
CALL INTERRUPT(&H21, InRegs, OutRegs)
IF OutRegs.ax = &HFFFF THEN
	PRINT "Invalid Drive"
ELSE
	clustersize& = CLNG(OutRegs.ax) * CLNG(OutRegs.cx)
	TotalBytes& = CLNG(OutRegs.dx) * clustersize&
	freebytes& = CLNG(OutRegs.bx) * clustersize&
	PRINT USING "Drive !:"; CHR$(drive + ASC("A") - 1)
	PRINT USING "  ######### bytes total disk space"; TotalBytes&
	PRINT USING "  ######### bytes available on disk"; freebytes&
	PRINT
END IF

END SUB

SUB GetDTAAddr (Segment, Offset)

	DIM InRegsX AS RegTypeX, OutRegsX AS RegTypeX

	InRegsX.ax = &H2F00
	CALL INTERRUPTX(&H21, InRegsX, OutRegsX)
	Segment = OutRegsX.es   'Return address of DTA
	Offset = OutRegsX.bx    'Segment:Offset format

END SUB

SUB GetFTime (Handle%, FTime%, FDate%, Datum$, tijd$)


SHARED InRegsX AS RegTypeX, OutRegsX AS RegTypeX
InRegsX.ax = &H5700
InRegsX.bx = FILEATTR(Handle%, 2)
CALL INTERRUPTX(&H21, InRegsX, OutRegsX)
FTime% = OutRegsX.cx
FDate% = OutRegsX.dx

Adress% = VARPTR(FDate%)
Datum$ = MID$(STR$((PEEK(Adress%) AND &H1F)), 2) + "-"
Datum$ = Datum$ + MID$(STR$((PEEK(Adress% + 1) AND &H1) * 8 + (PEEK(Adress%) AND &HE0) \ 32), 2) + "-"
Datum$ = Datum$ + MID$(STR$(((PEEK(Adress% + 1) AND &HFE) \ 2 + 80) MOD 100), 2)

Adress% = VARPTR(FTime%)
tijd$ = MID$(STR$((PEEK(Adress% + 1) AND &HF8) \ 8), 2) + ":"
tijd$ = tijd$ + MID$(STR$((PEEK(Adress% + 1) AND &H7) * 8 + (PEEK(Adress%) AND &HE0) \ 32), 2) + ":"
tijd$ = tijd$ + MID$(STR$((PEEK(Adress%) AND &H1F) * 2), 2)


END SUB

SUB GetMEMoryInfo

InRegs.ax = &H6200
CALL INTERRUPT(&H21, InRegs, OutRegs)
psp = OutRegs.bx

CALL INTERRUPT(&H12, InRegs, OutRegs)
memsize& = OutRegs.ax * 64&
PRINT USING "  ######### bytes total memory"; CLNG(OutRegs.ax) * 1024&
PRINT USING "  ######### bytes free"; (memsize& - CLNG(psp) + 1&) * 16&
PRINT : PRINT "  Next program will load at "; HEX$(psp); ":0000 hex"
PRINT

END SUB

SUB GOODPaSSWoRD
DONE:
COLOR 2
LOCATE 1, 1
PRINT SPC(8); " ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü "
PRINT SPC(8); " ±±Ûßßßß  ±±Ûß±±Û  ±±Ûß±±Û  ±±Ûß±±Û  ±±Ûßßßß  ±±Ûßßßß   ß±±Ûßß "
PRINT SPC(8); " ±±Û      ±±Û ±±Û  ±±±±±Ûß  ±±±±±Ûß  ±±±±±Ü   ±±Û        ±±Û   "
PRINT SPC(8); " ±±Û      ±±Û ±±Û  ±±Ûß±±Ü  ±±Ûß±±Ü  ±±Ûßßß   ±±Û        ±±Û   "
PRINT SPC(8); " ±±±±±±Ü  ±±±±±±Û  ±±Û ±±Û  ±±Û ±±Û  ±±±±±±Ü  ±±±±±±Ü    ±±Û   "
PRINT SPC(8); "  ßßßßßß   ßßßßßß   ßß  ßß   ßß  ßß   ßßßßßß   ßßßßßß     ßß   "
LOCATE 18, 1
PRINT SPC(4); " ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±±Ü ±±Ü   ±±Ü  ±±±±±±Ü  ±±±±±±Ü  ±±±±±Ü "
PRINT SPC(4); " ±±Ûß±±Û  ±±Ûß±±Û  ±±Ûßßßß  ±±Ûßßßß ±±Û   ±±Û  ±±Ûß±±Û  ±±Ûß±±Û  ±±Ûß±±Û"
PRINT SPC(4); " ±±±±±±Û  ±±±±±±Û  ±±±±±±Ü  ±±±±±±Ü ±±Û   ±±Û  ±±Û ±±Û  ±±±±±Ûß  ±±Û ±±Û"
PRINT SPC(4); " ±±Ûßßßß  ±±Û ±±Û   ßßß±±Û   ßßß±±Û ±±Û±±Ü±±Û  ±±Û ±±Û  ±±Ûß±±Ü  ±±Û ±±Û"
PRINT SPC(4); " ±±Û      ±±Û ±±Û  ±±±±±±Û  ±±±±±±Û  ß±±±±Ûßß  ±±±±±±Û  ±±Û ±±Û  ±±±±±Ûß"
PRINT SPC(4); "  ßß       ßß  ßß   ßßßßßß   ßßßßßß    ßßßß     ßßßßßß   ßß  ßß   ßßßßß "

END SUB

FUNCTION HarDDisK$
DIM regs AS RegTypeX

regs.ax = &H1C00                       'ah=1c al=00
regs.dx = 0                            '0=default, 1=a:,2=b:,etc
CALL INTERRUPTX(&H21, regs, regs)      'use dos
DEF SEG = regs.ds                      'change to returned segment
MediaByte = PEEK(regs.bx)              'Get the byte
DEF SEG                                'get back to basic's segment

IF (regs.ax AND 255) <> &HFF THEN

    SELECT CASE HEX$(MediaByte)
		CASE "F0"
			HarD$ = "3.5 inch DS, 18 sectors or other"
		CASE "F8"
			HarD$ = "Fixed Disk"
		CASE "F9"
			HarD$ = "5.25 in DS, 15 sects or 3.5 in DS, 9 sects"
		CASE "FC"
			HarD$ = "5.25 inch SS, 9 sectors"
		CASE "FD"
			HarD$ = "5.25 inch DS, 9 sectors"
		CASE "FE"
			HarD$ = "5.25 inch SS, 8 sectors"
		CASE "FF"
			HarD$ = "5.25 inch DS, 8 sectors"
		CASE ELSE
			HarD$ = "Unknown Type"
	END SELECT
     
	HarDDisK$ = "Media ID Byte : " + HEX$(MediaByte) + " = " + HarD$
ELSE
	HarDDisK$ = "Error encountered (invalid drive or critical error)"
END IF


END FUNCTION

FUNCTION IS4DOS

a$ = ENVIRON$("COMSPEC")
IF INSTR(a$, "4DOS") THEN ffos = 1 ELSE ffos = 0
SELECT CASE ffos
CASE 0
IS4DOS = 0
CASE ELSE
IS4DOS = 1
END SELECT

END FUNCTION

FUNCTION keycode% STATIC
 DO
 k$ = INKEY$
 LOOP UNTIL k$ <> ""
 keycode% = CVI(k$ + CHR$(0))
END FUNCTION

SUB LichtKrant (Tekst$, Regel%, BKleur%, FKleur%)
COLOR 7
teksten$ = SPACE$(40) + Tekst$ + SPACE$(40)
FOR teken% = 1 TO LEN(teksten$)
    COLOR BKleur%, FKleur%
    LOCATE Regel%, 1
    PRINT MID$(teksten$, teken%, 80)
    wacht
NEXT teken%
END SUB

SUB Linein (LineColor%)
DIM lijnen$(24)
 
    lijnen$(2) = SPACE$(39) + "þ" + SPACE$(2)
    lijnen$(1) = SPACE$(39) + "." + SPACE$(2)
    lijnen$(23) = STRING$(80, "Ä")
    Sp% = 39
    Ln% = 0
    FOR i% = 2 TO 21
	  lijnen$(i%) = SPACE$(Sp%) + STRING$(Ln%, "Ä") + SPACE$(2)
	  Sp% = Sp% - 2
	  Ln% = Ln% + 4
    NEXT i%
 
    COLOR LineColor%, 0
    FOR i% = 1 TO 23
	  LOCATE 13, 1
	  PRINT lijnen$(i%);
	  Delay .03, 1
    NEXT
 
    COLOR 15, LineColor%
    x% = 12
    y% = 13
    FOR i% = 1 TO 13
	  LOCATE y%, 1
	  PRINT STRING$(80, " ");
	  LOCATE x%, 1
	  PRINT STRING$(80, " ");
	  DrawBox x%, 1, y%, 80
	  Delay .03, 1
	  IF x% > 1 THEN x% = x% - 1
	  y% = y% + 1
    NEXT i%
END SUB

SUB LineOut (LineColor%)  '*** By Mark H Butler
DIM lines$(1 TO 24)
 
    lines$(1) = STRING$(80, "Ä")
    Sp% = 2
    Ln% = 76
    FOR i% = 2 TO 21
	  lines$(i%) = SPACE$(Sp%) + STRING$(Ln%, "Ä") + SPACE$(2)
	  Sp% = Sp% + 2
	  Ln% = Ln% - 4
    NEXT i%
    lines$(22) = SPACE$(39) + "þ" + SPACE$(2)
    lines$(23) = SPACE$(39) + "." + SPACE$(2)
 
    COLOR 0, 0
    x% = 1
    y% = 25
    FOR i% = 1 TO 12
	  LOCATE y%, 1
	  PRINT STRING$(80, CHR$(32));
	  LOCATE x%, 1
	  PRINT STRING$(80, CHR$(32));
	  DELAYLINE .03
	  x% = x% + 1
	  y% = y% - 1
    NEXT i%
    COLOR LineColor%, 0
    FOR i% = 1 TO 23
	  LOCATE 13, 1: PRINT lines$(i%);
	  DELAYLINE .03
    NEXT i%
    COLOR 7
    CLS
END SUB

FUNCTION Lo (IntegerVar)
	Lo = IntegerVar MOD 256
END FUNCTION

SUB PassWordMenu (PassWord$, Plijn%, PRow%, BKleur%, FKleur%, Tekst$, WrongDelay, GOOD)
COLOR BKleur%, FKleur%
Plijn% = Plijn% - 1
Expand 8, 20, 14, 60
LOCATE 10, 25: PRINT Tekst$
LOCATE 12, 25: PRINT "["; STRING$(30, 32); "]"

DO

DO
a$ = INKEY$
LOOP UNTIL a$ <> ""
PaSS$ = PaSS$ + a$
IF LEN(PaSS$) < 31 THEN LOCATE 12, 26: PRINT STRING$(LEN(PaSS$), 254)
IF LEN(PaSS$) > 30 THEN GOSUB Wrong
LOOP UNTIL INSTR(PaSS$, PassWord$) >= 1
COLOR 7, 0
IF GOOD = 1 THEN CALL GOODPaSSWoRD
EXIT SUB

Wrong:
LOCATE 12, 26: PRINT "WRong PaSSword [RELoading.]   "
FOR i = 1 TO WrongDelay
NEXT i
PaSS$ = ""
LOCATE 12, 25: PRINT "["; STRING$(30, 32); "]"
RETURN




END SUB

DEFSNG A-Z
FUNCTION Path$
DEFINT A-Z
'=================== Function ProgramName$ ======================
'== INPUT: None                                                ==
'== RETURNS: Name of currently executing program               ==
'================================================================
'

DIM regs AS RegType

   regs.ax = &H6200
   CALL INTERRUPT(&H21, regs, regs)
   PSPSegment = regs.bx
   DEF SEG = PSPSegment
   EnvSegment = PEEK(&H2D) * 256 + PEEK(&H2C)


   DEF SEG = EnvSegment
   EOT = False                 'Set end of environment table flag
   Offset = 0

   WHILE NOT EOT
	Byte = PEEK(Offset)       'Get table character
	IF Byte = 0 THEN          'End of environment string?
	 Offset = Offset + 1
	 Byte = PEEK(Offset)
	 IF Byte = 0 THEN        'End of environment?
	    Offset = Offset + 3   'Yes - Skip over nulls & tbl info
	    C% = PEEK(Offset)
	    WHILE C% <> 0                   'Assemble filename string
		 FileN$ = FileN$ + CHR$(C%)    '  from individual
		 Offset = Offset + 1           '  characters
		 C% = PEEK(Offset)
	    WEND
	    EOT = true              'Set flag to exit while/wend loop
	 END IF
	ELSE                        'No-Read more environment string
	Offset = Offset + 1
	END IF
   WEND

FOR i = LEN(FileN$) TO 1 STEP -1
IF RIGHT$(MID$(FileN$, i, 1), 1) = "\" THEN EXIT FOR
a = a + 1
NEXT i
FileN$ = LEFT$(FileN$, LEN(FileN$) - a)
FileN$ = RIGHT$(FileN$, LEN(FileN$) - 2)

Path$ = FileN$
DEF SEG

END FUNCTION

 SUB pause (ticks%)
    DEF SEG = 0
    DO UNTIL TestTick% > ticks%
	IF LEN(INKEY$) THEN EXIT SUB
	LastTick% = GetTick%
	GetTick% = PEEK(&H46C)
	IF LastTick% <> GetTick% THEN
	    TestTick% = TestTick% + 1
	END IF
    LOOP


    DEF SEG
 END SUB

'=================== Function ProgramName$ ======================
'== INPUT: None                                                ==
'== RETURNS: Name of currently executing program               ==
'================================================================
'
FUNCTION ProgramName$

DIM regs AS RegType

   regs.ax = &H6200
   CALL INTERRUPT(&H21, regs, regs)
   PSPSegment = regs.bx
   DEF SEG = PSPSegment
   EnvSegment = PEEK(&H2D) * 256 + PEEK(&H2C)


   DEF SEG = EnvSegment
   EOT = False                 'Set end of environment table flag
   Offset = 0

   WHILE NOT EOT
	Byte = PEEK(Offset)       'Get table character
	IF Byte = 0 THEN          'End of environment string?
	 Offset = Offset + 1
	 Byte = PEEK(Offset)
	 IF Byte = 0 THEN        'End of environment?
	    Offset = Offset + 3   'Yes - Skip over nulls & tbl info
	    C% = PEEK(Offset)
	    WHILE C% <> 0                   'Assemble filename string
		 FileN$ = FileN$ + CHR$(C%)    '  from individual
		 Offset = Offset + 1           '  characters
		 C% = PEEK(Offset)
	    WEND
	    EOT = true              'Set flag to exit while/wend loop
	 END IF
	ELSE                        'No-Read more environment string
	Offset = Offset + 1
	END IF
   WEND

FOR i = LEN(FileN$) TO 1 STEP -1
IF RIGHT$(MID$(FileN$, i, 1), 1) = "\" THEN EXIT FOR
a = a + 1
NEXT i
FileN$ = RIGHT$(FileN$, a)
ProgramName$ = FileN$
   DEF SEG

END FUNCTION

SUB Reboot
OUT &H64, &HFE                  'Reboot area!
END SUB

FUNCTION RenameDiskID (drive$, OldDiskID$, NewDiskID$)

	DIM EFCB AS ExtendedFCBRecord
	DIM InRegsX AS RegTypeX, OutRegsX AS RegTypeX

'EFCB setup

	EFCB.ExtFCB = CHR$(&HFF) 'Set EFCB flag
	EFCB.Attr = CHR$(&H8)    'Vol label attribute
	EFCB.drive = CHR$(ASC(drive$) - 64)

'Rename specific instructions

	L = LEN(OldDiskID$)
	IF L < 11 THEN
		OldDiskID$ = OldDiskID$ + SPACE$(11 - L)
	END IF
	EFCB.Name1 = OldDiskID$

	L = LEN(NewDiskID$)
	IF L < 11 THEN
		NewDiskID$ = NewDiskID$ + SPACE$(11 - L)
	END IF
	EFCB.Name2 = NewDiskID$

'  Call Service 17H to RENAME a volume label

	InRegsX.ax = &H1700        'Call find first FCB
	InRegsX.ds = VARSEG(EFCB)  'Load DS:DX with
	InRegsX.dx = VARPTR(EFCB)  'address of EFCB
	CALL INTERRUPTX(&H21, InRegsX, OutRegsX)

'Set error codes

	IF Lo(OutRegsX.ax) = 0 THEN     'Successful
		RenameDiskID = -1 'True
	ELSE
		RenameDiskID = 0  'False
	END IF

END FUNCTION

SUB RestoreScreen (File$)
COLOR 7, 0
PRINT File$;
PRINT

END SUB

SUB s.TekenKlok

FOR x% = 175 TO 177                              ' Tekenen van de cirkel
  CIRCLE (300, 170), x%                          ' voor de klok.
NEXT x%


FOR U% = 0 TO 360 STEP 6                         ' Zet de tekens voor de
  DRAW "TA=" + VARPTR$(U%) + "BU115"             ' hele uren in de klok.

  IF U MOD 30 = 0 THEN
    DRAW " U10"                                  ' Zet streepje van 10 pixels.
  ELSE
    DRAW "U1"                                    ' Zet streepje van 1 pixel.
  END IF

  PSET (300, 170), 7                             ' Terug naar het middelpunt
NEXT U%


END SUB

SUB s.Wijzers (Seconde$) STATIC

Seconde% = VAL(Seconde$)                         ' Gegevens uit Time$ lezen
uur% = VAL(TIME$)
Minuut% = VAL(MID$(TIME$, 4, 2))


IF Seconde% = 0 THEN                             ' Na verstrijken van een hele
  OudeSecondeWijzer% = 6                         ' minuut worden de
  DRAW "TA=" + VARPTR$(OudeMinuutWijzer%) + "C0 NU90" ' uurwijzer en de
  DRAW "TA=" + VARPTR$(OudeUurWijzer%) + "C0 NU60" ' minuutwijzer gewist
ELSE
  OudeSecondeWijzer% = 360 - (6 * (Seconde% - 1))
END IF


SecondeWijzer% = 360 - (6 * Seconde%)            ' berekening van de richting
MinuutWijzer% = 360 - (6 * Minuut%)              ' van de diverse wijzers.
OudeMinuutWijzer% = MinuutWijzer%
UurWijzer% = 360 - (30 * uur% + Minuut% / 2)
OudeUurWijzer% = UurWijzer%

DRAW "TA=" + VARPTR$(OudeSecondeWijzer%) + "C0 NU110" ' oude secondewijzer
DRAW "TA=" + VARPTR$(SecondeWijzer%) + "C4 NU110" ' wissen, nieuwe plaatsen
DRAW "TA=" + VARPTR$(UurWijzer%) + "C7 NU60"     ' uurwijzer en
DRAW "TA=" + VARPTR$(MinuutWijzer%) + "C7 NU90"  ' minuutwijzer plaatsen

END SUB

SUB SaveScreen (Strin$)
DEFINT A-Z
DIM scherm(3820) AS INTEGER
DEF SEG = &HB800
FOR i = 0 TO 3820
IF CHR$(PEEK(i)) < CHR$(32) THEN GOTO onee
a$ = a$ + CHR$(PEEK(i))
onee:
NEXT i
Strin$ = a$
END SUB

SUB Scroll
FOR i% = 0 TO 2000 STEP 80
REM M% stands for MSB and L%=LSB
M% = FIX(i% / 256): L% = i% - (M% * 256)
OUT &H3D4, 12: OUT &H3D5, M%: OUT &H3D4, 13: OUT &H3D5, L%
WAIT &H3DA, 8 'Wait for vertical retrace
FOR D = 0 TO 1250: NEXT: 'Adjust for different scroll speed
NEXT
FOR i% = 2000 TO 0 STEP -80
M% = FIX(i% / 256): L% = i% - (M% * 256)
OUT &H3D4, 12: OUT &H3D5, M%: OUT &H3D4, 13: OUT &H3D5, L%
WAIT &H3DA, 8: 'waits for vertical retrace
FOR D = 0 TO 1250: NEXT: 'Adjust for different scroll speed
NEXT
END SUB

FUNCTION Selecterror$ (Whitch%)
SELECT CASE Whitch%
CASE 0
Err$ = "Cannot identify error! ERR=0, so no corresponding message exists!"
CASE 1
Err$ = "NEXT without FOR"
CASE 2
Err$ = "Syntax error"
CASE 3
Err$ = "RETURN without GOSUB"
CASE 4
Err$ = "Out of case"
CASE 5
Err$ = "Illegal function call"
CASE 6
Err$ = "Overflow"
CASE 7
Err$ = "Out of memory"
CASE 8
Err$ = "Undefined line number"
CASE 9
Err$ = "Subscript out of range"
CASE 10
Err$ = "Redimensioned array"
CASE 11
Err$ = "Division by zero"
CASE 12
Err$ = "Illegal direct"
CASE 13
Err$ = "Type mismatch"
CASE 14
Err$ = "Out of string space"
CASE 15
Err$ = "String too long"
CASE 16
Err$ = "String formula too complex"
CASE 17
Err$ = "Can't continue"
CASE 18
Err$ = "Undefined user function"
CASE 19
Err$ = "No RESUME"
CASE 20
Err$ = "RESUME without error"
CASE 22
Err$ = "Missing operand"
CASE 23
Err$ = "Line buffer overflow"
CASE 24
Err$ = "Device Timeout"
CASE 25
Err$ = "Device Fault"
CASE 26
Err$ = "FOR without NEXT"
CASE 27
Err$ = "Out of paper"
CASE 29
Err$ = "WHILE without WEND"
CASE 30
Err$ = "WEND without WHILE"
CASE 50
Err$ = "FIELD overflow"
CASE 51
Err$ = "Internal error"
CASE 52
Err$ = "Bad file number"
CASE 53
Err$ = "File not found"
CASE 54
Err$ = "Bad file mode"
CASE 55
Err$ = "File already open"
CASE 57
Err$ = "Device I/O error"
CASE 58
Err$ = "File already exists"
CASE 61
Err$ = "Disk full"
CASE 62
Err$ = "Input past end"
CASE 63
Err$ = "Bad record number"
CASE 64
Err$ = "Bad file name"
CASE 66
Err$ = "Direct statement in file"
CASE 67
Err$ = "Too many files"
CASE 68
Err$ = "Device unavailable"
CASE 69
Err$ = "Communication buffer overflow"
CASE 70
Err$ = "Permission denied"
CASE 71
Err$ = "Disk not ready"
CASE 72
Err$ = "Disk media error"
CASE 73
Err$ = "Advanced feature"
CASE 74
Err$ = "Rename across disks"
CASE 75
Err$ = "Path/file access error"
CASE 76
Err$ = "Path not found"
CASE ELSE
Err$ = "Cannot identify error"
END SELECT

Selecterror$ = Err$
END FUNCTION

FUNCTION SetDiskID (drive$, VolumeName$)

	DIM EFCB AS ExtendedFCBRecord
	DIM InRegsX AS RegTypeX, OutRegsX AS RegTypeX

	CALL GetDTAAddr(Segment, Offset)

'  Call the Find First FCB function
'  using the Volume attribute

	EFCB.ExtFCB = CHR$(&HFF) 'Set EFCB flag
	EFCB.Attr = CHR$(&H8)    'Vol label attribute
	EFCB.drive = CHR$(ASC(drive$) - 64)
	L = LEN(VolumeName$)
	IF L < 11 THEN
		VolumeName$ = VolumeName$ + SPACE$(11 - L)
	END IF
	EFCB.Name1 = VolumeName$
	InRegsX.ax = &H1600        'Call find first FCB
	InRegsX.ds = VARSEG(EFCB)  'Load DS:DX with
	InRegsX.dx = VARPTR(EFCB)  'address of EFCB
	CALL INTERRUPTX(&H21, InRegsX, OutRegsX)

	IF Lo(OutRegsX.ax) = 0 THEN     'Successful
		SetDiskID = -1 'True
	ELSE
		SetDiskID = 0  'False
	END IF
END FUNCTION

 SUB Shadow (UpRow%, LtCol%, LoRow%, RtCol%) STATIC
    DEF SEG = &H40
    mono% = PEEK(&H10)
    IF (mono% AND 48) = 48 THEN
	EXIT SUB            '*** Forget the Shadow if it's monochrome.
    ELSE
	DEF SEG = &HB800
    END IF

 Attr% = SCREEN(LoRow% + 1, RtCol% + 1, -1)  ' Get the attribute.
    Attr% = Attr% AND 15                     ' Calculate forground.
    Attr% = Attr% - 8                        ' Remove bright.
    IF Attr% < 1 THEN Attr% = 8              ' In case color wasn't bright.


    FOR row% = UpRow% + 1 TO LoRow% + 1       '***** right edge locations.
	FOR col% = RtCol% + 1 TO RtCol% + 2   '***** make it 2 chars Wide.
	    Offset% = (row% - 1) * 160 + (col% - 1) * 2 + 1
	    POKE Offset%, Attr%
	NEXT
    NEXT
    row% = LoRow% + 1                        '***** now POKE along the
    FOR col% = LtCol% + 2 TO RtCol% + 2      '***** bottom edge
	Offset% = (row% - 1) * 160 + (col% - 1) * 2 + 1
	POKE Offset%, Attr%
    NEXT
    DEF SEG
 END SUB

SUB ShowGif (File$)
DIM Prefix(4095), Suffix(4095), OutStack(4095), ShiftOut(8)

DIM YBase AS LONG, Powersof2(11) AS LONG, WorkCode AS LONG

FOR a = 0 TO 8: ShiftOut(8 - a) = 2 ^ a: NEXT
FOR a = 0 TO 11: Powersof2(a) = 2 ^ a: NEXT
IF File$ = "" THEN EXIT SUB

FOR a = LEN(File$) TO 1 STEP -1
    SELECT CASE MID$(File$, a, 1)
    CASE "\", ":": EXIT FOR
    CASE ".": Extension = -1: EXIT FOR
    END SELECT
NEXT
IF Extension = 0 THEN File$ = File$ + ".GIF"

OPEN File$ FOR INPUT AS #1: CLOSE #1
OPEN File$ FOR BINARY AS #1

File$ = "      ": GET #1, , File$
IF LEFT$(File$, 3) <> "GIF" THEN PRINT "Not a GIF file.": END

GET #1, , TotalX: GET #1, , TotalY: GOSUB GetByte
NumColors = 2 ^ ((a AND 7) + 1): NoPalette = (a AND 128) = 0
GOSUB GetByte: Background = a

GOSUB GetByte

IF NoPalette = 0 THEN P$ = SPACE$(NumColors * 3): GET #1, , P$

DO
DO
    DO
	  IF EOF(1) THEN EXIT DO
	  GOSUB GetByte
    LOOP WHILE a = 0

    SELECT CASE a
    CASE 44
	  EXIT DO
    CASE 59
	  GOTO AllDone
    CASE IS <> 33
	  PRINT "Unknown GIF extension type.": END
    END SELECT
    GOSUB GetByte
    DO: GOSUB GetByte: File$ = SPACE$(a): GET #1, , File$: LOOP UNTIL a = 0
LOOP

GET #1, , XStart: GET #1, , YStart: GET #1, , XLength: GET #1, , YLength
XEnd = XStart + XLength: YEnd = YStart + YLength

GOSUB GetByte
IF (a AND 128) THEN
    NoPalette = 0
    NumColors = 2 ^ ((a AND 7) + 1)
    P$ = SPACE$(NumColors * 3): GET #1, , P$
END IF

Interlaced = (a AND 64) > 0: PassNumber = 0: passStep = 8

GOSUB GetByte

ClearCode = 2 ^ a
EOSCode = ClearCode + 1
FirstCode = ClearCode + 2: NextCode = FirstCode
StartCodeSize = a + 1: CodeSize = StartCodeSize

StartMaxCode = 2 ^ (a + 1) - 1: MaxCode = StartMaxCode

BitsIn = 0: BlockSize = 0: BlockPointer = 1

x = XStart: y = YStart: YBase = y * 320&

IF FirstTime = 0 THEN
    SCREEN 13: DEF SEG = &HA000
END IF

IF NoPalette = 0 THEN
    OUT &H3C8, 0
    FOR a = 1 TO NumColors * 3: OUT &H3C9, ASC(MID$(P$, a, 1)) \ 4: NEXT
END IF

IF FirstTime = 0 THEN
    LINE (0, 0)-(319, 199), Background, BF
    FirstTime = -1
END IF

DO
    GOSUB GetCode
    IF Code <> EOSCode THEN
	  IF Code = ClearCode THEN
		NextCode = FirstCode
		CodeSize = StartCodeSize
		MaxCode = StartMaxCode
		GOSUB GetCode
		CurCode = Code: LastCode = Code: LastPixel = Code
		IF x < 320 AND y < 200 THEN POKE x + YBase, LastPixel
		x = x + 1: IF x = XEnd THEN GOSUB NextScanLine
	  ELSE
		CurCode = Code: StackPointer = 0
		IF Code >= NextCode THEN
		    IF Code > NextCode THEN GOTO AllDone
		    CurCode = LastCode
		    OutStack(StackPointer) = LastPixel
		    StackPointer = StackPointer + 1
		END IF

		DO WHILE CurCode >= FirstCode
		    OutStack(StackPointer) = Suffix(CurCode)
		    StackPointer = StackPointer + 1
		    CurCode = Prefix(CurCode)
		LOOP

		LastPixel = CurCode
		IF x < 320 AND y < 200 THEN POKE x + YBase, LastPixel
		x = x + 1: IF x = XEnd THEN GOSUB NextScanLine

		FOR a = StackPointer - 1 TO 0 STEP -1
		    IF x < 320 AND y < 200 THEN POKE x + YBase, OutStack(a)
		    x = x + 1: IF x = XEnd THEN GOSUB NextScanLine
		NEXT

		IF NextCode < 4096 THEN
		    Prefix(NextCode) = LastCode
		    Suffix(NextCode) = LastPixel
		    NextCode = NextCode + 1
		    IF (NextCode > MaxCode) AND (CodeSize < 12) THEN
			  CodeSize = CodeSize + 1
			  MaxCode = MaxCode * 2 + 1
		    END IF
		END IF
		LastCode = Code
	  END IF
    END IF
LOOP UNTIL Code = EOSCode

LOOP
AllDone:
BEEP
SLEEP
SCREEN 0
WIDTH 80
EXIT SUB

GetByte:
File$ = " ": GET #1, , File$: a = ASC(File$): RETURN

NextScanLine:
    IF Interlaced THEN
	  y = y + passStep
	  IF y >= YEnd THEN
		PassNumber = PassNumber + 1
		SELECT CASE PassNumber
		CASE 1: y = 4: passStep = 8
		CASE 2: y = 2: passStep = 4
		CASE 3: y = 1: passStep = 2
		END SELECT
	  END IF
    ELSE
	  y = y + 1
    END IF
    x = XStart: YBase = y * 320&
RETURN

GetCode:
    WorkCode = LastChar \ ShiftOut(BitsIn)
    DO WHILE CodeSize > BitsIn
	  IF BlockPointer > BlockSize THEN
     
		GOSUB GetByte: BlockSize = a
		File$ = SPACE$(BlockSize): GET #1, , File$
		BlockPointer = 1
	  END IF
     
	  LastChar = ASC(MID$(File$, BlockPointer, 1))
	  BlockPointer = BlockPointer + 1
     
	  WorkCode = WorkCode OR LastChar * Powersof2(BitsIn)
	  BitsIn = BitsIn + 8
    LOOP
 
    BitsIn = BitsIn - CodeSize
 
    Code = WorkCode AND MaxCode
RETURN


END SUB

SUB ShowKlok
CLS
SCREEN 9
COLOR 7, 1
LOCATE 24, 25
PRINT "Druk op een toets om te stoppen";

CALL s.TekenKlok                                 ' Teken de klok op het scherm
DO
  Seconde$ = RIGHT$(TIME$, 2)
  CALL s.Wijzers(Seconde$)                       ' roep subprocedure aan
  DO
    LOCATE 2, 34
    PRINT TIME$                                  ' druk de tijd digitaal af
    In$ = INKEY$
  LOOP WHILE Seconde$ = RIGHT$(TIME$, 2) AND In$ = ""

LOOP WHILE In$ = ""
SCREEN 0


END SUB

SUB Sterren
SCREEN 13
OUT &H3C8, 0
FOR n = 1 TO 63
  OUT &H3C9, n
  OUT &H3C9, n
  OUT &H3C9, n
NEXT n

DIM Stars(1 TO 200) AS StarType
DIM Stars1(1 TO 200) AS StarType
DIM Stars2(1 TO 200) AS StarType
DIM Stars3(1 TO 200) AS StarType
DIM OldStars(1 TO 200) AS StarType

FOR n = 1 TO 200

  Stars1(n).Angle = RND * 360
  Stars1(n).Speed = RND + 1
  Stars1(n).Brite = RND * 10
  Stars1(n).Dis = RND * 200

  Stars2(n).Angle = (n * 3.6) MOD 360
  Stars2(n).Speed = 2
  Stars2(n).Brite = 1
  Stars2(n).Dis = (n * 25) MOD 200

  IF n MOD 3 = 0 THEN
    Stars3(n).Angle = (n * 3.6) MOD 360
    Stars3(n).Speed = 3
    Stars3(n).Brite = 1
    Stars3(n).Dis = n
  ELSEIF n MOD 3 = 1 THEN
    Stars3(n).Angle = ((n + 33) * 3.6) MOD 360
    Stars3(n).Speed = 3
    Stars3(n).Brite = 1
    Stars3(n).Dis = n
  ELSEIF n MOD 3 = 2 THEN
    Stars3(n).Angle = ((n + 66) * 3.6) MOD 360
    Stars3(n).Speed = 3
    Stars3(n).Brite = 1
    Stars3(n).Dis = n
  END IF

NEXT n

DIM s(360)
DIM C(360) AS INTEGER

FOR n = 0 TO 360
  s(n) = SIN(n / 57.32) * 100 * 1.2
  C(n) = COS(n / 57.32) * 100
NEXT n

SCREEN 13
CLS
REDIM Temp(5000)

FOR n = 1 TO 200
  Stars(n).Angle = Stars1(n).Angle
  Stars(n).Speed = Stars1(n).Speed
  Stars(n).Brite = Stars1(n).Brite
  Stars(n).Dis = Stars1(n).Dis
NEXT n

DO
  D = (D + 1) MOD 360
  FOR n = 1 TO 200
    Stars(n).RealX = 160 + (C(Stars(n).Angle) - s(Stars(n).Angle) * Stars(n).Dis) \ 100
    Stars(n).RealY = 100 + (s(Stars(n).Angle) + C(Stars(n).Angle) * Stars(n).Dis) \ 100
    IF Stars(n).RealY < 11 THEN Stars(n).RealY = 200
  NEXT n
  FOR n = 1 TO 200
    PSET (OldStars(n).RealX, OldStars(n).RealY), 1 '0
    PSET (Stars(n).RealX, Stars(n).RealY), Stars(n).Brite + Stars(n).Dis \ 3
    OldStars(n).RealX = Stars(n).RealX
    OldStars(n).RealY = Stars(n).RealY
  NEXT n
  IF rotation <> 0 THEN
    FOR n = 1 TO 200
	Stars(n).Dis = (Stars(n).Dis + Stars(n).Speed) MOD 200
	Stars(n).Angle = (Stars(n).Angle + rotation) MOD 360
    NEXT n
  ELSE
    FOR n = 1 TO 200
	Stars(n).Dis = (Stars(n).Dis + Stars(n).Speed) MOD 200
    NEXT n
  END IF
  Sp = Sp + 1

  OUT &H3C8, 70
  OUT &H3C9, (1 * Sp) MOD 40 + 20
  OUT &H3C9, (2 * Sp) MOD 40 + 20
  OUT &H3C9, (3 * Sp) MOD 40 + 20

  IF Sp \ 8 = 122 THEN
    rotation = 1
  END IF

  IF Sp \ 8 = 256 THEN
    rotation = 358
  END IF

  IF Sp \ 8 = 512 THEN
    rotation = 0
    FOR n = 1 TO 200
	Stars(n).Angle = Stars2(n).Angle
	Stars(n).Speed = Stars2(n).Speed
	Stars(n).Brite = Stars2(n).Brite
	Stars(n).Dis = Stars2(n).Dis
    NEXT n
  END IF

  IF Sp \ 8 = 762 THEN
    rotation = 1
  END IF

  IF Sp \ 8 = 1024 THEN
    rotation = 358
  END IF

  IF Sp \ 8 = 1256 THEN
    rotation = 0

    FOR n = 1 TO 200
	Stars(n).Angle = Stars3(n).Angle
	Stars(n).Speed = Stars3(n).Speed
	Stars(n).Brite = Stars3(n).Brite
	Stars(n).Dis = Stars3(n).Dis
    NEXT n
  END IF

  IF Sp \ 8 = 1512 THEN
    rotation = 1
  END IF

  IF Sp \ 8 = 1974 THEN
    rotation = 358
  END IF

LOOP UNTIL LEN(INKEY$)

REDIM Stars1(0) AS StarType
REDIM Stars2(0) AS StarType
REDIM Stars3(0) AS StarType

REDIM Stars(0) AS StarType
REDIM OldStars(0) AS StarType
SCREEN 0
WIDTH 80, 25
EXIT SUB
END SUB

SUB ViewFile (FileName$)
CONST False = 0: CONST true = NOT False
uparrow = 18432: downarrow = 20480: pgup = 18688: pgdn = 20736
home = 18176: endkey = 20224: escape = 27
DIM a$(1 TO 9000)       'modify this for file size



CALL fileread(FileName$, linecount%, a$())
ON ERROR GOTO 0
CLS
lineptr% = 1
DO
 COLOR 0, 3
 VIEW PRINT
 LOCATE 1, 1
 PRINT "Line:"; LEFT$(STR$(lineptr%) + SPACE$(7), 8);
 PRINT "File: "; LEFT$(FileName$ + SPACE$(19), 19);
 PRINT "Quit: ESC"; SPACE$(3);
 PRINT "Move "; CHR$(24); " "; CHR$(25); " PGUP PGDN HOME END   ";
 COLOR 7, 1
 VIEW PRINT 2 TO 25
 FOR i% = 0 TO 23
  LOCATE i% + 2, 1
  PRINT LEFT$(a$(i% + lineptr%) + SPACE$(80), 80);
 NEXT i%
 SELECT CASE keycode%
 CASE uparrow
  IF lineptr% > 1 THEN
   lineptr% = lineptr% - 1
  END IF
 CASE downarrow
  IF lineptr% < linecount% THEN
   lineptr% = lineptr% + 1
  END IF
 CASE pgup
  IF lineptr% > 1 THEN
   lineptr% = lineptr - 24
   IF lineptr% < 1 THEN
    lineptr% = 1
   END IF
  END IF
 CASE pgdn
  IF lineptr% < linecount% - 24 THEN
   lineptr% = lineptr% + 24
   IF lineptr% > linecount% THEN
    lineptr% = linecount%
   END IF
  END IF
 CASE home
  IF lineptr% > 1 THEN
   lineptr% = 1
  END IF
 CASE endkey
  IF lineptr% < linecount% - 24 THEN
   lineptr% = linecount% - 24
  END IF
 CASE escape
  quitflag% = true
 CASE ELSE
  updateflag% = False
 END SELECT
LOOP UNTIL quitflag%
CLOSE
VIEW PRINT
EXIT SUB

END SUB

DEFSNG A-Z
SUB wacht
FOR tijd = 1 TO 1250: NEXT tijd

END SUB
