1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-27 01:31:42 +00:00

Started making provisions for a DMA-compatible implementation. Re: the CPC, it sounds like DMA acknowledge might be permanently wired, causing DMA mode seemingly to work from the 8272's point of view.

This commit is contained in:
Thomas Harte 2017-08-14 08:38:00 -04:00
parent ea64125124
commit 7ea703f150
3 changed files with 33 additions and 7 deletions

View File

@ -11,7 +11,7 @@
#include <cstdio> #include <cstdio>
using namespace Intel; using namespace Intel::i8272;
#define SetDataRequest() (main_status_ |= 0x80) #define SetDataRequest() (main_status_ |= 0x80)
#define ResetDataRequest() (main_status_ &= ~0x80) #define ResetDataRequest() (main_status_ &= ~0x80)
@ -52,8 +52,9 @@ using namespace Intel;
#define SetBadCylinder() (status_[2] |= 0x02) #define SetBadCylinder() (status_[2] |= 0x02)
#define SetMissingDataAddressMark() (status_[2] |= 0x01) #define SetMissingDataAddressMark() (status_[2] |= 0x01)
i8272::i8272(Cycles clock_rate, int clock_rate_multiplier, int revolutions_per_minute) : i8272::i8272(BusHandler &bus_handler, Cycles clock_rate, int clock_rate_multiplier, int revolutions_per_minute) :
Storage::Disk::MFMController(clock_rate, clock_rate_multiplier, revolutions_per_minute), Storage::Disk::MFMController(clock_rate, clock_rate_multiplier, revolutions_per_minute),
bus_handler_(bus_handler),
main_status_(0), main_status_(0),
interesting_event_mask_((int)Event8272::CommandByte), interesting_event_mask_((int)Event8272::CommandByte),
resume_point_(0), resume_point_(0),
@ -773,3 +774,9 @@ bool i8272::Drive::seek_is_satisfied() {
return (target_head_position == head_position) || return (target_head_position == head_position) ||
(target_head_position == -1 && drive->get_is_track_zero()); (target_head_position == -1 && drive->get_is_track_zero());
} }
void i8272::set_dma_acknowledge(bool dack) {
}
void i8272::set_terminal_count(bool tc) {
}

View File

@ -13,22 +13,38 @@
#include "../../Storage/Disk/Drive.hpp" #include "../../Storage/Disk/Drive.hpp"
#include <cstdint> #include <cstdint>
#include <memory>
#include <vector> #include <vector>
namespace Intel { namespace Intel {
namespace i8272 {
class BusHandler {
public:
virtual void set_dma_data_request(bool drq) {}
virtual void set_interrupt(bool irq) {}
};
class i8272: public Storage::Disk::MFMController { class i8272: public Storage::Disk::MFMController {
public: public:
i8272(Cycles clock_rate, int clock_rate_multiplier, int revolutions_per_minute); i8272(BusHandler &bus_handler, Cycles clock_rate, int clock_rate_multiplier, int revolutions_per_minute);
void run_for(Cycles); void run_for(Cycles);
void set_register(int address, uint8_t value); void set_register(int address, uint8_t value);
uint8_t get_register(int address); uint8_t get_register(int address);
void set_dma_acknowledge(bool dack);
void set_terminal_count(bool tc);
void set_disk(std::shared_ptr<Storage::Disk::Disk> disk, int drive); void set_disk(std::shared_ptr<Storage::Disk::Disk> disk, int drive);
private: private:
// The bus handler, for interrupt and DMA-driven usage.
BusHandler &bus_handler_;
std::unique_ptr<BusHandler> allocated_bus_handler_;
// Status registers. // Status registers.
uint8_t main_status_; uint8_t main_status_;
uint8_t status_[3]; uint8_t status_[3];
@ -110,6 +126,6 @@ class i8272: public Storage::Disk::MFMController {
}; };
} }
}
#endif /* i8272_hpp */ #endif /* i8272_hpp */

View File

@ -438,12 +438,15 @@ struct KeyboardState {
Wraps the 8272 so as to provide proper clocking and RPM counts, and just directly Wraps the 8272 so as to provide proper clocking and RPM counts, and just directly
exposes motor control, applying the same value to all drives. exposes motor control, applying the same value to all drives.
*/ */
class FDC: public Intel::i8272 { class FDC: public Intel::i8272::i8272 {
private:
Intel::i8272::BusHandler bus_handler_;
public: public:
FDC() : i8272(Cycles(8000000), 16, 300) {} FDC() : i8272(bus_handler_, Cycles(8000000), 16, 300) {}
void set_motor_on(bool on) { void set_motor_on(bool on) {
Intel::i8272::set_motor_on(on); Intel::i8272::i8272::set_motor_on(on);
} }
}; };