15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* -*-Asm-*- */
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 1999,2000,2001,2002,2004   Free Software Foundation, Inc.
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it under the terms of the GNU General Public License as published by
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  the Free Software Foundation; either version 2 of the License, or
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  (at your option) any later version.
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is distributed in the hope that it will be useful,
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU General Public License for more details.
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  You should have received a copy of the GNU General Public License
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  along with this program; if not, write to the Free Software
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stage1.h>
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  defines for the code go here
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Absolute addresses
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   This makes the assembler generate the address without support
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   from the linker. (ELF can't relocate 16-bit addresses!) */
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ABS(x) (x-_start+0x7c00)
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Print message string */
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG(x)	movw $ABS(x), %si; call message
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* XXX:	binutils-2.9.1.0.x doesn't produce a short opcode for this. */
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define	MOV_MEM_TO_AL(x)	.byte 0xa0;  .word x
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.file	"stage1.S"
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.text
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Tell GAS to generate 16-bit instructions so that this code works
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   in real mode. */
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.code16
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.globl _start; _start:
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Beginning of the sector is compatible with the FAT/HPFS BIOS
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * parameter block.
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	after_BPB
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	nop	/* do I care about this ??? */
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * This space is for the BIOS parameter block!!!!  Don't change
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * the first jump, nor start the code anywhere but right after
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * this area.
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + 4
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* scratch space */
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmode:
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	0
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdisk_address_packet:
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsectors:
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	0
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectheads:
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	0
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcylinders:
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word	0
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsector_start:
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	0
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthead_start:
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	0
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcylinder_start:
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word	0
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* more space... */
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + STAGE1_BPBEND
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * End of BIOS parameter block.
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage1_version:
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	COMPAT_VERSION_MAJOR, COMPAT_VERSION_MINOR
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectboot_drive:
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	GRUB_INVALID_DRIVE	/* the disk to load stage2 from */
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectforce_lba:
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	0
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_address:
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word	0x8000
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_sector:
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long	1
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstage2_segment:
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word	0x800
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectafter_BPB:
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* general setup */
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cli		/* we're not safe here! */
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * This is a workaround for buggy BIOSes which don't pass boot
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * drive correctly. If GRUB is installed into a HDD, check if
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * DL is masked correctly. If not, assume that the BIOS passed
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * a bogus value and set DL to 0x80, since this is the only
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * possible boot drive. If GRUB is installed into a floppy,
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * this does nothing (only jump).
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectboot_drive_check:
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	1f
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	testb	$0x80, %dl
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jnz	1f
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x80, %dl
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * ljmp to the next instruction because some bogus BIOSes
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * jump to 07C0:0000 instead of 0000:7C00.
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ljmp	$0, $ABS(real_start)
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectreal_start:
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set up %ds and %ss as offset from 0 */
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%ax, %ax
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, %ds
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, %ss
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set up the REAL stack */
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$STAGE1_STACKSEG, %sp
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	sti		/* we're safe again */
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  Check if we have a forced disk reference here
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MOV_MEM_TO_AL(ABS(boot_drive))	/* movb	ABS(boot_drive), %al */
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpb	$GRUB_INVALID_DRIVE, %al
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	je	1f
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%al, %dl
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save drive reference first thing! */
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%dx
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* print a notification message on the screen */
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_string)
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* do not probe LBA if the drive is a floppy */
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	testb	$STAGE1_BIOS_HD_FLAG, %dl
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jz	chs_mode
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* check if LBA is supported */
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x41, %ah
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x55aa, %bx
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  %dl may have been clobbered by INT 13, AH=41H.
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  This happens, for example, with AST BIOS 1.04.
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%dx
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%dx
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* use CHS if fails */
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	chs_mode
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	$0xaa55, %bx
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	chs_mode
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* check if AH=0x42 is supported if FORCE_LBA is zero */
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MOV_MEM_TO_AL(ABS(force_lba))	/* movb	ABS(force_lba), %al */
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	testb	%al, %al
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jnz	lba_mode
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	andw	$1, %cx
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jz	chs_mode
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlba_mode:
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save the total number of sectors */
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	0x10(%si), %ecx
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set %si to the disk address packet */
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$ABS(disk_address_packet), %si
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set the mode to non-zero */
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$1, -1(%si)
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	ABS(stage2_sector), %ebx
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the size and the reserved byte */
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x0010, (%si)
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the blocks */
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$1, 2(%si)
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the absolute address (low 32 bits) */
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%ebx, 8(%si)
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the segment of buffer address */
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$STAGE1_BUFFERSEG, 6(%si)
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%eax, %eax
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 4(%si)
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%eax, 12(%si)
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Call with	%ah = 0x42
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dl = drive number
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%ds:%si = segment:offset of disk address packet
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Return:
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = 0x0 on success; err code on failure
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x42, %ah
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* LBA read is not supported, so fallback to CHS.  */
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	chs_mode
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$STAGE1_BUFFERSEG, %bx
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	copy_buffer
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchs_mode:
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  Determine the hard disk geometry from the BIOS!
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  We do this first, so that LS-120 IDE floppies work correctly.
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$8, %ah
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jnc	final_init
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  The call failed, so maybe use the floppy probe instead.
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	testb	$STAGE1_BIOS_HD_FLAG, %dl
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jz	floppy_probe
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Nope, we definitely have a hard disk, and we're screwed. */
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	hd_probe_error
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfinal_init:
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$ABS(sectors), %si
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set the mode to zero */
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0, -1(%si)
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save number of heads */
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%eax, %eax
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dh, %al
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incw	%ax
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%eax, 4(%si)
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%dx, %dx
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%cl, %dl
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shlw	$2, %dx
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%ch, %al
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dh, %ah
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save number of cylinders */
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incw	%ax
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 8(%si)
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%ax, %ax
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dl, %al
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shrb	$2, %al
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save number of sectors */
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%eax, (%si)
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsetup_sectors:
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load logical sector start (bottom half) */
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	ABS(stage2_sector), %eax
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* zero %edx */
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%edx, %edx
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* divide by number of sectors */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	divl	(%si)
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save sector start */
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dl, 10(%si)
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%edx, %edx	/* zero %edx */
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	divl	4(%si)		/* divide by number of heads */
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save head start */
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dl, 11(%si)
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save cylinder start */
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 12(%si)
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* do we need too many cylinders? */
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	8(%si), %ax
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jge	geometry_error
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This is the loop for taking care of BIOS geometry translation (ugh!)
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* get high bits of cylinder */
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	13(%si), %dl
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shlb	$6, %dl		/* shift left by 6 bits */
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	10(%si), %cl	/* get sector */
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incb	%cl		/* normalize sector (sectors go
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					from 1-N, not 0-(N-1) ) */
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	orb	%dl, %cl	/* composite together */
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	12(%si), %ch	/* sector+hcyl in cl, cylinder in ch */
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* restore %dx */
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%dx
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* head number */
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	11(%si), %dh
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Call with	%ah = 0x2
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = number of sectors
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%ch = cylinder
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%cl = sector (bits 6-7 are high bits of "cylinder")
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dh = head
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dl = drive (0x80 for hard disk, 0x0 for floppy disk)
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%es:%bx = segment:offset of buffer
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Return:
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = 0x0 on success; err code on failure
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$STAGE1_BUFFERSEG, %bx
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%bx, %es	/* load %es segment with disk buffer */
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%bx, %bx	/* %bx = 0, put it at 0 in the segment */
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x0201, %ax	/* function 2 */
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	read_error
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%es, %bx
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcopy_buffer:
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	ABS(stage2_segment), %es
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * We need to save %cx and %si because the startup code in
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * stage2 uses them without initializing them.
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pusha
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%ds
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x100, %cx
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%bx, %ds
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%si, %si
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%di, %di
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cld
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rep
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movsw
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%ds
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popa
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* boot stage2 */
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	*(stage2_address)
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* END OF MAIN LOOP */
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS Geometry translation error (past the end of the disk geometry!).
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error:
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(geometry_error_string)
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	general_error
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Disk probe failure.
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthd_probe_error:
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(hd_probe_error_string)
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	general_error
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Read error on the disk.
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error:
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(read_error_string)
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error:
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(general_error_string)
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* go here when you need to stop the machine hard after an error condition */
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop:	jmp	stop
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string:	.string "GRUB "
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error_string:	.string "Geom"
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthd_probe_error_string:	.string "Hard Disk"
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error_string:	.string "Read"
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error_string:	.string " Error"
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * message: write the string pointed to by %si
4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *   WARNING: trashes %si, %ax, and %bx
4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%ah = 0xe	%al = character
4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%bh = page	%bl = foreground color (graphics modes)
4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x0001, %bx
4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0xe, %ah
4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x10		/* display a byte */
4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmessage:
4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lodsb
4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpb	$0, %al
4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	1b	/* if not end of string, jmp to display */
4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  Windows NT breaks compatibility by embedding a magic
4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  number here.
4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + STAGE1_WINDOWS_NT_MAGIC
4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnt_magic:
4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long 0
4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  This is where an MBR would go if on a hard disk.  The code
4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  here isn't even referenced unless we're on a floppy.  Kinda
4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *  sneaky, huh?
4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectpart_start:
4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + STAGE1_PARTSTART
4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprobe_values:
4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte	36, 18, 15, 9, 0
4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfloppy_probe:
4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Perform floppy probe.
4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$ABS(probe_values-1), %si
4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprobe_loop:
4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* reset floppy controller INT 13h AH=0 */
4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%ax, %ax
4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incw	%si
4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	(%si), %cl
4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if number of sectors is 0, display error and die */
4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpb	$0, %cl
4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	1f
4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Floppy disk probe failure.
4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(fd_probe_error_string)
4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	general_error
4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfd_probe_error_string:	.string "Floppy"
4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* perform read */
4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$STAGE1_BUFFERSEG, %bx
4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x201, %ax
4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0, %ch
4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0, %dh
4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if error, jump to "probe_loop" */
4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	probe_loop
4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* %cl is already the correct value! */
4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$1, %dh
4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$79, %ch
4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	final_init
4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + STAGE1_PARTEND
4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* the last 2 bytes in the sector 0 contain the signature */
4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word	STAGE1_SIGNATURE
500