~kernel/kernel.cr
.cr
Crystal
(text/x-crystal)
# require "../minrt/src/prelude"

lib LibBootstrap
  @[Packed]
  struct StartInfo
    multiboot_ptr : UInt32
    end_of_kernel : UInt32
  end
end

fun kearly(info_ptr: LibBootstrap::StartInfo*)

  # Get the startup info
  info = info_ptr.value

  # Initialize stuff
  # GDT.init
  # Heap.init info.end_of_kernel
  # PIC.remap
  # PIC.enable
  # IDT.init
end

fun kmain
  screen = Pointer(UInt16).new(0xb8000_u64)

  screen.value = 0x1f43_u16  # C
  screen += 1
  screen.value = 0x1f72_u16  # r
  screen += 1
  screen.value = 0x1f79_u16  # y
  screen += 1
  screen.value = 0x1f73_u16  # s
  screen += 1
  screen.value = 0x1f74_u16  # t
  screen += 1
  screen.value = 0x1f61_u16  # a
  screen += 1
  screen.value = 0x1f6c_u16  # l
  screen += 1
  screen.value = 0x1f4f_u16  # O
  screen += 1
  screen.value = 0x1f53_u16  # S
  screen += 1
  screen.value = 0x1f20_u16  # space
  screen += 1
  screen.value = 0x1f6b_u16  # k
  screen += 1
  screen.value = 0x1f65_u16  # e
  screen += 1
  screen.value = 0x1f72_u16  # r
  screen += 1
  screen.value = 0x1f6e_u16  # n
  screen += 1
  screen.value = 0x1f65_u16  # e
  screen += 1
  screen.value = 0x1f6c_u16  # l
  screen += 1
  screen.value = 0x1f20_u16  # space
  screen += 1
  screen.value = 0x1f72_u16  # r
  screen += 1
  screen.value = 0x1f65_u16  # e
  screen += 1
  screen.value = 0x1f61_u16  # a
  screen += 1
  screen.value = 0x1f64_u16  # d
end