15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GRUB  --  GRand Unified Bootloader
35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Copyright (C) 1999,2000,2001   Free Software Foundation, Inc.
45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is free software; you can redistribute it and/or modify
65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  it under the terms of the GNU General Public License as published by
75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  the Free Software Foundation; either version 2 of the License, or
85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  (at your option) any later version.
95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This program is distributed in the hope that it will be useful,
115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  GNU General Public License for more details.
145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  You should have received a copy of the GNU General Public License
165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  along with this program; if not, write to the Free Software
175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define ASM_FILE
215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h>
225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5
245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stage2_size.h>
255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  defines for the code go here
295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Absolute addresses
325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   This makes the assembler generate the address without support
335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   from the linker. (ELF can't relocate 16-bit addresses!) */
345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define ABS(x) (x-_start+0x2000)
365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define ABS(x) (x-_start+0x8000)
385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* STAGE1_5 */
395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Print message string */
415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MSG(x)	movw $ABS(x), %si; call message
425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.file	"start.S"
445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.text
465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* Tell GAS to generate 16-bit instructions so that this code works
485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   in real mode. */
495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.code16
505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.globl	start, _start
525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstart:
535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project_start:
545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * _start is loaded at 0x8000 and is jumped to with
565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * CS:IP 0:0x8000 in stage2.
575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * we continue to use the stack for stage1 and assume that
615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * some registers are set to correct values. See stage1.S
625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * for more information.
635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save drive reference first thing! */
665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%dx
675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* print a notification message on the screen */
695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%si
705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_string)
715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%si
725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* this sets up for the first run through "bootloop" */
745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$ABS(firstlist - BOOTSEC_LISTSIZE), %di
755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save the sector number of the second sector in %ebp */
775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	(%di), %ebp
785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        /* this is the loop for reading the secondary boot-loader in */
805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootloop:
815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* check the number of sectors to read */
835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	$0, 4(%di)
845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if zero, go to the start function */
865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	je	bootit
875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsetup_sectors:
895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* check if we use LBA or CHS */
905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpb	$0, -1(%si)
915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* jump to chs_mode if zero */
935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	je	chs_mode
945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlba_mode:
965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load logical sector start */
975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	(%di), %ebx
985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the maximum is limited to 0x7f because of Phoenix EDD */
1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%eax, %eax
1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x7f, %al
1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* how many do we really want to read? */
1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	%ax, 4(%di)	/* compare against total number of sectors */
1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* which is greater? */
1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jg	1f
1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if less than, set to total */
1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	4(%di), %ax
1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* subtract from total */
1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	subw	%ax, 4(%di)
1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* add into logical sector start */
1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	addl	%eax, (%di)
1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* set up disk address packet */
1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the size and the reserved byte */
1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x0010, (%si)
1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the number of sectors */
1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 2(%si)
1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the absolute address (low 32 bits) */
1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%ebx, 8(%si)
1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the segment of buffer address */
1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$BUFFERSEG, 6(%si)
1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save %ax from destruction! */
1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%ax
1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* zero %eax */
1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%eax, %eax
1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the offset of buffer address */
1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 4(%si)
1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* the absolute address (high 32 bits) */
1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	%eax, 12(%si)
1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory
1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Call with	%ah = 0x42
1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dl = drive number
1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%ds:%si = segment:offset of disk address packet
1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Return:
1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = 0x0 on success; err code on failure
1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x42, %ah
1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	read_error
1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$BUFFERSEG, %bx
1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	copy_buffer
1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchs_mode:
1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load logical sector start (bottom half) */
1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movl	(%di), %eax
1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* zero %edx */
1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%edx, %edx
1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* divide by number of sectors */
1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	divl	(%si)
1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save sector start */
1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dl, 10(%si)
1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorl	%edx, %edx	/* zero %edx */
1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	divl	4(%si)		/* divide by number of heads */
1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save head start */
1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	%dl, 11(%si)
1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save cylinder start */
1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, 12(%si)
1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* do we need too many cylinders? */
1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	8(%si), %ax
1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jge	geometry_error
1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* determine the maximum sector length of this read */
1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	(%si), %ax	/* get number of sectors per track/head */
1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* subtract sector start */
1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	subb	10(%si), %al
1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* how many do we really want to read? */
1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	%ax, 4(%di)	/* compare against total number of sectors */
1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* which is greater? */
2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jg	2f
2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* if less than, set to total */
2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	4(%di), %ax
2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project2:
2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* subtract from total */
2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	subw	%ax, 4(%di)
2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* add into logical sector start */
2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	addl	%eax, (%di)
2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This is the loop for taking care of BIOS geometry translation (ugh!)
2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* get high bits of cylinder */
2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	13(%si), %dl
2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shlb	$6, %dl		/* shift left by 6 bits */
2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	10(%si), %cl	/* get sector */
2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incb	%cl		/* normalize sector (sectors go
2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project					from 1-N, not 0-(N-1) ) */
2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	orb	%dl, %cl	/* composite together */
2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	12(%si), %ch	/* sector+hcyl in cl, cylinder in ch */
2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* restore %dx */
2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%dx
2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%dx
2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* head number */
2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	11(%si), %dh
2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%ax	/* save %ax from destruction! */
2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory
2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Call with	%ah = 0x2
2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = number of sectors
2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%ch = cylinder
2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%cl = sector (bits 6-7 are high bits of "cylinder")
2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dh = head
2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%dl = drive (0x80 for hard disk, 0x0 for floppy disk)
2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%es:%bx = segment:offset of buffer
2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *	Return:
2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *			%al = 0x0 on success; err code on failure
2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$BUFFERSEG, %bx
2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%bx, %es	/* load %es segment with disk buffer */
2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%bx, %bx	/* %bx = 0, put it at 0 in the segment */
2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0x2, %ah	/* function 2 */
2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x13
2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jc	read_error
2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save source segment */
2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%es, %bx
2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcopy_buffer:
2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* load addresses for copy from disk buffer to destination */
2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	6(%di), %es	/* load destination segment */
2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* restore %ax */
2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%ax
2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* determine the next possible destination address (presuming
2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project		512 byte sectors!) */
2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shlw	$5, %ax		/* shift %ax five bits to the left */
2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	addw	%ax, 6(%di)	/* add the corrected value to the destination
2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project				   address for next time */
2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* save addressing regs */
2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pusha
2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	pushw	%ds
2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* get the copy length */
2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	shlw	$4, %ax
2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%ax, %cx
2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%di, %di	/* zero offset of destination addresses */
2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	xorw	%si, %si	/* zero offset of source addresses */
2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	%bx, %ds	/* restore the source segment */
2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cld		/* sets the copy direction to forward */
2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* perform copy */
2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	rep		/* sets a repeat */
2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movsb		/* this runs the actual copy */
2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* restore addressing regs and print a dot with correct DS
2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	   (MSG modifies SI, which is saved, and unused AX and BX) */
2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%ds
2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_step)
2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popa
2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* check if finished with this dataset */
3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpw	$0, 4(%di)
3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	setup_sectors
3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* update position to load from */
3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	subw	$BOOTSEC_LISTSIZE, %di
3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* jump to bootloop */
3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	bootloop
3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* END OF MAIN LOOP */
3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootit:
3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/* print a newline */
3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(notification_done)
3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	popw	%dx	/* this makes sure %dl is our "boot" drive */
3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ljmp	$0, $0x2200
3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else /* ! STAGE1_5 */
3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ljmp	$0, $0x8200
3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* ! STAGE1_5 */
3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * BIOS Geometry translation error (past the end of the disk geometry!).
3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error:
3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(geometry_error_string)
3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jmp	general_error
3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Read error on the disk.
3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error:
3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(read_error_string)
3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error:
3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	MSG(general_error_string)
3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* go here when you need to stop the machine hard after an error condition */
3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop:	jmp	stop
3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string:	.string "Loading stage1.5"
3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_string:	.string "Loading stage2"
3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_step:	.string "."
3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnotification_done:	.string "\r\n"
3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeometry_error_string:	.string "Geom"
3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectread_error_string:	.string "Read"
3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgeneral_error_string:	.string " Error"
3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * message: write the string pointed to by %si
3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *
3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *   WARNING: trashes %si, %ax, and %bx
3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	/*
3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%ah = 0xe	%al = character
3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 *	%bh = page	%bl = foreground color (graphics modes)
3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	 */
3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project1:
3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movw	$0x0001, %bx
3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	$0xe, %ah
3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	int	$0x10		/* display a byte */
3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	incw	%si
3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmessage:
3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	movb	(%si), %al
3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	cmpb	$0, %al
3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	jne	1b	/* if not end of string, jmp to display */
3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	ret
3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlastlist:
3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/*
3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  This area is an empty space between the main body of code below which
3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  grows up (fixed after compilation, but between releases it may change
3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  in size easily), and the lists of sectors to read, which grows down
3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *  from a fixed top location.
3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */
3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0
3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	. = _start + 0x200 - BOOTSEC_LISTSIZE
3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project        /* fill the first data listing with the default */
3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_start:
3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.long 2		/* this is the sector start parameter, in logical
3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   sectors from the start of the disk, sector 0 */
3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_len:
3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			/* this is the number of sectors to read */
3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0		/* the command "install" will fill this up */
3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word (STAGE2_SIZE + 511) >> 9
4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectblocklist_default_seg:
4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef STAGE1_5
4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0x220
4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else
4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project	.word 0x820	/* this is the segment of the starting address
4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project			   to load the data into */
4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif
4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project
4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfirstlist:	/* this label has to be after the list data!!! */
410