home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Tool Box
/
SIMS_2.iso
/
bp_3_94
/
power
/
sysinfo.bas
< prev
Wrap
BASIC Source File
|
1994-05-10
|
15KB
|
441 lines
'*********************************************************
'! File : SYSINFO.BAS
'! Vers. : 1.0
'! Last Edit : 10.5.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:
'!
'! SYSINFO
'!
'! aufgerufen. Es ermittelt die Konfiguration
'! des PC's und gibt das Ergebnis auf dem
'! Bildschirm aus. Dabei wird der Umgang mit
'! den systemnahen Schnittstellen gezeigt.
'**********************************************************
'! Variable definieren
frei& = 0 '! freier Speicher
start& = 0 '! Startadresse
'#########################################################
'# Hauptprogramm #
'#########################################################
ON ERROR GOTO fehler
PRINT
PRINT "S y s t e m I N F O (c) Born Version 1.0"
PRINT
CALL bios '! Bios Copyright
CALL dosvers '! DOS Versionsnummer
CALL memory '! Speicherbelegung
CALL progadr '! Adr. Userprogramme
CALL freemem '! freier Speicher
PRINT "Weiter bitte eine Taste betätigen"
DO WHILE INKEY$ = "": WEND
CALL config '! Systemkonfigurierung
PRINT
PRINT "Ende System Info"
END '! Ende
'#########################################################
'# Hilfsroutinen #
'#########################################################
fehler:
'---------------------------------------------------------
'! Fehlerbehandlung in HWINFO
'---------------------------------------------------------
PRINT "Fehler : ";ERR;" unbekannt"
PRINT "Programmabbruch"
END '! MSDOS Exit
SUB bios
'!---------------------------------------------------------
'! lese Bios Signatur
'!---------------------------------------------------------
LOCAL i%
DEF SEG = &HF800 '! Segm. Bios ROM
PRINT
PRINT "Bios Version ";
FOR i% = 3 TO 50
PRINT CHR$(PEEK (i%));
NEXT i%
PRINT
END SUB
SUB dosvers
'!---------------------------------------------------------
'! Abfrage der DOS-Versionsnummer:
'! 1. per INT 21, Funktion AH=30H (SETVER Version ab DOS 5)
'! 2. per INT 21, Funktion AX3306H (True Version)
'!---------------------------------------------------------
'!
LOCAL AH%, AL%, BH%, BL%, AX%, DL%
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Erste Anfrage bezüglich der Systemversion
'! Ermittle zuerst die DOS Version über die INT 21 Funkt. 30
'! CALL: AH = 30 RETURN: AL = Untervers. AH = Hauptvers.
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
REG 1, &H3000 '! AX = 3000 -> read
'! Version
CALL INTERRUPT &H21 '! Dispatcher INT
AH% = (REG (1) / 256) AND &HFF '! lese Wert in AH
AL% = REG (1) AND &HFF '! lese Wert in AL
PRINT
IF AL% = 0 THEN '! AL = leer ?
PRINT "MS-DOS Version 1.x"
ELSE
PRINT "MS-DOS Version "; '! Versionsnummer
PRINT USING "##&"; AL%; "."; '! AL = Hauptversion
PRINT USING "##"; AH%; '! AH = Unterversion
PRINT " gemeldet"
END IF
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Trau keinem DOS über 4.01, Prüfung über INT 21
'! CALL: AX = 3306H RETURN: BX=Version, DX: Flag
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
REG 1, &H3306 '! AX = 3306 -> read
'! True Version
CALL INTERRUPT &H21 '! Dispatcher INT
AL% = REG (1) AND &HFF '! Fehlerstatus
IF AL% <> &HFF THEN '! Aufruf ok
BH% = (REG (2) / 256) AND &HFF '! lese Unterversion
BL% = REG (2) AND &HFF '! lese Hauptversion
PRINT
PRINT "MS-DOS Version "; '! Versionsnummer
PRINT USING "##&"; BL%; "."; '! BL = Hauptversion
PRINT USING "##"; BH%; '! BH = Unterversion
PRINT " (true Version)"
AX% = (REG(4) AND &H1000)
IF AX% <> 0 THEN
PRINT "DOS ist im HMA geladen"
ELSE
PRINT "DOS ist im konventionellen Speicher geladen"
END IF
END IF
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Ermittle Bootlaufwerk ab DOS 5.0,
'! Prüfung über INT 21, AX=3305H
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
REG 1, &H3305 '! AX = 3305 -> read
'! Boot Drive
CALL INTERRUPT &H21 '! Dispatcher INT
AL% = REG (1) AND &HFF '! Fehlerstatus
IF AL% <> &HFF THEN '! Aufruf ok
PRINT "Boot Drive ";
DL% = REG(4) AND &HFF '! DL lesen
PRINT CHR$(&H40+DL%)+":" '! A:= 1
END IF
END SUB
SUB memory
'!---------------------------------------------------------
'! ermittle die RAM und ROM Speichergröße
'!---------------------------------------------------------
LOCAL i&
PRINT
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! ermittle die RAM Größe über den BIOS INT 12
'! Ergebnis in AX in Kbyte
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
CALL INTERRUPT &H12 '! BIOS: GET RAM SIZE
PRINT "RAM from 0000:0000 len ";
PRINT REG (1);" Kbytes" '! AX = Größe
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Prüfe die Lage des Bildschirmadadapters auf Segment
'! A000H, B000H, B800H
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
DEF SEG = &HA000 '! setze Segment
IF (PEEK(0) <> &HFF) AND _ '! Bildschirm RAM ?
(PEEK(1) <> &HFF) THEN
PRINT "RAM from A000:0000" '! Segmentadr.
END IF
DEF SEG = &HB000 '! setze Segment
IF (PEEK(0) <> &HFF) AND _ '! Bildschirm RAM ?
(PEEK(1) <> &HFF) THEN
PRINT "RAM from B000:0000" '! Segmentadr.
END IF
DEF SEG = &HB800 '! setze Segment
IF (PEEK(0) <> &HFF) AND _ '! Bildschirm RAM ?
(PEEK(1) <> &HFF) THEN
PRINT "RAM from B800:0000" '! Segmentadr.
END IF
'!
'! Prüfe ab C000:0 in 32 Kbyte Schritten auf ROM's
'!
FOR i& = &HC000 TO &HFFFF STEP &H800 '! teste ROM
DEF SEG = i& '! setze Segment
IF (PEEK(0) = &H55) AND _ '! ROM Signatur ?
(PEEK(1) = &HAA) THEN
PRINT "ROM from "; HEX$(i&);":0000";'! Segmentadr.
PRINT " len "; PEEK(2); '! Kbytes
PRINT " Kbyte"
ELSEIF (PEEK(0) <> &HFF) AND _ '! ROM Signatur ?
(PEEK(1) <> &HFF) THEN
PRINT "ROM from "; HEX$(i&);":0000" '! Segmentadr.
END IF
NEXT i&
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Ermittle of HMA frei ist (erst ab DOS 5)
'! INT 2F, AX=4A01H, Ret. BX: freier HMA,
'! ES:DI=Adr. HMA (FFFF:FFFF = keine HMA)
'! AX = 0 -> HMA unbenutzt
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
REG 1, &H4A01 '! Get Ext. Memory Size
CALL INTERRUPT &H2F '! GET HMA SIZE
IF (REG (9) <> &HFFFF) OR (REG (6) <> &HFFFF) THEN '! HMA ?
IF REG(1) = 0 THEN
PRINT "HMA unbenutzt"
ELSE
PRINT "HMA frei: ";
PRINT REG (1);" Byte" '! AX = Größe
END IF
END IF
END SUB
SUB freemem
'!---------------------------------------------------------
'! ermittle den freien Speicher
'!---------------------------------------------------------
SHARED start&
LOCAL frei&, ram&
CALL INTERRUPT &H12 '! BIOS: GET RAM SIZE
ram& = REG(1) '! RAM Größe
ram& = ram& * &H3FF
frei& = ram& - (start& * 16) '! berechne. freie Größe
PRINT
PRINT "MS-DOS Free Memory : ";
PRINT frei&;" Kbyte" '! freier Speicher
PRINT "MS-DOS Used Memory : ";
PRINT start& * 16;" Kbyte" '! belegter Speicher
END SUB
SUB progadr
'!---------------------------------------------------------
'! Ermittle die Anfangsadresse des Anwenderprogrammes
'! über die undokumentierte Funktion 51H des INT 21.
'! Diese gibt im Register BX die Segmentadresse des
'! aktuellen PSP an. Dies ist gleichzeitig die Start-
'! adresse der Anwenderprogramme.
'!---------------------------------------------------------
LOCAL res$
SHARED start&
REG 1, &H5100 '! AX = 5100 -> read
'! PSP Segm. Adr
CALL INTERRUPT &H21 '! Dispatcher INT
IF (REG (0) AND &H01) > 0 THEN '! Fehler ?
PRINT "Fehler beim Systemaufruf "; REG (1) '! AX = Fehlercode
ELSE
PRINT "User Progr. Adresse : ";
start& = REG(2) '! merke Adresse
res$ = HEX$(REG(2)) '! Segm. Adr in BX
res$ = STRING$(4-LEN(res$),"0") + res$ '! führende Nullen
PRINT res$;":0000"
END IF
END SUB
SUB config
'!---------------------------------------------------------
'! lese die Konfiguration der Hardware über den INT 11
'!---------------------------------------------------------
LOCAL ax%, drive%, bytes&, frei&, disp%, i% , tmp%, dblsp%
DIM a%(2) '! Hilfsvariable für MOVE
CALL INTERRUPT &H11 '! Lese Konfiguration
ax% = REG(1) '! Wert in ax%
PRINT
IF (ax% AND 1) = 0 THEN '! Floppys ?
PRINT "keine Diskettenlaufwerke gefunden "
ELSE
drive% = (ax% AND &HC0) / 64 '! Floppys -> b14, b15
PRINT "Floppy-Disks"; SPACE$(8);
FOR i% = 0 TO drive% '! n Drives
PRINT CHR$(&H41 + i%);": "; '! Kennbuchstabe A: .. F:
NEXT i%
END IF
PRINT
PRINT
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! ist eine Festplatte im System integriert ?
'! Platten befinden sich oberhalb der Floppys (C:, D:, etc.).
'! Prüfe per INT 21, Funktion 1CH ob Platten vorhanden sind.
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
IF drive% < 2 THEN '! weniger als 1 Floppy?
drive% = 3 '! Platte ab c:
ELSE
INCR drive% '! oberhalb Floppy
END IF
FOR i% = drive% to drive% + 2 '! max. 3 Disks
REG 1, &H3600 '! Funktion 3600
REG 4, i% AND &HFF '! Laufwerkscode
CALL INTERRUPT &H21 '! INT 21
IF (REG(1) AND &HFF) <> &HFF THEN '! Platte gefunden ?
PRINT "Disk "; SPACE$(15); CHR$(&H40+i%);": ";
tmp% = REG(4) '! Cluster
'!
'! Achtung: wegen I*2 ist eine Typkonvertierung erforderlich !!!!
'!
a%(1) = VARPTR(tmp%) '! Adr. Variable übergeben!!!
a%(2) = VARSEG(tmp%)
clust& = 1
CALL MOVE (2,clust&,a%(1))
bytes& = clust& * REG(3) * REG(1)
PRINT bytes&; '! Speichergröße
PRINT " Bytes"
PRINT "Sektoren pro Cluster : "; REG(1)
PRINT "Bytes pro Sektor : "; REG(3)
PRINT "Bytes pro Cluster : "; REG(1)*REG(3)
PRINT "Cluster : "; clust&
tmp% = REG(2) '! freie Cluster
'!
'! Achtung: wegen I*2 ist eine Typkonvertierung erforderlich !!!!
'!
a%(1) = VARPTR(tmp%) '! Adr. Variable übergeben!!!
a%(2) = VARSEG(tmp%)
fclust& = 0
CALL MOVE (2,fclust&,a%(1))
frei& = fclust& * REG(3) * REG(1)
PRINT "Freie Kapazität : "; frei&; '! in Bytes
PRINT USING "Bytes (##.#";(frei& * 100.0 / bytes&);
PRINT " %)" '! in %
END IF
NEXT i% '! nächstes Laufwerk
PRINT "Weiter bitte eine Taste betätigen"
DO WHILE INKEY$ = "": WEND
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! prüfe ob DBLSpace installiert ist
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
REG 1, &H4A11 '! Funktion AX:=4A11
REG 2, 0 '! BX := 0 Install check
CALL INTERRUPT &H2F '! INT 2F
IF (REG(1) = 0) THEN '! DBLSpace gefunden ?
IF REG(2) = &H444D THEN '! Signatur DM
PRINT
PRINT "DBLSpace installiert"
'!
'! CL sollte 1. Laufwerk enthalten, funktioniert aber nicht
'! PRINT "1. DBLSpace Laufwerk "; CHR$(&H41+(REG(3) AND &HFF))
'!
dblsp% = (REG(3) / 256) AND &HFF
PRINT "DBLSpace Laufwerke "; dblsp%
PRINT
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Ermittle Zuordnung der Hostlaufwerke
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
FOR i% = drive% to drive%+dblsp%-1 '! max. 3 Disks
REG 1, &H4A11 '! Funktion AX:=4A11
REG 2, 1 '! BX := 1 Get Drive Mapping
REG 4, i%-1 '! Drive Nummer
CALL INTERRUPT &H2F '! INT 2F
IF (REG(1) = 0) THEN '! DBLSpace gefunden ?
tmp% = REG(2) AND &H7F
PRINT "DBLSpace-Laufwerk "; CHR$(&H40+i%); ": = Host: "; CHR$(&H41+tmp%)
END IF
NEXT I%
END IF
END IF
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Anzeige weiterer Informationen aus dem BIOS Aufruf
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
PRINT
disp% = (ax% AND &H30) / 16 '! Bildschirmadapter
SELECT CASE disp%
CASE 0
PRINT "Illegal Display Mode"
CASE 1
PRINT "Colorcard 40 x 25 Monochrom"
CASE 2
PRINT "Colorcard 80 x 25 Monochrom"
CASE 3
PRINT "Monochromcard 80 x 25"
END SELECT
PRINT
PRINT "Serial Interfaces : "; (ax% AND &H0E00) / 512
tmp& = (ax% AND &HC000) / &HFF / &H2F
PRINT "Parallel Interfaces : "; tmp&
END SUB
SUB MOVE (BYVAL xlen%, dest&, source%)
'!
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'! Verschiebe n Bytes, Aufruf mit:
'! CALL MOVE (Len, Ziel, Quelle)
'!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'!
$INCLUDE "MOVE.INC"
END SUB
'***** Programm Ende ******