2016-08-14 02:21:46 +02:00
|
|
|
SECTION .text
|
|
|
|
USE16
|
|
|
|
|
|
|
|
startup:
|
|
|
|
; enable A20-Line via IO-Port 92, might not work on all motherboards
|
|
|
|
in al, 0x92
|
|
|
|
or al, 2
|
|
|
|
out 0x92, al
|
|
|
|
|
|
|
|
; loading kernel to 1MiB
|
|
|
|
; move part of kernel to startup_end via bootsector#load and then copy it up
|
|
|
|
; repeat until all of the kernel is loaded
|
|
|
|
|
|
|
|
; buffersize in multiple of sectors (512 Bytes)
|
|
|
|
; min 1
|
|
|
|
; max (0x70000 - startup_end) / 512
|
2016-09-02 04:45:26 +02:00
|
|
|
buffer_size_sectors equ 64
|
2016-08-14 02:21:46 +02:00
|
|
|
; buffer size in Bytes
|
|
|
|
buffer_size_bytes equ buffer_size_sectors * 512
|
|
|
|
|
|
|
|
kernel_base equ 0x100000
|
|
|
|
|
|
|
|
; how often do we need to call load and move memory
|
|
|
|
mov ecx, kernel_file.length_sectors / buffer_size_sectors
|
|
|
|
|
|
|
|
mov ax, (kernel_file - boot) / 512
|
|
|
|
mov edi, kernel_base
|
|
|
|
cld
|
|
|
|
.lp:
|
|
|
|
; saving counter
|
|
|
|
push cx
|
|
|
|
|
|
|
|
; populating buffer
|
|
|
|
mov cx, buffer_size_sectors
|
2016-08-25 04:31:59 +02:00
|
|
|
mov bx, kernel_file
|
2016-08-14 02:21:46 +02:00
|
|
|
mov dx, 0x0
|
|
|
|
|
|
|
|
push ax
|
|
|
|
call load
|
|
|
|
|
|
|
|
; moving buffer
|
|
|
|
call unreal
|
|
|
|
pop ax
|
|
|
|
|
2016-08-25 04:31:59 +02:00
|
|
|
mov esi, kernel_file
|
2016-08-14 02:21:46 +02:00
|
|
|
mov ecx, buffer_size_bytes / 4
|
|
|
|
a32 rep movsd
|
|
|
|
|
|
|
|
; preparing next iteration
|
|
|
|
add ax, buffer_size_sectors
|
|
|
|
|
|
|
|
pop cx
|
|
|
|
loop .lp
|
|
|
|
|
|
|
|
; load the part of the kernel that does not fill the buffer completely
|
|
|
|
mov cx, kernel_file.length_sectors % buffer_size_sectors
|
|
|
|
test cx, cx
|
|
|
|
jz finished_loading ; if cx = 0 => skip
|
|
|
|
|
2016-08-25 04:31:59 +02:00
|
|
|
mov bx, kernel_file
|
2016-08-14 02:21:46 +02:00
|
|
|
mov dx, 0x0
|
|
|
|
call load
|
|
|
|
|
|
|
|
; moving remnants of kernel
|
|
|
|
call unreal
|
|
|
|
|
2016-08-25 04:31:59 +02:00
|
|
|
mov esi, kernel_file
|
2016-08-14 02:21:46 +02:00
|
|
|
mov ecx, (kernel_file.length_sectors % buffer_size_bytes) / 4
|
|
|
|
a32 rep movsd
|
|
|
|
finished_loading:
|
|
|
|
|
|
|
|
|
|
|
|
call memory_map
|
|
|
|
|
|
|
|
call vesa
|
|
|
|
|
|
|
|
call initialize.fpu
|
|
|
|
call initialize.sse
|
|
|
|
call initialize.pit
|
|
|
|
call initialize.pic
|
|
|
|
|
|
|
|
jmp startup_arch
|
|
|
|
|
|
|
|
%include "descriptor_flags.inc"
|
|
|
|
%include "gdt_entry.inc"
|
|
|
|
%include "unreal.asm"
|
|
|
|
%include "memory_map.asm"
|
|
|
|
%include "vesa.asm"
|
|
|
|
%include "initialize.asm"
|