mirror of
https://github.com/TomHarte/CLK.git
synced 2024-09-08 18:55:14 +00:00
Attempts to start getting the WDC working.
This commit is contained in:
parent
6d1e09ba55
commit
0567410bcf
@ -11,6 +11,7 @@
|
|||||||
#include "../CRTMachine.hpp"
|
#include "../CRTMachine.hpp"
|
||||||
#include "../KeyboardMachine.hpp"
|
#include "../KeyboardMachine.hpp"
|
||||||
#include "../MouseMachine.hpp"
|
#include "../MouseMachine.hpp"
|
||||||
|
#include "../MediaTarget.hpp"
|
||||||
|
|
||||||
//#define LOG_TRACE
|
//#define LOG_TRACE
|
||||||
#include "../../Processors/68000/68000.hpp"
|
#include "../../Processors/68000/68000.hpp"
|
||||||
@ -48,6 +49,7 @@ class ConcreteMachine:
|
|||||||
public DMAController::InterruptDelegate,
|
public DMAController::InterruptDelegate,
|
||||||
public MouseMachine::Machine,
|
public MouseMachine::Machine,
|
||||||
public KeyboardMachine::MappedMachine,
|
public KeyboardMachine::MappedMachine,
|
||||||
|
public MediaTarget::Machine,
|
||||||
public GI::AY38910::PortHandler {
|
public GI::AY38910::PortHandler {
|
||||||
public:
|
public:
|
||||||
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
ConcreteMachine(const Target &target, const ROMMachine::ROMFetcher &rom_fetcher) :
|
||||||
@ -103,6 +105,9 @@ class ConcreteMachine:
|
|||||||
ay_.set_port_handler(this);
|
ay_.set_port_handler(this);
|
||||||
|
|
||||||
set_gpip_input();
|
set_gpip_input();
|
||||||
|
|
||||||
|
// Insert any supplied media.
|
||||||
|
insert_media(target.media);
|
||||||
}
|
}
|
||||||
|
|
||||||
~ConcreteMachine() {
|
~ConcreteMachine() {
|
||||||
@ -510,6 +515,17 @@ class ConcreteMachine:
|
|||||||
dma_->set_floppy_drive_selection(value & 2, value & 4, value & 1);
|
dma_->set_floppy_drive_selection(value & 2, value & 4, value & 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - MediaTarget
|
||||||
|
bool insert_media(const Analyser::Static::Media &media) final {
|
||||||
|
size_t c = 0;
|
||||||
|
for(const auto &disk: media.disks) {
|
||||||
|
dma_->set_floppy_disk(disk, c);
|
||||||
|
++c;
|
||||||
|
if(c == 2) break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -85,17 +85,28 @@ void DMAController::set_floppy_drive_selection(bool drive1, bool drive2, bool si
|
|||||||
fdc_.set_floppy_drive_selection(drive1, drive2, side2);
|
fdc_.set_floppy_drive_selection(drive1, drive2, side2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DMAController::set_floppy_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive) {
|
||||||
|
fdc_.drives_[drive]->set_disk(disk);
|
||||||
|
}
|
||||||
|
|
||||||
void DMAController::run_for(HalfCycles duration) {
|
void DMAController::run_for(HalfCycles duration) {
|
||||||
running_time_ += duration;
|
running_time_ += duration;
|
||||||
fdc_.run_for(duration.flush<Cycles>());
|
fdc_.run_for(duration.flush<Cycles>());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMAController::wd1770_did_change_output(WD::WD1770 *) {
|
void DMAController::wd1770_did_change_output(WD::WD1770 *) {
|
||||||
|
// Check for a change in interrupt state.
|
||||||
const bool old_interrupt_line = interrupt_line_;
|
const bool old_interrupt_line = interrupt_line_;
|
||||||
interrupt_line_ = fdc_.get_interrupt_request_line();
|
interrupt_line_ = fdc_.get_interrupt_request_line();
|
||||||
if(interrupt_delegate_ && interrupt_line_ != old_interrupt_line) {
|
if(interrupt_delegate_ && interrupt_line_ != old_interrupt_line) {
|
||||||
interrupt_delegate_->dma_controller_did_change_interrupt_status(this);
|
interrupt_delegate_->dma_controller_did_change_interrupt_status(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: check for a data request.
|
||||||
|
if(fdc_.get_data_request_line()) {
|
||||||
|
// TODO: something?
|
||||||
|
printf("DRQ?\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMAController::set_interrupt_delegate(InterruptDelegate *delegate) {
|
void DMAController::set_interrupt_delegate(InterruptDelegate *delegate) {
|
||||||
|
@ -30,6 +30,7 @@ class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, p
|
|||||||
bool get_interrupt_line();
|
bool get_interrupt_line();
|
||||||
|
|
||||||
void set_floppy_drive_selection(bool drive1, bool drive2, bool side2);
|
void set_floppy_drive_selection(bool drive1, bool drive2, bool side2);
|
||||||
|
void set_floppy_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive);
|
||||||
|
|
||||||
struct InterruptDelegate {
|
struct InterruptDelegate {
|
||||||
virtual void dma_controller_did_change_interrupt_status(DMAController *) = 0;
|
virtual void dma_controller_did_change_interrupt_status(DMAController *) = 0;
|
||||||
@ -46,6 +47,7 @@ class DMAController: public WD::WD1770::Delegate, public ClockingHint::Source, p
|
|||||||
drives_.emplace_back(new Storage::Disk::Drive(8000000, 300, 2));
|
drives_.emplace_back(new Storage::Disk::Drive(8000000, 300, 2));
|
||||||
drives_.emplace_back(new Storage::Disk::Drive(8000000, 300, 2));
|
drives_.emplace_back(new Storage::Disk::Drive(8000000, 300, 2));
|
||||||
set_drive(drives_[0]);
|
set_drive(drives_[0]);
|
||||||
|
set_is_double_density(true); // TODO: is this selectable on the ST?
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_motor_on(bool motor_on) final {
|
void set_motor_on(bool motor_on) final {
|
||||||
|
Loading…
Reference in New Issue
Block a user