- 论坛徽章:
- 0
|
[color="#ffffff"] 1 /* -*-[color="#98fb98"]Asm-*- */
[color="#ffff00"] 2 /*
[color="#ffff00"] 3 * [color="#98fb98"]GRUB -- [color="#98fb98"]GRand [color="#98fb98"]Unified [color="#98fb98"]Bootloader
[color="#ffff00"] 4 * [color="#98fb98"]Copyright ([color="#98fb98"]C) [color="#ffa0a0"]1999,[color="#ffa0a0"]2000,[color="#ffa0a0"]2001,[color="#ffa0a0"]2002,[color="#ffa0a0"]2004 [color="#98fb98"]Free [color="#98fb98"]Software [color="#98fb98"]Foundation, [color="#98fb98"]Inc.
[color="#ffff00"] 5 *
[color="#ffff00"] 6 * [color="#98fb98"]This [color="#98fb98"]program [color="#98fb98"]is [color="#98fb98"]free [color="#98fb98"]software;[color="#87ceeb"] you can redistribute it and/or modify
[color="#ffff00"] 7 * [color="#98fb98"]it [color="#98fb98"]under [color="#98fb98"]the [color="#98fb98"]terms [color="#98fb98"]of [color="#98fb98"]the [color="#98fb98"]GNU [color="#98fb98"]General [color="#98fb98"]Public [color="#98fb98"]License [color="#98fb98"]as [color="#98fb98"]published [color="#98fb98"]by
[color="#ffff00"] 8 * [color="#98fb98"]the [color="#98fb98"]Free [color="#98fb98"]Software [color="#98fb98"]Foundation;[color="#87ceeb"] either version 2 of the License, or
[color="#ffff00"] 9 * ([color="#98fb98"]at [color="#98fb98"]your [color="#98fb98"]option) [color="#98fb98"]any [color="#98fb98"]later [color="#98fb98"]version.
[color="#ffff00"] 10 *
[color="#ffff00"] 11 * [color="#98fb98"]This [color="#98fb98"]program [color="#98fb98"]is [color="#98fb98"]distributed [color="#98fb98"]in [color="#98fb98"]the [color="#98fb98"]hope [color="#98fb98"]that [color="#98fb98"]it [color="#98fb98"]will [color="#98fb98"]be [color="#98fb98"]useful,
[color="#ffff00"] 12 * [color="#98fb98"]but [color="#98fb98"]WITHOUT [color="#98fb98"]ANY [color="#98fb98"]WARRANTY;[color="#87ceeb"] without even the implied warranty of
[color="#ffff00"] 13 * [color="#98fb98"]MERCHANTABILITY [color="#98fb98"]or [color="#98fb98"]FITNESS [color="#98fb98"]FOR [color="#98fb98"]A [color="#98fb98"]PARTICULAR [color="#98fb98"]PURPOSE. [color="#98fb98"]See [color="#98fb98"]the
[color="#ffff00"] 14 * [color="#98fb98"]GNU [color="#98fb98"]General [color="#98fb98"]Public [color="#98fb98"]License [color="#98fb98"]for [color="#98fb98"]more [color="#98fb98"]details.
[color="#ffff00"] 15 *
[color="#ffff00"] 16 * [color="#98fb98"]You [color="#98fb98"]should [color="#98fb98"]have [color="#98fb98"]received [color="#98fb98"]a [color="#98fb98"]copy [color="#98fb98"]of [color="#98fb98"]the [color="#98fb98"]GNU [color="#98fb98"]General [color="#98fb98"]Public [color="#98fb98"]License
[color="#ffff00"] 17 * [color="#98fb98"]along [color="#98fb98"]with [color="#98fb98"]this [color="#98fb98"]program;[color="#87ceeb"] if not, write to the Free Software
[color="#ffff00"] 18 * [color="#98fb98"]Foundation, [color="#98fb98"]Inc., [color="#ffa0a0"]675 [color="#98fb98"]Mass [color="#98fb98"]Ave, [color="#98fb98"]Cambridge, [color="#98fb98"]MA [color="#ffa0a0"]0213[color="#ffa0a0"]9, [color="#98fb98"]USA.
[color="#ffff00"] 19 */
[color="#ffff00"] 20
[color="#ffff00"] 21 #[color="#98fb98"]include
[color="#ffff00"] 22
[color="#ffff00"] 23 /*
[color="#ffff00"] 24 * [color="#98fb98"]defines [color="#98fb98"]for [color="#98fb98"]the [color="#98fb98"]code [color="#98fb98"]go [color="#98fb98"]here
[color="#ffff00"] 25 */
[color="#ffff00"] 26
[color="#ffff00"] 27 /* [color="#98fb98"]Absolute [color="#98fb98"]addresses
[color="#ffff00"] 28 [color="#98fb98"]This [color="#98fb98"]makes [color="#98fb98"]the [color="#98fb98"]assembler [color="#98fb98"]generate [color="#98fb98"]the [color="#98fb98"]address [color="#98fb98"]without [color="#98fb98"]support
[color="#ffff00"] 29 [color="#98fb98"]from [color="#98fb98"]the [color="#98fb98"]linker. ([color="#98fb98"]ELF [color="#98fb98"]can'[color="#98fb98"]t [color="#98fb98"]relocate [color="#ffa0a0"]16-[color="#98fb98"]bit [color="#98fb98"]addresses!) */
[color="#ffff00"] 30 #[color="#98fb98"]define [color="#98fb98"]ABS([color="#98fb98"]x) ([color="#98fb98"]x-[color="#98fb98"]_start+[color="#ffa0a0"]0x7c00)
[color="#ffff00"] 31
[color="#ffff00"] 32 /* [color="#98fb98"]Print [color="#98fb98"]message [color="#98fb98"]string */
[color="#ffff00"] 33 #[color="#98fb98"]define [color="#98fb98"]MSG([color="#98fb98"]x) [color="#98fb98"]movw $[color="#98fb98"]ABS([color="#98fb98"]x), %[color="#98fb98"]si;[color="#87ceeb"] call message
[color="#ffff00"] 34
[color="#ffff00"] 35 /* [color="#98fb98"]XXX: [color="#98fb98"]binutils-[color="#ffa0a0"]2.[color="#ffa0a0"]9.[color="#ffa0a0"]1.0.[color="#98fb98"]x [color="#98fb98"]doesn'[color="#98fb98"]t [color="#98fb98"]produce [color="#98fb98"]a [color="#98fb98"]short [color="#98fb98"]opcode [color="#98fb98"]for [color="#98fb98"]this. */
[color="#ffff00"] 36 #[color="#98fb98"]define [color="#98fb98"]MOV_MEM_TO_AL([color="#98fb98"]x) [color="#f0e68c"].byte [color="#ffa0a0"]0xa0;[color="#87ceeb"] .word x
[color="#ffff00"] 37
[color="#ffff00"] 38 [color="#f0e68c"].file "[color="#98fb98"]stage1.[color="#98fb98"]S"
[color="#ffff00"] 39
[color="#ffff00"] 40 [color="#f0e68c"].text
[color="#ffff00"] 41
[color="#ffff00"] 42 /* [color="#98fb98"]Tell [color="#98fb98"]GAS [color="#98fb98"]to [color="#98fb98"]generate [color="#ffa0a0"]16-[color="#98fb98"]bit [color="#98fb98"]instructions [color="#98fb98"]so [color="#98fb98"]that [color="#98fb98"]this [color="#98fb98"]code [color="#98fb98"]works
[color="#ffff00"] 43 [color="#98fb98"]in [color="#98fb98"]real [color="#98fb98"]mode. */
[color="#ffff00"] 44 [color="#f0e68c"].code[color="#ffa0a0"]16
[color="#ffff00"] 45
[color="#ffff00"] 46 [color="#f0e68c"].globl [color="#98fb98"]_start;[color="#87ceeb"] _start:
[color="#ffff00"] 47 /*
[color="#ffff00"] 48 * [color="#98fb98"]_start [color="#98fb98"]is [color="#98fb98"]loaded [color="#98fb98"]at [color="#ffa0a0"]0x7c00 [color="#98fb98"]and [color="#98fb98"]is [color="#98fb98"]jumped [color="#98fb98"]to [color="#98fb98"]with [color="#98fb98"]CS:[color="#98fb98"]IP 0:[color="#ffa0a0"]0x7c00
[color="#ffff00"] 49 */
[color="#ffff00"] 50
[color="#ffff00"] 51 /*
[color="#ffff00"] 52 * [color="#98fb98"]Beginning [color="#98fb98"]of [color="#98fb98"]the [color="#98fb98"]sector [color="#98fb98"]is [color="#98fb98"]compatible [color="#98fb98"]with [color="#98fb98"]the [color="#98fb98"]FAT/[color="#98fb98"]HPFS [color="#98fb98"]BIOS
[color="#ffff00"] 53 * [color="#98fb98"]parameter [color="#98fb98"]block.
[color="#ffff00"] 54 */
[color="#ffff00"] 55
[color="#ffff00"] 56 [color="#98fb98"]jmp [color="#98fb98"]after_BPB
[color="#ffff00"] 57 [color="#98fb98"]nop /* [color="#98fb98"]do [color="#98fb98"]I [color="#98fb98"]care [color="#98fb98"]about [color="#98fb98"]this ??? */
[color="#ffff00"] 58
[color="#ffff00"] 59 /*
[color="#ffff00"] 60 * [color="#98fb98"]This [color="#98fb98"]space [color="#98fb98"]is [color="#98fb98"]for [color="#98fb98"]the [color="#98fb98"]BIOS [color="#98fb98"]parameter [color="#98fb98"]block!!!! [color="#98fb98"]Don'[color="#98fb98"]t [color="#98fb98"]change
[color="#ffff00"] 61 * [color="#98fb98"]the [color="#98fb98"]first [color="#98fb98"]jump, [color="#98fb98"]nor [color="#98fb98"]start [color="#98fb98"]the [color="#98fb98"]code [color="#98fb98"]anywhere [color="#98fb98"]but [color="#98fb98"]right [color="#98fb98"]after
[color="#ffff00"] 62 * [color="#98fb98"]this [color="#98fb98"]area.
[color="#ffff00"] 63 */
[color="#ffff00"] 64
[color="#ffff00"] 65 . = [color="#98fb98"]_start + [color="#ffa0a0"]4
[color="#ffff00"] 66
[color="#ffff00"] 67 /* [color="#98fb98"]scratch [color="#98fb98"]space */
[color="#ffff00"] 68 [color="#98fb98"]mode:
[color="#ffff00"] 69 [color="#f0e68c"].byte [color="#ffa0a0"]0
[color="#ffff00"] 70 [color="#98fb98"]disk_address_packet:
[color="#ffff00"] 71 [color="#98fb98"]sectors:
[color="#ffff00"] 72 [color="#f0e68c"].long [color="#ffa0a0"]0
[color="#ffff00"] 73 [color="#98fb98"]heads:
[color="#ffff00"] 74 [color="#f0e68c"].long [color="#ffa0a0"]0
[color="#ffff00"] 75 [color="#98fb98"]cylinders:
[color="#ffff00"] 76 [color="#f0e68c"].word [color="#ffa0a0"]0
[color="#ffff00"] 77 [color="#98fb98"]sector_start:
[color="#ffff00"] 78 [color="#f0e68c"].byte [color="#ffa0a0"]0
[color="#ffff00"] 79 [color="#98fb98"]head_start:
[color="#ffff00"] 80 [color="#f0e68c"].byte [color="#ffa0a0"]0
[color="#ffff00"] 81 [color="#98fb98"]cylinder_start:
[color="#ffff00"] 82 [color="#f0e68c"].word [color="#ffa0a0"]0
[color="#ffff00"] 83 /* [color="#98fb98"]more [color="#98fb98"]space... */
[color="#ffff00"] 84
[color="#ffff00"] 85 . = [color="#98fb98"]_start + [color="#98fb98"]STAGE1_BPBEND
[color="#ffff00"] 86
[color="#ffff00"] 87 /*
[color="#ffff00"] 88 * [color="#98fb98"]End [color="#98fb98"]of [color="#98fb98"]BIOS [color="#98fb98"]parameter [color="#98fb98"]block.
[color="#ffff00"] 89 */
[color="#ffff00"] 90
[color="#ffff00"] 91 [color="#98fb98"]stage1_version:
[color="#ffff00"] 92 [color="#f0e68c"].byte [color="#98fb98"]COMPAT_VERSION_MAJOR, [color="#98fb98"]COMPAT_VERSION_MINOR
[color="#ffff00"] 93 [color="#98fb98"]boot_drive:
[color="#ffff00"] 94 [color="#f0e68c"].byte [color="#98fb98"]GRUB_INVALID_DRIVE /* [color="#98fb98"]the [color="#98fb98"]disk [color="#98fb98"]to [color="#98fb98"]load [color="#98fb98"]stage2 [color="#98fb98"]from */
[color="#ffff00"] 95 [color="#98fb98"]force_lba:
[color="#ffff00"] 96 [color="#f0e68c"].byte [color="#ffa0a0"]0
[color="#ffff00"] 97 [color="#98fb98"]stage2_address:
[color="#ffff00"] 98 [color="#f0e68c"].word [color="#ffa0a0"]0x8000
[color="#ffff00"] 99 [color="#98fb98"]stage2_sector:
[color="#ffff00"]100 [color="#f0e68c"].long [color="#ffa0a0"]1
[color="#ffff00"]101 [color="#98fb98"]stage2_segment:
[color="#ffff00"]102 [color="#f0e68c"].word [color="#ffa0a0"]0x800
[color="#ffff00"]103
[color="#ffff00"]104 [color="#98fb98"]after_BPB:
[color="#ffff00"]105
[color="#ffff00"]106 /* [color="#98fb98"]general [color="#98fb98"]setup */
[color="#ffff00"]107 [color="#98fb98"]cli /* [color="#98fb98"]we'[color="#98fb98"]re [color="#98fb98"]not [color="#98fb98"]safe [color="#98fb98"]here! */
[color="#ffff00"]108
[color="#ffff00"]109 /*
[color="#ffff00"]110 * [color="#98fb98"]This [color="#98fb98"]is [color="#98fb98"]a [color="#98fb98"]workaround [color="#98fb98"]for [color="#98fb98"]buggy [color="#98fb98"]BIOSes [color="#98fb98"]which [color="#98fb98"]don'[color="#98fb98"]t [color="#98fb98"]pass [color="#98fb98"]boot
[color="#ffff00"]111 * [color="#98fb98"]drive [color="#98fb98"]correctly. [color="#98fb98"]If [color="#98fb98"]GRUB [color="#98fb98"]is [color="#98fb98"]installed [color="#98fb98"]into [color="#98fb98"]a [color="#98fb98"]HDD, [color="#98fb98"]check [color="#98fb98"]if
[color="#ffff00"]112 * [color="#98fb98"]DL [color="#98fb98"]is [color="#98fb98"]masked [color="#98fb98"]correctly. [color="#98fb98"]If [color="#98fb98"]not, [color="#98fb98"]assume [color="#98fb98"]that [color="#98fb98"]the [color="#98fb98"]BIOS [color="#98fb98"]passed
[color="#ffff00"]113 * [color="#98fb98"]a [color="#98fb98"]bogus [color="#98fb98"]value [color="#98fb98"]and [color="#98fb98"]set [color="#98fb98"]DL [color="#98fb98"]to [color="#ffa0a0"]0x80, [color="#98fb98"]since [color="#98fb98"]this [color="#98fb98"]is [color="#98fb98"]the [color="#98fb98"]only
[color="#ffff00"]114 * [color="#98fb98"]possible [color="#98fb98"]boot [color="#98fb98"]drive. [color="#98fb98"]If [color="#98fb98"]GRUB [color="#98fb98"]is [color="#98fb98"]installed [color="#98fb98"]into [color="#98fb98"]a [color="#98fb98"]floppy,
[color="#ffff00"]115 * [color="#98fb98"]this [color="#98fb98"]does [color="#98fb98"]nothing ([color="#98fb98"]only [color="#98fb98"]jump).
[color="#ffff00"]116 */
[color="#ffff00"]117 [color="#98fb98"]boot_drive_check:
[color="#ffff00"]118 [color="#98fb98"]jmp [color="#ffa0a0"]1[color="#98fb98"]f
[color="#ffff00"]119 [color="#98fb98"]testb $[color="#ffa0a0"]0x80, %[color="#98fb98"]dl
[color="#ffff00"]120 [color="#98fb98"]jnz [color="#ffa0a0"]1[color="#98fb98"]f
[color="#ffff00"]121 [color="#98fb98"]movb $[color="#ffa0a0"]0x80, %[color="#98fb98"]dl
[color="#ffff00"]122 [color="#ffa0a0"]1:
[color="#ffff00"]123
[color="#ffff00"]124 /*
[color="#ffff00"]125 * [color="#98fb98"]ljmp [color="#98fb98"]to [color="#98fb98"]the [color="#98fb98"]next [color="#98fb98"]instruction [color="#98fb98"]because [color="#98fb98"]some [color="#98fb98"]bogus [color="#98fb98"]BIOSes
[color="#ffff00"]126 * [color="#98fb98"]jump [color="#98fb98"]to 0[color="#ffa0a0"]7[color="#98fb98"]C0:[color="#ffa0a0"]0000 [color="#98fb98"]instead [color="#98fb98"]of [color="#ffa0a0"]0000:[color="#ffa0a0"]7[color="#98fb98"]C00.
[color="#ffff00"]127 */
[color="#ffff00"]128 [color="#98fb98"]ljmp $[color="#ffa0a0"]0, $[color="#98fb98"]ABS([color="#98fb98"]real_start)
[color="#ffff00"]129
[color="#ffff00"]130 [color="#98fb98"]real_start:
[color="#ffff00"]131
[color="#ffff00"]132 /* [color="#98fb98"]set [color="#98fb98"]up %[color="#98fb98"]ds [color="#98fb98"]and %[color="#98fb98"]ss [color="#98fb98"]as [color="#98fb98"]offset [color="#98fb98"]from [color="#ffa0a0"]0 */
[color="#ffff00"]133 [color="#98fb98"]xorw %[color="#98fb98"]ax, %[color="#98fb98"]ax
[color="#ffff00"]134 [color="#98fb98"]movw %[color="#98fb98"]ax, %[color="#98fb98"]ds
[color="#ffff00"]135 [color="#98fb98"]movw %[color="#98fb98"]ax, %[color="#98fb98"]ss
[color="#ffff00"]136
[color="#ffff00"]137 /* [color="#98fb98"]set [color="#98fb98"]up [color="#98fb98"]the [color="#98fb98"]REAL [color="#98fb98"]stack */
[color="#ffff00"]138 [color="#98fb98"]movw $[color="#98fb98"]STAGE1_STACKSEG, %[color="#98fb98"]sp
[color="#ffff00"]139
[color="#ffff00"]140 [color="#98fb98"]sti /* [color="#98fb98"]we'[color="#98fb98"]re [color="#98fb98"]safe [color="#98fb98"]again */
[color="#ffff00"]141
[color="#ffff00"]142 /*
[color="#ffff00"]143 * [color="#98fb98"]Check [color="#98fb98"]if [color="#98fb98"]we [color="#98fb98"]have [color="#98fb98"]a [color="#98fb98"]forced [color="#98fb98"]disk [color="#98fb98"]reference [color="#98fb98"]here
[color="#ffff00"]144 */
[color="#ffff00"]145 [color="#98fb98"]MOV_MEM_TO_AL([color="#98fb98"]ABS([color="#98fb98"]boot_drive)) /* [color="#98fb98"]movb [color="#98fb98"]ABS([color="#98fb98"]boot_drive), %[color="#98fb98"]al */
[color="#ffff00"]146 [color="#98fb98"]cmpb $[color="#98fb98"]GRUB_INVALID_DRIVE, %[color="#98fb98"]al
[color="#ffff00"]147 [color="#98fb98"]je [color="#ffa0a0"]1[color="#98fb98"]f
[color="#ffff00"]148 [color="#98fb98"]movb %[color="#98fb98"]al, %[color="#98fb98"]dl
[color="#ffff00"]149 [color="#ffa0a0"]1:
[color="#ffff00"]150 /* [color="#98fb98"]save [color="#98fb98"]drive [color="#98fb98"]reference [color="#98fb98"]first [color="#98fb98"]thing! */
[color="#ffff00"]151 [color="#98fb98"]pushw %[color="#98fb98"]dx
[color="#ffff00"]152
[color="#ffff00"]153 /* [color="#98fb98"]print [color="#98fb98"]a [color="#98fb98"]notification [color="#98fb98"]message [color="#98fb98"]on [color="#98fb98"]the [color="#98fb98"]screen */
[color="#ffff00"]154 [color="#98fb98"]MSG([color="#98fb98"]notification_string)
[color="#ffff00"]155
[color="#ffff00"]156 /* [color="#98fb98"]do [color="#98fb98"]not [color="#98fb98"]probe [color="#98fb98"]LBA [color="#98fb98"]if [color="#98fb98"]the [color="#98fb98"]drive [color="#98fb98"]is [color="#98fb98"]a [color="#98fb98"]floppy */
[color="#ffff00"]157 [color="#98fb98"]testb $[color="#98fb98"]STAGE1_BIOS_HD_FLAG, %[color="#98fb98"]dl
[color="#ffff00"]158 [color="#98fb98"]jz [color="#98fb98"]chs_mode
[color="#ffff00"]159
[color="#ffff00"]160 /* [color="#98fb98"]check [color="#98fb98"]if [color="#98fb98"]LBA [color="#98fb98"]is [color="#98fb98"]supported */
[color="#ffff00"]161 [color="#98fb98"]movb $[color="#ffa0a0"]0x41, %[color="#98fb98"]ah
[color="#ffff00"]162 [color="#98fb98"]movw $[color="#ffa0a0"]0x55aa, %[color="#98fb98"]bx
[color="#ffff00"]163 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]164
[color="#ffff00"]165 /*
[color="#ffff00"]166 * %[color="#98fb98"]dl [color="#98fb98"]may [color="#98fb98"]have [color="#98fb98"]been [color="#98fb98"]clobbered [color="#98fb98"]by [color="#98fb98"]INT [color="#ffa0a0"]13, [color="#98fb98"]AH=[color="#ffa0a0"]41[color="#98fb98"]H.
[color="#ffff00"]167 * [color="#98fb98"]This [color="#98fb98"]happens, [color="#98fb98"]for [color="#98fb98"]example, [color="#98fb98"]with [color="#98fb98"]AST [color="#98fb98"]BIOS [color="#ffa0a0"]1.0[color="#ffa0a0"]4.
[color="#ffff00"]168 */
[color="#ffff00"]169 [color="#98fb98"]popw %[color="#98fb98"]dx
[color="#ffff00"]170 [color="#98fb98"]pushw %[color="#98fb98"]dx
[color="#ffff00"]171
[color="#ffff00"]172 /* [color="#98fb98"]use [color="#98fb98"]CHS [color="#98fb98"]if [color="#98fb98"]fails */
[color="#ffff00"]173 [color="#98fb98"]jc [color="#98fb98"]chs_mode
[color="#ffff00"]174 [color="#98fb98"]cmpw $[color="#ffa0a0"]0xaa55, %[color="#98fb98"]bx
[color="#ffff00"]175 [color="#98fb98"]jne [color="#98fb98"]chs_mode
[color="#ffff00"]176
[color="#ffff00"]177 /* [color="#98fb98"]check [color="#98fb98"]if [color="#98fb98"]AH=[color="#ffa0a0"]0x42 [color="#98fb98"]is [color="#98fb98"]supported [color="#98fb98"]if [color="#98fb98"]FORCE_LBA [color="#98fb98"]is [color="#98fb98"]zero */
[color="#ffff00"]178 [color="#98fb98"]MOV_MEM_TO_AL([color="#98fb98"]ABS([color="#98fb98"]force_lba)) /* [color="#98fb98"]movb [color="#98fb98"]ABS([color="#98fb98"]force_lba), %[color="#98fb98"]al */
[color="#ffff00"]179 [color="#98fb98"]testb %[color="#98fb98"]al, %[color="#98fb98"]al
[color="#ffff00"]180 [color="#98fb98"]jnz [color="#98fb98"]lba_mode
[color="#ffff00"]181 [color="#98fb98"]andw $[color="#ffa0a0"]1, %[color="#98fb98"]cx
[color="#ffff00"]182 [color="#98fb98"]jz [color="#98fb98"]chs_mode
[color="#ffff00"]183
[color="#ffff00"]184 [color="#98fb98"]lba_mode:
[color="#ffff00"]185 /* [color="#98fb98"]save [color="#98fb98"]the [color="#98fb98"]total [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]sectors */
[color="#ffff00"]186 [color="#98fb98"]movl [color="#ffa0a0"]0x10(%[color="#98fb98"]si), %[color="#98fb98"]ecx
[color="#ffff00"]187
[color="#ffff00"]188 /* [color="#98fb98"]set %[color="#98fb98"]si [color="#98fb98"]to [color="#98fb98"]the [color="#98fb98"]disk [color="#98fb98"]address [color="#98fb98"]packet */
[color="#ffff00"]189 [color="#98fb98"]movw $[color="#98fb98"]ABS([color="#98fb98"]disk_address_packet), %[color="#98fb98"]si
[color="#ffff00"]190
[color="#ffff00"]191 /* [color="#98fb98"]set [color="#98fb98"]the [color="#98fb98"]mode [color="#98fb98"]to [color="#98fb98"]non-[color="#98fb98"]zero */
[color="#ffff00"]192 [color="#98fb98"]movb $[color="#ffa0a0"]1, -[color="#ffa0a0"]1(%[color="#98fb98"]si)
[color="#ffff00"]193
[color="#ffff00"]194 [color="#98fb98"]movl [color="#98fb98"]ABS([color="#98fb98"]stage2_sector), %[color="#98fb98"]ebx
[color="#ffff00"]195
[color="#ffff00"]196 /* [color="#98fb98"]the [color="#98fb98"]size [color="#98fb98"]and [color="#98fb98"]the [color="#98fb98"]reserved [color="#98fb98"]byte */
[color="#ffff00"]197 [color="#98fb98"]movw $[color="#ffa0a0"]0x0010, (%[color="#98fb98"]si)
[color="#ffff00"]198
[color="#ffff00"]199 /* [color="#98fb98"]the [color="#98fb98"]blocks */
[color="#ffff00"]200 [color="#98fb98"]movw $[color="#ffa0a0"]1, [color="#ffa0a0"]2(%[color="#98fb98"]si)
[color="#ffff00"]201
[color="#ffff00"]202 /* [color="#98fb98"]the [color="#98fb98"]absolute [color="#98fb98"]address ([color="#98fb98"]low [color="#ffa0a0"]32 [color="#98fb98"]bits) */
[color="#ffff00"]203 [color="#98fb98"]movl %[color="#98fb98"]ebx, [color="#ffa0a0"]8(%[color="#98fb98"]si)
[color="#ffff00"]204
[color="#ffff00"]205 /* [color="#98fb98"]the [color="#98fb98"]segment [color="#98fb98"]of [color="#98fb98"]buffer [color="#98fb98"]address */
[color="#ffff00"]206 [color="#98fb98"]movw $[color="#98fb98"]STAGE1_BUFFERSEG, [color="#ffa0a0"]6(%[color="#98fb98"]si)
[color="#ffff00"]207
[color="#ffff00"]208 [color="#98fb98"]xorl %[color="#98fb98"]eax, %[color="#98fb98"]eax
[color="#ffff00"]209 [color="#98fb98"]movw %[color="#98fb98"]ax, [color="#ffa0a0"]4(%[color="#98fb98"]si)
[color="#ffff00"]210 [color="#98fb98"]movl %[color="#98fb98"]eax, [color="#ffa0a0"]12(%[color="#98fb98"]si)
[color="#ffff00"]211
[color="#ffff00"]212 /*
[color="#ffff00"]213 * [color="#98fb98"]BIOS [color="#98fb98"]call "[color="#98fb98"]INT [color="#ffa0a0"]0x13 [color="#98fb98"]Function [color="#ffa0a0"]0x42" [color="#98fb98"]to [color="#98fb98"]read [color="#98fb98"]sectors [color="#98fb98"]from [color="#98fb98"]disk [color="#98fb98"]into [color="#98fb98"]memory
[color="#ffff00"]214 * [color="#98fb98"]Call [color="#98fb98"]with %[color="#98fb98"]ah = [color="#ffa0a0"]0x42
[color="#ffff00"]215 * %[color="#98fb98"]dl = [color="#98fb98"]drive [color="#98fb98"]number
[color="#ffff00"]216 * %[color="#98fb98"]ds:%[color="#98fb98"]si = [color="#98fb98"]segment:[color="#98fb98"]offset [color="#98fb98"]of [color="#98fb98"]disk [color="#98fb98"]address [color="#98fb98"]packet
[color="#ffff00"]217 * [color="#98fb98"]Return:
[color="#ffff00"]218 * %[color="#98fb98"]al = [color="#ffa0a0"]0x0 [color="#98fb98"]on [color="#98fb98"]success;[color="#87ceeb"] err code on failure
[color="#ffff00"]219 */
[color="#ffff00"]220
[color="#ffff00"]221 [color="#98fb98"]movb $[color="#ffa0a0"]0x42, %[color="#98fb98"]ah
[color="#ffff00"]222 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]223
[color="#ffff00"]224 /* [color="#98fb98"]LBA [color="#98fb98"]read [color="#98fb98"]is [color="#98fb98"]not [color="#98fb98"]supported, [color="#98fb98"]so [color="#98fb98"]fallback [color="#98fb98"]to [color="#98fb98"]CHS. */
[color="#ffff00"]225 [color="#98fb98"]jc [color="#98fb98"]chs_mode
[color="#ffff00"]226
[color="#ffff00"]227 [color="#98fb98"]movw $[color="#98fb98"]STAGE1_BUFFERSEG, %[color="#98fb98"]bx
[color="#ffff00"]228 [color="#98fb98"]jmp [color="#98fb98"]copy_buffer
[color="#ffff00"]229
[color="#ffff00"]230 [color="#98fb98"]chs_mode:
[color="#ffff00"]231 /*
[color="#ffff00"]232 * [color="#98fb98"]Determine [color="#98fb98"]the [color="#98fb98"]hard [color="#98fb98"]disk [color="#98fb98"]geometry [color="#98fb98"]from [color="#98fb98"]the [color="#98fb98"]BIOS!
[color="#ffff00"]233 * [color="#98fb98"]We [color="#98fb98"]do [color="#98fb98"]this [color="#98fb98"]first, [color="#98fb98"]so [color="#98fb98"]that [color="#98fb98"]LS-[color="#ffa0a0"]120 [color="#98fb98"]IDE [color="#98fb98"]floppies [color="#98fb98"]work [color="#98fb98"]correctly.
[color="#ffff00"]234 */
[color="#ffff00"]235 [color="#98fb98"]movb $[color="#ffa0a0"]8, %[color="#98fb98"]ah
[color="#ffff00"]236 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]237 [color="#98fb98"]jnc [color="#98fb98"]final_init
[color="#ffff00"]238
[color="#ffff00"]239 /*
[color="#ffff00"]240 * [color="#98fb98"]The [color="#98fb98"]call [color="#98fb98"]failed, [color="#98fb98"]so [color="#98fb98"]maybe [color="#98fb98"]use [color="#98fb98"]the [color="#98fb98"]floppy [color="#98fb98"]probe [color="#98fb98"]instead.
[color="#ffff00"]241 */
[color="#ffff00"]242 [color="#98fb98"]testb $[color="#98fb98"]STAGE1_BIOS_HD_FLAG, %[color="#98fb98"]dl
[color="#ffff00"]243 [color="#98fb98"]jz [color="#98fb98"]floppy_probe
[color="#ffff00"]244
[color="#ffff00"]245 /* [color="#98fb98"]Nope, [color="#98fb98"]we [color="#98fb98"]definitely [color="#98fb98"]have [color="#98fb98"]a [color="#98fb98"]hard [color="#98fb98"]disk, [color="#98fb98"]and [color="#98fb98"]we'[color="#98fb98"]re [color="#98fb98"]screwed. */
[color="#ffff00"]246 [color="#98fb98"]jmp [color="#98fb98"]hd_probe_error
[color="#ffff00"]247
[color="#ffff00"]248 [color="#98fb98"]final_init:
[color="#ffff00"]249
[color="#ffff00"]250 [color="#98fb98"]movw $[color="#98fb98"]ABS([color="#98fb98"]sectors), %[color="#98fb98"]si
[color="#ffff00"]251
[color="#ffff00"]252 /* [color="#98fb98"]set [color="#98fb98"]the [color="#98fb98"]mode [color="#98fb98"]to [color="#98fb98"]zero */
[color="#ffff00"]253 [color="#98fb98"]movb $[color="#ffa0a0"]0, -[color="#ffa0a0"]1(%[color="#98fb98"]si)
[color="#ffff00"]254
[color="#ffff00"]255 /* [color="#98fb98"]save [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]heads */
[color="#ffff00"]256 [color="#98fb98"]xorl %[color="#98fb98"]eax, %[color="#98fb98"]eax
[color="#ffff00"]257 [color="#98fb98"]movb %[color="#98fb98"]dh, %[color="#98fb98"]al
[color="#ffff00"]258 [color="#98fb98"]incw %[color="#98fb98"]ax
[color="#ffff00"]259 [color="#98fb98"]movl %[color="#98fb98"]eax, [color="#ffa0a0"]4(%[color="#98fb98"]si)
[color="#ffff00"]260
[color="#ffff00"]261 [color="#98fb98"]xorw %[color="#98fb98"]dx, %[color="#98fb98"]dx
[color="#ffff00"]262 [color="#98fb98"]movb %[color="#98fb98"]cl, %[color="#98fb98"]dl
[color="#ffff00"]263 [color="#98fb98"]shlw $[color="#ffa0a0"]2, %[color="#98fb98"]dx
[color="#ffff00"]264 [color="#98fb98"]movb %[color="#98fb98"]ch, %[color="#98fb98"]al
[color="#ffff00"]265 [color="#98fb98"]movb %[color="#98fb98"]dh, %[color="#98fb98"]ah
[color="#ffff00"]266
[color="#ffff00"]267 /* [color="#98fb98"]save [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]cylinders */
[color="#ffff00"]268 [color="#98fb98"]incw %[color="#98fb98"]ax
[color="#ffff00"]269 [color="#98fb98"]movw %[color="#98fb98"]ax, [color="#ffa0a0"]8(%[color="#98fb98"]si)
[color="#ffff00"]270
[color="#ffff00"]271 [color="#98fb98"]xorw %[color="#98fb98"]ax, %[color="#98fb98"]ax
[color="#ffff00"]272 [color="#98fb98"]movb %[color="#98fb98"]dl, %[color="#98fb98"]al
[color="#ffff00"]273 [color="#98fb98"]shrb $[color="#ffa0a0"]2, %[color="#98fb98"]al
[color="#ffff00"]274
[color="#ffff00"]275 /* [color="#98fb98"]save [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]sectors */
[color="#ffff00"]276 [color="#98fb98"]movl %[color="#98fb98"]eax, (%[color="#98fb98"]si)
[color="#ffff00"]277
[color="#ffff00"]278 [color="#98fb98"]setup_sectors:
[color="#ffff00"]279 /* [color="#98fb98"]load [color="#98fb98"]logical [color="#98fb98"]sector [color="#98fb98"]start ([color="#98fb98"]bottom [color="#98fb98"]half) */
[color="#ffff00"]280 [color="#98fb98"]movl [color="#98fb98"]ABS([color="#98fb98"]stage2_sector), %[color="#98fb98"]eax
[color="#ffff00"]281
[color="#ffff00"]282 /* [color="#98fb98"]zero %[color="#98fb98"]edx */
[color="#ffff00"]283 [color="#98fb98"]xorl %[color="#98fb98"]edx, %[color="#98fb98"]edx
[color="#ffff00"]284
[color="#ffff00"]285 /* [color="#98fb98"]divide [color="#98fb98"]by [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]sectors */
[color="#ffff00"]286 [color="#98fb98"]divl (%[color="#98fb98"]si)
[color="#ffff00"]287
[color="#ffff00"]288 /* [color="#98fb98"]save [color="#98fb98"]sector [color="#98fb98"]start */
[color="#ffff00"]289 [color="#98fb98"]movb %[color="#98fb98"]dl, [color="#ffa0a0"]10(%[color="#98fb98"]si)
[color="#ffff00"]290
[color="#ffff00"]291 [color="#98fb98"]xorl %[color="#98fb98"]edx, %[color="#98fb98"]edx /* [color="#98fb98"]zero %[color="#98fb98"]edx */
[color="#ffff00"]292 [color="#98fb98"]divl [color="#ffa0a0"]4(%[color="#98fb98"]si) /* [color="#98fb98"]divide [color="#98fb98"]by [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]heads */
[color="#ffff00"]293
[color="#ffff00"]294 /* [color="#98fb98"]save [color="#98fb98"]head [color="#98fb98"]start */
[color="#ffff00"]295 [color="#98fb98"]movb %[color="#98fb98"]dl, [color="#ffa0a0"]11(%[color="#98fb98"]si)
[color="#ffff00"]296
[color="#ffff00"]297 /* [color="#98fb98"]save [color="#98fb98"]cylinder [color="#98fb98"]start */
[color="#ffff00"]298 [color="#98fb98"]movw %[color="#98fb98"]ax, [color="#ffa0a0"]12(%[color="#98fb98"]si)
[color="#ffff00"]299
[color="#ffff00"]300 /* [color="#98fb98"]do [color="#98fb98"]we [color="#98fb98"]need [color="#98fb98"]too [color="#98fb98"]many [color="#98fb98"]cylinders? */
[color="#ffff00"]301 [color="#98fb98"]cmpw [color="#ffa0a0"]8(%[color="#98fb98"]si), %[color="#98fb98"]ax
[color="#ffff00"]302 [color="#98fb98"]jge [color="#98fb98"]geometry_error
[color="#ffff00"]303
[color="#ffff00"]304 /*
[color="#ffff00"]305 * [color="#98fb98"]This [color="#98fb98"]is [color="#98fb98"]the [color="#98fb98"]loop [color="#98fb98"]for [color="#98fb98"]taking [color="#98fb98"]care [color="#98fb98"]of [color="#98fb98"]BIOS [color="#98fb98"]geometry [color="#98fb98"]translation ([color="#98fb98"]ugh!)
[color="#ffff00"]306 */
[color="#ffff00"]307
[color="#ffff00"]308 /* [color="#98fb98"]get [color="#98fb98"]high [color="#98fb98"]bits [color="#98fb98"]of [color="#98fb98"]cylinder */
[color="#ffff00"]309 [color="#98fb98"]movb [color="#ffa0a0"]13(%[color="#98fb98"]si), %[color="#98fb98"]dl
[color="#ffff00"]310
[color="#ffff00"]311 [color="#98fb98"]shlb $[color="#ffa0a0"]6, %[color="#98fb98"]dl /* [color="#98fb98"]shift [color="#98fb98"]left [color="#98fb98"]by [color="#ffa0a0"]6 [color="#98fb98"]bits */
[color="#ffff00"]312 [color="#98fb98"]movb [color="#ffa0a0"]10(%[color="#98fb98"]si), %[color="#98fb98"]cl /* [color="#98fb98"]get [color="#98fb98"]sector */
[color="#ffff00"]313
[color="#ffff00"]314 [color="#98fb98"]incb %[color="#98fb98"]cl /* [color="#98fb98"]normalize [color="#98fb98"]sector ([color="#98fb98"]sectors [color="#98fb98"]go
[color="#ffff00"]315 [color="#98fb98"]from [color="#ffa0a0"]1-[color="#98fb98"]N, [color="#98fb98"]not 0-([color="#98fb98"]N-[color="#ffa0a0"]1) ) */
[color="#ffff00"]316 [color="#98fb98"]orb %[color="#98fb98"]dl, %[color="#98fb98"]cl /* [color="#98fb98"]composite [color="#98fb98"]together */
[color="#ffff00"]317 [color="#98fb98"]movb [color="#ffa0a0"]12(%[color="#98fb98"]si), %[color="#98fb98"]ch /* [color="#98fb98"]sector+[color="#98fb98"]hcyl [color="#98fb98"]in [color="#98fb98"]cl, [color="#98fb98"]cylinder [color="#98fb98"]in [color="#98fb98"]ch */
[color="#ffff00"]318
[color="#ffff00"]319 /* [color="#98fb98"]restore %[color="#98fb98"]dx */
[color="#ffff00"]320 [color="#98fb98"]popw %[color="#98fb98"]dx
[color="#ffff00"]321
[color="#ffff00"]322 /* [color="#98fb98"]head [color="#98fb98"]number */
[color="#ffff00"]323 [color="#98fb98"]movb [color="#ffa0a0"]11(%[color="#98fb98"]si), %[color="#98fb98"]dh
[color="#ffff00"]324
[color="#ffff00"]325 /*
[color="#ffff00"]326 * [color="#98fb98"]BIOS [color="#98fb98"]call "[color="#98fb98"]INT [color="#ffa0a0"]0x13 [color="#98fb98"]Function [color="#ffa0a0"]0x2" [color="#98fb98"]to [color="#98fb98"]read [color="#98fb98"]sectors [color="#98fb98"]from [color="#98fb98"]disk [color="#98fb98"]into [color="#98fb98"]memory
[color="#ffff00"]327 * [color="#98fb98"]Call [color="#98fb98"]with %[color="#98fb98"]ah = [color="#ffa0a0"]0x2
[color="#ffff00"]328 * %[color="#98fb98"]al = [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]sectors
[color="#ffff00"]329 * %[color="#98fb98"]ch = [color="#98fb98"]cylinder
[color="#ffff00"]330 * %[color="#98fb98"]cl = [color="#98fb98"]sector ([color="#98fb98"]bits [color="#ffa0a0"]6-[color="#ffa0a0"]7 [color="#98fb98"]are [color="#98fb98"]high [color="#98fb98"]bits [color="#98fb98"]of "[color="#98fb98"]cylinder")
[color="#ffff00"]331 * %[color="#98fb98"]dh = [color="#98fb98"]head
[color="#ffff00"]332 * %[color="#98fb98"]dl = [color="#98fb98"]drive ([color="#ffa0a0"]0x80 [color="#98fb98"]for [color="#98fb98"]hard [color="#98fb98"]disk, [color="#ffa0a0"]0x0 [color="#98fb98"]for [color="#98fb98"]floppy [color="#98fb98"]disk)
[color="#ffff00"]333 * %[color="#98fb98"]es:%[color="#98fb98"]bx = [color="#98fb98"]segment:[color="#98fb98"]offset [color="#98fb98"]of [color="#98fb98"]buffer
[color="#ffff00"]334 * [color="#98fb98"]Return:
[color="#ffff00"]335 * %[color="#98fb98"]al = [color="#ffa0a0"]0x0 [color="#98fb98"]on [color="#98fb98"]success;[color="#87ceeb"] err code on failure
[color="#ffff00"]336 */
[color="#ffff00"]337
[color="#ffff00"]338 [color="#98fb98"]movw $[color="#98fb98"]STAGE1_BUFFERSEG, %[color="#98fb98"]bx
[color="#ffff00"]339 [color="#98fb98"]movw %[color="#98fb98"]bx, %[color="#98fb98"]es /* [color="#98fb98"]load %[color="#98fb98"]es [color="#98fb98"]segment [color="#98fb98"]with [color="#98fb98"]disk [color="#98fb98"]buffer */
[color="#ffff00"]340
[color="#ffff00"]341 [color="#98fb98"]xorw %[color="#98fb98"]bx, %[color="#98fb98"]bx /* %[color="#98fb98"]bx = [color="#ffa0a0"]0, [color="#98fb98"]put [color="#98fb98"]it [color="#98fb98"]at [color="#ffa0a0"]0 [color="#98fb98"]in [color="#98fb98"]the [color="#98fb98"]segment */
[color="#ffff00"]342 [color="#98fb98"]movw $[color="#ffa0a0"]0x0201, %[color="#98fb98"]ax /* [color="#98fb98"]function [color="#ffa0a0"]2 */
[color="#ffff00"]343 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]344
[color="#ffff00"]345 [color="#98fb98"]jc [color="#98fb98"]read_error
[color="#ffff00"]346
[color="#ffff00"]347 [color="#98fb98"]movw %[color="#98fb98"]es, %[color="#98fb98"]bx
[color="#ffff00"]348
[color="#ffff00"]349 [color="#98fb98"]copy_buffer:
[color="#ffff00"]350 [color="#98fb98"]movw [color="#98fb98"]ABS([color="#98fb98"]stage2_segment), %[color="#98fb98"]es
[color="#ffff00"]351
[color="#ffff00"]352 /*
[color="#ffff00"]353 * [color="#98fb98"]We [color="#98fb98"]need [color="#98fb98"]to [color="#98fb98"]save %[color="#98fb98"]cx [color="#98fb98"]and %[color="#98fb98"]si [color="#98fb98"]because [color="#98fb98"]the [color="#98fb98"]startup [color="#98fb98"]code [color="#98fb98"]in
[color="#ffff00"]354 * [color="#98fb98"]stage2 [color="#98fb98"]uses [color="#98fb98"]them [color="#98fb98"]without [color="#98fb98"]initializing [color="#98fb98"]them.
[color="#ffff00"]355 */
[color="#ffff00"]356 [color="#98fb98"]pusha
[color="#ffff00"]357 [color="#98fb98"]pushw %[color="#98fb98"]ds
[color="#ffff00"]358
[color="#ffff00"]359 [color="#98fb98"]movw $[color="#ffa0a0"]0x100, %[color="#98fb98"]cx
[color="#ffff00"]360 [color="#98fb98"]movw %[color="#98fb98"]bx, %[color="#98fb98"]ds
[color="#ffff00"]361 [color="#98fb98"]xorw %[color="#98fb98"]si, %[color="#98fb98"]si
[color="#ffff00"]362 [color="#98fb98"]xorw %[color="#98fb98"]di, %[color="#98fb98"]di
[color="#ffff00"]363
[color="#ffff00"]364 [color="#98fb98"]cld
[color="#ffff00"]365
[color="#ffff00"]366 [color="#98fb98"]rep
[color="#ffff00"]367 [color="#98fb98"]movsw
[color="#ffff00"]368
[color="#ffff00"]369 [color="#98fb98"]popw %[color="#98fb98"]ds
[color="#ffff00"]370 [color="#98fb98"]popa
[color="#ffff00"]371
[color="#ffff00"]372 /* [color="#98fb98"]boot [color="#98fb98"]stage2 */
[color="#ffff00"]373 [color="#98fb98"]jmp *([color="#98fb98"]stage2_address)
[color="#ffff00"]374
[color="#ffff00"]375 /* [color="#98fb98"]END [color="#98fb98"]OF [color="#98fb98"]MAIN [color="#98fb98"]LOOP */
[color="#ffff00"]376
[color="#ffff00"]377 /*
[color="#ffff00"]378 * [color="#98fb98"]BIOS [color="#98fb98"]Geometry [color="#98fb98"]translation [color="#98fb98"]error ([color="#98fb98"]past [color="#98fb98"]the [color="#98fb98"]end [color="#98fb98"]of [color="#98fb98"]the [color="#98fb98"]disk [color="#98fb98"]geometry!).
[color="#ffff00"]379 */
[color="#ffff00"]380 [color="#98fb98"]geometry_error:
[color="#ffff00"]381 [color="#98fb98"]MSG([color="#98fb98"]geometry_error_string)
[color="#ffff00"]382 [color="#98fb98"]jmp [color="#98fb98"]general_error
[color="#ffff00"]383
[color="#ffff00"]384 /*
[color="#ffff00"]385 * [color="#98fb98"]Disk [color="#98fb98"]probe [color="#98fb98"]failure.
[color="#ffff00"]386 */
[color="#ffff00"]387 [color="#98fb98"]hd_probe_error:
[color="#ffff00"]388 [color="#98fb98"]MSG([color="#98fb98"]hd_probe_error_string)
[color="#ffff00"]389 [color="#98fb98"]jmp [color="#98fb98"]general_error
[color="#ffff00"]390
[color="#ffff00"]391 /*
[color="#ffff00"]392 * [color="#98fb98"]Read [color="#98fb98"]error [color="#98fb98"]on [color="#98fb98"]the [color="#98fb98"]disk.
[color="#ffff00"]393 */
[color="#ffff00"]394 [color="#98fb98"]read_error:
[color="#ffff00"]395 [color="#98fb98"]MSG([color="#98fb98"]read_error_string)
[color="#ffff00"]396
[color="#ffff00"]397 [color="#98fb98"]general_error:
[color="#ffff00"]398 [color="#98fb98"]MSG([color="#98fb98"]general_error_string)
[color="#ffff00"]399
[color="#ffff00"]400 /* [color="#98fb98"]go [color="#98fb98"]here [color="#98fb98"]when [color="#98fb98"]you [color="#98fb98"]need [color="#98fb98"]to [color="#98fb98"]stop [color="#98fb98"]the [color="#98fb98"]machine [color="#98fb98"]hard [color="#98fb98"]after [color="#98fb98"]an [color="#98fb98"]error [color="#98fb98"]condition */
[color="#ffff00"]401 [color="#98fb98"]stop: [color="#98fb98"]jmp [color="#98fb98"]stop
[color="#ffff00"]402
[color="#ffff00"]403 [color="#98fb98"]notification_string: [color="#f0e68c"].string "[color="#98fb98"]GRUB "
[color="#ffff00"]404 [color="#98fb98"]geometry_error_string: [color="#f0e68c"].string "[color="#98fb98"]Geom"
[color="#ffff00"]405 [color="#98fb98"]hd_probe_error_string: [color="#f0e68c"].string "[color="#98fb98"]Hard [color="#98fb98"]Disk"
[color="#ffff00"]406 [color="#98fb98"]read_error_string: [color="#f0e68c"].string "[color="#98fb98"]Read"
[color="#ffff00"]407 [color="#98fb98"]general_error_string: [color="#f0e68c"].string " [color="#98fb98"]Error"
[color="#ffff00"]408
[color="#ffff00"]409 /*
[color="#ffff00"]410 * [color="#98fb98"]message: [color="#98fb98"]write [color="#98fb98"]the [color="#98fb98"]string [color="#98fb98"]pointed [color="#98fb98"]to [color="#98fb98"]by %[color="#98fb98"]si
[color="#ffff00"]411 *
[color="#ffff00"]412 * [color="#98fb98"]WARNING: [color="#98fb98"]trashes %[color="#98fb98"]si, %[color="#98fb98"]ax, [color="#98fb98"]and %[color="#98fb98"]bx
[color="#ffff00"]413 */
[color="#ffff00"]414
[color="#ffff00"]415 /*
[color="#ffff00"]416 * [color="#98fb98"]Use [color="#98fb98"]BIOS "[color="#98fb98"]int [color="#ffa0a0"]10[color="#98fb98"]H [color="#98fb98"]Function 0[color="#98fb98"]Eh" [color="#98fb98"]to [color="#98fb98"]write [color="#98fb98"]character [color="#98fb98"]in [color="#98fb98"]teletype [color="#98fb98"]mode
[color="#ffff00"]417 * %[color="#98fb98"]ah = [color="#ffa0a0"]0xe %[color="#98fb98"]al = [color="#98fb98"]character
[color="#ffff00"]418 * %[color="#98fb98"]bh = [color="#98fb98"]page %[color="#98fb98"]bl = [color="#98fb98"]foreground [color="#98fb98"]color ([color="#98fb98"]graphics [color="#98fb98"]modes)
[color="#ffff00"]419 */
[color="#ffff00"]420 [color="#ffa0a0"]1:
[color="#ffff00"]421 [color="#98fb98"]movw $[color="#ffa0a0"]0x0001, %[color="#98fb98"]bx
[color="#ffff00"]422 [color="#98fb98"]movb $[color="#ffa0a0"]0xe, %[color="#98fb98"]ah
[color="#ffff00"]423 [color="#98fb98"]int $[color="#ffa0a0"]0x10 /* [color="#98fb98"]display [color="#98fb98"]a [color="#98fb98"]byte */
[color="#ffff00"]424 [color="#98fb98"]message:
[color="#ffff00"]425 [color="#98fb98"]lodsb
[color="#ffff00"]426 [color="#98fb98"]cmpb $[color="#ffa0a0"]0, %[color="#98fb98"]al
[color="#ffff00"]427 [color="#98fb98"]jne [color="#ffa0a0"]1[color="#98fb98"]b /* [color="#98fb98"]if [color="#98fb98"]not [color="#98fb98"]end [color="#98fb98"]of [color="#98fb98"]string, [color="#98fb98"]jmp [color="#98fb98"]to [color="#98fb98"]display */
[color="#ffff00"]428 [color="#98fb98"]ret
[color="#ffff00"]429
[color="#ffff00"]430 /*
[color="#ffff00"]431 * [color="#98fb98"]Windows [color="#98fb98"]NT [color="#98fb98"]breaks [color="#98fb98"]compatibility [color="#98fb98"]by [color="#98fb98"]embedding [color="#98fb98"]a [color="#98fb98"]magic
[color="#ffff00"]432 * [color="#98fb98"]number [color="#98fb98"]here.
[color="#ffff00"]433 */
[color="#ffff00"]434
[color="#ffff00"]435 . = [color="#98fb98"]_start + [color="#98fb98"]STAGE1_WINDOWS_NT_MAGIC
[color="#ffff00"]436 [color="#98fb98"]nt_magic:
[color="#ffff00"]437 [color="#f0e68c"].long [color="#ffa0a0"]0
[color="#ffff00"]438 [color="#f0e68c"].word [color="#ffa0a0"]0
[color="#ffff00"]439
[color="#ffff00"]440 /*
[color="#ffff00"]441 * [color="#98fb98"]This [color="#98fb98"]is [color="#98fb98"]where [color="#98fb98"]an [color="#98fb98"]MBR [color="#98fb98"]would [color="#98fb98"]go [color="#98fb98"]if [color="#98fb98"]on [color="#98fb98"]a [color="#98fb98"]hard [color="#98fb98"]disk. [color="#98fb98"]The [color="#98fb98"]code
[color="#ffff00"]442 * [color="#98fb98"]here [color="#98fb98"]isn'[color="#98fb98"]t [color="#98fb98"]even [color="#98fb98"]referenced [color="#98fb98"]unless [color="#98fb98"]we'[color="#98fb98"]re [color="#98fb98"]on [color="#98fb98"]a [color="#98fb98"]floppy. [color="#98fb98"]Kinda
[color="#ffff00"]443 * [color="#98fb98"]sneaky, [color="#98fb98"]huh?
[color="#ffff00"]444 */
[color="#ffff00"]445
[color="#ffff00"]446 [color="#98fb98"]part_start:
[color="#ffff00"]447 . = [color="#98fb98"]_start + [color="#98fb98"]STAGE1_PARTSTART
[color="#ffff00"]448
[color="#ffff00"]449 [color="#98fb98"]probe_values:
[color="#ffff00"]450 [color="#f0e68c"].byte [color="#ffa0a0"]36, [color="#ffa0a0"]18, [color="#ffa0a0"]15, [color="#ffa0a0"]9, [color="#ffa0a0"]0
[color="#ffff00"]451
[color="#ffff00"]452 [color="#98fb98"]floppy_probe:
[color="#ffff00"]453 /*
[color="#ffff00"]454 * [color="#98fb98"]Perform [color="#98fb98"]floppy [color="#98fb98"]probe.
[color="#ffff00"]455 */
[color="#ffff00"]456
[color="#ffff00"]457 [color="#98fb98"]movw $[color="#98fb98"]ABS([color="#98fb98"]probe_values-[color="#ffa0a0"]1), %[color="#98fb98"]si
[color="#ffff00"]458
[color="#ffff00"]459 [color="#98fb98"]probe_loop:
[color="#ffff00"]460 /* [color="#98fb98"]reset [color="#98fb98"]floppy [color="#98fb98"]controller [color="#98fb98"]INT [color="#ffa0a0"]13[color="#98fb98"]h [color="#98fb98"]AH=[color="#ffa0a0"]0 */
[color="#ffff00"]461 [color="#98fb98"]xorw %[color="#98fb98"]ax, %[color="#98fb98"]ax
[color="#ffff00"]462 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]463
[color="#ffff00"]464 [color="#98fb98"]incw %[color="#98fb98"]si
[color="#ffff00"]465 [color="#98fb98"]movb (%[color="#98fb98"]si), %[color="#98fb98"]cl
[color="#ffff00"]466
[color="#ffff00"]467 /* [color="#98fb98"]if [color="#98fb98"]number [color="#98fb98"]of [color="#98fb98"]sectors [color="#98fb98"]is [color="#ffa0a0"]0, [color="#98fb98"]display [color="#98fb98"]error [color="#98fb98"]and [color="#98fb98"]die */
[color="#ffff00"]468 [color="#98fb98"]cmpb $[color="#ffa0a0"]0, %[color="#98fb98"]cl
[color="#ffff00"]469 [color="#98fb98"]jne [color="#ffa0a0"]1[color="#98fb98"]f
[color="#ffff00"]470
[color="#ffff00"]471 /*
[color="#ffff00"]472 * [color="#98fb98"]Floppy [color="#98fb98"]disk [color="#98fb98"]probe [color="#98fb98"]failure.
[color="#ffff00"]473 */
[color="#ffff00"]474 [color="#98fb98"]MSG([color="#98fb98"]fd_probe_error_string)
[color="#ffff00"]475 [color="#98fb98"]jmp [color="#98fb98"]general_error
[color="#ffff00"]476
[color="#ffff00"]477 [color="#98fb98"]fd_probe_error_string: [color="#f0e68c"].string "[color="#98fb98"]Floppy"
[color="#ffff00"]478
[color="#ffff00"]479 [color="#ffa0a0"]1:
[color="#ffff00"]480 /* [color="#98fb98"]perform [color="#98fb98"]read */
[color="#ffff00"]481 [color="#98fb98"]movw $[color="#98fb98"]STAGE1_BUFFERSEG, %[color="#98fb98"]bx
[color="#ffff00"]482 [color="#98fb98"]movw $[color="#ffa0a0"]0x201, %[color="#98fb98"]ax
[color="#ffff00"]483 [color="#98fb98"]movb $[color="#ffa0a0"]0, %[color="#98fb98"]ch
[color="#ffff00"]484 [color="#98fb98"]movb $[color="#ffa0a0"]0, %[color="#98fb98"]dh
[color="#ffff00"]485 [color="#98fb98"]int $[color="#ffa0a0"]0x13
[color="#ffff00"]486
[color="#ffff00"]487 /* [color="#98fb98"]if [color="#98fb98"]error, [color="#98fb98"]jump [color="#98fb98"]to "[color="#98fb98"]probe_loop" */
[color="#ffff00"]488 [color="#98fb98"]jc [color="#98fb98"]probe_loop
[color="#ffff00"]489
[color="#ffff00"]490 /* %[color="#98fb98"]cl [color="#98fb98"]is [color="#98fb98"]already [color="#98fb98"]the [color="#98fb98"]correct [color="#98fb98"]value! */
[color="#ffff00"]491 [color="#98fb98"]movb $[color="#ffa0a0"]1, %[color="#98fb98"]dh
[color="#ffff00"]492 [color="#98fb98"]movb $[color="#ffa0a0"]79, %[color="#98fb98"]ch
[color="#ffff00"]493
[color="#ffff00"]494 [color="#98fb98"]jmp [color="#98fb98"]final_init
[color="#ffff00"]495
[color="#ffff00"]496 . = [color="#98fb98"]_start + [color="#98fb98"]STAGE1_PARTEND
[color="#ffff00"]497
[color="#ffff00"]498 /* [color="#98fb98"]the [color="#98fb98"]last [color="#ffa0a0"]2 [color="#98fb98"]bytes [color="#98fb98"]in [color="#98fb98"]the [color="#98fb98"]sector [color="#ffa0a0"]0 [color="#98fb98"]contain [color="#98fb98"]the [color="#98fb98"]signature */
[color="#ffff00"]499 [color="#f0e68c"].word [color="#98fb98"]STAGE1_SIGNATURE
stage1.S被放在0面0道的第1扇区,start.S被放在0面0道的第2扇区,而与boot分区相关的文件系统的xxfs_stage1_5被放在0面0道第3扇区开始的扇区里,其占据的扇区数目与该stage1_5文件的大小有关。
代码:
+------------+ | stage1 | <-- 0面0道第1扇区
+------------+ | start | <-- 0面0道第2扇区
+------------+ | stage1_5 | <-- 0面0道第3扇区
| ... | +------------+
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6869/showart_625973.html |
|