Compare commits

...

4 Commits

@ -2,26 +2,51 @@
use core::ptr::{read_volatile, write_volatile};
pub const BASE_POINTER: u32 = 0x1000_0000;
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 KEYBOARD_OFFSET: u32 = 0x10;
pub const SCREEN_OFFSET: u32 = 0x80;
pub const NUMBER_DISPLAY_OFFSET : u32 = 0x00;
pub const RANDOM_NUMBER_OFFSET : u32 = 0x04;
pub const BUTTONS_OFFSET : u32 = 0x08;
pub const KEYBOARD_OFFSET : u32 = 0x10;
pub const SCREEN_CONTROL_OFFSET : u32 = 0x20;
pub const TEXT_CONTROL_OFFSET : u32 = 0x24;
pub const TEXT_DISPLAY_OFFSET : u32 = 0x28;
pub const SCREEN_OFFSET : u32 = 0x80;
pub const NUMBER_DISPLAY_POINTER: *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32;
pub const RANDOM_NUMBER_POINTER: *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFSET) as *mut u32;
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_POINTER: *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32;
pub const NUMBER_DISPLAY_POINTER : *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32;
pub const RANDOM_NUMBER_POINTER : *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFSET) as *mut u32;
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 TEXT_CONTROL_POINTER : *mut u32 = (BASE_POINTER + TEXT_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 {
@ -48,6 +73,16 @@ impl Screen {
pub struct TextDisplay {}
impl TextDisplay {
const TEXT_CLEAR: u32 = 0x0000_0001;
const TEXT_DISPLAY: u32 = 0x0000_0100;
#[inline]
pub fn init(&self) {
unsafe {
write_volatile(TEXT_CONTROL_POINTER, Self::TEXT_CLEAR); // hide contents and clear
write_volatile(TEXT_CONTROL_POINTER, Self::TEXT_DISPLAY); // display contents
}
}
#[inline]
pub fn put_char(ch: u8) {
unsafe {
@ -91,14 +126,14 @@ 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_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;
#[inline]
pub fn read() -> u8 {

@ -2,14 +2,14 @@
#![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]
fn panic_handler(_info: &PanicInfo) -> ! {
NumberDisplay::display_number(0xDEADC0DE);
let mut text = TextDisplay{};
let _ = write!(text, "Panic: {} 1234", _info.message());
let _ = write!(text, "Panic: {} {}", _info.message(), 1234);
loop {}
}
@ -17,7 +17,13 @@ const HELLO_WORLD: &str = " Hello world!";
#[entry]
fn main() -> ! {
NumberDisplay::display_number(0);
Screen::init(ScreenMode::AlwaysDisplay);
let mut text = TextDisplay{};
text.init();
for i in 0..32 {
Screen::set_line(i, 1 << i);
}
unsafe {
write_volatile(SCREEN_POINTER, 0x001166ff);
write_volatile(SCREEN_POINTER.offset(1), 0xAAAAAAAA);

Loading…
Cancel
Save