org 0
BootOrg:

 mov ax,07C0h
 mov ds,ax
 xor si,si ;data@07C0:0000

 cli
 mov ss,ax
 xor sp,sp ;stack@07C0:0000
 sti

 mov ax,0060h
 mov es,ax
 xor di,di ;reloc@0060:0000

 mov cx,512
 cld
 repnz movsb

 mov ds,ax ;data@0060:0000
 mov [BootDrive],dl

 jmp 0060h:BootStart ;code@0060:BootStart

BootStart:
 mov si,BootPart
 mov cx,4
BootFind:
 cmp byte[si],80h ;active
 je BootActive
 cmp byte[si],00h ;invalid
 jne BootFail
 add si,16 ;next
 loop BootFind
BootFail:
 cli
 hlt
 jmp $

BootActive:

 mov cx,[si+2] ;cylinder/sector
 mov dh,[si+1] ;head
 mov dl,[BootDrive]

 mov ax,07C0h
 mov es,ax
 xor bx,bx ;load@07C0:0000

 mov bp,8+1 ;tries+1

BootLoad:

 dec bp
 jz BootFail

 mov ax,0201h ;ah=read,al=count
 int 13h ;BIOS DISK service
 jnc BootExec

 xor ax,ax ;ah=reset,al=?
 int 13h
 jmp BootLoad

BootExec:

 cmp word[es:510],0AA55h ;verify
 jne BootFail

 mov ax,es
 mov ds,ax ;data@07C0:0000

 ;dl=drive
 jmp 07C0h:0000 ;code@07C0:0000

BootDrive:
 rb 1
BootPad:
 rb ((512-64-2)-($-$$))
BootPart:
 rb 64
BootSig:
 db 055h
 db 0AAh
BootEnd:
