start.S revision 5b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4
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