;/* ; * Microsoft Confidential ; * Copyright (C) Microsoft Corporation 1983 - 1991 ; * All Rights Reserved. ; */ ; BOOT - IBM hard disk boot record 6/8/82 ; ; ; This is the standard boot record that will be shipped on all hard disks. It contains: ; ; 1. Code to load (and give control to) the boot record for 1 of 4 possible ; operating systems. ; ; 2. A partition table at the end of the boot record, followed by the required signature. ; ; _data segment public assume cs:_data,ds:_data org 600h cli ;no interrupts for now xor ax,ax mov ss,ax mov sp,7c00h ;new stack at 0:7c00 mov si,sp ;where this boot record starts - 0:7c00 push ax pop es ;seg regs the same push ax pop ds sti ;interrupts ok now cld mov di,0600h ;where to relocate this boot record to mov cx,100h repnz movsw ;relocate to 0:0600 ; jmp entry2 db 0eah dw $+4,0 entry2: mov si,offset tab ;partition table mov bl,4 ;number of table entries next: cmp byte ptr[si],80h ;is this a bootable entry? je boot ;yes cmp byte ptr[si],0 ;no, is boot indicator zero? jne bad ;no, it must be x"00" or x"80" to be valid add si,16 ;yes, go to next entry dec bl jnz next int 18h ;no bootable entries - go to rom basic boot: mov dx,[si] ;head and drive to boot from mov cx,[si+2] ;cyl, sector to boot from mov bp,si ;save table entry address to pass to partition boot record next1: add si,16 ;next table entry dec bl ;# entries left jz tabok ;all entries look ok cmp byte ptr[si],0 ;all remaining entries should begin with zero je next1 ;this one is ok bad: mov si,offset m1 ;oops - found a non-zero entry - the table is bad msg: lodsb ;get a message character cmp al,0 je hold push si mov bx,7 mov ah,14 int 10h ;and display it pop si jmp msg ;do the entire message ; hold: jmp hold ;spin here - nothing more to do tabok: mov di,5 ;retry count rdboot: mov bx,7c00h ;where to read system boot record mov ax,0201h ;read 1 sector push di int 13h ;get the boot record pop di jnc goboot ;successful - now give it control xor ax,ax ;had an error, so int 13h ;recalibrate dec di ;reduce retry count jnz rdboot ;if retry count above zero, go retry mov si,offset m2 ;all retries done - permanent error - point to message, jmp msg ;go display message and loop goboot: mov si,offset m3 ;prepare for invalid boot record mov di,07dfeh cmp word ptr [di],0aa55h ;does the boot record have the ; required signature? jne msg ;no, display invalid system boot record message mov si,bp ;yes, pass partition table entry address db 0eah dw 7c00h,0 include fdisk5.cl1 org 7beh tab: ;partition table dw 0,0 ;partition 1 begin dw 0,0 ;partition 1 end dw 0,0 ;partition 1 relative sector (low, high parts) dw 0,0 ;partition 1 # of sectors (low, high parts) dw 0,0 ;partition 2 begin dw 0,0 ;partition 2 end dw 0,0 ;partition 2 relative sector dw 0,0 ;partition 2 # of sectors dw 0,0 ;partition 3 begin dw 0,0 ;partition 3 end dw 0,0 ;partition 3 relative sector dw 0,0 ;partition 3 # of sectors dw 0,0 ;partition 4 begin dw 0,0 ;partition 4 end dw 0,0 ;partition 4 relative sector dw 0,0 ;partition 4 # of sectors signa db 55h,0aah ;signature _data ends end
 
|