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:
parent
ea64125124
commit
7ea703f150
@ -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) {
|
||||||
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user