mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-29 12:50:28 +00:00
Corrects non-recurring-pattern adaptation bug: the 'SerialPortVIA' should keep a reference to its VIA, not a copy of it.
This commit is contained in:
parent
8eeb7e73cd
commit
3b12fca417
@ -55,8 +55,9 @@ Cycles MachineBase::perform_bus_operation(CPU::MOS6502::BusOperation operation,
|
|||||||
else
|
else
|
||||||
ram_[address] = *value;
|
ram_[address] = *value;
|
||||||
} else if(address >= 0xc000) {
|
} else if(address >= 0xc000) {
|
||||||
if(isReadOperation(operation))
|
if(isReadOperation(operation)) {
|
||||||
*value = rom_[address & 0x3fff];
|
*value = rom_[address & 0x3fff];
|
||||||
|
}
|
||||||
} else if(address >= 0x1800 && address <= 0x180f) {
|
} else if(address >= 0x1800 && address <= 0x180f) {
|
||||||
if(isReadOperation(operation))
|
if(isReadOperation(operation))
|
||||||
*value = serial_port_VIA_.get_register(address);
|
*value = serial_port_VIA_.get_register(address);
|
||||||
@ -160,6 +161,8 @@ void SerialPortVIA::set_port_output(MOS::MOS6522::Port port, uint8_t value, uint
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SerialPortVIA::set_serial_line_state(::Commodore::Serial::Line line, bool value) {
|
void SerialPortVIA::set_serial_line_state(::Commodore::Serial::Line line, bool value) {
|
||||||
|
// printf("[C1540] %s is %s\n", StringForLine(line), value ? "high" : "low");
|
||||||
|
|
||||||
switch(line) {
|
switch(line) {
|
||||||
default: break;
|
default: break;
|
||||||
case ::Commodore::Serial::Line::Data: port_b_ = (port_b_ & ~0x01) | (value ? 0x00 : 0x01); break;
|
case ::Commodore::Serial::Line::Data: port_b_ = (port_b_ & ~0x01) | (value ? 0x00 : 0x01); break;
|
||||||
@ -223,25 +226,27 @@ void DriveVIA::set_control_line_output(MOS::MOS6522::Port port, MOS::MOS6522::Li
|
|||||||
|
|
||||||
void DriveVIA::set_port_output(MOS::MOS6522::Port port, uint8_t value, uint8_t direction_mask) {
|
void DriveVIA::set_port_output(MOS::MOS6522::Port port, uint8_t value, uint8_t direction_mask) {
|
||||||
if(port) {
|
if(port) {
|
||||||
// record drive motor state
|
if(previous_port_b_output_ != value) {
|
||||||
drive_motor_ = !!(value&4);
|
// record drive motor state
|
||||||
|
drive_motor_ = !!(value&4);
|
||||||
|
|
||||||
// check for a head step
|
// check for a head step
|
||||||
int step_difference = ((value&3) - (previous_port_b_output_&3))&3;
|
int step_difference = ((value&3) - (previous_port_b_output_&3))&3;
|
||||||
if(step_difference) {
|
if(step_difference) {
|
||||||
if(delegate_) delegate_->drive_via_did_step_head(this, (step_difference == 1) ? 1 : -1);
|
if(delegate_) delegate_->drive_via_did_step_head(this, (step_difference == 1) ? 1 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for a change in density
|
||||||
|
int density_difference = (previous_port_b_output_^value) & (3 << 5);
|
||||||
|
if(density_difference && delegate_) {
|
||||||
|
delegate_->drive_via_did_set_data_density(this, (value >> 5)&3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: something with the drive LED
|
||||||
|
// printf("LED: %s\n", value&8 ? "On" : "Off");
|
||||||
|
|
||||||
|
previous_port_b_output_ = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for a change in density
|
|
||||||
int density_difference = (previous_port_b_output_^value) & (3 << 5);
|
|
||||||
if(density_difference && delegate_) {
|
|
||||||
delegate_->drive_via_did_set_data_density(this, (value >> 5)&3);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: something with the drive LED
|
|
||||||
// printf("LED: %s\n", value&8 ? "On" : "Off");
|
|
||||||
|
|
||||||
previous_port_b_output_ = value;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ class SerialPortVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
|||||||
void set_serial_port(const std::shared_ptr<::Commodore::Serial::Port> &);
|
void set_serial_port(const std::shared_ptr<::Commodore::Serial::Port> &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MOS::MOS6522::MOS6522<SerialPortVIA> via_;
|
MOS::MOS6522::MOS6522<SerialPortVIA> &via_;
|
||||||
uint8_t port_b_;
|
uint8_t port_b_;
|
||||||
std::weak_ptr<::Commodore::Serial::Port> serial_port_;
|
std::weak_ptr<::Commodore::Serial::Port> serial_port_;
|
||||||
bool attention_acknowledge_level_, attention_level_input_, data_level_output_;
|
bool attention_acknowledge_level_, attention_level_input_, data_level_output_;
|
||||||
|
Loading…
Reference in New Issue
Block a user