BITS 16
ORG 0x7C00

_start:
    cli
    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov sp, 0x7C00

    call enable_a20

    lgdt [gdt_desc]

    mov eax, cr0
    or al, 1
    mov cr0, eax
    
    jmp 0x08:protected_mode

enable_a20:
    in al, 0x92
    or eax, 2
    out 0x92, al
    ret

BITS 32
protected_mode:
    mov ax, 0x10
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov esp, 0x90000

    jmp 0x00100000

align 8
gdt:
    dq 0x0000000000000000
    dq 0x00CF9A000000FFFF
    dq 0x00CF92000000FFFF
gdt_end:

gdt_desc:
    dw gdt_end - gdt - 1
    dd gdt

times 510-($-$$) db 0   ; fill remaining bytes with 0
dw 0xAA55               ; boot signature (little-endian)