diff --git a/lwcpu/src/lib.rs b/lwcpu/src/lib.rs index 8d85fc7..d93fe4c 100644 --- a/lwcpu/src/lib.rs +++ b/lwcpu/src/lib.rs @@ -7,8 +7,9 @@ pub const BASE_POINTER : u32 = 0x1000_0000; pub const NUMBER_DISPLAY_OFFSET : u32 = 0x00; pub const RANDOM_NUMBER_OFFSET : u32 = 0x04; pub const BUTTONS_OFFSET : u32 = 0x08; -pub const TEXT_DISPLAY_OFFSET : u32 = 0x0C; +pub const TEXT_DISPLAY_OFFSET : u32 = 0x28; pub const KEYBOARD_OFFSET : u32 = 0x10; +pub const SCREEN_CONTROL_OFFSET : u32 = 0x20; pub const SCREEN_OFFSET : u32 = 0x80; pub const NUMBER_DISPLAY_POINTER : *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32; @@ -16,12 +17,34 @@ pub const RANDOM_NUMBER_POINTER : *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFS pub const BUTTONS_POINTER : *mut u8 = (BASE_POINTER + BUTTONS_OFFSET) as *mut u8; pub const TEXT_DISPLAY_POINTER : *mut u8 = (BASE_POINTER + TEXT_DISPLAY_OFFSET) as *mut u8; pub const KEYBOARD_POINTER : *mut u32 = (BASE_POINTER + KEYBOARD_OFFSET) as *mut u32; +pub const SCREEN_CONTROL_POINTER : *mut u32 = (BASE_POINTER + SCREEN_CONTROL_OFFSET) as *mut u32; pub const SCREEN_POINTER : *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32; + +pub enum ScreenMode { + AlwaysDisplay, + Buffered, +} + pub struct Screen {} impl Screen { + const SCREEN_CLEAR: u32 = 0x0000_0001; + const SCREEN_DISPLAY: u32 = 0x0000_0100; + #[inline] - pub fn clear() {} + pub fn init(mode: ScreenMode) { + unsafe { + write_volatile(SCREEN_CONTROL_POINTER, Self::SCREEN_CLEAR | Self::SCREEN_DISPLAY); + match mode { + ScreenMode::AlwaysDisplay => { + write_volatile(SCREEN_CONTROL_POINTER, Self::SCREEN_DISPLAY); + }, + ScreenMode::Buffered => { + write_volatile(SCREEN_CONTROL_POINTER, 0); + } + } + } + } #[inline] pub fn turn_pixel_on(x: u8, y: u8) { unsafe { diff --git a/test/src/main.rs b/test/src/main.rs index d17f2c2..0a831e7 100644 --- a/test/src/main.rs +++ b/test/src/main.rs @@ -2,7 +2,7 @@ #![no_main] use core::{fmt::Write, panic::PanicInfo, ptr::{read_volatile, write_volatile}}; -use lwcpu::{NumberDisplay, TextDisplay, SCREEN_POINTER}; +use lwcpu::{NumberDisplay, Screen, ScreenMode, TextDisplay, SCREEN_POINTER}; use riscv_rt::entry; #[panic_handler] @@ -17,6 +17,7 @@ const HELLO_WORLD: &str = " Hello world!"; #[entry] fn main() -> ! { + Screen::init(ScreenMode::AlwaysDisplay); let mut text = TextDisplay{}; unsafe { write_volatile(SCREEN_POINTER, 0x001166ff);