Skip to content
Snippets Groups Projects
startup-common.asm 1.89 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
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
buffer_size_sectors equ 127
Jeremy Soller's avatar
Jeremy Soller committed
; 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 eax, (kernel_file - boot) / 512
Jeremy Soller's avatar
Jeremy Soller committed
    mov edi, kernel_base
    cld
.lp:
    ; saving counter
    push cx

        ; populating buffer
        mov cx, buffer_size_sectors
Jeremy Soller's avatar
Jeremy Soller committed
        mov bx, kernel_file
Jeremy Soller's avatar
Jeremy Soller committed
        mov dx, 0x0

        push edi
        push eax
Jeremy Soller's avatar
Jeremy Soller committed
        call load

        ; moving buffer
        call unreal
        pop eax
        pop edi
Jeremy Soller's avatar
Jeremy Soller committed
        mov esi, kernel_file
Jeremy Soller's avatar
Jeremy Soller committed
        mov ecx, buffer_size_bytes / 4
        a32 rep movsd

        ; preparing next iteration
        add eax, buffer_size_sectors
Jeremy Soller's avatar
Jeremy Soller committed

    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

Jeremy Soller's avatar
Jeremy Soller committed
    mov bx, kernel_file
Jeremy Soller's avatar
Jeremy Soller committed
    mov dx, 0x0
    call load

    ; moving remnants of kernel
    call unreal

Jeremy Soller's avatar
Jeremy Soller committed
    mov esi, kernel_file
Jeremy Soller's avatar
Jeremy Soller committed
    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 "config.asm"
Jeremy Soller's avatar
Jeremy Soller committed
%include "descriptor_flags.inc"
%include "gdt_entry.inc"
%include "unreal.asm"
%include "memory_map.asm"
%include "vesa.asm"
%include "initialize.asm"