Autor Thema: FAT12  (Gelesen 7731 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« 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???

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 24. November 2004, 22:51 »
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.
----------------------
Redakteur bei LowLevel

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #2 am: 25. November 2004, 13:49 »
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)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 25. November 2004, 14:21 »
Zitat von: zacK
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!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 25. November 2004, 17:11 »
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.
----------------------
Redakteur bei LowLevel

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. November 2004, 17:31 »
 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.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #6 am: 25. November 2004, 19:50 »
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
----------------------
Redakteur bei LowLevel

zacK

  • Beiträge: 216
    • Profil anzeigen
    • http://www.domae.ch
Gespeichert
« Antwort #7 am: 25. November 2004, 21:30 »
sorry ich meinte damit das er nur 120byte davon verwenden sollte am schluss...  :(

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 26. November 2004, 18:47 »
 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

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 28. November 2004, 17:03 »
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)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #10 am: 28. November 2004, 17:36 »
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.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 02. December 2004, 22:02 »
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?

 

Einloggen