Also eigentlich ist es ganz einfach.
Ich schildere kurz wie ich drauf gekommen bin.
Nachdem ich den FloppyFAT12-Boocode entwickelt hatte hab ich begonnen FAT16-Bootcode zu basteln, damit ich auch von Zip und LS booten kann.
Dabei habe ich eine Zip100 genauer untersucht um z.b. herauszufinden vieviele Sectoren pro Cluster, wieviel Sectoren pro Track usw. vorhanden sind.
Dabei fand ich zu meinem "Entsetzen" heraus das alle mir unter die Finger gekommenen Zip100, Zip250, LS120, USB-Stick usw. wie Festplatten Partitioniert sind. (Ich erwähnte es schon). Nur halt mit einer großen, Mediumfüllenden Partition.
Und wie das bei Partitionen so üblich ist beginnt die Partition am Anfang des nächsten Tracks. (Der erste Track ist ja durch den MBR (mit Partiton-Table) schon "angerissen")
Bei einer Zip100 sieht das so aus:
- Bootsector
- 31 unbenutzte Sectoren (32 Sectoren pro Track)
- Start der Partition, also Bootsector (Cylinder0, Kopf1, Sector1)
Aber nun konnte ich die Nummern der Sectoren zum einlesen von FAT und RootDir nicht mehr korrekt berechnen.... Der Bootsector war ja nicht mehr Sector 0 (wie bei FAT12 ohne Partition) sondern in diesem Fall Sector 33, die Fat lag nicht ab Sector 1 sondern ab Sector 34 und das RootDir lag nicht an Sector 1+(Anzahl-Sectoren-beider-FATs)....
(Das Problem potenziert sich noch wenn man an eine Fat16-Partition auf einer Festplatte denkt wo mehr als 1 Partition drauf ist...)
Also hab ich die Zip100 mit DOS bootfähig gemacht und geguckt wie der DOS-Bootcode das macht...
Und siehe da... der benutzte auch den Eintrag Hidden_Sec zur Berechnung...
Ein bisschen Recherche im Netz brachte dann die Lösung...
(Ich weiß, ich weiß, ich schweife aus... aber nun die Erklärung:)
In BpbHiddenSec steht die "Anzahl der Sectoren vor der Partition".
Das ist es schon!
Hidden ist da als Name natürlich Irre führend.
Aber immerhin, denke einfach ein FAT16-Bootcode auf der 2. Partition auf der Festplatte wird gebootet. Der Bootcode müsste erst den MBR einlesen und feststellen: 1. auf welcher Partition er selber liegt und 2. auf welchem Sector die Partition beginnt. Und dann erst kann der Bootcode Fat, RootDir und Kernel einlesen...
(Ich weiß, das MBR-Programm sollte eigentlich einen Pointer auf den Partition-Table-Eintrag liefern...)
Kurz: Wer von Zip booten möchte muss bei der Berechnung der Sectoren immer den Wert in Hidden_Sec dazuaddieren und dann funktioniert es wie es soll.
(Ich hoffe ich war nicht zu ausschweifend...
)