Itt egy kis leirás bootsector írásról, mivel mostanában az az új dili, hogy mindenki oprendszert akar írni, de még egy bebootolós lemezt sem tud megcsinálni. Azért szerintem tiszta poén, hogyha rábootolsz egy lemezre, akkor nem azt a szerencsétlen szöveget kapod, hogy NYET system disk..., hanem mondjuk elindul egy falbontós játék, vagy akár egy phong shadelt torus :)))

Azt tudni kell, hogy a lemezkezelést a BIOS "sáv-fej-szektor" címzésmóddal oldja meg, de ennek segítésével egységesen lehet kezelni vinyót vagy lemezegységet. Mivel ált. mindenki DOS operációs rendszert használ, ezért nincs szükség ilyen alacsonyszintű programozásra, mert ott van az 21h-s interrupt, és nincs gond semmi ilyesmire. Dehát megérdemi az, aki oprendszert akar írni... :)

Tehát akkor a lemezekről:

Az adatok lemez(ek)en vannak tárolva, cikkelyekre osztott koncentrikus körgyűrűkön. Floppynál egy, winchestereknél több lemezről van szó, és minden lemez minden oldalához külön író/olvasófej tartozik, ezért a lemezoldal szinonímájára eléggé elterjedt a "fej" elnevezés is. Ahhoz, hogy egy adatcsomagot (szektort) pontosan azonosítsunk, meg kell adnunk, hogy hányadik körgyűrűn található, hányadik lemezfelületen és azon belül hányadik a kért szektor a sorban. Az első szám a sáv (track vagy cylinder), a második a fej (head vagy side) az utolsó pedig a szektorszám. Néhány floppyformátum (a * azt jelzi, hogy a DOS alapban olvassa-e):
 
 

Méret Sáv Fej Szektor Lemez
160K 40 1 8 *5.25
360K 40 2 9 *5.25
720K 80 2 9 *3.5
800K 80 2 10 5.25
1.2M 80 2 15 *5.25
1.36M 80 2 17 5.25
1.44M 80 2 19 *3.5
 
Winchestereknél a sávszám az 500..1500, a fejek száma a 4..16, a szektorok száma pedig a 17..64 tartományban helyezkedik el, a típustól függően. Minden szektor mellett a lemezen van egy-egy ellenőrző kód is, ennek segítségével floppynál csak jelezni (CRC - Cyclic Redundancy Check), winchesternél pedig -bizonyos határok között- javítani is tudja a BIOS a hibákat (ECC - Error Correcting Code). Mielőtt elfelejteném, egy sector 512-bájt!

Ennyit az elméleti részről, amit feltétlenül közölni kellett. Jöjjön akkor a gyakorlati rész:

Mivel ugyebár nem fut semmilyen operációs rendszer, ezért gyorsan el lehet felejteni mindenféle int21h-t, meg hasonlókat. Szerencsére a többi gyakran használt interrupt hívás megvan (int 10h..) A másik hatalmas előny, hogy NEM fut semmiféle operációs rendszer, ezért nyugodtan lehet akár FLATREAL-t is használni, mivel nincs semmi, amivel ütközne. Miután betöltődik a bootsector, a 0:7c00h-s címre adja át a vezérlést, és már fut is a program. Ha esetleg nem lenne ötleted, hogyan töltsd fel az első sectorba a programodat, akkor gondolj mondjuk a Norton Diskedit-jére, vagy esetleg a dos debugra.

  debug demorulz.com   w 100 0 0 1   q
Na, akkor még egy-pár ötlet:

Ha pl. egy boot betöltő komolyabb rutint akarunk csinálni, akkor: csináljatok egy com-ot... majd ez fog végrehajtódni. Meg csináljatok egy adat file-t, ez kerül majd a végére. A boot rutin meg csak annyit csináljon, hogy fellép flat-real módba, hogy legyen elég memó, felmásolja a com-ot meg az adatot egy megadott címre, és átadja oda a vezérlést.

Javasolnám még a NG-ben a rombios/int 13h/... rutinok átnézését, mert itt le van írva az olvasás, és lehet 65535 byteot is beolvasni, csak akkor azt kell kitalálni, hogy melyik sectoron állsz, mert azt nem tudom, hogy az olvasás lépteti-e a sectort??????

Ja, akkor az adatfile-ra így lehet majd hivatkozni:

[   ...   mov    si,filevege   add    si,eltolas   ...   ...   eltolas dw 42335h   filevege label byte   ends   end start]
!!! TASM SYNTAX !!! Akkor jöjjön a forrás:
.286   code_seg     segment                assume cs:code_seg,ds:code_seg   main         proc    far                 ; azaz a wrout-tól kezdve                mov     ax,cs               ; feljebb  másolja  magát                mov     ds,ax               ; 512-byte-tal, a második                add     ax,7c0h+20h         ; sectorba, mert majd  az                mov     es,ax               ; elsőbe fogja  a vinyóét                cld                         ; lekérdezni                mov     si,7c00h            ; Fentebb másoljuk a programot                xor     di,di               ; 512 byte-tal, hogy a vinyó                mov     cx,100h             ; első szektora ugyancsak 0:7C00                rep     movsw               ; -ról indulhasson                push    es                  ; Ugrás az új helyen                push    offset demoeffect   ; lévő procedure-ra                ret   main         endp   demoeffect   proc    far                mov     ax,cs               ; minden szegmensregiszter a                mov     ds,ax               ; cs-re mutat, és sp a szegmens                mov     es,ax               ; végén van                mov     ss,ax                mov     sp,0fffeh                xor     dl,dl                or      dl,80h              ; Drive = 80h = első winchester                mov     ax,0201h                mov     cx,1                mov     dh,0                push    es                push    0                pop     es                  ; szegmens=es=0                mov     bx,7c00h            ; offset  =bx                int     13h                 ; nézd meg az NG-ben!                jmp     bootpos             ; Ennyi elég is volt   continue     endp   code_seg     ends   zeroseg      segment at 0                assume cs:zeroseg                org 7c00h   bootpos      label far                       ; majd ide  fog ugrani   zeroseg      ends                            ; mert ide  másolja be                                                ; a vinyó bootsectorát   end          main   ----------------------------[END OF]------------------------
Az így lefordított exe-t pedig a dos csodafegyverével, az exe2bin-nel lehet bináris formátumba konvertálni, és ezután már be is lehet írni a bootsectorba. Még egy ötlet: Ha sokat akarunk próbálgatni, akkor először mentsük ki a lemez bootsectorát egy fileba, majd írjuk be az új bootsectort, és ha nem tetszik, akkor másoljuk vissza a régit,majd formázzuk le /Q-val, és már jó is lesz...

Ha mondjuk több adatot szeretnél tárolni a programodhoz, akkor az int 13h (03h funkció) felhasználásával írd fel az adatokat következő szektortól kezdve a lemezre, és a programodból már tudod is használni.