rulimine/stage1/hdd/bootsect.asm

141 lines
2.3 KiB
NASM
Raw Normal View History

org 0x7c00
bits 16
2020-01-22 06:12:55 +03:00
start:
jmp .skip_bpb ; Workaround for some BIOSes that require this stub
nop
; Some BIOSes will do a funny and decide to overwrite bytes of code in
; the section where a FAT BPB would be, potentially overwriting
; bootsector code.
; Avoid that by filling the BPB area with 0s
times 87 db 0
.skip_bpb:
2020-01-22 06:12:55 +03:00
cli
2020-01-22 07:02:12 +03:00
cld
2020-01-22 06:12:55 +03:00
jmp 0x0000:.initialise_cs
.initialise_cs:
2021-09-21 15:39:43 +03:00
xor si, si
mov ds, si
mov es, si
mov ss, si
2020-09-25 23:42:01 +03:00
mov sp, 0x7c00
2020-01-22 06:12:55 +03:00
sti
2020-08-29 21:02:16 +03:00
; Limine isn't made for floppy disks, these are dead anyways.
; So if the value the BIOS passed is <0x80, just assume it has passed
; an incorrect value.
cmp dl, 0x80
2021-09-21 15:39:43 +03:00
jb err.0
; Values above 0x8f are dubious so we assume we weren't booted properly
; for those either
cmp dl, 0x8f
2021-09-21 15:39:43 +03:00
ja err.1
2020-08-29 21:02:16 +03:00
.continue:
; Make sure int 13h extensions are supported
mov ah, 0x41
mov bx, 0x55aa
int 0x13
2021-09-21 15:39:43 +03:00
jc err.2
cmp bx, 0xaa55
2021-09-21 15:39:43 +03:00
jne err.3
push 0x7000
pop es
mov di, stage2_locs
mov eax, dword [di]
mov ebp, dword [di+4]
xor bx, bx
xor ecx, ecx
mov cx, word [di-4]
call read_sectors
2021-09-21 15:39:43 +03:00
jc err.4
mov eax, dword [di+8]
mov ebp, dword [di+12]
add bx, cx
mov cx, word [di-2]
2020-01-22 06:12:55 +03:00
call read_sectors
2021-09-21 15:39:43 +03:00
jc err.5
lgdt [gdt]
2020-01-22 06:12:55 +03:00
cli
mov eax, cr0
bts ax, 0
2020-01-22 06:12:55 +03:00
mov cr0, eax
jmp 0x08:vector
times 0xda-($-$$) db 0
times 6 db 0
; Includes
2021-02-25 03:24:54 +03:00
%include 'disk.asm'
%include '../gdt.asm'
err:
2021-09-21 15:39:43 +03:00
.5:
inc si
.4:
inc si
.3:
inc si
.2:
inc si
.1:
inc si
.0:
add si, '0' | (0x4f << 8)
push 0xb800
pop es
2021-09-21 15:39:43 +03:00
mov word [es:0], si
sti
.h: hlt
jmp .h
bits 32
vector:
mov eax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
and edx, 0xff
push 0
push edx
push stage2.size
push (stage2 - decompressor) + 0x70000
call 0x70000
times 0x1a4-($-$$) db 0
stage2_size_a: dw 0
stage2_size_b: dw 0
stage2_locs:
stage2_loc_a: dq 0
stage2_loc_b: dq 0
times 0x1b8-($-$$) db 0
times 510-($-$$) db 0
dw 0xaa55
; ********************* Stage 2 *********************
decompressor:
2021-03-08 02:50:23 +03:00
incbin '../../build/decompressor/decompressor.bin'
align 16
stage2:
2021-03-08 02:50:23 +03:00
incbin '../../build/stage23-bios/stage2.bin.gz'
.size: equ $ - stage2