From 2f459690d4b0fe2eeb65e204cdb08250031643e4 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 26 Nov 2016 23:29:30 +0800 Subject: [PATCH] It would appear the 1770 and 1773 actually differ in relation to the (non-sensical) ability not to spin-up for a Type 2, and whether a side compare can occur. So the WD1770 class now requires a personality to be specified. Which it singly fails to honour. --- Components/1770/1770.cpp | 5 +++-- Components/1770/1770.hpp | 8 +++++++- Machines/Electron/Plus3.cpp | 2 ++ Machines/Electron/Plus3.hpp | 2 ++ Machines/Oric/Microdisc.cpp | 3 ++- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Components/1770/1770.cpp b/Components/1770/1770.cpp index 83bec4d2f..a7d8c0efb 100644 --- a/Components/1770/1770.cpp +++ b/Components/1770/1770.cpp @@ -11,7 +11,7 @@ using namespace WD; -WD1770::WD1770() : +WD1770::WD1770(Personality p) : Storage::Disk::Controller(8000000, 16, 300), status_(0), interesting_event_mask_(Event::Command), @@ -22,7 +22,8 @@ WD1770::WD1770() : is_reading_data_(false), interrupt_request_line_(false), data_request_line_(false), - delegate_(nullptr) + delegate_(nullptr), + personality_(p) { set_is_double_density(false); posit_event(Event::Command); diff --git a/Components/1770/1770.hpp b/Components/1770/1770.hpp index 4272d14af..cc681b2f0 100644 --- a/Components/1770/1770.hpp +++ b/Components/1770/1770.hpp @@ -15,7 +15,11 @@ namespace WD { class WD1770: public Storage::Disk::Controller { public: - WD1770(); + enum Personality { + P1770, + P1773 + }; + WD1770(Personality p); void set_is_double_density(bool is_double_density); void set_register(int address, uint8_t value); @@ -48,6 +52,8 @@ class WD1770: public Storage::Disk::Controller { inline void set_delegate(Delegate *delegate) { delegate_ = delegate; } private: + Personality personality_; + uint8_t status_; uint8_t track_; uint8_t sector_; diff --git a/Machines/Electron/Plus3.cpp b/Machines/Electron/Plus3.cpp index 4c674e797..52035dd3d 100644 --- a/Machines/Electron/Plus3.cpp +++ b/Machines/Electron/Plus3.cpp @@ -10,6 +10,8 @@ using namespace Electron; +Plus3::Plus3() : WD1770(P1770) {} + void Plus3::set_disk(std::shared_ptr disk, int drive) { if(!drives_[drive]) diff --git a/Machines/Electron/Plus3.hpp b/Machines/Electron/Plus3.hpp index d0e36a15c..cd04b3877 100644 --- a/Machines/Electron/Plus3.hpp +++ b/Machines/Electron/Plus3.hpp @@ -15,6 +15,8 @@ namespace Electron { class Plus3 : public WD::WD1770 { public: + Plus3(); + void set_disk(std::shared_ptr disk, int drive); void set_control_register(uint8_t control); diff --git a/Machines/Oric/Microdisc.cpp b/Machines/Oric/Microdisc.cpp index 2aa5f7690..ded159fa2 100644 --- a/Machines/Oric/Microdisc.cpp +++ b/Machines/Oric/Microdisc.cpp @@ -13,7 +13,8 @@ using namespace Oric; Microdisc::Microdisc() : irq_enable_(false), delegate_(nullptr), - paging_flags_(BASICDisable) + paging_flags_(BASICDisable), + WD1770(P1773) {} void Microdisc::set_disk(std::shared_ptr disk, int drive)