diff options
Diffstat (limited to 'contrib/syslinux/latest/mbr/oldmbr.asm')
-rw-r--r-- | contrib/syslinux/latest/mbr/oldmbr.asm | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/contrib/syslinux/latest/mbr/oldmbr.asm b/contrib/syslinux/latest/mbr/oldmbr.asm deleted file mode 100644 index 26fb022..0000000 --- a/contrib/syslinux/latest/mbr/oldmbr.asm +++ /dev/null @@ -1,230 +0,0 @@ -; ----------------------------------------------------------------------- -; -; Copyright 2003-2008 H. Peter Anvin - All Rights Reserved -; -; Permission is hereby granted, free of charge, to any person -; obtaining a copy of this software and associated documentation -; files (the "Software"), to deal in the Software without -; restriction, including without limitation the rights to use, -; copy, modify, merge, publish, distribute, sublicense, and/or -; sell copies of the Software, and to permit persons to whom -; the Software is furnished to do so, subject to the following -; conditions: -; -; The above copyright notice and this permission notice shall -; be included in all copies or substantial portions of the Software. -; -; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -; OTHER DEALINGS IN THE SOFTWARE. -; -; ----------------------------------------------------------------------- - -; -; mbr.asm -; -; Simple Master Boot Record, including support for EBIOS extensions. -; -; The MBR lives in front of the boot sector, and is responsible for -; loading the boot sector of the active partition. The EBIOS support -; is needed if the active partition starts beyond cylinder 1024. -; -; This MBR determines all geometry info at runtime. It uses only the -; linear block field in the partition table. It does, however, pass -; the partition table information unchanged to the target OS. -; -; This MBR should be "8086-clean", i.e. not require a 386. -; - -%include "bios.inc" - -; -; Note: The MBR is actually loaded at 0:7C00h, but we quickly move it down to -; 0600h. -; - section .text - cpu 8086 - org 0600h - -_start: cli - xor ax,ax - mov ds,ax - mov es,ax - mov ss,ax - mov sp,7C00h - sti - cld - mov si,sp ; Start address - mov di,0600h ; Destination address - mov cx,512/2 - rep movsw - -; -; Now, jump to the copy at 0600h so we can load the boot sector at 7C00h. -; Since some BIOSes seem to think 0000:7C00h and 07C0:0000h are the same -; thing, use a far jump to canonicalize the address. This also makes -; sure that it is a code speculation barrier. -; - - jmp 0:next ; Jump to copy at 0600h - -next: - mov [DriveNo], dl ; Drive number stored in DL -; -; Check for CHS parameters. This doesn't work on floppy disks, -; but for an MBR we don't care. -; - mov ah,08h ; Get drive parameters - int 13h - and cx,3Fh ; Max sector number - mov [Sectors],cx - xor ax,ax - mov al,dh - inc ax ; From 0-based to count - mul cx ; Heads*Sectors - mov [SecPerCyl],ax - ; Note: we actually don't care about the number of - ; cylinders, since that's the highest-order division - -; -; Now look for one (and only one) active partition. -; - mov si,PartitionTable - xor ax,ax - mov cx,4 -checkpartloop: - test byte [si],80h - jz .notactive - inc ax - mov di,si -.notactive: add si,byte 16 - loop checkpartloop - - cmp ax,byte 1 ; Better be only one - jnz not_one_partition - -; -; Now we have the active partition partition information in DS:DI. -; Check to see if we support EBIOS. -; - mov dl,[DriveNo] - mov ax,4100h - mov bx,055AAh - xor cx,cx - xor dh,dh - stc - int 13h - jc no_ebios - cmp bx,0AA55h - jne no_ebios - test cl,1 ; LBA device access - jz no_ebios -; -; We have EBIOS. Load the boot sector using LBA. -; - push di - mov si,dapa - mov bx,[di+8] ; Copy the block address - mov [si+8],bx - mov bx,[di+10] - mov [si+10],bx - mov dl,[DriveNo] - mov ah,42h ; Extended Read - jmp short common_tail -; -; No EBIOS. Load the boot sector using CHS. -; -no_ebios: - push di - mov ax,[di+8] - mov dx,[di+10] - div word [SecPerCyl] ; AX = cylinder DX = sec in cyl - ror ah,1 - ror ah,1 - mov cl,ah - mov ch,al ; CL = cyl[9:8], CH = cyl[7:0] - - mov ax,dx - div byte [Sectors] ; AL = head AH = sector - mov dh,al - inc ah - or cl,ah ; CX = cylinder and sector - - mov dl,[DriveNo] - mov bx,7C00h - mov ax,0201h ; Read one sector -common_tail: - int 13h - jc disk_error - pop si ; DS:SI -> partition table entry -; -; Verify that we have a boot sector, jump -; - cmp word [7C00h+510],0AA55h - jne missing_os - cli - jmp 0:7C00h ; Jump to boot sector; far - ; jump is speculation barrier - ; (Probably not neecessary, but - ; there is plenty of space.) - -not_one_partition: - ja too_many_os -missing_os: - mov si,missing_os_msg - jmp short die -too_many_os: -disk_error: - mov si,bad_disk_msg -die: -.msgloop: - lodsb - and al,al - jz .now - mov ah,0Eh ; TTY output - mov bh,[BIOS_page] ; Current page - mov bl,07h - int 10h - jmp short .msgloop -.now: - jmp short .now - - align 4, db 0 ; Begin data area - -; -; EBIOS disk address packet -; -dapa: - dw 16 ; Packet size -.count: dw 1 ; Block count -.off: dw 7C00h ; Offset of buffer -.seg: dw 0 ; Segment of buffer -.lba: dd 0 ; LBA (LSW) - dd 0 ; LBA (MSW) - -; CHS information -SecPerCyl: dw 0 ; Heads*Sectors -Sectors: dw 0 - -; Error messages -missing_os_msg db 'Missing operating system', 13, 10, 0 -bad_disk_msg db 'Operating system loading error', 13, 10, 0 - -; -; Maximum MBR size: 446 bytes; end-of-boot-sector signature also needed. -; Note that some operating systems (NT, DR-DOS) put additional stuff at -; the end of the MBR, so shorter is better. Location 440 is known to -; have a 4-byte attempt-at-unique-ID for some OSes. -; - -PartitionTable equ $$+446 ; Start of partition table - -; -; BSS data; put at 800h -; -DriveNo equ 0800h |