MULTIBOOT_HDR_MAGIC = 0x1BADB002
MULTIBOOT_MAGIC     = 0x2BADB002

MULTIBOOT_HDR_ALIGN       = 0x1
MULTIBOOT_HDR_MEMINFO     = 0x2
MULTIBOOT_HDR_VIDEO       = 0x4
MULTIBOOT_HDR_AOUT_KLUDGE = 0x10000
MULTIBOOT_FLAGS = MULTIBOOT_HDR_ALIGN or MULTIBOOT_HDR_MEMINFO or MULTIBOOT_HDR_VIDEO or MULTIBOOT_HDR_AOUT_KLUDGE

struc MultibootHeader addr
{
        .magic    dd MULTIBOOT_HDR_MAGIC
        .flags    dd MULTIBOOT_FLAGS
        .checksum dd -(MULTIBOOT_HDR_MAGIC + MULTIBOOT_FLAGS)

        ; address fields (we'll just skip them)
        .header_addr   dd addr
        .load_addr     dd LOADER_BASE
        .load_end_addr dd _edata
        .bss_end_addr  dd _end
        .entry_addr    dd _start

        ; Video mode
        .mode_type dd 0x0
        .width     dd VIDEO_WIDTH
        .height    dd VIDEO_HEIGHT
        .depth     dd VIDEO_DEPTH
}

struc MultibootData
{
        .flags dd ?

        ; if flags[0] is set
        .mem_lower dd ?
        .mem_upper dd ?

        ; if flags[1] is set
        .boot_device dd ?

        ; if flags[2] is set
        .cmdline dd ?

        ; if flags[3] is set
        .mods_count dd ?
        .mods_addr  dd ?

        ; if flags[4] is set
        .syms dd 4 dup ?

        ; if flags[6] is set
        .mmap_length dd ?
        .mmap_addr   dd ?

        ; if flags[7] is set
        .drives_length dd ?
        .drives_addr   dd ?

        ; if flags[8] is set
        .config_table dd ?

        ; if flags[9] is set
        .bootloader_name dd ?

        ; if flags[10] is set
        .apm_table dd ?

        ; if flags[11] is set
        .vbe_control_info dd ?
        .vbe_mode_info    dd ?
        .vbe_mode         dw ?
        .vbe_if_seg       dw ?
        .vbe_if_off       dw ?
        .vbe_if_length    dw ?

        ; if flags[12] is set
        .fb_addr   dq ?
        .fb_pitch  dd ?
        .fb_width  dd ?
        .fb_height dd ?
        .fb_bpp    db ?
        .fb_type   db ?
        .fb_misc   dw 3 dup ?
}
DEFN MultibootData

MULTIBOOT_DATA_MEM             = 0x0001
MULTIBOOT_DATA_BOOTDEV         = 0x0002
MULTIBOOT_DATA_CMDLINE         = 0x0004
MULTIBOOT_DATA_MODULES         = 0x0008
MULTIBOOT_DATA_MMAP            = 0x0040
MULTIBOOT_DATA_DRIVES          = 0x0080
MULTIBOOT_DATA_BOOTLOADER_NAME = 0x0200
MULTIBOOT_DATA_VBE             = 0x0800
MULTIBOOT_DATA_FB              = 0x1000

struc MultibootMMap
{
        .size   dd ?
        .addr   dq ?
        .length dq ?
        .type   dd ?
}
DEFN MultibootMMap

MULTIBOOT_MEMORY_AVAILABLE = 0x1
MULTIBOOT_MEMORY_RESERVED  = 0x2
MULTIBOOT_MEMORY_ACPI      = 0x3
MULTIBOOT_MEMORY_NVS       = 0x4
MULTIBOOT_MEMORY_BADPARAM  = 0x5

struc MultibootModule
{
	.mod_start dd ?
	.mod_end   dd ?
	.cmdline   dd ?
	.pad       dd ?
}
DEFN MultibootModule