From fb26b38ff97c0ee5c45f2109649db89220fb6af8 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 13 Mar 2016 19:55:20 -0400 Subject: [PATCH] This is as simplified as things seem to be able to get without breaking at least Northern Star. Joe Blade et al remain stubbornly broken but I'm not immediately able to determine why. --- Machines/Electron/Electron.cpp | 39 +++++++++++----------------------- Machines/Electron/Electron.hpp | 1 - 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index 4a08e7c10..1267cc80f 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -850,8 +850,17 @@ inline void Tape::get_next_tape_pulse() inline void Tape::push_tape_bit(uint16_t bit) { _data_register = (uint16_t)((_data_register >> 1) | (bit << 10)); + if(_input.minimum_bits_until_full) _input.minimum_bits_until_full--; - if(_input.minimum_bits_until_full == 7) _interrupt_status &= ~Interrupt::ReceiveDataFull; + if(_input.minimum_bits_until_full == 8) _interrupt_status &= ~Interrupt::ReceiveDataFull; + if(!_input.minimum_bits_until_full) + { + if((_data_register&0x3) == 0x1) + { + _interrupt_status |= Interrupt::ReceiveDataFull; + if(_is_in_input_mode) _input.minimum_bits_until_full = 9; + } + } if(_output.bits_remaining_until_empty) _output.bits_remaining_until_empty--; if(!_output.bits_remaining_until_empty) _interrupt_status |= Interrupt::TransmitDataEmpty; @@ -862,29 +871,8 @@ inline void Tape::push_tape_bit(uint16_t bit) evaluate_interrupts(); } -//inline void Tape::reset_tape_input() -//{ -// _input.minimum_bits_until_full = 0; -// _interrupt_status &= ~(Interrupt::ReceiveDataFull | Interrupt::TransmitDataEmpty | Interrupt::HighToneDetect); -// -// if(_last_posted_interrupt_status != _interrupt_status) -// { -// _last_posted_interrupt_status = _interrupt_status; -// if(_delegate) _delegate->tape_did_change_interrupt_status(this); -// } -//} - inline void Tape::evaluate_interrupts() { - if(!_input.minimum_bits_until_full) - { - if((_data_register&0x3) == 0x1) - { - _interrupt_status |= Interrupt::ReceiveDataFull; - if(_is_in_input_mode) _input.minimum_bits_until_full = 9; - } - } - if(_last_posted_interrupt_status != _interrupt_status) { _last_posted_interrupt_status = _interrupt_status; @@ -894,11 +882,8 @@ inline void Tape::evaluate_interrupts() inline void Tape::clear_interrupts(uint8_t interrupts) { - if(_interrupt_status & interrupts) - { - _interrupt_status &= ~interrupts; - if(_delegate) _delegate->tape_did_change_interrupt_status(this); - } + _interrupt_status &= ~interrupts; + evaluate_interrupts(); } inline void Tape::set_is_in_input_mode(bool is_in_input_mode) diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index f5c66d727..288f9aa4f 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -86,7 +86,6 @@ class Tape { private: inline void push_tape_bit(uint16_t bit); - inline void reset_tape_input(void); inline void get_next_tape_pulse(); std::shared_ptr _tape;