diff --git a/lwcpu/src/lib.rs b/lwcpu/src/lib.rs index 2c89c5c..62fbdcb 100644 --- a/lwcpu/src/lib.rs +++ b/lwcpu/src/lib.rs @@ -4,26 +4,24 @@ use core::ptr::{read_volatile, write_volatile}; const BASE_POINTER: u32 = 0x2000_0000; -const NUMBER_DISPLAY_OFFSET : u32 = 0x00; -const RANDOM_NUMBER_OFFSET : u32 = 0x04; -const BUTTONS_OFFSET : u32 = 0x08; -const TEXT_DISPLAY_OFFSET : u32 = 0x0C; -const KEYBOARD_OFFSET : u32 = 0x10; -const SCREEN_OFFSET : u32 = 0x80; - -const NUMBER_DISPLAY_POINTER : *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32; -const RANDOM_NUMBER_POINTER : *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFSET) as *mut u32; -const BUTTONS_POINTER : *mut u8 = (BASE_POINTER + BUTTONS_OFFSET) as *mut u8; -const TEXT_DISPLAY_POINTER : *mut u8 = (BASE_POINTER + TEXT_DISPLAY_OFFSET) as *mut u8; -const KEYBOARD_POINTER : *mut u32 = (BASE_POINTER + KEYBOARD_OFFSET) as *mut u32; -const SCREEN_POINTER : *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32; +const NUMBER_DISPLAY_OFFSET: u32 = 0x00; +const RANDOM_NUMBER_OFFSET: u32 = 0x04; +const BUTTONS_OFFSET: u32 = 0x08; +const TEXT_DISPLAY_OFFSET: u32 = 0x0C; +const KEYBOARD_OFFSET: u32 = 0x10; +const SCREEN_OFFSET: u32 = 0x80; +const NUMBER_DISPLAY_POINTER: *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32; +const RANDOM_NUMBER_POINTER: *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFSET) as *mut u32; +const BUTTONS_POINTER: *mut u8 = (BASE_POINTER + BUTTONS_OFFSET) as *mut u8; +const TEXT_DISPLAY_POINTER: *mut u8 = (BASE_POINTER + TEXT_DISPLAY_OFFSET) as *mut u8; +const KEYBOARD_POINTER: *mut u32 = (BASE_POINTER + KEYBOARD_OFFSET) as *mut u32; +const SCREEN_POINTER: *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32; pub struct Screen {} impl Screen { #[inline] - pub fn clear() { - } + pub fn clear() {} #[inline] pub fn turn_pixel_on(x: u8, y: u8) { unsafe { @@ -57,6 +55,17 @@ impl TextDisplay { } } } +impl core::fmt::Write for TextDisplay { + #[inline] + fn write_str(&mut self, s: &str) -> core::fmt::Result { + for ch in s.bytes() { + unsafe { + write_volatile(TEXT_DISPLAY_POINTER, ch); + } + } + return Ok(()); + } +} pub struct NumberDisplay {} impl NumberDisplay { @@ -83,13 +92,13 @@ impl RNG { pub struct Buttons {} impl Buttons { pub const RIGHT_RIGHT: u8 = 0b00000001; - pub const RIGHT_DOWN : u8 = 0b00000010; - pub const RIGHT_LEFT : u8 = 0b00000100; - pub const RIGHT_UP : u8 = 0b00001000; - pub const LEFT_RIGHT : u8 = 0b00010000; - pub const LEFT_DOWN : u8 = 0b00100000; - pub const LEFT_LEFT : u8 = 0b01000000; - pub const LEFT_UP : u8 = 0b10000000; + pub const RIGHT_DOWN: u8 = 0b00000010; + pub const RIGHT_LEFT: u8 = 0b00000100; + pub const RIGHT_UP: u8 = 0b00001000; + pub const LEFT_RIGHT: u8 = 0b00010000; + pub const LEFT_DOWN: u8 = 0b00100000; + pub const LEFT_LEFT: u8 = 0b01000000; + pub const LEFT_UP: u8 = 0b10000000; #[inline] pub fn read() -> u8 { diff --git a/test/src/main.rs b/test/src/main.rs index c5e2dbf..a0a0a43 100644 --- a/test/src/main.rs +++ b/test/src/main.rs @@ -1,8 +1,8 @@ #![no_std] #![no_main] -use core::panic::PanicInfo; -use lwcpu::{self, NumberDisplay, Screen, TextDisplay}; +use core::{fmt::Write, panic::PanicInfo}; +use lwcpu::{NumberDisplay, Screen, TextDisplay}; use riscv_rt::entry; #[panic_handler] @@ -11,16 +11,15 @@ fn panic_handler(_info: &PanicInfo) -> ! { loop {} } -const HELLO_WORLD: &[u8; 13] = b" Hello world!"; +const HELLO_WORLD: &str = " Hello world!"; #[entry] fn main() -> ! { + let mut text = TextDisplay{}; for i in 0..31 { Screen::set_line(i, 1 << i); } loop { - for ch in HELLO_WORLD { - TextDisplay::put_char(*ch); - } + let _ = text.write_str(HELLO_WORLD); } }