92 lines
1.5 KiB
ArmAsm
92 lines
1.5 KiB
ArmAsm
|
.code16
|
||
|
main:
|
||
|
/* fix up code seg */
|
||
|
ljmp $0x0,$entry
|
||
|
|
||
|
entry:
|
||
|
/* init data segments */
|
||
|
xor %ax, %ax
|
||
|
mov %ax, %ds
|
||
|
mov %ax, %ss
|
||
|
/* save boot disk */
|
||
|
mov %dl, boot_disk
|
||
|
/* set up stack */
|
||
|
mov $0x7b00, %ax
|
||
|
mov %ax, %sp
|
||
|
/* figure out sector size */
|
||
|
mov $0x48, %ah
|
||
|
mov boot_disk, %dl
|
||
|
mov $drive_params, %si
|
||
|
int $0x13
|
||
|
/* figure out first sector of stage 2 */
|
||
|
mov $0, %edx
|
||
|
mov $BOOT_FILE_OFFSET, %eax
|
||
|
mov (drive_params_bps), %ecx
|
||
|
div %ecx
|
||
|
mov %eax, dap_lba_low
|
||
|
mov $BOOT_FILE_SIZE, %eax
|
||
|
div %ecx
|
||
|
inc %eax
|
||
|
mov %ax, dap_sectors
|
||
|
movl $0x7e00, dap_buffer
|
||
|
mov $0x42, %ah /* Extended read */
|
||
|
mov boot_disk, %dl /* Using our boot disk */
|
||
|
mov $dap, %si /* From the DAP below */
|
||
|
int $0x13
|
||
|
|
||
|
mov $0, %ax
|
||
|
mov %ax, %es
|
||
|
mov %ax, %ds
|
||
|
/* Now move the rest of our code somewhere low */
|
||
|
mov $mover, %esi
|
||
|
mov $0x7b00, %edi
|
||
|
mov $(mover_end-mover), %ecx
|
||
|
rep movsb
|
||
|
mov $0x7b00, %eax
|
||
|
jmp *%eax
|
||
|
|
||
|
mover:
|
||
|
mov $0x7e00, %esi
|
||
|
mov $0x7c00, %edi
|
||
|
mov $BOOT_FILE_SIZE, %ecx
|
||
|
rep movsb
|
||
|
mov $0x7c00, %eax
|
||
|
jmp *%eax
|
||
|
mover_end:
|
||
|
|
||
|
boot_disk:
|
||
|
.byte 0
|
||
|
|
||
|
.align 4
|
||
|
.global dap
|
||
|
dap:
|
||
|
.byte 16
|
||
|
.byte 0 /* always 0 */
|
||
|
.global dap_sectors
|
||
|
dap_sectors:
|
||
|
.word 1
|
||
|
.global dap_buffer
|
||
|
dap_buffer:
|
||
|
.long 0x0
|
||
|
.global dap_lba_low
|
||
|
dap_lba_low:
|
||
|
.long 0
|
||
|
.global dap_lba_high
|
||
|
dap_lba_high:
|
||
|
.long 0
|
||
|
|
||
|
.align 4
|
||
|
drive_params:
|
||
|
.word 0x1A
|
||
|
.word 0 /* flags */
|
||
|
.long 0 /* cylinders */
|
||
|
.long 0 /* heads */
|
||
|
.long 0 /* sectors */
|
||
|
.quad 0 /* total sectors */
|
||
|
drive_params_bps:
|
||
|
.word 0 /* bytes per sector */
|
||
|
|
||
|
.org 510
|
||
|
.byte 0x55
|
||
|
.byte 0xaa
|