Also ich hab mir nun einen Code einfallen lassen, der überprüft, ob das laufwerk FAT formatiert ist und wenn ja dann wie.
Schreibt mir was s dann übern code zu meckern gibt.
CheckFS: ; Die Funktion um das FS zu überprüfen
; Parameter: DL = Laufwerk
call ReadBootSector ; lese den BootSector
cmp [BootSector + 54], âFâ ; Ist 1. Buchstabe vom Eintrag FileSysType ein âFâ ?
jne Ende ; wenn nein, dann kein FAT
cmp [BootSector + 55], âAâ ; Ist 2. Buchstabe vom Eintrag FileSysType ein âAâ ?
jne Ende ; wenn nein, dann kein FAT
cmp [BootSector + 56], âTâ ; Ist 3. Buchstabe vom Eintrag FileSysType ein âTâ ?
jne Ende ; wenn nein, dann kein FAT
call FAT ; welches FAT ?
Ende:
ret
ReadBootSector: ; Funktion um den Boot Sektor zu laden
; Parameter: DL = Laufwerk (übernommen aus CheckFS)
mov AH, 02h ; Funktionsnummer: 02h
mov AL, 1 ; lese einen Sektor
xor CH, CH ; Cylinder = 0
mov CL, 1 ; Sektor = 1
xor DH, DH ; Head = 0
mov BX, Offset BootSector ; Adesse des Puffers nach BX
Int 13h ; lese nun den BootSector!!!!
ret
FAT: ; Funktion um FAT12 + FAT16 zu erkennen
mov CX, [BootSector + 19] ; TotSec nach AX
sub CX, [BootSector + 14] ; TotSec - ResvdSecCnt
xor DX, DX ; DX = 0 (wichtig für Word Multiplikation)
xor AH, AH ; AH = 0 (wichtig für Word Multiplikation)
mov AL, [BootSector + 16] ; AL = NumFATs => AX = NumFATs
mul word ptr [BootSector + 22] ; NumFATs * FATSize
sub CX, AX ; (TotSec â ResvdSecCnt) â (NumFATs* FATSize)
xor DX, DX ; DX = 0 (wichtig für Word Multiplikation)
mov AX, [BootSector + 17] ; RootEntCnt nach AX
mul word ptr 32 ; RootEntCnt * 32
xor DX, DX ; DX = 0 (wichtig für Word Division)
div 512 ; (RootEntCnt) / 512 = RootDirSectors
sub CX, AX ; TotSec â ResvdSecCnt â NumFATs* FATSize - RootDirSectors
ret
AssignClusterToFAT: ; Funktion, welche den Laufwerken die FAT Version zuweist
; Parameter: CX = Cluster
cmp CX, 4085d ; FAT12 ?
jnl FAT16 ; wenn nein, dann springe zur FAT16 Überprüfung
; [...] Some Code
jmp End
FAT16:
cmp CX, 65525d ; FAT16 ?
jnl FAT32 ; wenn nein, dann ist es FAT32
; [...] Some Code
jmp End
FAT32
; [â¦] Some Code
End:
ret
BootSector db 512 dup (0)
Im Code hab ich mehr auf verständlichkeit wert gelegt, als auf Performace
*hinweis*