|
|
@ -7,10 +7,8 @@ pub const BASE_POINTER : u32 = 0x1000_0000;
|
|
|
|
pub const NUMBER_DISPLAY_OFFSET: u32 = 0x00;
|
|
|
|
pub const NUMBER_DISPLAY_OFFSET: u32 = 0x00;
|
|
|
|
pub const RANDOM_NUMBER_OFFSET: u32 = 0x04;
|
|
|
|
pub const RANDOM_NUMBER_OFFSET: u32 = 0x04;
|
|
|
|
pub const BUTTONS_OFFSET: u32 = 0x08;
|
|
|
|
pub const BUTTONS_OFFSET: u32 = 0x08;
|
|
|
|
|
|
|
|
pub const TEXT_DISPLAY_OFFSET: u32 = 0x0C;
|
|
|
|
pub const KEYBOARD_OFFSET: u32 = 0x10;
|
|
|
|
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 SCREEN_OFFSET: u32 = 0x80;
|
|
|
|
|
|
|
|
|
|
|
|
pub const NUMBER_DISPLAY_POINTER: *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32;
|
|
|
|
pub const NUMBER_DISPLAY_POINTER: *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32;
|
|
|
@ -18,35 +16,12 @@ 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 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 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 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 const SCREEN_POINTER: *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub enum ScreenMode {
|
|
|
|
|
|
|
|
AlwaysDisplay,
|
|
|
|
|
|
|
|
Buffered,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub struct Screen {}
|
|
|
|
pub struct Screen {}
|
|
|
|
impl Screen {
|
|
|
|
impl Screen {
|
|
|
|
const SCREEN_CLEAR: u32 = 0x0000_0001;
|
|
|
|
|
|
|
|
const SCREEN_DISPLAY: u32 = 0x0000_0100;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
#[inline]
|
|
|
|
pub fn init(mode: ScreenMode) {
|
|
|
|
pub fn clear() {}
|
|
|
|
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]
|
|
|
|
#[inline]
|
|
|
|
pub fn turn_pixel_on(x: u8, y: u8) {
|
|
|
|
pub fn turn_pixel_on(x: u8, y: u8) {
|
|
|
|
unsafe {
|
|
|
|
unsafe {
|
|
|
@ -73,16 +48,6 @@ impl Screen {
|
|
|
|
|
|
|
|
|
|
|
|
pub struct TextDisplay {}
|
|
|
|
pub struct TextDisplay {}
|
|
|
|
impl 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]
|
|
|
|
#[inline]
|
|
|
|
pub fn put_char(ch: u8) {
|
|
|
|
pub fn put_char(ch: u8) {
|
|
|
|
unsafe {
|
|
|
|
unsafe {
|
|
|
|