diff --git a/Cargo.toml b/Cargo.toml index aca97bc..6ded1b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "holani" -version = "0.6.3" +version = "0.6.4" edition = "2021" [dependencies] diff --git a/src/mikey/mod.rs b/src/mikey/mod.rs index 0b409eb..29049ea 100644 --- a/src/mikey/mod.rs +++ b/src/mikey/mod.rs @@ -452,7 +452,7 @@ impl Mikey { bus.set_status(BusStatus::PeekDone); } MikeyInstruction::PokeSerCtl => { - self.registers.set_serctl(self.registers.data_r() as u8); + self.registers.set_serctl(&mut self.uart, self.registers.data_r() as u8); self.registers.reset_ir(); trace!("< Poke"); bus.set_status(BusStatus::PokeDone); diff --git a/src/mikey/registers.rs b/src/mikey/registers.rs index 9105bfa..9c1d392 100644 --- a/src/mikey/registers.rs +++ b/src/mikey/registers.rs @@ -188,12 +188,17 @@ impl MikeyRegisters { self.serctl_r.bits() } - pub fn set_serctl(&mut self, v: u8) { + pub fn set_serctl(&mut self, uart: &mut Uart, v: u8) { + let brk = self.serctl_w_is_flag_set(SerCtlW::tx_brk); self.serctl_w = match SerCtlW::from_bits(v) { Some(bits) => bits, None => SerCtlW::empty() }; + if brk && !self.serctl_w_is_flag_set(SerCtlW::tx_brk) { //Set redeye to high if break has been disabled + uart.set_redeye_pin(uart::redeye_status::RedeyeStatus::High); + } + if self.serctl_w_is_flag_set(SerCtlW::reset_err) { self.serctl_r_disable_flag(SerCtlR::par_err); self.serctl_r_disable_flag(SerCtlR::frame_err); diff --git a/src/mikey/uart/mod.rs b/src/mikey/uart/mod.rs index 176bfb6..da3b8da 100644 --- a/src/mikey/uart/mod.rs +++ b/src/mikey/uart/mod.rs @@ -94,7 +94,7 @@ impl Uart { if let Some(to_send) = self.transmit_register.pop() { self.set_redeye_pin(to_send); - } + } } fn load_transmit_data(&mut self, mut data: u8, regs: &mut MikeyRegisters) { @@ -152,16 +152,24 @@ impl Uart { self.receive_register_len += 1; } 9 => { - let par = bool_parity!(self.receive_register_buffer.count_ones() & 1 == 1); - if par == RedeyeStatus::High { - regs.serctl_r_enable_flag(SerCtlR::par_bit); - } else { - regs.serctl_r_disable_flag(SerCtlR::par_bit); - } - if par != redeye_status { - trace!("Parity Error"); - regs.serctl_r_enable_flag(SerCtlR::par_err); - } + match regs.serctl_w_is_flag_set(SerCtlW::par_en) { + true => { + let par = bool_parity!(self.receive_register_buffer.count_ones() & 1 == 1); + if par == RedeyeStatus::High { + regs.serctl_r_enable_flag(SerCtlR::par_bit); + } else { + regs.serctl_r_disable_flag(SerCtlR::par_bit); + } + if par != redeye_status { + trace!("Parity Error"); + regs.serctl_r_enable_flag(SerCtlR::par_err); + } + } + false => if redeye_status != bool_parity!(regs.serctl_w_is_flag_set(SerCtlW::par_even)) { + trace!("Parity Error"); + regs.serctl_r_enable_flag(SerCtlR::par_err); + } + } self.receive_register_len += 1; } 10 => { @@ -201,7 +209,7 @@ impl Uart { regs.serctl_r_disable_flag(SerCtlR::tx_empty); } - fn set_redeye_pin(&mut self, status: RedeyeStatus) { + pub fn set_redeye_pin(&mut self, status: RedeyeStatus) { self.redeye_pin.set(status); }