@@ -20,70 +20,44 @@ mod timer;
20
20
mod keypad;
21
21
mod serial_ram;
22
22
mod rom;
23
+ mod framebuffer;
23
24
24
25
use rom:: * ;
25
26
use timer:: sleep_ms;
27
+ use framebuffer:: FBIter ;
26
28
27
29
use chirp8:: prelude:: * ;
28
30
use chirp8:: peripherals:: * ;
29
31
30
32
struct Board {
31
33
fb_dirty : bool ,
32
- fb_pixels : [ [ u8 ; ( pcd8544 :: SCREEN_HEIGHT / 8 ) as usize ] ; pcd8544 :: SCREEN_WIDTH as usize ] ,
34
+ fb_rows : [ u64 ; SCREEN_HEIGHT as usize ] ,
33
35
countdown : u8
34
36
}
35
37
36
38
impl Board {
37
39
pub const fn new ( ) -> Board {
38
40
Board {
39
41
fb_dirty : false ,
40
- fb_pixels : [ [ 0 ; ( pcd8544 :: SCREEN_HEIGHT / 8 ) as usize ] ; pcd8544 :: SCREEN_WIDTH as usize ] ,
42
+ fb_rows : [ 0 ; SCREEN_HEIGHT as usize ] ,
41
43
countdown : 0
42
44
}
43
45
}
44
46
}
45
47
static mut BOARD : Board = Board :: new ( ) ;
46
48
47
- fn xy_from_chirp8 ( x : u8 , y : u8 ) -> ( u8 , u8 ) {
48
- let dx = ( pcd8544:: SCREEN_WIDTH - SCREEN_WIDTH ) / 2 ;
49
- let dy = ( pcd8544:: SCREEN_HEIGHT - SCREEN_HEIGHT ) / 2 ;
50
- ( x + dx, y + dy)
51
- }
52
-
53
49
impl Peripherals for Board {
54
50
fn keep_running ( & self ) -> bool { true }
55
51
56
- fn clear_pixels ( & mut self ) {
57
- for col in self . fb_pixels . iter_mut ( ) {
58
- for pixel in col. iter_mut ( ) {
59
- * pixel = 0 ;
60
- }
61
- }
62
- self . fb_dirty = true
52
+ fn get_pixel_row ( & self , y : u8 ) -> u64 {
53
+ self . fb_rows [ y as usize ]
63
54
}
64
55
65
- fn set_pixel ( & mut self , x : Byte , y : Byte , v : bool ) {
66
- let ( x, y) = xy_from_chirp8 ( x, y) ;
67
-
68
- let row = y >> 3 ;
69
- let offset = y - ( row << 3 ) ;
70
- let mask = 1 << offset;
71
- let bit = ( if v { 1 } else { 0 } ) << offset;
72
-
73
- self . fb_pixels [ x as usize ] [ row as usize ] = ( self . fb_pixels [ x as usize ] [ row as usize ] & !mask) | bit;
56
+ fn set_pixel_row ( & mut self , y : u8 , row : u64 ) {
57
+ self . fb_rows [ y as usize ] = row;
74
58
self . fb_dirty = true ;
75
59
}
76
60
77
- fn get_pixel ( & self , x : Byte , y : Byte ) -> bool {
78
- let ( x, y) = xy_from_chirp8 ( x, y) ;
79
-
80
- let row = y >> 3 ;
81
- let offset = y - ( row << 3 ) ;
82
- let mask = 1 << offset;
83
-
84
- self . fb_pixels [ x as usize ] [ row as usize ] & mask != 0
85
- }
86
-
87
61
fn redraw ( & mut self ) {
88
62
// Not really needed? timer will take care of it?
89
63
}
@@ -140,7 +114,7 @@ impl Peripherals for Board {
140
114
pub fn redraw ( ) {
141
115
let board = unsafe { & mut BOARD } ;
142
116
if board. fb_dirty {
143
- pcd8544:: send ( & board. fb_pixels ) ;
117
+ pcd8544:: send ( FBIter :: new ( & board. fb_rows ) ) ;
144
118
board. fb_dirty = false ;
145
119
}
146
120
}
@@ -153,19 +127,23 @@ pub fn tick() {
153
127
fn draw_test_pattern ( board : & mut Board ) {
154
128
let dx = ( SCREEN_WIDTH - SCREEN_HEIGHT ) / 2 ;
155
129
156
- for i in 0 ..SCREEN_HEIGHT {
157
- board. set_pixel ( i + dx, SCREEN_HEIGHT - ( i + 1 ) , false ) ;
158
- board. set_pixel ( i + dx, i, true ) ;
130
+ let mut row: u64 = 1 << 47 ;
131
+ for i in 0 ..32 {
132
+ board. set_pixel_row ( i, row) ;
133
+ row >>= 1 ;
159
134
}
135
+ sleep_ms ( 500 ) ;
160
136
137
+ let mut row: u64 = 1 << 47 ;
138
+ for i in ( 0 ..32 ) . rev ( ) {
139
+ board. set_pixel_row ( i, row) ;
140
+ row >>= 1 ;
141
+ }
161
142
sleep_ms ( 500 ) ;
162
143
163
144
for i in 0 ..SCREEN_HEIGHT {
164
- board. set_pixel ( i + dx, SCREEN_HEIGHT - ( i + 1 ) , true ) ;
165
- board. set_pixel ( i + dx, i, false ) ;
145
+ board. set_pixel_row ( i, 0 )
166
146
}
167
- sleep_ms ( 500 ) ;
168
- board. clear_pixels ( ) ;
169
147
}
170
148
171
149
#[ no_mangle]
0 commit comments