1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use crate::memory_mapped::MemoryMapped;
use bitflags::bitflags;
use vblank::VBlankGiver;
use video::Video;
use self::object::ObjectControl;
pub mod bitmap3;
pub mod bitmap4;
pub mod example_logo;
pub mod object;
pub mod palette16;
pub mod tiled0;
pub mod vblank;
pub mod video;
const DISPLAY_CONTROL: MemoryMapped<u16> = unsafe { MemoryMapped::new(0x0400_0000) };
const DISPLAY_STATUS: MemoryMapped<u16> = unsafe { MemoryMapped::new(0x0400_0004) };
const VCOUNT: MemoryMapped<u16> = unsafe { MemoryMapped::new(0x0400_0006) };
bitflags! {
struct GraphicsSettings: u16 {
const PAGE_SELECT = 1 << 0x4;
const OAM_HBLANK = 1 << 0x5;
const SPRITE1_D = 1 << 0x6;
const SCREEN_BLANK = 1 << 0x7;
const LAYER_BG0 = 1 << 0x8;
const LAYER_BG1 = 1 << 0x9;
const LAYER_BG2 = 1 << 0xA;
const LAYER_BG3 = 1 << 0xB;
const LAYER_OBJ = 1 << 0xC;
const WINDOW0 = 1 << 0xD;
const WINDOW1 = 1 << 0xE;
const WINDOW_OBJECT = 1 << 0xF;
}
}
pub const WIDTH: i32 = 240;
pub const HEIGHT: i32 = 160;
#[allow(dead_code)]
enum DisplayMode {
Tiled0 = 0,
Tiled1 = 1,
Tiled2 = 2,
Bitmap3 = 3,
Bitmap4 = 4,
Bitmap5 = 5,
}
#[non_exhaustive]
pub struct Display {
pub video: Video,
pub vblank: VBlankGiver,
pub object: ObjectDistribution,
}
#[non_exhaustive]
pub struct ObjectDistribution {}
impl ObjectDistribution {
pub fn get(&mut self) -> ObjectControl {
ObjectControl::new()
}
}
impl Display {
pub(crate) const unsafe fn new() -> Self {
Display {
video: Video {},
vblank: VBlankGiver {},
object: ObjectDistribution {},
}
}
}
unsafe fn set_graphics_mode(mode: DisplayMode) {
let current = DISPLAY_CONTROL.get();
let current = current & (!0b111);
let s = current | (mode as u16 & 0b111);
DISPLAY_CONTROL.set(s);
}
unsafe fn set_graphics_settings(settings: GraphicsSettings) {
let current = DISPLAY_CONTROL.get();
let current = current & 0b111;
let s = settings.bits() | current;
DISPLAY_CONTROL.set(s);
}
#[allow(non_snake_case)]
pub fn busy_wait_for_VBlank() {
while VCOUNT.get() >= 160 {}
while VCOUNT.get() < 160 {}
}
pub enum Priority {
P0 = 0,
P1 = 1,
P2 = 2,
P3 = 3,
}