15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 1994-2002  H. Peter Anvin
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 1999,2000,2001,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
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project Most of this file was originally "isolinux.asm" from SYSLINUX package.
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project It has been very heavily modified.
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ASM_FILE
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "stage1.h"
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "shared.h"
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "iso9660.h"
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "stage2_size.h"
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Absolute addresses
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   This makes the assembler generate the address without support
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   from the linker. (ELF can't relocate 16-bit addresses!) */
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ABS(x)			(x-_start+BOOTSEC_LOCATION)
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define STAGE_ADDR		0x2000
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define STAGE_ADDR		0x8000
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* STAGE1_5 */
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Print message string */
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG(x)			mov $ABS(x), %si; call message;
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.file	"start_eltorito.S"
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.text
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Tell GAS to generate 16-bit instructions so that this code works
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   in real mode. */
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.code16
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.globl	start, _start
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Primary entry point.	 Because BIOSes are buggy, we only load the first
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CD-ROM sector (2K) of the file, so the number one priority is actually
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * loading the rest.
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstart:
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project_start:
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cli
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ljmp	$0, $ABS(real_start)
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + 8			    /* Pad to file offset 8 */
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		/* This table gets filled in by mkisofs using the
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		   -boot-info-table option */
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_pvd:		.long 0xDEADBEEF	    /* LBA of primary volume descript */
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_file:	.long 0xDEADBEEF	    /* LBA of boot file */
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_length:	.long 0xDEADBEEF	    /* Length of boot file */
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_csum:	.long 0xDEADBEEF	    /* Checksum of boot file */
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbi_reserved:	.space (10*4)		    /* Reserved */
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectreal_start:
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xor	%ax, %ax
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %ss
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %ds
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %es
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %fs
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %gs
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$STAGE1_STACKSEG, %sp	    /* set up the REAL stack */
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	sti
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cld
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save drive reference first thing! */
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%dl, ABS(BootDrive)
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* print a notification message on the screen */
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_string)
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectload_image:
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Set up boot file sector, size, load address */
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(bi_length), %eax
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	add	$(ISO_SECTOR_SIZE-1), %eax
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shr	$ISO_SECTOR_BITS, %eax	    /* dwords->sectors */
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %bp		    /* boot file sectors */
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$(STAGE_ADDR >> 4), %bx
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%bx, %es
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xor	%bx, %bx
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(bi_file), %eax
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	call	getlinsec
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ds, %ax
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ax, %es
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_done)
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootit:
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save the sector number of the second sector in %ebp */
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$ABS(firstlist - BOOTSEC_LISTSIZE), %si
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	(%si), %ebp
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(BootDrive), %dl	    /* this makes sure %dl is our "boot" drive */
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ljmp	$0, $(STAGE_ADDR+SECTOR_SIZE)  /* jump to main() in asm.S */
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* go here when you need to stop the machine hard after an error condition */
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop:	jmp	stop
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Get linear sectors - EBIOS LBA addressing, 2048-byte sectors.
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Note that we can't always do this as a single request, because at least
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Phoenix BIOSes has a 127-sector limit.  To be on the safe side, stick
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to 16 sectors (32K) per request.
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Input:
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	 EAX	 - Linear sector number
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	 ES:BX	 - Target buffer
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	 BP	 - Sector count
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgetlinsec:
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$ABS(dapa), %si		   /* Load up the DAPA */
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%bx, 4(%si)
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%es, %bx
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%bx, 6(%si)
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%eax, 8(%si)
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	push	%bp
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	push	%si
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmp	ABS(MaxTransfer), %bp
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jbe	2f
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(MaxTransfer), %bp
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2:
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%bp, 2(%si)
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(BootDrive), %dl
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$0x42, %ah		    /* Extended Read */
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	call	xint13
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pop	%si
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pop	%bp
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movzwl	2(%si), %eax		    /* Sectors we read */
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	add	%eax, 8(%si)		    /* Advance sector pointer */
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	sub	%ax, %bp		    /* Sectors left */
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shl	$(ISO_SECTOR_BITS-4), %ax   /* 2048-byte sectors -> segment */
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	add	%ax, 6(%si)		    /* Advance buffer pointer */
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushal
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_step)
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popal
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmp	$0, %bp
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ja	1b
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	8(%si), %eax		    /* Return next sector */
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * INT 13h with retry
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectxint13:
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$6, ABS(RetryCount)
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushal
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.try:
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	1f
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	add	$(8*4), %sp		    /* Clean up stack */
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ah, %dl		    /* Save error code */
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	decb	ABS(RetryCount)
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jz	.real_error
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(RetryCount), %al
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	ABS(dapa+2), %ah	    /* Sector transfer count */
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmp	$2, %al			    /* Only 2 attempts left */
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ja	2f
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$1, %ah			    /* Drop transfer size to 1 */
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	.setmaxtr
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2:
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmp	$3, %al
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ja	3f			    /* First time, just try again */
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shr	$1, %ah			    /* Otherwise, try to reduce */
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	adc	$0, %ah			    /* the max transfer size, but not */
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.setmaxtr:
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ah, ABS(MaxTransfer)
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%ah, ABS(dapa+2)
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project3:
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popal
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	.try
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.real_error:
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(read_error_string)
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	%dl, %al
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	call	printhex2
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popal
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	stop
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * message: write the string pointed to by %si
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *   WARNING: trashes %si, %ax, and %bx
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%ah = 0xe	%al = character
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%bh = page	%bl = foreground color (graphics modes)
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$0x0001, %bx
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$0x0E, %ah
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x10		/* display a byte */
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmessage:
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	lodsb
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	or	%al, %al
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	1b		/* if not end of string, jmp to display */
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * printhex[248]: Write a hex number in (AL, AX, EAX) to the console
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex2:
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushal
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rol	$24, %eax
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$2, %cx
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	1f
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex4:
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushal
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rol	$16, %eax
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$4, %cx
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	1f
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprinthex8:
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushal
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$8, %cx
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rol	$4, %eax
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	push	%eax
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	and	$0x0F, %al
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmp	$10, %al
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jae	.high
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.low:	add	$('0'), %al
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	2f
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project.high:	add	$('A'-10), %al
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2:
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$0x0001, %bx
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	mov	$0x0E, %ah
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x10		/* display a char */
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pop	%eax
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	loop	1b
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popal
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/**************************************************************************/
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string:	.string "Loading stage1.5 "
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string:	.string "Loading stage2 "
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_step:	.string "."
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_done:	.string "\r\n"
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error_string:	.string "Read error 0x"
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * EBIOS disk address packet
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.align 8
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdapa:		.byte 16		   /* Packet size */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.byte 0			   /* reserved */
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.word 0			   /* +2 Block count */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.word 0			   /* +4 Offset of buffer */
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.word 0			   /* +6 Segment of buffer */
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.long 0			   /* +8 LBA (LSW) */
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		.long 0			   /* +C LBA (MSW) */
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(BootDrive)
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte 0xFF
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(MaxTransfer)
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 16			   /* Max sectors per transfer (32Kb) */
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVARIABLE(RetryCount)
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.byte 0
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This area is an empty space between the main body of code below which
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  grows up (fixed after compilation, but between releases it may change
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  in size easily), and the lists of sectors to read, which grows down
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  from a fixed top location.
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* fill the first data listing with the default */
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_start:/* this is the sector start parameter, in logical
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   sectors from the start of the disk, sector 0 */
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long 0
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_len:	/* this is the number of sectors to read */
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word (STAGE2_SIZE + ISO_SECTOR_SIZE - 1) >> ISO_SECTOR_BITS
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_seg:	/* this is the segment of the starting address
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   to load the data into */
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word (STAGE_ADDR + SECTOR_SIZE) >> 4
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfirstlist:	/* this label has to be after the list data!!! */
327