home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Tool Box
/
SIMS_2.iso
/
bp_4_94
/
power
/
cache.bas
Wrap
BASIC Source File
|
1994-08-10
|
7KB
|
238 lines
'*********************************************************
'! File : CACHE.BAS
'! Vers. : 1.0
'! Last Edit : 10.8.94
'! Autor : G. Born
'! Files : INPUT, OUTPUT
'! Progr. Spr.: Power Basic 2.1/3.0
'! Betr. Sys. : DOS 2.1 - 5.0 - 6.x
'! Funktion: Das Programm wird mit der Eingabe:
'!
'! CACHE
'!
'! aufgerufen. Es überprüft verschiedene
'! Parameter von SMARTDRV und demonstriert
'! den Zugriff auf die INT 2F-Schnittstelle.
'**********************************************************
'! Variable definieren
hit???=0
fail??? = 0
drive% = 0
ON ERROR GOTO fehler
PRINT
PRINT "SMARTDRV Cache Demo (c) Born Version 1.0"
PRINT
'!
'! prüfe, ob Cache installiert ist und gebe Parameter
'! aus.
'!
CALL CacheInstall (cFlag%, hit???, fail???, vers%)
IF cFlag% <> 0 THEN
PRINT USING "SMARTDRV Version #.";Vers%/256;
PRINT USING "## ist installiert"; (Vers% AND &HFF)
PRINT
PRINT "Cache-Hit : ", hit???
PRINT "Cache-Misses : ", fail???
ELSE
PRINT "SMARTDRV nicht installiert"
END
END IF
'!
'! Buffer auf Platte auslagern
'!
PRINT "Commit Cache"
CALL CacheFlush '! Flush Buffer
'!
'! prüfe erneut den Cache-Status
'!
CALL CacheInstall (cFlag%, hit???, fail???, vers%)
IF cFlag% <> 0 THEN
PRINT
PRINT "Cache-Hit : ", hit???
PRINT "Cache-Misses : ", fail???
END IF
INPUT "Laufwerk (0=A, 1=B, 2=C etc.): ", drive%
'!
'! lese den Status des Laufwerks
'!
CALL CacheStatus (Errx%,status%,drive%) '! Lese Status
IF errx% = 0 THEN
IF status% = &HFF THEN
PRINT "Laufwerk C: existiert nicht"
END
ELSE
PRINT "Status: ", HEX$(status%)
END IF
END IF
'!
'! Cachemodus für Laufwerk ändern
'! mode 1 -> Read Cache ein, 2 -> Read Cache aus
'! 3 -> Write Cache ein 4 -> Write Cache aus
'!
mode% = 3
CALL SetCacheDrive (Errx%,mode%,drive%) '! Setze Status
IF Errx% = 0 THEN
IF mode% = &HFF THEN
PRINT "Laufwerk existiert nicht"
END
ELSE
PRINT "Status: ", HEX$(mode%)
END IF
END IF
'!
'! Ermittle Cachegröße
'!
CALL GetCacheSize (DOSBlock&,CacheBlock&,BlockSize&,WINBlock&)
PRINT "Blocks in DOS"; DOSBlock&
PRINT "Blocks in Windows"; WINBlock&
PRINT "Blockgröße "; BlockSize&
PRINT "Cacheblocks benutzt "; CacheBlock&
Print " eine Taste betätigen"
DO WHILE INKEY$ = "": WEND
PRINT
PRINT "Ende Cache Demo"
END '! Ende
'#########################################################
'# Hilfsroutinen #
'#########################################################
fehler:
'---------------------------------------------------------
'! Fehlerbehandlung
'---------------------------------------------------------
PRINT "Fehler : ";ERR;" unbekannt"
PRINT "Programmabbruch"
END '! MSDOS Exit
SUB CacheInstall (inst%, hit???, miss???, vers%)
'!---------------------------------------------------------
'! Prüfe, ob SMARTDRV installiert ist und lese Status
'!
'! INT 2F, Funktion AX=4A10H, BX = 0000H, CX = EBABH
'!
'! inst% 1 -> SMARTDRV installiert
'! hit??? Trefferquote Cache
'! miss?? Fehlerquote Cache
'! vers% Versionsnummer SMARTDRV (BCD-Zahl)
'!---------------------------------------------------------
'!
REG 1, &H4A10 '! AX=4A10H get Status
REG 2, &H0000 '! BX = 0
REG 3, &HEBAB '! Signatur
CALL INTERRUPT &H2F '! Multiplexer INT
inst% = 0 '! Reset Install-Flag
IF (REG(1) = &HBABE) THEN '! SMARTDRV installiert
inst% = 1 '! Install-Flag setzen
hit??? = Reg(4) '! DX:BX = Cache hits
SHIFT LEFT hit???,16
hit??? = hit??? OR Reg(2)
fail??? = Reg(6) '! DI:SI = Cache fails
SHIFT LEFT fail???,16
fail??? = fail??? OR Reg(5)
vers% = Reg (7) '! BP = version
END IF
END SUB
SUB CacheFlush
'!---------------------------------------------------------
'! Cache-Puffer auf Platte schreiben
'!
'! INT 2F, Funktion AX=4A10H BX = 0001
'!---------------------------------------------------------
'!
REG 1, &H4A10 '! AX=4A10H get Status
REG 2, &H0001 '! BX = 1
CALL INTERRUPT &H2F '! Multiplexer INT
END SUB
SUB CacheStatus (Errx%, mode%, drive%)
'!---------------------------------------------------------
'! Lese den Cache-Status zurück
'!
'! INT 2F, Funktion AX=4A10H BX = 0003H, BP = Drive
'! DL = Subfunktion (0 = Get Info)
'!---------------------------------------------------------
'!
REG 1, &H4A10 '! AX=4A10H get Status
REG 2, &H0003 '! BX = 3
REG 7, drive% '! Laufwerk (0 = A)
REG 4, 0 '! Get Info
CALL INTERRUPT &H2F '! Multiplexer INT
Errx% = 1
IF (REG(1) = &HBABE) THEN '! Aufruf ok?
Errx% = 0 '! Fehlerflag löschen
mode% = Reg(4) AND &HFF
END IF
END SUB
SUB SetCacheDrive (errx%, mode%, drive%)
'!---------------------------------------------------------
'! Setze den Cache-Mode des Laufwerks
'!
'! INT 2F, Funktion AX=4A10H BX = 0003H, BP = Drive
'! DL = Subfunktion (1-4)
'!---------------------------------------------------------
'!
REG 1, &H4A10 '! AX=4A10H set mode
REG 2, &H0003 '! BX = 3
REG 7, drive% '! Laufwerk (0 = A)
REG 4, mode% '! Mode setzen
CALL INTERRUPT &H2F '! Multiplexer INT
Errx% = 1
IF (REG(1) = &HBABE) THEN '! Aufruf ok?
Errx% = 0 '! Fehlerflag löschen
mode% = Reg(4) AND &HFF
END IF
END SUB
SUB GetCacheSize (DOSBlock&,CacheBlock&,BlockSize&,WINBlock&)
'!---------------------------------------------------------
'! Lese den Cache-Status zurück
'!
'! INT 2F, Funktion AX=4A10H BX = 0004H, BP = Drive
'! DL = Subfunktion (0 = Get Info)
'!---------------------------------------------------------
'!
REG 1, &H4A10 '! AX=4A10H Get Size
REG 2, &H0004 '! BX = 4
CALL INTERRUPT &H2F '! Multiplexer INT
DOSBlock& = Reg(1) '! Parameter
CacheBlock& = Reg(2)
BlockSIze& = Reg(3)
WINBlock = Reg(4)
END SUB
'***** Programm Ende ******