130 lines
1.9 KiB
ArmAsm
130 lines
1.9 KiB
ArmAsm
.code16
|
|
.text
|
|
.global _start
|
|
_start:
|
|
ljmp $0x07C0, $something
|
|
|
|
something:
|
|
cli
|
|
cld
|
|
|
|
mov %cs, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
|
|
# stack stuff
|
|
mov $0x0000, %ax
|
|
mov %ax, %ss
|
|
mov $0xFFF0, %sp
|
|
|
|
# copy the first 12 bytes of our MBR table entry
|
|
mov %dl, (disk_number)
|
|
mov $mbr_entry, %di
|
|
mov $12, %cx
|
|
rep movsb
|
|
|
|
mov $0, %ah
|
|
int $0x13
|
|
|
|
mov $0x08, %ah
|
|
int $0x13
|
|
and 0b00111111, %cl
|
|
mov %cl, (total_sectors)
|
|
mov %ch, (total_cylinders)
|
|
mov %dh, (total_heads)
|
|
|
|
mov $0x1000, %ax
|
|
mov %ax, %es
|
|
mov $0x0000, %bx
|
|
|
|
mov (disk_number), %dl
|
|
mov $0, %ch #cylinder
|
|
mov $0, %dh #head
|
|
mov $2, %cl #sector
|
|
|
|
load_sector:
|
|
mov $1, %al
|
|
mov $0x02, %ah
|
|
int $0x13
|
|
|
|
mov (kernel_sectors), %ax
|
|
cmp $0xffff, %ax
|
|
jne check_last_sector
|
|
mov %es:20, %eax
|
|
shr $9, %eax
|
|
inc %eax
|
|
|
|
check_last_sector:
|
|
dec %ax
|
|
mov %ax, kernel_sectors
|
|
cmp $0, %ax
|
|
je done
|
|
|
|
move: # inc our offset. If it hits 0, we've moved a segment, inc that too.
|
|
add $512, %bx
|
|
cmp $0, %bx
|
|
jnz read_next_sector
|
|
mov %es, %ax
|
|
add $1000, %ax
|
|
mov %ax, %es
|
|
|
|
read_next_sector: # find the next valid sector, head, cylinder combo on the disk
|
|
inc %cl
|
|
mov (total_sectors), %al
|
|
cmp %al, %cl
|
|
jle load_sector
|
|
mov $1, %cl #go back to sector 1.. of the next head
|
|
|
|
inc %dh #next head
|
|
mov (total_heads), %al
|
|
cmp %al, %dh
|
|
jle load_sector
|
|
mov $0, %dh # go back to head 0.. of the next cylinder
|
|
|
|
inc %ch # next cylinder
|
|
mov (total_cylinders), %al
|
|
cmp %al, %ch
|
|
jle load_sector
|
|
# no more disk... fall through
|
|
done:
|
|
mov $0, %ah
|
|
int $0x13
|
|
|
|
mov $0x1000, %ax
|
|
mov %ax, %ds
|
|
ljmp $0x1000, $0x0000
|
|
|
|
disk_number:
|
|
.byte 0
|
|
total_cylinders:
|
|
.byte 0
|
|
total_heads:
|
|
.byte 0
|
|
total_sectors:
|
|
.byte 0
|
|
|
|
kernel_sectors:
|
|
.word 0xFFFF
|
|
|
|
mbr_entry:
|
|
partition_status:
|
|
.byte 0
|
|
partition_start_chs:
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0
|
|
partition_type:
|
|
.byte 0
|
|
partition_stop_chs:
|
|
.byte 0
|
|
.byte 0
|
|
.byte 0
|
|
partition_start_lba:
|
|
.long 0
|
|
partition_start_length:
|
|
.long 0
|
|
|
|
.org 510
|
|
magic:
|
|
.word 0xAA55
|