summaryrefslogtreecommitdiff
path: root/src/devices/screen_device.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/screen_device.rs')
-rw-r--r--src/devices/screen_device.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/devices/screen_device.rs b/src/devices/screen_device.rs
index b4eae22..a10ab20 100644
--- a/src/devices/screen_device.rs
+++ b/src/devices/screen_device.rs
@@ -419,6 +419,7 @@ impl HasDimensions<u16> for ScreenDevice {
pub struct SpriteBuffer {
pub mem: [u8; 16],
pub pointer: usize,
+ pub cached: Option<(Sprite, u8)>,
}
impl SpriteBuffer {
@@ -426,15 +427,22 @@ impl SpriteBuffer {
Self {
mem: [0; 16],
pointer: 0,
+ cached: None,
}
}
pub fn push_byte(&mut self, byte: u8) {
self.mem[self.pointer] = byte;
self.pointer = (self.pointer + 1) % 16;
+ self.cached = None;
}
- pub fn read_1bit_sprite(&self, draw: u8) -> Sprite {
+ pub fn read_1bit_sprite(&mut self, draw: u8) -> Sprite {
+ if let Some((sprite, transform)) = self.cached {
+ if transform == (draw & 0x77) {
+ return sprite;
+ }
+ }
macro_rules! c {
($v:ident=mem[$p:ident++]) => { let $v = self.mem[$p % 16]; $p = $p.wrapping_add(1); };
($v:ident=mem[--$p:ident]) => { $p = $p.wrapping_sub(1); let $v = self.mem[$p % 16]; };
@@ -455,10 +463,16 @@ impl SpriteBuffer {
0x7 => { for y in 0..8 { c!(l=mem[--p]); for x in 0..8 { sprite[x][y] = l>>( x) & 1; } } },
_ => unreachable!(),
}
+ self.cached = Some((sprite, draw & 0x77));
return sprite;
}
- pub fn read_2bit_sprite(&self, draw: u8) -> Sprite {
+ pub fn read_2bit_sprite(&mut self, draw: u8) -> Sprite {
+ if let Some((sprite, transform)) = self.cached {
+ if transform == (draw & 0x77) {
+ return sprite;
+ }
+ }
macro_rules! c {
($v:ident=mem[$p:ident++]) => { let $v = self.mem[$p % 16]; $p = $p.wrapping_add(1); };
($v:ident=mem[--$p:ident]) => { $p = $p.wrapping_sub(1); let $v = self.mem[$p % 16]; };
@@ -480,6 +494,7 @@ impl SpriteBuffer {
0x7 => for y in 0..8 { c!(l=mem[--p]); c!(h=mem[--s]); for x in 0..8 { let i= x; sprite[x][y] = (l>>i & 1) | (h>>i & 1) << 1; } },
_ => unreachable!(),
}
+ self.cached = Some((sprite, draw & 0x77));
return sprite;
}
}