mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 03:32:01 +00:00
Factors out some boilerplate.
When I'm confident this is correct, I can fix up the other call sites.
This commit is contained in:
parent
1b0f45649e
commit
58be770eaa
@ -164,6 +164,31 @@ template <bool is_stereo> class AY38910: public ::Outputs::Speaker::SampleSource
|
|||||||
uint8_t c_left_ = 255, c_right_ = 255;
|
uint8_t c_left_ = 255, c_right_ = 255;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Provides helper code, to provide something closer to the interface exposed by many
|
||||||
|
AY-deploying machines of the era.
|
||||||
|
*/
|
||||||
|
struct Utility {
|
||||||
|
template <typename AY> static void select_register(AY &ay, uint8_t reg) {
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BDIR | GI::AY38910::BC2 | GI::AY38910::BC1));
|
||||||
|
ay.set_data_input(reg);
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename AY> static void write_data(AY &ay, uint8_t reg) {
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BDIR | GI::AY38910::BC2));
|
||||||
|
ay.set_data_input(reg);
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename AY> static uint8_t read_data(AY &ay) {
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BC2 | GI::AY38910::BC1));
|
||||||
|
const uint8_t result = ay.get_data_output();
|
||||||
|
ay.set_control_lines(GI::AY38910::ControlLines(0));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,17 +213,13 @@ template<Model model> class ConcreteMachine:
|
|||||||
case 0xfffd:
|
case 0xfffd:
|
||||||
// Select AY register.
|
// Select AY register.
|
||||||
update_audio();
|
update_audio();
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BDIR | GI::AY38910::BC2 | GI::AY38910::BC1));
|
GI::AY38910::Utility::select_register(ay_, *cycle.value);
|
||||||
ay_.set_data_input(*cycle.value);
|
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(0));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xbffd:
|
case 0xbffd:
|
||||||
// Write to AY register.
|
// Write to AY register.
|
||||||
update_audio();
|
update_audio();
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BDIR | GI::AY38910::BC2));
|
GI::AY38910::Utility::write_data(ay_, *cycle.value);
|
||||||
ay_.set_data_input(*cycle.value);
|
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(0));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -265,9 +261,7 @@ template<Model model> class ConcreteMachine:
|
|||||||
case 0xfffd:
|
case 0xfffd:
|
||||||
// Read from AY register.
|
// Read from AY register.
|
||||||
update_audio();
|
update_audio();
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(GI::AY38910::BC2 | GI::AY38910::BC1));
|
*cycle.value &= GI::AY38910::Utility::read_data(ay_);
|
||||||
*cycle.value &= ay_.get_data_output();
|
|
||||||
ay_.set_control_lines(GI::AY38910::ControlLines(0));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user