免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1431 | 回复: 0
打印 上一主题 下一主题

grub grub\stage1\stage1.s [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-28 17:22 |只看该作者 |倒序浏览

               
[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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP