const MARKER_MASK: u64 = 0xFFFF_FFFF_FFFF_0000;
pub struct MfmStreamDecoder {
shift_reg: u64,
nibbles: Vec<Nibble>,
clock: bool,
synced: bool,
markers: Vec<u64>,
nibble_bit_ct: u8,
nibble: u8,
}
impl MfmStreamDecoder {
pub fn with_markers(markers: &[u64]) -> Self {
MfmStreamDecoder {
shift_reg: 0,
nibbles: Vec::with_capacity(128),
clock: true,
synced: false,
markers: markers.to_vec(),
nibble_bit_ct: 0,
nibble: 0,
}
}
}
impl StreamDecoder for MfmStreamDecoder {
fn reset(&mut self) {
self.nibbles.clear();
self.shift_reg = 0;
self.clock = true;
self.synced = false;
self.nibble_bit_ct = 0;
self.nibble = 0;
}
#[inline]
fn is_synced(&self) -> bool {
self.synced
}
fn encoding(&self) -> DiskDataEncoding {
DiskDataEncoding::Mfm
}
fn push_bit(&mut self, bit: bool) {
self.shift_reg = (self.shift_reg << 1) | (bit as u64);
for marker in &self.markers {
if self.shift_reg & MARKER_MASK == *marker {
self.synced = true;
}
if self.synced {}
}
self.clock = !self.clock;
}
fn bits_remaining(&self) -> usize {
self.nibble_bit_ct as usize
}
fn has_nibble(&self) -> bool {
!self.nibbles.is_empty()
}
fn peek_nibble(&self) -> Option<Nibble> {
self.nibbles.last().copied()
}
fn pop_nibble(&mut self) -> Option<Nibble> {
self.nibbles.pop()
}
}