Content extract
					
					Sándor Zsolt - Bootsector írása 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 :))) 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 416, a szektorok száma pedig a 1764 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 mov mov add mov cld mov xor mov rep push push ret  main  endp  demoeffect  proc mov mov mov  far ax,cs ds,ax ax,7c0h+20h es,ax si,7c00h di,di cx,100h movsw es offset demoeffect  far ax,cs ds,ax es,ax  ; azaz a wrout-tól kezdve ; feljebb másolja magát ; 512-byte-tal, a második ; sectorba, mert majd az ; elsőbe fogja a vinyóét ; lekérdezni ; Fentebb másoljuk a programot ; 512 byte-tal, hogy a vinyó ; első szektora ugyancsak 0:7C00 ; -ról indulhasson ; Ugrás az új helyen ; lévő procedure-ra  ; minden szegmensregiszter a ; cs-re mutat, és sp a szegmens ; végén van     mov mov xor or mov mov mov push push pop mov int  ss,ax sp,0fffeh dl,dl dl,80h ax,0201h cx,1 dh,0 es 0 es
bx,7c00h 13h  ; szegmens=es=0 ; offset =bx ; nézd meg az NG-ben!  jmp  bootpos  ; Ennyi elég is volt  continue code seg  endp ends  zeroseg  bootpos zeroseg  segment at 0 assume cs:zeroseg org 7c00h label far ends  end  main  ; Drive = 80h = első winchester  ; majd ide fog ugrani ; mert ide másolja be ; a vinyó bootsectorát  ----------------------------[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