| ; libparted - a library for manipulating disk partitions |
| ; Copyright (C) 1999, 2000 Free Software Foundation, Inc. |
| ; |
| ; This program is free software; you can redistribute it and/or modify |
| ; it under the terms of the GNU General Public License as published by |
| ; the Free Software Foundation; either version 2 of the License, or |
| ; (at your option) any later version. |
| ; |
| ; This program is distributed in the hope that it will be useful, |
| ; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ; GNU General Public License for more details. |
| ; |
| ; You should have received a copy of the GNU General Public License |
| ; along with this program; if not, write to the Free Software |
| ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| |
| ; NOTE: I build this with: |
| ; $ as86 -b /dev/stdout mbr.s | hexdump -e '8/1 "0x%02x, " "\n"' |
| ; |
| ; The build isn't done automagically by make, because as86 may not be on many |
| ; machines (particularly non-x86). Also, it seems rather difficult to get |
| ; as86 to build object files that can be linked, especially as it's 16 bit |
| ; code... |
| |
| USE16 |
| |
| ; This code, plus the partition table is loaded into 0000:7C00 by the BIOS |
| |
| .text |
| |
| ; set top of stack to 1000:B000 |
| |
| cli |
| |
| mov ax, #0x1000 |
| mov ss, ax |
| mov sp, #0xB000 |
| |
| mov ax, #0x0000 |
| mov ds, ax |
| mov es, ax |
| |
| sti |
| |
| ; Copy what the BIOS loaded (i.e. the MBR + head of partition table) from |
| ; 0000:7c00 to 0000:0600 |
| |
| mov si, #0x7c00 |
| mov di, #0x0600 |
| mov cx, #0x200 |
| rep |
| movsb |
| |
| ; Jump to the copy of the MBR |
| |
| jmp 0x0000:find_boot_partition + 0x0600 |
| |
| find_boot_partition: |
| mov si, #0x07BE |
| |
| check_next_bootable: |
| cmp [si], al |
| jnz found_bootable |
| add si, #0x0010 |
| cmp si, #0x07FE |
| jnz check_next_bootable |
| jmp error |
| |
| found_bootable: |
| |
| ; Load in the boot sector at 0000:7c00 |
| |
| mov ah, #2 ; BIOS command (read) |
| mov al, #1 ; count |
| mov bx, #0x7c00 ; destination pointer |
| mov dl, #0x80 ; drive |
| mov dh, byte ptr [si + 1] ; head |
| mov cx, word ptr [si + 2] ; sector / cylinder |
| int #0x13 ; BIOS read interrupt |
| |
| jmp 0x0000:0x7c00 ; hand control to boot sector |
| |
| error: |
| jmp error |
| |