Initial Commit
This commit is contained in:
		
						commit
						99b87d5163
					
				
					 11 changed files with 191 additions and 0 deletions
				
			
		
							
								
								
									
										64
									
								
								src/io/vga/buffer.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/io/vga/buffer.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
use crate::io::vga::colors::ColorCode;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
			
		||||
#[repr(C)]
 | 
			
		||||
struct ScreenChar {
 | 
			
		||||
    ascii_character: u8,
 | 
			
		||||
    color_code: ColorCode,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const BUFFER_HEIGHT: usize = 25;
 | 
			
		||||
const BUFFER_WIDTH: usize = 80;
 | 
			
		||||
 | 
			
		||||
#[repr(transparent)]
 | 
			
		||||
pub struct Buffer {
 | 
			
		||||
    chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT],
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct Writer {
 | 
			
		||||
    pub(crate) column_position: usize,
 | 
			
		||||
    pub(crate) color_code: ColorCode,
 | 
			
		||||
    pub(crate) buffer: &'static mut Buffer,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Writer {
 | 
			
		||||
    pub fn write_byte(&mut self, byte: u8) {
 | 
			
		||||
        match byte {
 | 
			
		||||
            b'\n' => self.new_line(),
 | 
			
		||||
            byte => {
 | 
			
		||||
                if self.column_position >= BUFFER_WIDTH {
 | 
			
		||||
                    self.new_line();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                let row = BUFFER_HEIGHT - 1;
 | 
			
		||||
                let col = self.column_position;
 | 
			
		||||
 | 
			
		||||
                let color_code = self.color_code;
 | 
			
		||||
                self.buffer.chars[row][col] = ScreenChar {
 | 
			
		||||
                    ascii_character: byte,
 | 
			
		||||
                    color_code,
 | 
			
		||||
                };
 | 
			
		||||
                self.column_position += 1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn new_line(&mut self) {
 | 
			
		||||
        unimplemented!();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
impl Writer {
 | 
			
		||||
    pub fn write_string(&mut self, s: &str) {
 | 
			
		||||
        for byte in s.bytes() {
 | 
			
		||||
            match byte {
 | 
			
		||||
                // printable ASCII byte or newline
 | 
			
		||||
                0x20..=0x7e | b'\n' => self.write_byte(byte),
 | 
			
		||||
                // not part of printable ASCII range
 | 
			
		||||
                _ => self.write_byte(0xfe),
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								src/io/vga/colors.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/io/vga/colors.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
#[allow(dead_code)]
 | 
			
		||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
			
		||||
#[repr(u8)]
 | 
			
		||||
pub enum Color {
 | 
			
		||||
    Black = 0,
 | 
			
		||||
    Blue = 1,
 | 
			
		||||
    Green = 2,
 | 
			
		||||
    Cyan = 3,
 | 
			
		||||
    Red = 4,
 | 
			
		||||
    Magenta = 5,
 | 
			
		||||
    Brown = 6,
 | 
			
		||||
    LightGray = 7,
 | 
			
		||||
    DarkGray = 8,
 | 
			
		||||
    LightBlue = 9,
 | 
			
		||||
    LightGreen = 10,
 | 
			
		||||
    LightCyan = 11,
 | 
			
		||||
    LightRed = 12,
 | 
			
		||||
    Pink = 13,
 | 
			
		||||
    Yellow = 14,
 | 
			
		||||
    White = 15,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
			
		||||
#[repr(transparent)]
 | 
			
		||||
pub struct ColorCode(u8);
 | 
			
		||||
 | 
			
		||||
impl ColorCode {
 | 
			
		||||
    pub(crate) fn new(foreground: Color, background: Color) -> ColorCode {
 | 
			
		||||
        ColorCode((background as u8) << 4 | (foreground as u8))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								src/io/vga/mod.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/io/vga/mod.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
pub mod colors;
 | 
			
		||||
pub mod buffer;
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue