Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: elfish_rider am 24. November 2004, 20:13
-
Ich habe das FAT12 Tut von TeeJay gelesen. Es ist viel verständlicher als das Englische von Microsoft.
Nun ist das ganze doch etwas kompliziert... Angenommen, ein Datei namens TEST würde in einen Sektor passen, wäre also kleiner als 512 Bytes.
Stimmt dann das folgende Vorgehen:
1. Bootsektor einlesen
2. RsvdSecCnt, NumFATs und FATSize einlesen
3. Root-Directory einlesen
4.
xxxxh:0000h mit TEST vergleichen
xxxxh:0020h mit TEST vergleichen
xxxxh:0040h usw. bis es übereinstimmt, dann dort Offset 26d einlesen und dort liegt die Datei???
-
So sollte es gehen :)
Zur sicherheit das die die Datei kleiner als 512 Byte ist, solltest du aber in der FAT-Tabelle nachschauen ob die Datei wirklich nur den einen Sektor (Cluster) belegt.
-
wenn die datei dann nur 120 byte gross ist, dann solltest du auch nur 120 byte einlesen und nicht den ganzen sektor ;) (sollte wahrscheindlich klar sein)
-
wenn die datei dann nur 120 byte gross ist, dann solltest du auch nur 120 byte einlesen und nicht den ganzen sektor ;) (sollte wahrscheindlich klar sein)
ich weiß nicht, ob das ironie sein sollte, aber: man kann nur sektorweise einlesen!
-
Da hat er recht.
Von der Hardware ist das schon so gemacht, das die kleinste Einheit die gelesen werden kann ein Sektor ist.
Heisst also das du auf jeden Fall Platz für mindestens einen ganzen Sektor (512) Bytes im Speicher haben musst.
-
PUSH ES
MOV AX, 020Eh
MOV CX, 0102h
XOR DX, DX
MOV BX, 0400h
MOV ES, BX
XOR BX, BX
INT 13h
POP AX
JC .floppy_error
PUSH ES
; Root-Directory nach Datei 'TEST' absuchen ;
MOV CX, 224
MOV BX, 0000h
.search:
CMP [ES:BX], BYTE 'T'
JNE .search_next
CMP [ES:BX+1], BYTE 'E'
JNE .search_next
CMP [ES:BX+2], BYTE 'S'
JNE .search_next
CMP [ES:BX+3], BYTE 'T'
JNE .search_next
; Wenn es übereinstimmt, Datei laden (zuerst Adresse bei Offset 26 herausfinden, dann Sektor in Speicher laden und springen) ;
MOV AX, 0007h
MOV BX, [ES:BX+26]
ADD BX, 33
MOV SI, head_cylinder_sector
INT 20h
MOV AX, 0201h
MOV CH, BYTE [head_cylinder_sector+1]
MOV CL, BYTE [head_cylinder_sector]
MOV DH, BYTE [head_cylinder_sector+2]
XOR DL, DL
MOV BX, 0400h
MOV ES, BX
XOR BX, BX
INT 13h
POP AX
JC .floppy_error
; Zum Programm springen ;
JMP 0400h:0000h
.search_next:
ADD BX, 0020h
LOOP .search
JMP .start
.floppy_error:
MOV AX, 0005h
INT 20h
JMP .start
Wieso funktioniert dieser Code nicht? Der PC bleibt eifach hängen. Es ist eine vereinfachte Version.
-
Ein paar mehr kommentare im Code wären recht hilfreich deinen Fehler zu finden.
Sorry aber mir macht es jetzt zu viel arbeit mich da komplett reinzudenken nur um erstmal rauszufinden was du da im einzelnen machst.
Mach bitte ein paar mehr Kommentare rein und dann schau ich es mir gerne nochmal an.
mfg
TJ
-
sorry ich meinte damit das er nur 120byte davon verwenden sollte am schluss... :(
-
PUSH ES
MOV AX, 020Eh ; Daten für BIOS-Int 13h eingeben um Root-Dir einzulesen
MOV CX, 0102h ; 14 Sektoren von Head0, Cylinder1, Sektor 2 an
XOR DX, DX
MOV BX, 0400h
MOV ES, BX
XOR BX, BX
INT 13h
POP AX
JC .floppy_error ; bei Fehler dorthin springen und Nachricht ausgeben
PUSH ES
; Root-Directory nach Datei 'TEST' absuchen ;
MOV CX, 224 ; Dort wo Root-Dir eingelesen worden ist, alle 32 Bytes nach Dateiname TEST suchen
MOV BX, 0000h
.search:
CMP [ES:BX], BYTE 'T'
JNE .search_next
CMP [ES:BX+1], BYTE 'E'
JNE .search_next
CMP [ES:BX+2], BYTE 'S'
JNE .search_next
CMP [ES:BX+3], BYTE 'T'
JNE .search_next ; Wenn es nicht überinstimmt nach search_next springen, um bei nächstem Eintrag nachzuschauen
; Wenn es übereinstimmt, Datei laden (zuerst Adresse bei Offset 26 herausfinden, wo Datei ist, dann Sektor in Speicher laden und springen) ;
MOV AX, 0007h
MOV BX, [ES:BX+26]
ADD BX, 33
MOV SI, head_cylinder_sector
INT 20h ; OS-Interrupt zur Umrechnung von LSN in HCS
MOV AX, 0201h
MOV CH, BYTE [head_cylinder_sector+1]
MOV CL, BYTE [head_cylinder_sector]
MOV DH, BYTE [head_cylinder_sector+2]
XOR DL, DL
MOV BX, 0400h
MOV ES, BX
XOR BX, BX
INT 13h
POP AX
JC .floppy_error
; Zum Programm springen ;
JMP 0400h:0000h
.search_next:
ADD BX, 0020h ; 32 B addieren, um zum nächsten Eintrag zu gelangen
LOOP .search
JMP .start
.floppy_error:
MOV AX, 0005h ; Bei Floppy-Fehler OS-Interrupt mit Fehlerbehandlung aufrufen
INT 20h
JMP .start
-
Noch eine ganz grundlegende Frage zu der LSN-Nummer: LSN 0 ist ja bekanntlich Head 0 Cylinder 0 Sector 1, ist dann LSN 18 Head 0 Cylinder 1 Sector 1 oder Head 1 Cylinder 0 Sector 1? (Wollte nur keinen neuen Thread wegen dieser dämlichen Anfängerfrage öffnen)
-
also rawwrite benutzt die methode, immer zuerst alle sectoren, dann alle sectoren auf dem anderen head, dann die nächste sput auf dem 1. head und dann die nächste spur auf dem 2. head. ich hab mich dem angepasst.
-
Laut dem FAT12 Tut liegt die LSN des Startsektors der Datei im RootDir-Offset 26 (2 Bytes). Nun bin ich nicht sicher, ob dies genau stimmt. Welche Bytes oder welches Byte muss ich nun genau einlesen, damit ich die LSN der Datei erhalte?