colorify function added

This commit is contained in:
Able 2021-12-24 13:00:20 -06:00
parent cddecccb4c
commit 914085fdf5
15 changed files with 182 additions and 109 deletions

View file

@ -1,2 +0,0 @@
cargo bootimage --target json_targets/x86_64-ableos.json && \
qemu-system-x86_64 -S -gdb tcp::9000 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin

View file

@ -1,2 +0,0 @@
cargo bootimage --target json_targets/x86_64-ableos.json && \
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin

View file

@ -1,2 +0,0 @@
cargo bootimage --target json_targets/x86_64-ableos.json && \
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/debug/bootimage-ableos.bin

View file

@ -1,2 +0,0 @@
cargo bootimage --release --target json_targets/x86_64-ableos.json && \
qemu-system-x86_64 -drive format=raw,file=target/x86_64-ableos/release/bootimage-ableos.bin

View file

@ -1,5 +1,5 @@
pub mod allocator; pub mod allocator;
pub mod graphics; pub mod graphics;
pub mod serial; pub mod serial;
#[deprecated(note = "The use of hardware specific drivers for VGA is discouraged")] // #[deprecated(note = "The use of hardware specific drivers for VGA is discouraged")]
pub mod vga; pub mod vga;

View file

@ -2,114 +2,111 @@
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)] #[repr(u8)]
pub enum Color { pub enum Color {
Black = 0, Black = 0,
Blue = 1, Blue = 1,
Green = 2, Green = 2,
Cyan = 3, Cyan = 3,
Red = 4, Red = 4,
Magenta = 5, Magenta = 5,
Brown = 6, Brown = 6,
LightGray = 7, LightGray = 7,
DarkGray = 8, DarkGray = 8,
LightBlue = 9, LightBlue = 9,
LightGreen = 10, LightGreen = 10,
LightCyan = 11, LightCyan = 11,
LightRed = 12, LightRed = 12,
Pink = 13, Pink = 13,
Yellow = 14, Yellow = 14,
White = 15, White = 15,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(transparent)] #[repr(transparent)]
struct ColorCode(u8); struct ColorCode(u8);
impl ColorCode { impl ColorCode {
fn new(foreground: Color, background: Color) -> ColorCode { fn new(foreground: Color, background: Color) -> ColorCode {
ColorCode((background as u8) << 4 | (foreground as u8)) ColorCode((background as u8) << 4 | (foreground as u8))
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)] #[repr(C)]
struct ScreenChar { struct ScreenChar {
ascii_character: u8, ascii_character: u8,
color_code: ColorCode, color_code: ColorCode,
} }
const BUFFER_HEIGHT: usize = 25; const BUFFER_HEIGHT: usize = 25;
const BUFFER_WIDTH: usize = 80; const BUFFER_WIDTH: usize = 80;
#[repr(transparent)] #[repr(transparent)]
struct Buffer { struct Buffer {
chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT], chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT],
} }
pub struct Writer { pub struct Writer {
column_position: usize, column_position: usize,
color_code: ColorCode, color_code: ColorCode,
buffer: &'static mut Buffer, buffer: &'static mut Buffer,
} }
impl Writer { impl Writer {
pub fn write_byte(&mut self, byte: u8) { pub fn write_byte(&mut self, byte: u8) {
match byte { match byte {
b'\n' => self.new_line(), b'\n' => self.new_line(),
byte => { byte => {
if self.column_position >= BUFFER_WIDTH { if self.column_position >= BUFFER_WIDTH {
self.new_line(); self.new_line();
} }
let row = BUFFER_HEIGHT - 1; let row = BUFFER_HEIGHT - 1;
let col = self.column_position; let col = self.column_position;
let color_code = self.color_code; let color_code = self.color_code;
self.buffer.chars[row][col].write(ScreenChar { self.buffer.chars[row][col].write(ScreenChar {
ascii_character: byte, ascii_character: byte,
color_code, color_code,
}); });
self.column_position += 1; self.column_position += 1;
} }
} }
} }
pub fn write_string(&mut self, s: &str) { pub fn write_string(&mut self, s: &str) {
for byte in s.bytes() { for byte in s.bytes() {
match byte { match byte {
// printable ASCII byte or newline // printable ASCII byte or newline
0x20..=0x7e | b'\n' => self.write_byte(byte), 0x20..=0x7e | b'\n' => self.write_byte(byte),
// not part of printable ASCII range // not part of printable ASCII range
_ => self.write_byte(0xfe), _ => self.write_byte(0xfe),
} }
} }
} }
fn new_line(&mut self) { fn new_line(&mut self) {
for row in 1..BUFFER_HEIGHT { for row in 1..BUFFER_HEIGHT {
for col in 0..BUFFER_WIDTH { for col in 0..BUFFER_WIDTH {
let character = self.buffer.chars[row][col].read(); let character = self.buffer.chars[row][col].read();
self.buffer.chars[row - 1][col].write(character); self.buffer.chars[row - 1][col].write(character);
} }
} }
self.clear_row(BUFFER_HEIGHT - 1); self.clear_row(BUFFER_HEIGHT - 1);
self.column_position = 0; self.column_position = 0;
} }
fn clear_row(&mut self, row: usize) { fn clear_row(&mut self, row: usize) {
let blank = ScreenChar { let blank = ScreenChar {
ascii_character: b' ', ascii_character: b' ',
color_code: self.color_code, color_code: self.color_code,
}; };
for col in 0..BUFFER_WIDTH { for col in 0..BUFFER_WIDTH {
self.buffer.chars[row][col].write(blank); self.buffer.chars[row][col].write(blank);
} }
} }
} }
impl fmt::Write for Writer { impl fmt::Write for Writer {
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
self.write_string(s); self.write_string(s);
Ok(()) Ok(())
} }
} }
lazy_static! { lazy_static! {
pub static ref WRITER: Mutex<Writer> = Mutex::new(Writer { pub static ref WRITER: Mutex<Writer> = Mutex::new(Writer {
column_position: 0, column_position: 0,
color_code: ColorCode::new(Color::Green, Color::Black), color_code: ColorCode::new(Color::Green, Color::Black),
buffer: unsafe { &mut *(0xb8000 as *mut Buffer) }, buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
}); });
}
#[allow(dead_code)]
pub fn set_vga_color() {
WRITER.lock().color_code = ColorCode::new(Color::White, Color::Yellow);
} }
use core::fmt; use core::fmt;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use spin::Mutex; use spin::Mutex;
@ -125,9 +122,13 @@ macro_rules! kprintln {
} }
#[doc(hidden)] #[doc(hidden)]
pub fn _kprint(args: fmt::Arguments) { pub fn _kprint(args: fmt::Arguments) {
use core::fmt::Write; use core::fmt::Write;
use x86_64::instructions::interrupts; use x86_64::instructions::interrupts;
interrupts::without_interrupts(|| { interrupts::without_interrupts(|| {
WRITER.lock().write_fmt(args).unwrap(); WRITER.lock().write_fmt(args).unwrap();
}); });
}
pub fn set_vga_color(fg: Color, bg: Color) {
WRITER.lock().color_code = ColorCode::new(fg, bg);
} }

View file

@ -23,8 +23,8 @@ pub fn start(boot_info: &'static BootInfo) -> ! {
let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000)); let page = Page::containing_address(VirtAddr::new(0xdeadbeaf000));
memory::create_example_mapping(page, &mut mapper, &mut frame_allocator); memory::create_example_mapping(page, &mut mapper, &mut frame_allocator);
let page_ptr: *mut u64 = page.start_address().as_mut_ptr(); // let page_ptr: *mut u64 = page.start_address().as_mut_ptr();
unsafe { page_ptr.offset(400).write_volatile(0xf021_f077_f065_804e) }; // unsafe { page_ptr.offset(400).write_volatile(0xf021_f077_f065_804e) };
allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed"); allocator::init_heap(&mut mapper, &mut frame_allocator).expect("heap initialization failed");

View file

@ -0,0 +1,63 @@
use crate::arch::drivers::vga::{set_vga_color, Color};
pub fn colorify(eval: &str) {
let y = eval.split("$");
for z in y {
match z {
"BLACK" => {
set_vga_color(Color::Black, Color::Black);
}
"RED" => {
set_vga_color(Color::Red, Color::Black);
}
"GREEN" => {
set_vga_color(Color::Green, Color::Black);
}
"BLUE" => {
set_vga_color(Color::Blue, Color::Black);
}
"CYAN" => {
set_vga_color(Color::Cyan, Color::Black);
}
"MAGENTA" => {
set_vga_color(Color::Magenta, Color::Black);
}
"BROWN" => {
set_vga_color(Color::Brown, Color::Black);
}
"LIGHTGRAY" => {
set_vga_color(Color::LightGray, Color::Black);
}
"DARKGRAY" => {
set_vga_color(Color::DarkGray, Color::Black);
}
"LIGHTBLUE" => {
set_vga_color(Color::LightBlue, Color::Black);
}
"LIGHTGREEN" => {
set_vga_color(Color::LightGreen, Color::Black);
}
"LIGHTCYAN" => {
set_vga_color(Color::LightCyan, Color::Black);
}
"LIGHTRED" => {
set_vga_color(Color::LightRed, Color::Black);
}
"PINK" => {
set_vga_color(Color::Pink, Color::Black);
}
"YELLOW" => {
set_vga_color(Color::Yellow, Color::Black);
}
"WHITE" => {
set_vga_color(Color::White, Color::Black);
}
"RESET" => {
set_vga_color(Color::White, Color::Black);
}
elk => {
print!("{}", elk);
}
}
}
}

View file

@ -1,5 +1,6 @@
#![allow(dead_code)] #![allow(dead_code)]
use crate::trace; use crate::trace;
// TODO: Evaluate variable sized mailboxes
pub struct MailBoxes { pub struct MailBoxes {
flags: u8, flags: u8,

View file

@ -1,5 +1,6 @@
#![allow(dead_code)] #![allow(dead_code)]
pub mod absi;
pub mod clip; pub mod clip;
pub mod server; pub mod server;
pub mod systeminfo; pub mod systeminfo;

View file

@ -1,5 +1,6 @@
#![allow(clippy::empty_loop)] #![allow(clippy::empty_loop)]
use crate::experiments::absi::colorify;
use { use {
crate::{ crate::{
arch::{drivers::graphics::GraphicsBuffer, init, sloop}, arch::{drivers::graphics::GraphicsBuffer, init, sloop},
@ -12,7 +13,6 @@ use {
alloc::vec, alloc::vec,
lazy_static::lazy_static, lazy_static::lazy_static,
}; };
#[no_mangle] #[no_mangle]
#[allow(unconditional_recursion)] #[allow(unconditional_recursion)]
pub extern "C" fn stack_overflow() -> u8 { pub extern "C" fn stack_overflow() -> u8 {
@ -31,6 +31,7 @@ lazy_static! {
#[no_mangle] #[no_mangle]
pub fn kernel_main() -> ! { pub fn kernel_main() -> ! {
init::init(); init::init();
let mut a_thread = Thread::new(); let mut a_thread = Thread::new();
a_thread.new_task(test_fn); a_thread.new_task(test_fn);
@ -46,6 +47,8 @@ pub fn kernel_main() -> ! {
println!("{} v{}", RELEASE_TYPE, KERNEL_VERSION); println!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION); info!("{} v{}", RELEASE_TYPE, KERNEL_VERSION);
colorify("$PINK$Hi$RED$ from$GREEN$ able");
// stack_overflow(); // stack_overflow();
// crate::arch::shutdown(); // crate::arch::shutdown();
sloop() sloop()

View file

@ -39,7 +39,6 @@ pub mod kmain;
pub mod panic; pub mod panic;
pub mod relib; pub mod relib;
pub mod scheduler; pub mod scheduler;
pub mod test;
pub mod wasm; pub mod wasm;
extern crate alloc; extern crate alloc;

View file

@ -72,7 +72,7 @@ impl ModuleImportResolver for HostFunctions {
} }
pub fn evaluate() { pub fn evaluate() {
let wasm_binary = include_bytes!("rust.wasm"); let wasm_binary = include_bytes!("zig.wasm");
// Load wasm binary and prepare it for instantiation. // Load wasm binary and prepare it for instantiation.
let module = wasmi::Module::from_buffer(&wasm_binary).expect("failed to load wasm"); let module = wasmi::Module::from_buffer(&wasm_binary).expect("failed to load wasm");

View file

@ -37,11 +37,22 @@ syscall_enum! {
GET_PID=6, // Get the proccess ID GET_PID=6, // Get the proccess ID
PROCESS_INFO=7, // Get information about the process PROCESS_INFO=7, // Get information about the process
//scheduler Related Syscals //scheduler Related Syscals
GET_PRIORITY=10, // Get scheduler priority GET_PRIORITY=8, // Get scheduler priority
SET_PRIORITY=11, // Set scheduler priority SET_PRIORITY=9, // Set scheduler priority
// //
GET_HOSTNAME=12, GET_HOSTNAME=10,
SET_HOSTNAME=13, SET_HOSTNAME=11,
NEW_THREAD=12,
NEW_TASK=13,
KILL_THREAD=14,
KILL_TASK=15,
GET_THREAD=16,
GET_TASK=17,
SEND= 18,
RECEIVE = 19,
RESPOND = 20,
//File Related syscalls //File Related syscalls
// //
@ -65,7 +76,6 @@ syscall_enum! {
GET_TIME=36, // Gets the system time (some derivitive of seconds) GET_TIME=36, // Gets the system time (some derivitive of seconds)
SET_TIME=37, // Sets the system time (some derivitive of seconds) SET_TIME=37, // Sets the system time (some derivitive of seconds)
// Socket SysCall // Socket SysCall
SOCKET_BIND=39, // Used by servers to lock a port SOCKET_BIND=39, // Used by servers to lock a port
SOCKET_CONNECT=40, SOCKET_CONNECT=40,
@ -73,6 +83,9 @@ syscall_enum! {
SOCKET_SEND=42, SOCKET_SEND=42,
SOCKET_RECEIVE=43, SOCKET_RECEIVE=43,
EXIT=50, EXIT=50,
EMPTY=0xFFFF, EMPTY=0xFFFF,
} }

BIN
ableos/src/wasm/zig.wasm Normal file

Binary file not shown.