GitFOSS
chore: make sure kernel.cr loads
+ 40
- 20
@@ -24,7 +24,13 @@ use_crystal_kernel=true
 
 if [ "$use_crystal_kernel" = true ]
 then
-	crystal build --no-debug -Dkernel --cross-compile --target i386-unknown-linux-elf --prelude=../prelude.cr -o ./build/kernel ./kernel/kernel.cr
+	# Build crystal kernel without stdlib, using the custom prelude, and targeting i386-unknown-linux-elf
+	crystal build \
+		--no-debug -Dkernel \
+		--cross-compile --target i386-unknown-linux-elf \
+		--prelude=../prelude.cr \
+		-o ./build/kernel ./kernel/kernel.cr
+
 	# The object file should be at ./build/kernel.o, now link it with the entry point
 	ld -m elf_i386 -nostdlib -T ./kernel/linker.ld -o ./bin/kernel.bin ./build/kernelEntryPoint.o ./build/kernel.o || exit 1
 else

...
@@ -33,10 +39,11 @@ fi
 
 cp ./bin/kernel.bin ./iso/boot/kernel.bin || exit 1
 
-# touch ./bin/kernel.bin
 ./tools/genVDisk --output "crystalos.img" --floppy \
 				  --bootloader ./bin/bootloader.bin --kernel ./bin/kernel.bin
 
+# Run
+
 echo -e "\nRunning..."
 qemu-system-i386 -drive if=floppy,index=0,format=raw,file=crystalos.img || exit 1
 

@@ -31,28 +31,44 @@ def clear_screen
   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)
 
-  string = "[CrystalOS Kernel] Hello from Crystal"
-  # string_size = 33 # string.size
+  message = "[CrystalOS Kernel] Hello from Crystal\n"
+  # puts message
 
-  # clear_screen
+  clear_screen
 
   # Loop over each character in the string
-  # i = 0
-  # while i < string.size
-  #   # Write the character
-  #   address.value = string[i].to_u8
-  #   address += 1
-  #   # Write the attribute byte
-  #   address.value = 0xA0.to_u8
-  #   address += 1
-  #   i += 1
-  # end
+  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

@@ -1,6 +1,5 @@
 require "./prelude/atomic"
 require "./prelude/primitives"
-require "./prelude/puts"
 
 # order matters
 require "./prelude/crystal_core/object"

...
@@ -22,4 +21,5 @@ require "./prelude/crystal_core/tuple"
 require "./prelude/crystal_core/range"
 require "./prelude/crystal_core/string"
 require "./prelude/crystal_core/reference"
-require "./prelude/crystal_core/static_array"
+require "./prelude/crystal_core/static_array"
+require "./prelude/puts"

@@ -15,6 +15,3 @@ def puts(str : String)
   end
 end
 
-# Example usage with a static NUL-terminated string
-message = "[CrystalOS Kernel] Hello from C++\0"
-puts(message)