1
- use core:: fmt:: { Write , Result } ;
2
- use core:: slice;
3
- use spin:: Mutex ;
4
-
5
- pub static PRINTER : Mutex < Printer > = Mutex :: new ( Printer :: new ( ) ) ;
6
-
7
- pub struct Printer {
8
- index : usize ,
9
- }
10
-
11
- impl Printer {
12
- pub const fn new ( ) -> Printer {
13
- Printer {
14
- index : 0 ,
15
- }
16
- }
17
- }
18
-
19
- impl Write for Printer {
20
- fn write_str ( & mut self , s : & str ) -> Result {
21
- const VGA_BUFFER : * mut u8 = 0xb8000 as * mut _ ;
22
- let vga_buffer = unsafe { slice:: from_raw_parts_mut ( VGA_BUFFER , 80 * 25 * 2 ) } ;
23
- for byte in s. bytes ( ) {
24
- vga_buffer[ self . index ] = byte;
25
- vga_buffer[ self . index + 1 ] = 0x4f ;
26
- self . index += 2 ;
27
- }
28
-
29
- Ok ( ( ) )
30
- }
31
- }
1
+ use core:: fmt:: { Write , Result } ;
2
+ use core:: slice;
3
+ use spin:: Mutex ;
4
+
5
+ const VGA_BUFFER : * mut u8 = 0xb8000 as * mut _ ;
6
+ const SCREEN_SIZE : usize = 80 * 25 ;
7
+
8
+ pub static PRINTER : Mutex < Printer > = Mutex :: new ( Printer :: new ( ) ) ;
9
+
10
+ pub struct Printer {
11
+ index : usize ,
12
+ }
13
+
14
+ impl Printer {
15
+ pub const fn new ( ) -> Printer {
16
+ Printer {
17
+ index : 0 ,
18
+ }
19
+ }
20
+
21
+ pub fn clear_screen ( & mut self ) {
22
+ let vga_buffer = Self :: vga_buffer ( ) ;
23
+ for byte in vga_buffer {
24
+ * byte = 0 ;
25
+ }
26
+ self . index = 0 ;
27
+ }
28
+
29
+ fn vga_buffer ( ) -> & ' static mut [ u8 ] {
30
+ unsafe { slice:: from_raw_parts_mut ( VGA_BUFFER , SCREEN_SIZE * 2 ) }
31
+ }
32
+ }
33
+
34
+ impl Write for Printer {
35
+ fn write_str ( & mut self , s : & str ) -> Result {
36
+ let vga_buffer = Self :: vga_buffer ( ) ;
37
+ for byte in s. bytes ( ) {
38
+ vga_buffer[ self . index ] = byte;
39
+ vga_buffer[ self . index + 1 ] = 0x4f ;
40
+ self . index += 2 ;
41
+ }
42
+
43
+ Ok ( ( ) )
44
+ }
45
+ }
0 commit comments