bits 16
section .bootsect
-extern _stage2_start_seg
-extern _stage2_size
+extern _bootsect_start
+extern _kern_start_seg
+extern _kern_size
-boot_driveno equ 7b00h
-num_read_tries equ 7b06h ; 2 bytes
-sect_pending equ 7b08h ; 2 bytes
-sect_per_track equ 7b0ah ; 2 bytes
-cur_head equ 7b0ch ; 2 bytes - current head
-start_sect equ 7b0eh ; 2 bytes - start sector in track
-destptr equ 7b10h ; 2 bytes - destination pointer
-num_heads equ 7b12h ; 2 bytes - number of heads
-cur_cyl equ 7b14h ; 2 bytes - current cylinder
+boot_driveno equ 0500h
+num_read_tries equ 0506h ; 2 bytes
+sect_pending equ 0508h ; 2 bytes
+sect_per_track equ 050ah ; 2 bytes
+cur_head equ 050ch ; 2 bytes - current head
+start_sect equ 050eh ; 2 bytes - start sector in track
+destptr equ 0510h ; 2 bytes - destination pointer
+num_heads equ 0512h ; 2 bytes - number of heads
+cur_cyl equ 0514h ; 2 bytes - current cylinder
%macro floppy_motor_off 0
pushf
db 0 ; 25h: winnt flags
db 28h ; 26h: signature(?)
dd 0 ; 27h: volume serial number
- db "80 SIX BOOT"; 2bh: volume label, 11 bytes
+ db "86BOOT "; 2bh: volume label, 11 bytes
db "FAT12 " ; 36h: filesystem id, 8 bytes
start:
xor ax, ax
mov ds, ax
mov es, ax
+ mov ss, ax
+ mov [boot_driveno], dl ; save boot drive number
+
+ ; relocate boot sector to 600h
+ mov si, 0x7c00
+ mov di, _bootsect_start
+ mov cx, 256
+ rep movsw
+
jmp 00:.setcs
.setcs:
- ; put the stack high
- mov ax, 0x7f00
- mov ss, ax
- xor sp, sp
- mov [boot_driveno], dl
+ mov sp, _bootsect_start ; temp stack below our relocated address
; query sectors per track
mov ah, 8 ; get drive parameters call, dl already has the drive
.querydone:
; load the rest of the code high
- mov ax, _stage2_size
+ mov ax, _kern_size
add ax, 511
mov cl, 9
shr ax, cl
inc ax
mov [sect_pending], ax
- mov ax, _stage2_start_seg
+ mov ax, _kern_start_seg
mov es, ax ; destination segment
mov word [destptr], 0
mov word [start_sect], 1 ; start from sector 1 to skip boot sector
jnz .rdloop
; loaded sucessfully, load segment registers and jump
-.done: mov ax, _stage2_start_seg
+.done: mov ax, _kern_start_seg
mov ds, ax
mov es, ax
push ax
str_rdtrack2 db " from ",0
str_rdtrack3 db "/",0
-str_load_fail db "Failed to load 2nd stage!",0
+str_load_fail db "Failed to load kernel!",0
str_newline db 13,10,0
times 510-($-$$) db 0