use crate::rom::{self, DATA};
#[derive(Debug)]
pub struct Block {
_address: usize,
pointer: usize,
}
impl Block {
pub fn new(location: usize) -> Self {
Block {
_address: location,
pointer: location,
}
}
pub fn decompress(&mut self) -> Vec<i16> {
let size = rom::get_compressed_size(self.pointer, DATA);
assert!(size > 0, "Invalid compressed data: {}", size);
let mut block_output = vec![0i16; size as usize];
let mut read = 0;
block_output = rom::decompress(self.pointer, DATA, block_output, &mut read)
.expect("Computed and actual decompressed sizes do not match");
block_output
}
pub fn read_int16(&mut self) -> i16 {
let val = DATA[self.pointer];
self.pointer += 1;
val.into()
}
pub fn read_int32(&mut self) -> u32 {
self.read_int16() as u32
+ ((self.read_int16() as u32) << 8)
+ ((self.read_int16() as u32) << 16)
+ ((self.read_int16() as u32) << 24)
}
pub fn read_double_short(&mut self) -> i16 {
self.read_int16() + (self.read_int16() << 8)
}
}