Egy standard MBR (Master Boot Record) assembly listája
; Standard MBR = Master Boot Record
;
; Ezt az 512 byte-ot (a partíciós tábla adatait leszámítva)
; az MS-DOS v6.22 FDISK parancsa írja be a 0-as drive t0h0s1-ébe
; egy FDISK /MBR parancs hatására.
; A BIOS a POST végrehajtása után a track 0, head 0, sector 1-en
; találhato 512 byte méretű Master Boot Record-ot betölti 0000:7C00-ra,
; majd átadja rá a vezérlést. A kód elôször átmásolja magát 0000:0600-ra,
; mert a boot-olható partíció boot-szektorának kell a hely 0000:7C00-án:
7C00 FA CLI
7C01 33C0 XOR AX,AX
7C03 8ED0 MOV SS,AX
7C05 BC007C MOV SP,7C00 ; verem 7C00-tol lefelé
7C08 8BF4 MOV SI,SP ; másolás 0000:7C00-rol...
7C0A 50 PUSH AX
7C0B 07 POP ES
7C0C 50 PUSH AX
7C0D 1F POP DS
7C0E FB STI
7C0F FC CLD
7C10 BF0006 MOV DI,0600 ; ... 0000:0600-ra...
7C13 B90001 MOV CX,0100 ; 512 byte-ot (256 word)
7C16 F2 REPNZ
7C17 A5 MOVSW
7C18 EA1D060000 JMP 0000:061D
; Ami itt következik, az eredetileg 0000:7C1D-tôl volt, de a fenti rutin
; átmásolja az egészet 061D-re, es ott futtatja. A címeket átírtam az
; új pozíciónak megfelelôen.
; Az itt következô részlet a 4 partíció-bejegyzés közül megkeresi az
; elsô boot-olható partíciót, illetve ellenôrzi, hogy elôtte csak "inactive"
; partíciók vannak-e (00-as kódú):
061D BEBE07 MOV SI,07BE ; -> partíciós tábla
0620 B304 MOV BL,04 ; max. négy bejegyzés lehet
0622 803C80 CMP BYTE PTR [SI],80; boot-olható a partíció?
0625 740E JZ 0635
0627 803C00 CMP BYTE PTR [SI],00; 00-n és 80-on kívül más nem lehet
062A 751C JNZ 0648 ; -> "Invalid partition table"
062C 83C610 ADD SI,+10 ; lássuk a következô bejegyzést...
062F FECB DEC BL
0631 75EF JNZ 0622 ; ha még nem néztük végig, vissza
0633 CD18 INT 18 ; egyik partíció sem volt bootolható,
; -> a ROM-BASIC indítása
; A következôkben leteszteljük az egyetlen boot-olható partíció
; utáni bejegyzéseket is (csak 00-as kódúak lehetnek):
0635 8B14 MOV DX,[SI] ; drive/head
0637 8B4C02 MOV CX,[SI+02] ; cylinder/sector
063A 8BEE MOV BP,SI ; bejegyzés offsetjének mentése
063C 83C610 ADD SI,+10 ; lássuk a többi partíciót...
063F FECB DEC BL ; ez volt az utolsó?
0641 741A JZ 065D ; -> boot
0643 803C00 CMP BYTE PTR [SI],00; a többiben mind 00-nak kell lenni
0646 74F4 JZ 063C
; Ez itt a hibakiíró rutin. Miután kiírta az SI offseten lévô,
; 0-val lezárt szöveget (ASCIIZ), végtelen ciklusba jut:
0648 BE8B06 MOV SI,068B ; -> "Invalid partition table"
064B AC LODSB
064C 3C00 CMP AL,00
064E 740B JZ 065B
0650 56 PUSH SI
0651 BB0700 MOV BX,0007
0654 B40E MOV AH,0E
0656 CD10 INT 10 ; AL-ben lévô karakter kiírása
0658 5E POP SI
0659 EBF0 JMP 064B
065B EBFE JMP 065B ; press reset to continue...
; Betöltjük az "active" (boot-olható) partíciós tábla elsô szektorát.
; A partíciós tábla-bejegyzések elsô két word-je megadja a boot-szektor
; pozícióját (elsô word: drive/head, második word: cylinder/sector),
; ezeket az elôbb már be is töltöttük a megfelelô (azaz INT13 által
; elvárt) regiszterekbe.
065D BF0500 MOV DI,0005 ; 5-ször próbálkozunk
0660 BB007C MOV BX,7C00 ; 0000:7C00-ra töltjük a bootszektort
0663 B80102 MOV AX,0201 ; read 1 sector
0666 57 PUSH DI
0667 CD13 INT 13
0669 5F POP DI
066A 730C JNB 0678 ; ha nem volt hiba (CF=0), tovább
066C 33C0 XOR AX,AX ; különben...
066E CD13 INT 13 ; ...reset drive
0670 4F DEC DI
0671 75ED JNZ 0660
0673 BEA306 MOV SI,06A3 ; -> "Error loading operating system"
0676 EBD3 JMP 064B
; Bent van a tárban a boot-szektor, már csak le kell ellenôrizni, hogy
; érvényes-e (az 510-es offseten az 55,AA byte-oknak kell szerepelni):
0678 BEC206 MOV SI,06C2
067B BFFE7D MOV DI,7DFE ; boot szektor 510-es offsetje
067E 813D55AA CMP WORD PTR [DI],AA55 ; signature check
0682 75C7 JNZ 064B ; nincs ott? -> "Missing operating system"
0684 8BF5 MOV SI,BP ; SI = BP = partícióstábla bejegyzés offsetje
0686 EA007C0000 JMP 0000:7C00 ; ugrás a boot-partíció bootszektorára
0680 49 6E 76 61 6C Inval
0690 69 64 20 70 61 72 74 69-74 69 6F 6E 20 74 61 62 id partition tab
06A0 6C 65 00 45 72 72 6F 72-20 6C 6F 61 64 69 6E 67 le.Error loading
06B0 20 6F 70 65 72 61 74 69-6E 67 20 73 79 73 74 65 operating syste
06C0 6D 00 4D 69 73 73 69 6E-67 20 6F 70 65 72 61 74 m.Missing operat
06D0 69 6E 67 20 73 79 73 74-65 6D 00 ing system.
; Végül egy lehetséges partíciós tábla:
07B0 80 01 ..
07C0 01 00 06 3F 3F C4 3F 00-00 00 81 1E 0C 00 00 00 ...??.?.........
07D0 01 C5 05 3F 7F 47 C0 1E-0C 00 40 0F 08 00 00 00 ...?.G....@.....
07E0 41 48 82 3F 7F 53 00 2E-14 00 00 BD 00 00 00 00 AH.?.S..........
07F0 41 54 83 3F BF 0F 00 EB-14 00 00 91 0B 00 55 AA AT.?..........U.
; Megjegyzés:
;
; A partíciós tábla végére is kell egy 55,AA signature, mert ha nincs,
; a BIOS kiírja, hogy "Drive not ready" vagy valami hasonlót.