use crate::arch::x86_64::arch_regs::get_sp;
use crate::machine::cgascr::CGAScreen;
use crate::machine::key::Key;
use crate::machine::keyctrl::KEY_BUFFER;
use crate::machine::serial::SerialWritter;
use core::cell::SyncUnsafeCell;
use core::fmt::{Arguments, Write};
use core::panic::PanicInfo;
use lazy_static::lazy_static;
use spin::Mutex;
lazy_static! {
pub static ref CGASCREEN_GLOBAL: Mutex<CGAScreen> =
Mutex::new(CGAScreen::new());
}
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
println!("[{:X}] {}", get_sp(), info);
loop {}
}
pub static SERIAL_GLOBAL: SyncUnsafeCell<SerialWritter> =
SyncUnsafeCell::new(SerialWritter::new(0x3f8));
#[macro_export]
macro_rules! print {
($($arg:tt)*) => ($crate::io::_print(format_args!($($arg)*)));
}
pub(crate) use print;
#[macro_export]
macro_rules! println {
() => ($crate::print!("\n"));
($($arg:tt)*) => (print!("{}\n", format_args!($($arg)*)));
}
pub(crate) use println;
#[macro_export]
macro_rules! sprint {
($($arg:tt)*) => ($crate::io::_serial_print(format_args!($($arg)*)));
}
pub(crate) use sprint;
#[macro_export]
macro_rules! sprintln{
() => ($crate::sprint!("\n"));
($($arg:tt)*) => (sprint!("{}\n", format_args!($($arg)*)));
}
pub(crate) use sprintln;
pub fn read_key() -> Key {
use crate::proc::sync::semaphore::Semaphore;
KEY_BUFFER.p().unwrap()
}
pub fn _print(args: Arguments) {
CGASCREEN_GLOBAL.lock().write_fmt(args).unwrap();
}
pub fn _serial_print(args: Arguments) {
unsafe {
(*SERIAL_GLOBAL.get()).write_fmt(args).unwrap();
}
}
pub fn clear_screen() { CGASCREEN_GLOBAL.lock().clear(); }
pub fn reset_screen() { CGASCREEN_GLOBAL.lock().reset(); }
pub fn back_space() { CGASCREEN_GLOBAL.lock().backspace(); }
pub fn print_help(s: &str, attr: u8) {
CGASCREEN_GLOBAL.lock().print_at_bottom(s, attr);
}
pub fn set_attr(attr: u8) { CGASCREEN_GLOBAL.lock().setattr(attr); }
pub fn print_welcome() {
println!("--RuStuBs--");
println!(" _._ _,-'\"\"`-._ ~Meow");
println!(" (,-.`._,'( |\\`-/|");
println!(" `-.-' \\ )-`( , o o)");
println!(" `- \\`_`\"'-");
}