'**************************************************************************** ' ' installierte Laufwerke finden und Testen fr PowerBASIC 3.2 ' ' entwickelt von / developed by : Thomas Gohel ' Fido : Thomas Gohel@2:2410/330.1 ' InterNet: author@pbsound.snafu.de ' Homepage: http://www.snafu.de/~pbsound/ ' '**************************************************************************** DIM Drives(25) AS SHARED STRING DIM DriveTyp(25) AS SHARED STRING SHARED DriveMax% pbvUsingChrs = "*$.." CLS DriveAnzahl FOR i% = 1 TO DriveMax% PRINT "> "; DriveTyp$(i%); "<" NEXT i% '**************************************************************************** ' Laufwerke ermitteln & wechseln '**************************************************************************** SUB DriveAnzahl public LOCAL AnzahlFreierCluster?? Bugg$ = "Laufwerke ermitteln" FloppyFound% = 0 ' 1 = mehr als 1 Floppy gefunden FloppyAnzahl% = 0 ' Wert 0 fr 1 Floppy ' Wert 1 fr 2 Floppy DriveMax% = 0 ' erstmal definieren da zum Start ' keine Laufwerke vorhanden sind '*** Diskettenlaufwerke ber BIOS ermitteln *** ! int &h11 ! push ax ! test ax, &b0000000000000001 ; Testen ob wenigstens eine ' Floppy instaliert ist. Aller- ' dings meldet MS-DOS hier immer ' eine Floppy, auch wenn das ' Laufwerk per BIOS abgemeldet ' wurde! ! jz KeineFloppyGefunden FloppyFound% = 1 KeineFloppyGefunden: ! pop ax ! test ax, &b0000000001000000 ; Testen ob 1 oder 2 Laufwerke ' vorhanden sind um die DOSD- ' Meldung zu unterdrcken! ! jz Zweifloppies FloppyAnzahl% = 1 ZweiFloppies: ' *** Auslesen des Diskettenkonfigurations-Bytes *** IF FloppyFound% = 1 THEN FOR i% = 0 TO FloppyAnzahl% ! mov ah, &h08 ! mov dl, i% ! int &h13 ! mov DiskOk%, ah ! mov DiskBit%, bl IF DiskOk% = 0 THEN DriveMax% = DriveMax% + 1 Drives$(i% + 1) = CHR$(64 + DriveMax%) SELECT CASE DiskBit% CASE 1: DriveTyp$(i% + 1) = "5¬-Disk mit 360 KByte " CASE 2: DriveTyp$(i% + 1) = "5¬-Disk mit 1,2 MByte " CASE 3: DriveTyp$(i% + 1) = "3«-Disk mit 720 KByte " CASE 4: DriveTyp$(i% + 1) = "3«-Disk mit 1,44 MByte " CASE 5: DriveTyp$(i% + 1) = "3«-Disk mit 2,88 MByte " CASE 6: DriveTyp$(i% + 1) = "3«-Disk mit 2,88 MByte " CASE ELSE DriveTyp$(i% + 1) = "nicht definiertes Konfigurationsbyte! " END SELECT END IF NEXT i% END IF '*** alle restlichen Festplatten-/Netz- & sonstige Laufwerke ermitteln *** FOR i% = 3 TO 26 ! mov ah, &h36 ; Die Routine wird erst zweimal ! mov dl, i% ; sinnlos aufgerufen um Netzlauf- ! int &h21 ; werken bei Ihrem Erstaufruf nach ! mov ah, &h36 ; dem Booten zu aktivieren. DOS ! mov dl, i% ; legt erst bei diesem Aufruf den ! int &h21 ; ben”tigten DPB an!!! ! mov ah, &h36 ! mov dl, i% ! int &h21 ! mov SektorenPerCluster??, ax ! mov AnzahlFreierCluster??, bx ! mov AnzahlBytesProSektor??, cx ! mov GesamtCluster??, dx IF SektorenPerCluster?? <> 65535 THEN DriveMax% = DriveMax% + 1 Drives$(DriveMax%) = CHR$(64 + i%) DiskFree??? = SektorenPerCluster?? * AnzahlBytesProSektor?? * GesamtCluster?? DiskArt$ = "Festplatte mit " '*** Media-Descriptor-Check ber DPB *** ! push ds ! mov ah, &h32 ! mov dl, i% ! int &h21 ! mov ax, ds ; DS retten und wieder ! pop ds ; auf den Variablen- ' bereich setzen ! jc Device_Remote_Test ! mov es, ax ! mov ah, byte ptr es:[bx+&h16] ! mov Media_Descriptor%, ah IF Media_Descriptor% = &HCE THEN DiskArt$ = "RAM-Disk mit " END IF Device_Remote_Test: IF Media_Descriptor% <> &HCE THEN '*** jetzt erfolgt ein Device-Remote-Test *** ! mov ax, &h4409 ! mov bl, i% ! int &h21 ! mov DriveKennung%, dx IF BIT(DriveKennung%,1) = 1 THEN DiskArt$ = "Festplatte mit " IF BIT(DriveKennung%,12) = 1 THEN DiskArt$ = "Netzlaufwerk " IF BIT(DriveKennung%,15) = 1 THEN DiskArt$ = "SUBST-Laufwerk " ' *** noch schnell ein Test ob es ein CD-ROM ist *** ! mov ax, &h150B ; CD-ROM Laufwerk abfragen ! mov cx, i% ; Laufwerksvariable ! dec cx ; und eins runter ! mov bx, 0 ; BX definieren ! int &h2F ! cmp bx, &hADAD ; Gegentest ob MSCDEX ! jnz KeinCDRom ; installiert ist ! cmp ax, 0 ; <> 0 = CD-ROM gefunden ! jz KeinCDRom DiskArt$ = "CD-Rom Disk mit " KeinCDRom: Media_Descriptor% = 0 ' Descriptor l”schen END IF ' *** und endlich in die Liste eintragen *** DriveTyp$(DriveMax%) = DiskArt$ + USING$("###,###,###,###", DiskFree???) + " Byte " END IF NEXT i% END SUB