Tartalmi kivonat
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