mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Take a shot at the phase mismatch IRQ.
This commit is contained in:
parent
04f5d29ed9
commit
2d8e260671
@ -195,7 +195,7 @@ uint8_t NCR5380::read(int address, bool) {
|
|||||||
(end_of_dma_ ? 0x80 : 0x00) |
|
(end_of_dma_ ? 0x80 : 0x00) |
|
||||||
((dma_request_ && state_ == ExecutionState::PerformingDMA) ? 0x40 : 0x00) |
|
((dma_request_ && state_ == ExecutionState::PerformingDMA) ? 0x40 : 0x00) |
|
||||||
/* b5 = parity error */
|
/* b5 = parity error */
|
||||||
/* b4 = IRQ active */
|
(irq_ ? 0x10 : 0x00) |
|
||||||
(phase_matches() ? 0x08 : 0x00) |
|
(phase_matches() ? 0x08 : 0x00) |
|
||||||
/* b2 = busy error */
|
/* b2 = busy error */
|
||||||
((bus_state & Line::Attention) ? 0x02 : 0x00) |
|
((bus_state & Line::Attention) ? 0x02 : 0x00) |
|
||||||
@ -210,6 +210,7 @@ uint8_t NCR5380::read(int address, bool) {
|
|||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
LOG("[7] Reset parity/interrupt");
|
LOG("[7] Reset parity/interrupt");
|
||||||
|
irq_ = false;
|
||||||
return 0xff;
|
return 0xff;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -240,13 +241,15 @@ void NCR5380::update_control_output() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NCR5380::scsi_bus_did_change(SCSI::Bus *, SCSI::BusState new_state, double time_since_change) {
|
void NCR5380::scsi_bus_did_change(SCSI::Bus *, SCSI::BusState new_state, double time_since_change) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
When connected as an Initiator with DMA Mode True,
|
When connected as an Initiator with DMA Mode True,
|
||||||
if the phase lines I//O, C//D, and /MSG do not match the
|
if the phase lines I//O, C//D, and /MSG do not match the
|
||||||
phase bits in the Target Command Register, a phase mismatch
|
phase bits in the Target Command Register, a phase mismatch
|
||||||
interrupt is generated when /REQ goes active.
|
interrupt is generated when /REQ goes active.
|
||||||
*/
|
*/
|
||||||
|
if((mode_ & 0x42) == 0x02 && new_state & SCSI::Line::Request && !phase_matches()) {
|
||||||
|
irq_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
switch(state_) {
|
switch(state_) {
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -60,6 +60,8 @@ class NCR5380 final: public SCSI::Bus::Observer {
|
|||||||
bool dma_acknowledge_ = false;
|
bool dma_acknowledge_ = false;
|
||||||
bool end_of_dma_ = false;
|
bool end_of_dma_ = false;
|
||||||
|
|
||||||
|
bool irq_ = false;
|
||||||
|
|
||||||
enum class ExecutionState {
|
enum class ExecutionState {
|
||||||
None,
|
None,
|
||||||
WaitingForBusy,
|
WaitingForBusy,
|
||||||
|
Loading…
Reference in New Issue
Block a user