Subversion Repositories HelenOS-historic

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

#
# Copyright (C) 2001-2004 Jakub Jermar
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# - The name of the author may not be used to endorse or promote products
#   derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

# This is a very primitive boot.s

# It assumes that the first sector of the kernel image is found
# on head 0, track 0, sector 2 of the first floppy drive (1440K).
# Next kernel sectors follow on disk sector 3, 4, ...
#


.text
.global _start_0x7c00

.code16
_start_0x7c00:
    xorw %ax,%ax        # reset, %al will be used below
    movw %ax,%dx        # fd0, %dh and %dl will be used below
    int $0x13
    jc stop_trying

    movb $2,%ah     # read
    incb %al        # one sector
    movb %ah,%cl        # from disk sector 2
    movw %dx,%es
    movw $0x8000,%bx    # at %es:%bx
    int $0x13
    jc stop_trying

    pushw $('.')
    call echo_mark
    add $2,%sp
    
        movw %dx,%ds
    
    # KERNEL_SIZE is passed from the outside to the preprocessor
    movl $(KERNEL_SIZE),%edi
    
    shrl $9,%edi        # number of sectors that kernel occupies (%edi div 512)
    
read_next:
    test %edi,%edi
    jnz read_sectors

    movb $12,%al
    movw $0x3f2,%dx
    outb %al,%dx

    pushw $('$')
    call echo_mark
    add $2,%sp  
    
    jmpl $0,$0x8000

read_sectors:
    pushw $('.')
    call echo_mark
    add $2,%sp

    decl %edi
    incw logical_sector
    movw %es,%si
    addw $0x20,%si
    movw %si,%es

    movw logical_sector,%ax
    divb sectors
    
    movb %ah,%cl
        incb %cl            # sector
    
    movb %al,%ch
    shrb $1,%ch         # track
    
    movb %al,%dh
    andb $1,%dh         # head

    movw $0x0201,%ax
    int $0x13
    jnc read_next

    pushw $('R')
    call echo_mark
    add $2,%sp

    xorw %ax,%ax            # try to reset
    movw %ax,%dx            # fd0
    int $0x13
    jnc read_next

stop_trying:
    pushw $('F')
    call echo_mark
    add $2,%sp

    cli
    hlt

CH=4
echo_mark:
    push %bp
    movw %sp,%bp
    pusha
    
    movw CH(%bp),%ax
    movb $0xe,%ah
    movb $7,%bl
    int $0x10
    
    popa
    pop %bp
    ret

# current logical sector from the beginning of the disk
logical_sector:
    .word 1

# number of sectors per track on 1440 floppy
sectors:
    .byte 18


# boot floppy signature
.org 0x1fe
boot_floppy_signature:
    .byte 0x55
    .byte 0xaa