Egy kis boot szektorológia
Így néz ki az EXDOS boot szektor:
00-02 EBH. FEH, 90H IBM ( Ugrás a betöltõ kódra)
03-10 "EXDOS 1.0" rendszer (formázó software)
11-12 512 byte / szektor
13 szektor/cluster
14-15 boot szektorok száma (általában 1)
16 FAT példányok száma (általában 2)
17-18 fõkönyvtár bejegyzések száma
19-20 lemez szektorainak száma
21 formázási típusbájt (F8h-FFh)
22-23 egy FAT példány szektorainak száma
24-25 szektor/sáv
26-27 fejek száma
28-29 rejtett szektorok száma
Innentõl csak EXDOS (vagy VT-DOS) lemezeken:
30 C9H RET, az MSX-DOS BOOT program belépési pontja
31-63 0 nullázás
64-69 "VOL_ID" azonosító string
70 0 UNDEL jelzõ-byte
71-74 32 bites lemezazonosító
75-99 0 nullázás
100-511 E5H üres terület
A 03-29 terjedõ terület megfelel a FAT szabványban leírtaknak, most inkább a körítéssel foglalkoznék:
A 00-02 címen található egy x86-os ugróutasítás, amire az EXDOS-nak nincs semmi szüksége, de kompatibilitási okokból oda teszi, mivel egyes Microsoft operációs rendszerek - a saját szabványuktól eltérõen - ellenõrzik ennek a meglétét is. Ebbe futottak bele az Atarisok, mivel a korai TOS verziók nem írták ezt oda, így a PC-k nem olvasták az Atarin formázott lemezeket.
30-as címen az MSX tulajdonosokra gondoltak, hogy egy véletlen meghajtóban felejtett EP lemez esetén nem okozzon elszállást a bootolási kísérlet, ezért egy RET utasítást tettek erre a belépési pontra.
64-74 bájtokon terül el az EXDOS saját extrái: 64-69 bájtokon a "VOL_ID" azonosító jelzi, hogy ez egy EP lemez, és tartalmazza a következõ 2 adatot. 70-en egy jelzõ bájt jelzi, hogy a lemez tartalmaz törölt, de helyreállítható fájlokat. 71-74 bájtokon pedig egy véletlenszerû 32 bites lemezazonosító található, aminek lemezcsere ellenõrzésnél veszi hasznát.
Az EXDOS megalkotása óta eltelt több mint 25 évben újabb szabványok újabb adatokat pakoltak a boot szektorba:
28-31 rejtett szektorok száma (32 bit)
32-35 lemez szektorainak száma (32 bit)
36 fizikai meghajtó szám (PC) (00h floppy, 80h HDD)
37 CHKDSK jelzõbájt (Windows NT alapú rendszerek)
38 kibõvített boot szektor jelzõbájt (29h) ez jelzi, hogy a következõ paraméterek léteznek
39-42 32 bites lemezazonosító
43-53 11 karakteres lemeznév
54-61 7 karakteres fájlrendszer azonosító "FAT12 " vagy "FAT16 "
510-511 55h,AAh boot szektor jelzés
Ezeket az újdonságokat is célszerû lesz beépíteni az EP-s formázó programokba, a mai rendszerekkel való jobb kompatibilitás érdekébe. Szerencsénkre ezek mind az EXDOS által kihagyott üres területre esnek, így egyszerûen csak ki kell bõvíteni az eddigi EP-s boot szektort.
Egyedül csak MSX-eseknek kedveskedõ RET utasítás esik áldozatául a bõvítésnek, de az is csak vinyón, 65535 szektornál többet tartalmazó partició esetén, ez talán túlélhetõ probléma
Mint látható pár évvel az EXDOS után a Microsoft is feltalálta a 32 bites lemezazonosítót
ezzel annyi a teendõ, hogy az EXDOS által is használt 32 bites azonosítót beírni a PC-s helyére is, valamint 38-as bájtra írt 29h-val jelezni, hogy van ilyen érték. A fájlrendszer azonosító esetünkben "FAT12 ".
A boot szektorba helyezett lemeznév az tulajdonképpen egy okos ötlet lett volna, hogy ne a fõkönyvtárban kelljen keresgélni a lemez nevét. Viszont kipróbáltam MSDOS 6.2 és XP alatt is, hogy ettõl függetlenül a fõkönyvtárban lévõ lemeznevet használja, ha nincs olyan akkor se veszi elõ a boot szektorban lévõt. Így nyugodt szívvel figyelmen kívül hagyhatjuk ezt a mezõt. Majd egyszer bele lehet rakni a VOL parancsba, hogy ide is írja be.
Utolsó teendõ még a boot szektor végére elhelyezni az 55h,AAh bájtokat. Nem létszükséglet, de ki tudja mit ellenõriznek egyes kreténebb PC-s rendszerek (ahogy az már pl az ugró utasításról, vagy a formázó program nevérõl kiderült).
És van még egy dolog, a lemez elején EBh. FEh, 90h az egy önmagága ugró JMP utasítás PC-n, ami azt jelenti, hogy ha egy EP-s lemezt felejtünk a meghajtóban, és arról boot-ol a PC, akkor jól lefagy... végülis kárt nem okoz ez a megoldás, csak bosszantó, hogy resetelni kell.
Egyszerû megoldás, ami nem pazarol sok helyet: az EP-s lemez azonosító után pl a 75-76 címekre CDh,19h bájtokat kell írni, majd az ugró utasítást a lemez elején EBh,49h,90h-ra módosítani. Az új utasítás amire ráugrik, az egy INT 19h, ami újraindítja a boot-olást, azaz így újra meg újra olvassa a floppyt, azonban amikor észrevesszük a bent felejtett lemezt, és kivesszük, megy tovább rendesen, nem kell resetelni.
Ha nem sajnálunk több bájtot elpazarolni az EP-s programunkban, akkor egy hosszabb kóddal az is elérhetõ, hogy ki se kell venni a lemezt, az tölti be a vinyó boot szektorát (szintén 4Bh-re helyezve):
db 31h,0C0h ;xor ax, ax
db 8Eh,0D8h ;mov ds, ax
db 8Eh,0C0h ;mov es, ax
db 0FCh ;cld
db 0B9h ;mov cx,
dw 100h ; 100h
db 0BEh ;mov si,
dw 7C00h ; 7C00h
db 0BFh ;mov di,
dw 8000h ; 8000h
db 0F3h,0A5h ;rep movsw
db 0EAh ;jmp far ptr 800h:62h
dw 62h
dw 800h
db 0B8h ;mov ax,
dw 201h ; 201h
db 0BBh ;mov bx,
dw 7C00h ; 7C00h
db 0BAh ;mov dx,
dw 80h ; 80h
db 0B9h ;mov cx,
dw 1 ; 1
db 0CDh,13h ;int 13h ; DISK - READ SECTORS INTO MEMORY
db 72h,5 ;jb +5
db 0EAh ;jmp far ptr 0:7C00h
dw 7C00h
dw 0
db 0CDh,19h ;int 19h ; DISK BOOT