99 lines
2.7 KiB
ArmAsm
99 lines
2.7 KiB
ArmAsm
#
|
|
# Copyright (c) 1999 Robert Nordier
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms are freely
|
|
# permitted provided that the above copyright notice and this
|
|
# paragraph and the following disclaimer are duplicated in all
|
|
# such forms.
|
|
#
|
|
# This software is provided "AS IS" and without any express or
|
|
# implied warranties, including, without limitation, the implied
|
|
# warranties of merchantability and fitness for a particular
|
|
# purpose.
|
|
#
|
|
|
|
# $FreeBSD$
|
|
|
|
# Master boot record
|
|
|
|
.set LOAD,0x7c00 # Load address
|
|
.set EXEC,0x600 # Execution address
|
|
.set PT_OFF,0x1be # Partition table
|
|
.set MAGIC,0xaa55 # Magic: bootable
|
|
|
|
.set NDRIVE,0x8 # Drives to support
|
|
|
|
.globl start # Entry point
|
|
|
|
start: cld # String ops inc
|
|
xorl %eax,%eax # Zero
|
|
movl %eax,%es # Address
|
|
movl %eax,%ds # data
|
|
cli # Disable interrupts
|
|
movl %eax,%ss # Set up
|
|
movwir(LOAD,_sp) # stack
|
|
sti # Enable interrupts
|
|
movwir(main-EXEC+LOAD,_si) # Source
|
|
movwir(main,_di) # Destination
|
|
movwir(0x200-(main-start),_cx) # Byte count
|
|
rep # Relocate
|
|
movsb # code
|
|
jmpnwi(main-LOAD+EXEC) # To relocated code
|
|
|
|
main: xorl %esi,%esi # No active partition
|
|
movwir(partbl,_bx) # Partition table
|
|
movb $0x4,%cl # Number of entries
|
|
main.1: cmpbr0(_ch,_bx_) # Null entry?
|
|
je main.2 # Yes
|
|
jg err_pt # If 0x1..0x7f
|
|
testl %esi,%esi # Active already found?
|
|
jnz err_pt # Yes
|
|
movl %ebx,%esi # Point to active
|
|
main.2: addb $0x10,%bl # Till
|
|
loop main.1 # done
|
|
testl %esi,%esi # Active found?
|
|
jnz main.3 # Yes
|
|
int $0x18 # BIOS: Diskless boot
|
|
|
|
main.3: cmpb $0x80,%dl # Drive valid?
|
|
jb main.4 # No
|
|
cmpb $0x80+NDRIVE,%dl # Within range?
|
|
jb main.5 # Yes
|
|
main.4: movb0r(_si_,_dl) # Load drive
|
|
main.5: movb1r(0x1,_si_,_dh) # Load head
|
|
movw1r(0x2,_si_,_cx) # Load cylinder:sector
|
|
movwir(LOAD,_bx) # Transfer buffer
|
|
movwir(0x201,_ax) # BIOS: Read from
|
|
int $0x13 # disk
|
|
jc err_rd # If error
|
|
cmpwi2(MAGIC,0x1fe,_bx_) # Bootable?
|
|
jne err_os # No
|
|
jmp *%ebx # Invoke bootstrap
|
|
|
|
err_pt: movwir(msg_pt,_si) # "Invalid partition
|
|
jmp putstr # table"
|
|
|
|
err_rd: movwir(msg_rd,_si) # "Error loading
|
|
jmp putstr # operating system"
|
|
|
|
err_os: movwir(msg_os,_si) # "Missing operating
|
|
jmp putstr # system"
|
|
|
|
putstr.0: movwir(0x7,_bx) # Page:attribute
|
|
movb $0xe,%ah # BIOS: Display
|
|
int $0x10 # character
|
|
putstr: lodsb # Get character
|
|
testb %al,%al # End of string?
|
|
jnz putstr.0 # No
|
|
putstr.1: jmp putstr.1 # Await reset
|
|
|
|
msg_pt: .asciz "Invalid partition table"
|
|
msg_rd: .asciz "Error loading operating system"
|
|
msg_os: .asciz "Missing operating system"
|
|
|
|
.org PT_OFF
|
|
|
|
partbl: .fill 0x10,0x4,0x0 # Partition table
|
|
.word MAGIC # Magic number
|