Autor Thema: diskette mit fat12 formatieren  (Gelesen 7253 mal)

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« am: 12. February 2006, 12:05 »
hi, wenn ich eine diskette mit fat12 formatieren will, muss ich doch einfach nur  den bootsektor neu schreiben und dann 18 sektoren lang nullen schreiben, oder?
das hab ich zumindest dann mal probiert mit folgendem code (die werte fpr den bootsektor habe ich aus dem FAT12-tutorial, das auf der lowlevel-tutorials-seite verlinkt ist):


format_start dw 0          ; diskettenformatierung
db 0          ; JmpBoot
db "noreos  " ; OSName
dw 0xFF       ; BystesPerSec
db 1          ; SecPerClus
dw 1          ; RsvdSecCnt
db 2          ; NumFATs
dw 224        ; RootEntCnt
dw 2880       ; TotSec
db 0xF0       ; MediaType
dw 9          ; FATSize
dw 18         ; SecPerTrack
dw 2          ; NumHeads
dd 0          ; HiddenSec
dd 0          ; TotSec32
db 0          ; DrvNum
db 0          ; Reserved
db 0x29       ; BootSig
dd 0          ; VolumeID
times 11 db 20h ; VlumeLabel
db "FAT12"
times 3 db 20h  ; FileSysType
times 448 db 0  ; Dateilänge: 512 Bytes
dw 0AA55h       ; Bootsignatur
times 9216 db 0 ;

...

 diskreset:
 mov dl, 0             ; Erstes Diskettenlaufwerk
 mov ah, 0             ; Laufwerk zurücksetzen
 int 13h               ; int
 jc diskreset          ; fehler? nochmal
 diskformat:
 mov cx, 0             ; Cylinder=0 Sektor=0
 mov dx, 0             ; erstes diskettenlaufwerk, Head=0
 mov ax, ds            
 mov es, ax            ; segment
 mov bx, format_start  ; offset
 mov ah, 3             ; sektoren schreiben
 mov al, 19            ; 19 stück
 int 13h               ; int
 jc diskformat         ; fehler? nochmal


wenn ich das ausprobiere, macht an dieser stelle das betriebssystem einfach nichts mehr. hab das problem schon ein paar wochen und echt keine ahnung, was ich falsch mache.
wie ihr seht, bin ich seit dem letzten mal nicht viel weitergekommen.
deshalb wäre ich über hilfe sehr froh.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 12. February 2006, 12:11 »
Wo springst du zu diskreset?
In the Future everyone will need OS-64!!!

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. February 2006, 12:45 »
irgendwo da, wo die drei punkte sind. ;)  ich hab nur nen kleinen teil des ganzen codes gepostet, bin mir aber sicher, dass er bis diskreset kommt, weil der befehl in der zeile davor (ausgabe eines strings) noch ausgeführt wird.
wenn du möchtest, kann ich nochmal den ganzen kernel posten, aber ich denke, das ist nicht nötig.

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 12. February 2006, 13:46 »
Also einige BIOS' können nicht über Trackgrenzen hinweg schreiben und 19 Sektoren wären dann eben genau einer zuviel.
Madness isn't a bug - it's a feature

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. February 2006, 15:18 »
thx, werde versuchen, das irgendwie anders zu machen.

EDIT:
noch ne frage: ich muss doch dann achtzehn sektoren dahin schreiben und dann den letzten nur auf head 1, oder?

und noch eine weitere frage: gibt es das gleiche problem auch beim lesen von mehr als einem track?


EDIT2:
mit folgendem code klappts auch nicht:

diskreset:
 mov dl, 0             ; Erstes Diskettenlaufwerk
 mov ah, 0             ; Laufwerk zurücksetzen
 int 13h               ; int
 jc diskreset          ; fehler? nochmal
 diskformat1:
 mov cx, 0             ; Cylinder=0 Sektor=0
 mov dx, 0             ; erstes diskettenlaufwerk, Head=0
 mov ax, ds            
 mov es, ax            ; segment
 mov bx, format_start  ; offset
 mov ah, 3             ; sektoren schreiben
 mov al, 18            ; 18 stück
 int 13h               ; int
 jc diskformat1         ; fehler? nochmal
 diskformat2:
 inc dh                ; head=1 (sektor und cylinder immer noch 0)
 add bx, 9216          ; ...9216 byte weiter
 mov al, 1             ; einer noch
 int 13h
 jc diskformat2

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 13. February 2006, 07:40 »
Stehn die folgenden Sachen eigentlich ganz oben?

format_start dw 0          ; diskettenformatierung
db 0          ; JmpBoot
db "noreos  " ; OSName
dw 0xFF       ; BystesPerSec
db 1          ; SecPerClus
dw 1          ; RsvdSecCnt
db 2          ; NumFATs
dw 224        ; RootEntCnt
dw 2880       ; TotSec
db 0xF0       ; MediaType
dw 9          ; FATSize
dw 18         ; SecPerTrack
dw 2          ; NumHeads
dd 0          ; HiddenSec
dd 0          ; TotSec32
db 0          ; DrvNum
db 0          ; Reserved
db 0x29       ; BootSig
dd 0          ; VolumeID
times 11 db 20h ; VlumeLabel
db "FAT12"
times 3 db 20h  ; FileSysType
times 448 db 0  ; Dateilänge: 512 Bytes
dw 0AA55h       ; Bootsignatur
times 9216 db 0 ;


Dann werden sie ja als Code ausgeführt. Du musst sie mit jump überspringen. Ich verstehe sowieso nicht genau warum das dann FAT vormatiert sein soll. Die erstem drei Bytes im FAT müssen ja ein jmp sein.

bitmaster
In the Future everyone will need OS-64!!!

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. February 2006, 14:44 »
nein, das steht nicht ganz oben, es steht irgendwo mittendrin und wird auch mit jmp übersprungen. da bin ich hundertprozentig sicher, weil direkt vor "diskreset:" ein string ausgegeben werden soll und dies auch passiert.

das mit den ersten drei bytes hab ich wohl irgendwie nicht mitgekriegt, sry. aber das ist auch nicht der hauptfehler, da auf der diskette nachher noch immer das gleiche ist, wie vorher und an dieser stelle ja auch das ganze nicht mehr reagiert, d.h. ich den pc per reset-knopf neu starten muss.

btw: was muss denn in die ersten drei bytes?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. February 2006, 15:00 »
Die ersten 3 Bytes sind die hier:

0xEB 0x3C 0x90

Das ist der Opcode für einen Short-Jump, und ein NOP.

Zu deinem eigengtlichen Problem: Versuch doch mal vor deinen jc ein Zeichen auszugeben. Wenn der ganze Bildschirm voll wird, bleibt dein Code wohl in einer Endlosschleife hängen.

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. February 2006, 15:21 »
danke, werd ich sofort machen und dann hier reineditieren, was bei raus kommt.

EDIT: ok, "diskreset:" funktioniert noch, der teil ab "diskformat1:" bis zum jc wird wirklich zur endlosschleife. aber woran liegt das?

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. February 2006, 20:06 »
kann sich nicht vielleicht jemand das nochmal angucken? ich hab das gefühl, ich komme echt nicht weiter... wäre euch sehr dankbar.

sry wegen doppelpost.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 15. February 2006, 20:14 »
Du könntest noch versuchen nur einen einzelnen Sektor auf einmal zu schreiben. Wenn das auch nicht hilft, kannst du eigentlich nur nochmal überprüfen, ob du nicht Register vertauscht hast, usw. Eventuell liegt der Fehler auch wo ganz anders, vielleicht falscher Wert in DS oder so?!

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 16. February 2006, 14:48 »
ok, ich hab das problem: bei CHS ist der erste sektor 1 und nicht 0.

ich danke euch allen für eure antworten. :)

PS: windows sieht meine so formatierte diskette zwar noch nicht als fat12 formatiert an, aber das bekomm ich schon hin. ;)

 

Einloggen