From 9b1d09528ddcb93b2142b716d22d79c09c8d41a1 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sun, 18 Sep 2022 16:44:46 +0200 Subject: [PATCH] Volatile VGA buffer access --- stage2/Cargo.toml | 1 + stage2/src/vga.rs | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/stage2/Cargo.toml b/stage2/Cargo.toml index c1cd277..730ba62 100644 --- a/stage2/Cargo.toml +++ b/stage2/Cargo.toml @@ -16,3 +16,4 @@ lto = true codegen-units = 1 [dependencies] +volatile = "0.4.5" diff --git a/stage2/src/vga.rs b/stage2/src/vga.rs index d052724..3b6ddc4 100644 --- a/stage2/src/vga.rs +++ b/stage2/src/vga.rs @@ -1,4 +1,6 @@ -use core::ops::{AddAssign, Shl}; +use core::ops::{AddAssign, Deref, DerefMut, Shl}; + +use volatile::Volatile; #[allow(dead_code)] #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -39,12 +41,26 @@ struct ScreenChar { color_code: ColorCode, } +impl Deref for ScreenChar { + type Target = ScreenChar; + + fn deref(&self) -> &Self::Target { + self + } +} + +impl DerefMut for ScreenChar { + fn deref_mut(&mut self) -> &mut Self::Target { + self + } +} + const BUFFER_WIDTH: usize = 80; const BUFFER_HEIGHT: usize = 25; #[repr(transparent)] struct Buffer { - chars: [[ScreenChar; BUFFER_WIDTH]; BUFFER_HEIGHT], + chars: [[Volatile; BUFFER_WIDTH]; BUFFER_HEIGHT], } pub struct Writer { @@ -67,10 +83,10 @@ impl Writer { let col = self.column_position; let color_code = self.color_code; - self.buffer.chars[row][col] = ScreenChar { + self.buffer.chars[row][col].write(ScreenChar { ascii_character: byte, color_code, - }; + }); self.column_position.add_assign(1); }, -- 2.44.0