[BACK]Return to mkboot.s CVS log [TXT][DIR] Up to [local] / prex / boot / i386 / utils / mkboot

Annotation of prex/boot/i386/utils/mkboot/mkboot.s, Revision 1.1

1.1     ! nbrk        1: #
        !             2: # Copyright (c) 2005, Kohsuke Ohtani
        !             3: # All rights reserved.
        !             4: #
        !             5: # Redistribution and use in source and binary forms, with or without
        !             6: # modification, are permitted provided that the following conditions
        !             7: # are met:
        !             8: # 1. Redistributions of source code must retain the above copyright
        !             9: #    notice, this list of conditions and the following disclaimer.
        !            10: # 2. Redistributions in binary form must reproduce the above copyright
        !            11: #    notice, this list of conditions and the following disclaimer in the
        !            12: #    documentation and/or other materials provided with the distribution.
        !            13: # 3. Neither the name of the author nor the names of any co-contributors
        !            14: #    may be used to endorse or promote products derived from this software
        !            15: #    without specific prior written permission.
        !            16: #
        !            17: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
        !            18: # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            19: # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            20: # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
        !            21: # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            22: # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            23: # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            24: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            25: # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            26: # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            27: # SUCH DAMAGE.
        !            28: #
        !            29:
        !            30: #
        !            31: # mkboot.S - DOS utility to install boot sector into disk
        !            32: #
        !            33: # Usage: mkboot [drive]
        !            34: #  ex. mkboot a:
        !            35: #
        !            36: # Read image file "bootsect.bin" and write it to disk.
        !            37: # Current boot sector is automatically saved as file "bootsect.dbg".
        !            38: #
        !            39: # Prerequisite:        Correct BIOS Parameter Block (BPB) has already stored
        !            40: # in the target disk device. Generally, this data is written by a format tool.
        !            41: #
        !            42: .code16
        !            43: .text
        !            44: .align 1
        !            45:
        !            46: #
        !            47: # Entry point
        !            48: #
        !            49: main:
        !            50:        movw    %cs, %ax
        !            51:        movw    %ax, %ds
        !            52:        movw    %ax, %es
        !            53:        cld
        !            54:
        !            55:        call    get_drive                       # Get drive information
        !            56:        jc      dos_exit
        !            57:
        !            58:        call    read_file                       # Read boot sector file
        !            59:        jc      dos_exit
        !            60:
        !            61:        call    read_bsec                       # Read actual boot sector
        !            62:        jc      dos_exit
        !            63:
        !            64:        call    store_bpb                       # Copy BPB data
        !            65:        jc      dos_exit
        !            66:
        !            67: #       cmp     $1, dbg_mode
        !            68: #       je      skip_write
        !            69:
        !            70:        call    write_bsec                      # Write boot sector
        !            71:        jc      dos_exit
        !            72: skip_write:
        !            73:
        !            74:        call    debug_file                      # Put to file for debug
        !            75:        movw    $msg_ok, %dx
        !            76:        call    puts
        !            77:
        !            78: dos_exit:
        !            79:        movb    $0x4c, %ah                      # Return to DOS
        !            80:        int     $0x21
        !            81:        ret
        !            82:
        !            83: #
        !            84: # Get specified drive
        !            85: #
        !            86: get_drive:
        !            87:        pushw   %es
        !            88:        pushaw
        !            89:
        !            90:        movb    $0x62, %ah                      # Get DOS PSP
        !            91:        int     $0x21
        !            92:
        !            93:        movw    %bx, %es
        !            94:        movb    %es:(0x80), %al                 # Get parameter size
        !            95:        cmpb    $0, %al                         # No parameter ?
        !            96:        je      invalid_arg
        !            97:
        !            98:        movb    %es:(0x82), %al                 # Get drive character
        !            99:        cmpb    $0x41, %al                      # A ?
        !           100:        jb      invalid_arg
        !           101:        cmpb    $0x5a, %al                      # Z ?
        !           102:        ja      chk_low
        !           103:        subb    $0x41, %al                      # - A
        !           104:        jmp     drive_ok
        !           105:
        !           106: chk_low:
        !           107:        cmpb    $0x61, %al                      # a ?
        !           108:        jb      invalid_arg
        !           109:        cmpb    $0x7a, %al                      # z ?
        !           110:        ja      invalid_arg
        !           111:        subb    $0x61, %al                      # - a
        !           112:
        !           113: drive_ok:
        !           114:        cmpb    $2, %al
        !           115:        jb      skip_verify
        !           116:
        !           117:        movw    $err_dbg, %dx
        !           118:        pushw   %ax
        !           119:        call    puts
        !           120:        movb    $1, dbg_mode
        !           121:        popw    %ax
        !           122:
        !           123: skip_verify:
        !           124:        movb    %al, drive
        !           125:
        !           126:        movb    $0, phys_drive
        !           127:        cmp     $2, %al
        !           128:        jb      not_hdd
        !           129:        movb    $0x80, phys_drive
        !           130: not_hdd:
        !           131:        popaw
        !           132:        popw    %es
        !           133:        clc
        !           134:        ret
        !           135:
        !           136: invalid_arg:
        !           137:        popaw
        !           138:        popw    %es
        !           139:        movw    $msg_usage, %dx
        !           140:        call    puts
        !           141:        stc
        !           142:        ret
        !           143:
        !           144: #
        !           145: # puts
        !           146: #
        !           147: puts:
        !           148:        movb    $0x09, %ah
        !           149:        int     $0x21
        !           150:        ret
        !           151:
        !           152: #
        !           153: # Read file
        !           154: #
        !           155: read_file:
        !           156:        pushaw
        !           157:        movw    $bsec_name, %dx
        !           158:        movb    $0x3d, %ah                      # Open file
        !           159:        movb    $0x80, %al
        !           160:        int     $0x21
        !           161:        jc      error_read
        !           162:
        !           163:        movw    %ax, %bx
        !           164:        movw    $tmpSect, %dx
        !           165:        movw    512, %cx
        !           166:        movb    $0x3f, %ah                      # Read file
        !           167:        int     $0x21
        !           168:        jc      error_read
        !           169:
        !           170:        mov     $0x3e, %ah                      # Close file
        !           171:        int     $0x21
        !           172:
        !           173:        movw    $tmpSect, %bx
        !           174:        movw    510(%bx), %ax
        !           175:        cmpw    $0xaa55, %ax
        !           176:        jne     error_file
        !           177:        popaw
        !           178:        clc
        !           179:        ret
        !           180:
        !           181: error_file:
        !           182:        movw    $err_bad_file, %dx
        !           183:        call    puts
        !           184:        popaw
        !           185:        stc
        !           186:        ret
        !           187:
        !           188: error_read:
        !           189:        movw    $err_not_found, %dx
        !           190:        call    puts
        !           191:        popaw
        !           192:        stc
        !           193:        ret
        !           194:
        !           195: #
        !           196: # Read boot sector image from disk
        !           197: #
        !           198: read_bsec:
        !           199:        pushaw
        !           200:        movw    5, %cx
        !           201: retry_loop:
        !           202:        pushw   %cx
        !           203:
        !           204:        movw    $dos_packet, %bx                # bx = buffer address
        !           205:        movw    $orgSect, %ax
        !           206:        movw    %ax, 6(%bx)
        !           207:        movw    %cs, %ax
        !           208:        movw    %ax, 8(%bx)
        !           209:        movl    $0, (%bx)                       # Sector = 0
        !           210:        movw    $1, 4(%bx)                      # Num of sector = 1
        !           211:        movb    drive, %al                      # al = drive number
        !           212:        movw    $0xffff, %cx                    # Extended call
        !           213:        int     $0x25
        !           214:        popw    %ax
        !           215:
        !           216:        popw    %cx
        !           217:        jnc     read_ok
        !           218:        loopw   retry_loop
        !           219:
        !           220:        movw    $err_read, %dx
        !           221:        call    puts
        !           222:        stc
        !           223: read_ok:
        !           224:        popaw
        !           225:        ret
        !           226:
        !           227:
        !           228: #
        !           229: # Write boot sector image to disk
        !           230: #
        !           231: write_bsec:
        !           232:        pushaw
        !           233:        movw    $dos_packet, %bx                # bx = buffer address
        !           234:        movw    $tmpSect, %ax
        !           235:        movw    %ax, 6(%bx)
        !           236:        movw    %cs, %ax
        !           237:        movw    %ax, 8(%bx)
        !           238:        movl    $0, (%bx)                       # Sector = 0
        !           239:        movw    $1, 4(%bx)                      # Num of sector = 1
        !           240:        movb    drive, %al                      # al = drive number
        !           241:        movw    $0xffff, %cx                    # Extended call
        !           242:        int     $0x26
        !           243:        popw    %ax
        !           244:
        !           245:        jnc     write_ok
        !           246:
        !           247:        movw    $err_write, %dx
        !           248:        call    puts
        !           249:        popaw
        !           250:        stc
        !           251: write_ok:
        !           252:        popaw
        !           253:        ret
        !           254:
        !           255: #
        !           256: # Store BPB from current disk BPB
        !           257: #
        !           258: store_bpb:
        !           259:        cld
        !           260:        movw    $orgSect, %si
        !           261:        addw    $3, %si                         # Skip jump instruction
        !           262:        addw    $8, %si                         # Skip OEM ID
        !           263:        movw    $tmpSect, %di
        !           264:        addw    $3, %di
        !           265:        addw    $8, %di
        !           266:        movw    $0x33, %cx                      # Copy disk parameter
        !           267:        rep
        !           268:        movsb
        !           269:
        !           270: ###    movw    $tmpSect, %di                   # Update physical drive
        !           271: ###    addw    $0x24, %di
        !           272: ###    movb    phys_drive, %al
        !           273: ###    movb    %al, (%di)
        !           274:
        !           275:        clc
        !           276:        ret
        !           277:
        !           278: #
        !           279: # Create new BPB file for debug
        !           280: #
        !           281: debug_file:
        !           282:        movw    $dbg_name, %dx
        !           283:        movb    $0x3c, %ah                      # Create file
        !           284:        movw    $0, %cx
        !           285:        int     $0x21
        !           286:        jc      exit_debug
        !           287:
        !           288:        movw    %ax, %bx
        !           289:        movw    $tmpSect, %dx
        !           290:        movw    $512, %cx
        !           291:        movb    $0x40, %ah                      # Read file
        !           292:        int     $0x21
        !           293:        jc      exit_debug
        !           294:
        !           295:        movb    $0x3e, %ah                      # Close file
        !           296:        int     $0x21
        !           297:
        !           298: exit_debug:
        !           299:        ret
        !           300:
        !           301: #
        !           302: # Data
        !           303: #
        !           304: drive:         .byte   0
        !           305: phys_drive:    .byte   0
        !           306: dbg_mode:      .byte   0
        !           307:
        !           308: .align 4
        !           309: dos_packet:
        !           310:                .long   0                       # Sector
        !           311:                .word   1                       # Number of sector
        !           312:                .word   0                       # Buffer offset
        !           313:                .word   0                       # Buffer segment
        !           314:
        !           315: bsec_name:     .asciz  "bootsect.bin"
        !           316: dbg_name:      .asciz  "bootsect.dbg"
        !           317:
        !           318: msg_usage:     .ascii  "mkboot [drive]"
        !           319:                .byte   0xd,0xa,0x24
        !           320: msg_ok:                .ascii  "System transferred"
        !           321:                .byte   0xd,0xa,0x24
        !           322: err_dbg:       .ascii  "Warning: Write to HDD!"
        !           323:                .byte   0xd,0xa,0x24
        !           324: err_not_found: .ascii  "Error: bootsect.bin was not found"
        !           325:                .byte   0xd,0xa,0x24
        !           326: err_bad_file:  .ascii  "Error: bootsect.bin is not valid"
        !           327:                .byte   0xd,0xa,0x24
        !           328: err_read:      .ascii  "Error: Disk read errror"
        !           329:                .byte   0xd,0xa,0x24
        !           330: err_write:     .ascii  "Error: Disk write errror"
        !           331:                .byte   0xd,0xa,0x24
        !           332:
        !           333: .align 16
        !           334: orgSect:       .fill   512,1,0
        !           335: tmpSect:       .fill   512,1,0
        !           336:

CVSweb