~kernel/kernel.cr
.cr
Crystal
(text/x-crystal)
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

def clear_screen
  video_memory = Pointer(UInt8).new(0xB8000)
  screen_size = 80 * 25

  i = 0
  while i < screen_size
    video_memory[2 * i] = ' '.ord.to_u8
    video_memory[2 * i + 1] = 0x07_u8
    i += 1
  end
end

# clear screen using asm (intel) instructions
def clear_screen_asm
  asm(%(
    mov %ax, 0xB8000
    mov %es, %ax
    xor %di, %di
    mov %cx, 80 * 25
    mov %al, ' '
    mov %ah, 0x07
    rep stosw
  ))
end

fun kmain
  # IDT.enable_interrupts
  # kprint "Hello from Fluorite."

  address = Pointer(UInt8).new(0xb8000)

  message = "[CrystalOS Kernel] Hello from Crystal\n"
  # puts message

  clear_screen

  # Loop over each character in the string
  i = 0
  while i < message.size
    # Write the character
    address.value = message[i].to_u8
    address += 1
    # Write the attribute byte
    address.value = 0xA0.to_u8
    address += 1
    i += 1
  end

  while true
  end

  # prevent bootloader to take back
  # while true
  #   asm("cli")
  #   asm("hlt")
  # end
end