]> git.lizzy.rs Git - loadnothing.git/commitdiff
Volatile VGA buffer access
authorHimbeerserverDE <himbeerserverde@gmail.com>
Sun, 18 Sep 2022 14:44:46 +0000 (16:44 +0200)
committerHimbeerserverDE <himbeerserverde@gmail.com>
Sun, 18 Sep 2022 14:44:46 +0000 (16:44 +0200)
stage2/Cargo.toml
stage2/src/vga.rs

index c1cd277ae18e794bc26c7bf7b5b005197e0dd768..730ba623cbfd8860d3d62f0c24b8cd33b0ddbbc7 100644 (file)
@@ -16,3 +16,4 @@ lto = true
 codegen-units = 1
 
 [dependencies]
+volatile = "0.4.5"
index d0527246245bdf33903714e6cb717ac266c514a0..3b6ddc406e209dd1f4b00e248ed6b00b6ec7d240 100644 (file)
@@ -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<ScreenChar>; 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);
             },