mirror of
https://github.com/TomHarte/CLK.git
synced 2024-07-06 01:28:57 +00:00
Deintegrated the busy flag and the interrupt request line, as the latter is reset by status reads. Which also means I can start reporting the WD INTRQ line status directly from the Microdisc. That appears to be correct, rather than honouring the Microdisc IRQ select there.
This commit is contained in:
parent
4d3bdf8c7c
commit
c304db0f5a
@ -21,6 +21,7 @@ WD1770::Status::Status() :
|
|||||||
seek_error(false),
|
seek_error(false),
|
||||||
lost_data(false),
|
lost_data(false),
|
||||||
data_request(false),
|
data_request(false),
|
||||||
|
interrupt_request(false),
|
||||||
busy(false)
|
busy(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -83,6 +84,9 @@ uint8_t WD1770::get_register(int address)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
update_status([] (Status &status) {
|
||||||
|
status.interrupt_request = false;
|
||||||
|
});
|
||||||
uint8_t status =
|
uint8_t status =
|
||||||
(status_.write_protect ? Flag::WriteProtect : 0) |
|
(status_.write_protect ? Flag::WriteProtect : 0) |
|
||||||
(status_.crc_error ? Flag::CRCError : 0) |
|
(status_.crc_error ? Flag::CRCError : 0) |
|
||||||
@ -326,12 +330,14 @@ void WD1770::posit_event(Event new_event_type)
|
|||||||
|
|
||||||
update_status([] (Status &status) {
|
update_status([] (Status &status) {
|
||||||
status.busy = false;
|
status.busy = false;
|
||||||
|
status.interrupt_request = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
WAIT_FOR_EVENT(Event::Command);
|
WAIT_FOR_EVENT(Event::Command);
|
||||||
|
|
||||||
update_status([] (Status &status) {
|
update_status([] (Status &status) {
|
||||||
status.busy = true;
|
status.busy = true;
|
||||||
|
status.interrupt_request = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
printf("Starting %02x\n", command_);
|
printf("Starting %02x\n", command_);
|
||||||
|
@ -46,8 +46,8 @@ class WD1770: public Storage::Disk::Controller {
|
|||||||
Busy = 0x01
|
Busy = 0x01
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool get_interrupt_request_line() { return !status_.busy; }
|
inline bool get_interrupt_request_line() { return status_.interrupt_request; }
|
||||||
inline bool get_data_request_line() { return status_.data_request; }
|
inline bool get_data_request_line() { return status_.data_request; }
|
||||||
class Delegate {
|
class Delegate {
|
||||||
public:
|
public:
|
||||||
virtual void wd1770_did_change_output(WD1770 *wd1770) = 0;
|
virtual void wd1770_did_change_output(WD1770 *wd1770) = 0;
|
||||||
@ -73,6 +73,7 @@ class WD1770: public Storage::Disk::Controller {
|
|||||||
bool seek_error;
|
bool seek_error;
|
||||||
bool lost_data;
|
bool lost_data;
|
||||||
bool data_request;
|
bool data_request;
|
||||||
|
bool interrupt_request;
|
||||||
bool busy;
|
bool busy;
|
||||||
enum {
|
enum {
|
||||||
One, Two, Three
|
One, Two, Three
|
||||||
|
@ -90,7 +90,7 @@ bool Microdisc::get_interrupt_request_line()
|
|||||||
|
|
||||||
uint8_t Microdisc::get_interrupt_request_register()
|
uint8_t Microdisc::get_interrupt_request_register()
|
||||||
{
|
{
|
||||||
return 0x7f | (get_interrupt_request_line() ? 0x00 : 0x80);
|
return 0x7f | (WD1770::get_interrupt_request_line() ? 0x00 : 0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Microdisc::get_data_request_register()
|
uint8_t Microdisc::get_data_request_register()
|
||||||
|
Loading…
Reference in New Issue
Block a user