mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-09 05:25:01 +00:00
Attempt to support the DMA interface.
This commit is contained in:
@@ -33,14 +33,10 @@ void NCR5380::write(int address, uint8_t value, bool) {
|
|||||||
switch(address & 7) {
|
switch(address & 7) {
|
||||||
case 0:
|
case 0:
|
||||||
LOG("[SCSI 0] Set current SCSI bus state to " << PADHEX(2) << int(value));
|
LOG("[SCSI 0] Set current SCSI bus state to " << PADHEX(2) << int(value));
|
||||||
data_bus_ = value;
|
|
||||||
|
|
||||||
|
data_bus_ = value;
|
||||||
if(dma_request_ && dma_operation_ == DMAOperation::Send) {
|
if(dma_request_ && dma_operation_ == DMAOperation::Send) {
|
||||||
// printf("w %02x\n", value);
|
dma_acknowledge(value);
|
||||||
dma_acknowledge_ = true;
|
|
||||||
dma_request_ = false;
|
|
||||||
update_control_output();
|
|
||||||
bus_.set_device_output(device_id_, bus_output_);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -143,10 +139,7 @@ uint8_t NCR5380::read(int address, bool) {
|
|||||||
LOG("[SCSI 0] Get current SCSI bus state: " << PADHEX(2) << (bus_.get_state() & 0xff));
|
LOG("[SCSI 0] Get current SCSI bus state: " << PADHEX(2) << (bus_.get_state() & 0xff));
|
||||||
|
|
||||||
if(dma_request_ && dma_operation_ == DMAOperation::InitiatorReceive) {
|
if(dma_request_ && dma_operation_ == DMAOperation::InitiatorReceive) {
|
||||||
dma_acknowledge_ = true;
|
return dma_acknowledge();
|
||||||
dma_request_ = false;
|
|
||||||
update_control_output();
|
|
||||||
bus_.set_device_output(device_id_, bus_output_);
|
|
||||||
}
|
}
|
||||||
return uint8_t(bus_.get_state());
|
return uint8_t(bus_.get_state());
|
||||||
|
|
||||||
@@ -324,3 +317,27 @@ void NCR5380::set_execution_state(ExecutionState state) {
|
|||||||
size_t NCR5380::scsi_id() {
|
size_t NCR5380::scsi_id() {
|
||||||
return device_id_;
|
return device_id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NCR5380::dma_request() {
|
||||||
|
return dma_request_;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t NCR5380::dma_acknowledge() {
|
||||||
|
const uint8_t bus_state = uint8_t(bus_.get_state());
|
||||||
|
|
||||||
|
dma_acknowledge_ = true;
|
||||||
|
dma_request_ = false;
|
||||||
|
update_control_output();
|
||||||
|
bus_.set_device_output(device_id_, bus_output_);
|
||||||
|
|
||||||
|
return bus_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NCR5380::dma_acknowledge(uint8_t value) {
|
||||||
|
data_bus_ = value;
|
||||||
|
|
||||||
|
dma_acknowledge_ = true;
|
||||||
|
dma_request_ = false;
|
||||||
|
update_control_output();
|
||||||
|
bus_.set_device_output(device_id_, bus_output_);
|
||||||
|
}
|
||||||
|
@@ -33,6 +33,15 @@ class NCR5380 final: public SCSI::Bus::Observer {
|
|||||||
/*! @returns The SCSI ID assigned to this device. */
|
/*! @returns The SCSI ID assigned to this device. */
|
||||||
size_t scsi_id();
|
size_t scsi_id();
|
||||||
|
|
||||||
|
/*! @return @c true if DMA request is active; @c false otherwise. */
|
||||||
|
bool dma_request();
|
||||||
|
|
||||||
|
/*! Signals DMA acknowledge with a simultaneous read. */
|
||||||
|
uint8_t dma_acknowledge();
|
||||||
|
|
||||||
|
/*! Signals DMA acknowledge with a simultaneous write. */
|
||||||
|
void dma_acknowledge(uint8_t);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SCSI::Bus &bus_;
|
SCSI::Bus &bus_;
|
||||||
|
|
||||||
|
@@ -103,6 +103,15 @@ void SCSICard::perform_bus_operation(Select select, bool is_read, uint16_t addre
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x8:
|
||||||
|
// DMA acknowledge.
|
||||||
|
if(is_read) {
|
||||||
|
*value = ncr5380_.dma_acknowledge();
|
||||||
|
} else {
|
||||||
|
ncr5380_.dma_acknowledge(*value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 0xa:
|
case 0xa:
|
||||||
// RAM and ROM select.
|
// RAM and ROM select.
|
||||||
if(!is_read) {
|
if(!is_read) {
|
||||||
@@ -114,6 +123,13 @@ void SCSICard::perform_bus_operation(Select select, bool is_read, uint16_t addre
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0xe:
|
||||||
|
// DRQ in b7.
|
||||||
|
if(is_read) {
|
||||||
|
*value = ncr5380_.dma_request() ? 0x80 : 0x00;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("Unhandled: %04x %c %02x\n", address, is_read ? 'r' : 'w', *value);
|
printf("Unhandled: %04x %c %02x\n", address, is_read ? 'r' : 'w', *value);
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user