WIP: VGA
This commit is contained in:
+56
@@ -2,9 +2,65 @@
|
||||
#![feature(lang_items)]
|
||||
#![feature(llvm_asm)]
|
||||
|
||||
use core::slice;
|
||||
|
||||
mod panic;
|
||||
|
||||
#[repr(packed)]
|
||||
pub struct VgaTextBlock {
|
||||
char: u8,
|
||||
color: u8,
|
||||
}
|
||||
|
||||
#[repr(u8)]
|
||||
pub enum VgaTextColor {
|
||||
Black = 0,
|
||||
Blue = 1,
|
||||
Green = 2,
|
||||
Cyan = 3,
|
||||
Red = 4,
|
||||
Purple = 5,
|
||||
Brown = 6,
|
||||
Gray = 7,
|
||||
DarkGray = 8,
|
||||
LightBlue = 9,
|
||||
LightGreen = 10,
|
||||
LightCyan = 11,
|
||||
LightRed = 12,
|
||||
LightPurple = 13,
|
||||
Yellow = 14,
|
||||
White = 15,
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn kstart() -> ! {
|
||||
let vga = slice::from_raw_parts_mut(
|
||||
0xb8000 as *mut VgaTextBlock,
|
||||
80 * 25
|
||||
);
|
||||
|
||||
for i in 0..vga.len() {
|
||||
vga[i].char = 0;
|
||||
vga[i].color =
|
||||
((VgaTextColor::DarkGray as u8) << 4) |
|
||||
(VgaTextColor::White as u8);
|
||||
}
|
||||
|
||||
let draw_text = |vga: &mut [VgaTextBlock], x: usize, y: usize, text: &str| {
|
||||
let mut i = y * 80 + x;
|
||||
for c in text.chars() {
|
||||
if let Some(block) = vga.get_mut(i) {
|
||||
block.char = c as u8;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
};
|
||||
|
||||
draw_text(
|
||||
vga,
|
||||
10, 1,
|
||||
"Arrow keys and space select mode, enter to continue"
|
||||
);
|
||||
|
||||
loop {}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ startup:
|
||||
|
||||
call memory_map
|
||||
|
||||
call vesa
|
||||
;TODO call vesa
|
||||
|
||||
mov si, init_fpu_msg
|
||||
call print
|
||||
|
||||
Reference in New Issue
Block a user