1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-10-04 01:57:54 +00:00

It seems like Jasmin paged in at boot, and button = page back in and reset works?

At least, that gets me a 'boot failed' error. Which is something.
This commit is contained in:
Thomas Harte 2020-01-05 20:34:15 -05:00
parent 9f30be1c13
commit 533729638c
2 changed files with 42 additions and 28 deletions

View File

@ -38,11 +38,10 @@ class Jasmin: public WD::WD1770 {
inline void set_delegate(Delegate *delegate) { delegate_ = delegate; WD1770::set_delegate(delegate); } inline void set_delegate(Delegate *delegate) { delegate_ = delegate; WD1770::set_delegate(delegate); }
inline int get_paging_flags() { return paging_flags_; } inline int get_paging_flags() { return paging_flags_; }
private: private:
std::array<std::shared_ptr<Storage::Disk::Drive>, 4> drives_; std::array<std::shared_ptr<Storage::Disk::Drive>, 4> drives_;
size_t selected_drive_; size_t selected_drive_;
int paging_flags_ = 0; int paging_flags_ = BASICDisable;
Delegate *delegate_ = nullptr; Delegate *delegate_ = nullptr;
void posit_paging_flags(int new_flags) { void posit_paging_flags(int new_flags) {

View File

@ -41,6 +41,8 @@
namespace Oric { namespace Oric {
using DiskInterface = Analyser::Static::Oric::Target::DiskInterface;
enum ROM { enum ROM {
BASIC10 = 0, BASIC11, Microdisc, Colour BASIC10 = 0, BASIC11, Microdisc, Colour
}; };
@ -70,8 +72,8 @@ class Keyboard {
/// Sets whether @c key is or is not pressed, per @c is_pressed. /// Sets whether @c key is or is not pressed, per @c is_pressed.
void set_key_state(uint16_t key, bool is_pressed) { void set_key_state(uint16_t key, bool is_pressed) {
uint8_t mask = key & 0xff; const uint8_t mask = key & 0xff;
int line = key >> 8; const int line = key >> 8;
if(is_pressed) rows_[line] |= mask; if(is_pressed) rows_[line] |= mask;
else rows_[line] &= ~mask; else rows_[line] &= ~mask;
@ -226,7 +228,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
tape_player_.set_delegate(this); tape_player_.set_delegate(this);
Memory::Fuzz(ram_, sizeof(ram_)); Memory::Fuzz(ram_, sizeof(ram_));
if constexpr (disk_interface == Analyser::Static::Oric::Target::DiskInterface::Pravetz) { if constexpr (disk_interface == DiskInterface::Pravetz) {
diskii_.set_clocking_hint_observer(this); diskii_.set_clocking_hint_observer(this);
} }
@ -246,13 +248,13 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
size_t diskii_state_machine_index = 0; size_t diskii_state_machine_index = 0;
switch(disk_interface) { switch(disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
rom_names.emplace_back(machine_name, "the ORIC Jasmin ROM", "jasmin.rom", 2*1024, 0x37220e89); rom_names.emplace_back(machine_name, "the ORIC Jasmin ROM", "jasmin.rom", 2*1024, 0x37220e89);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
rom_names.emplace_back(machine_name, "the ORIC Microdisc ROM", "microdisc.rom", 8*1024, 0xa9664a9c); rom_names.emplace_back(machine_name, "the ORIC Microdisc ROM", "microdisc.rom", 8*1024, 0xa9664a9c);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: case DiskInterface::Pravetz:
rom_names.emplace_back(machine_name, "the 8DOS boot ROM", "8dos.rom", 512, 0x49a74c06); rom_names.emplace_back(machine_name, "the 8DOS boot ROM", "8dos.rom", 512, 0x49a74c06);
// These ROM details are coupled with those in the DiskIICard. // These ROM details are coupled with those in the DiskIICard.
diskii_state_machine_index = rom_names.size(); diskii_state_machine_index = rom_names.size();
@ -273,15 +275,15 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
switch(disk_interface) { switch(disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
jasmin_rom_ = std::move(*roms[2]); jasmin_rom_ = std::move(*roms[2]);
jasmin_rom_.resize(2048); jasmin_rom_.resize(2048);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
microdisc_rom_ = std::move(*roms[2]); microdisc_rom_ = std::move(*roms[2]);
microdisc_rom_.resize(8192); microdisc_rom_.resize(8192);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: { case DiskInterface::Pravetz: {
pravetz_rom_ = std::move(*roms[2]); pravetz_rom_ = std::move(*roms[2]);
pravetz_rom_.resize(512); pravetz_rom_.resize(512);
@ -294,11 +296,12 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
switch(target.disk_interface) { switch(target.disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
microdisc_did_change_paging_flags(&microdisc_); microdisc_did_change_paging_flags(&microdisc_);
microdisc_.set_delegate(this); microdisc_.set_delegate(this);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
jasmin_did_change_paging_flags(&jasmin_);
jasmin_.set_delegate(this); jasmin_.set_delegate(this);
break; break;
} }
@ -363,13 +366,13 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
if(!media.disks.empty()) { if(!media.disks.empty()) {
switch(disk_interface) { switch(disk_interface) {
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
inserted |= insert_disks(media, jasmin_, 4); inserted |= insert_disks(media, jasmin_, 4);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: { case DiskInterface::Microdisc: {
inserted |= insert_disks(media, microdisc_, 4); inserted |= insert_disks(media, microdisc_, 4);
} break; } break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: { case DiskInterface::Pravetz: {
inserted |= insert_disks(media, diskii_, 2); inserted |= insert_disks(media, diskii_, 2);
} break; } break;
@ -401,19 +404,19 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
} }
} else { } else {
if((address & 0xff00) == 0x0300) { if((address & 0xff00) == 0x0300) {
if(address < 0x0310 || (disk_interface == Analyser::Static::Oric::Target::DiskInterface::None)) { if(address < 0x0310 || (disk_interface == DiskInterface::None)) {
if(isReadOperation(operation)) *value = via_.read(address); if(isReadOperation(operation)) *value = via_.read(address);
else via_.write(address, *value); else via_.write(address, *value);
} else { } else {
switch(disk_interface) { switch(disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
if(address >= 0x3f4) { if(address >= 0x3f4) {
if(isReadOperation(operation)) *value = jasmin_.read(address); if(isReadOperation(operation)) *value = jasmin_.read(address);
else jasmin_.write(address, *value); else jasmin_.write(address, *value);
} }
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
switch(address) { switch(address) {
case 0x0310: case 0x0311: case 0x0312: case 0x0313: case 0x0310: case 0x0311: case 0x0312: case 0x0313:
if(isReadOperation(operation)) *value = microdisc_.read(address); if(isReadOperation(operation)) *value = microdisc_.read(address);
@ -428,7 +431,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
break; break;
} }
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: case DiskInterface::Pravetz:
if(address >= 0x0320) { if(address >= 0x0320) {
if(isReadOperation(operation)) *value = pravetz_rom_[pravetz_rom_base_pointer_ + (address & 0xff)]; if(isReadOperation(operation)) *value = pravetz_rom_[pravetz_rom_base_pointer_ + (address & 0xff)];
else { else {
@ -470,13 +473,24 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
tape_player_.run_for(Cycles(1)); tape_player_.run_for(Cycles(1));
switch(disk_interface) { switch(disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Jasmin: case DiskInterface::Jasmin:
jasmin_.run_for(Cycles(8)); jasmin_.run_for(Cycles(8));
// Jasmin autostart hack: wait for a period, then trigger a reset, having forced
// the Jasmin to page its ROM in first.
if(jasmin_reset_counter_) {
--jasmin_reset_counter_;
if(!jasmin_reset_counter_) {
jasmin_.write(0x3fa, 0);
jasmin_.write(0x3fb, 1);
m6502_.set_power_on(true);
}
}
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
microdisc_.run_for(Cycles(8)); microdisc_.run_for(Cycles(8));
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: case DiskInterface::Pravetz:
if(diskii_clocking_preference_ == ClockingHint::Preference::RealTime) { if(diskii_clocking_preference_ == ClockingHint::Preference::RealTime) {
diskii_.set_data_input(*value); diskii_.set_data_input(*value);
diskii_.run_for(Cycles(2)); diskii_.run_for(Cycles(2));
@ -486,6 +500,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
break; break;
} }
cycles_since_video_update_++; cycles_since_video_update_++;
return Cycles(1); return Cycles(1);
} }
@ -611,10 +626,10 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
void set_activity_observer(Activity::Observer *observer) override { void set_activity_observer(Activity::Observer *observer) override {
switch(disk_interface) { switch(disk_interface) {
default: break; default: break;
case Analyser::Static::Oric::Target::DiskInterface::Microdisc: case DiskInterface::Microdisc:
microdisc_.set_activity_observer(observer); microdisc_.set_activity_observer(observer);
break; break;
case Analyser::Static::Oric::Target::DiskInterface::Pravetz: case DiskInterface::Pravetz:
diskii_.set_activity_observer(observer); diskii_.set_activity_observer(observer);
break; break;
} }
@ -665,6 +680,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
// the Jasmin, if in use. // the Jasmin, if in use.
Jasmin jasmin_; Jasmin jasmin_;
int jasmin_reset_counter_ = 6000000; // i.e. 8 seconds.
// the Pravetz/Disk II, if in use. // the Pravetz/Disk II, if in use.
Apple::DiskII diskii_; Apple::DiskII diskii_;
@ -685,12 +701,12 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface> class Co
bool irq_line = via_.get_interrupt_line(); bool irq_line = via_.get_interrupt_line();
// The Microdisc directly provides an interrupt line. // The Microdisc directly provides an interrupt line.
if constexpr (disk_interface == Analyser::Static::Oric::Target::DiskInterface::Microdisc) { if constexpr (disk_interface == DiskInterface::Microdisc) {
irq_line |= microdisc_.get_interrupt_request_line(); irq_line |= microdisc_.get_interrupt_request_line();
} }
// The Jasmin reroutes its data request line to the processor's interrupt line. // The Jasmin reroutes its data request line to the processor's interrupt line.
if constexpr (disk_interface == Analyser::Static::Oric::Target::DiskInterface::Jasmin) { if constexpr (disk_interface == DiskInterface::Jasmin) {
irq_line |= jasmin_.get_data_request_line(); irq_line |= jasmin_.get_data_request_line();
} }
@ -707,7 +723,6 @@ using namespace Oric;
Machine *Machine::Oric(const Analyser::Static::Target *target_hint, const ROMMachine::ROMFetcher &rom_fetcher) { Machine *Machine::Oric(const Analyser::Static::Target *target_hint, const ROMMachine::ROMFetcher &rom_fetcher) {
auto *const oric_target = dynamic_cast<const Analyser::Static::Oric::Target *>(target_hint); auto *const oric_target = dynamic_cast<const Analyser::Static::Oric::Target *>(target_hint);
using DiskInterface = Analyser::Static::Oric::Target::DiskInterface;
switch(oric_target->disk_interface) { switch(oric_target->disk_interface) {
default: return new ConcreteMachine<DiskInterface::None>(*oric_target, rom_fetcher); default: return new ConcreteMachine<DiskInterface::None>(*oric_target, rom_fetcher);
case DiskInterface::Microdisc: return new ConcreteMachine<DiskInterface::Microdisc>(*oric_target, rom_fetcher); case DiskInterface::Microdisc: return new ConcreteMachine<DiskInterface::Microdisc>(*oric_target, rom_fetcher);