mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Support MDA control: display enable.
This commit is contained in:
parent
8103f8e682
commit
b0d1dedb65
@ -478,7 +478,7 @@ class MDA {
|
|||||||
template <int address>
|
template <int address>
|
||||||
void write(uint8_t value) {
|
void write(uint8_t value) {
|
||||||
if constexpr (address & 0x8) {
|
if constexpr (address & 0x8) {
|
||||||
printf("TODO: write MDA control %02x\n", value);
|
outputter_.set_control(value);
|
||||||
} else {
|
} else {
|
||||||
if constexpr (address & 0x1) {
|
if constexpr (address & 0x1) {
|
||||||
crtc_.set_register(value);
|
crtc_.set_register(value);
|
||||||
@ -491,8 +491,7 @@ class MDA {
|
|||||||
template <int address>
|
template <int address>
|
||||||
uint8_t read() {
|
uint8_t read() {
|
||||||
if constexpr (address & 0x8) {
|
if constexpr (address & 0x8) {
|
||||||
printf("TODO: read MDA control\n");
|
return outputter_.control();
|
||||||
return 0xff;
|
|
||||||
} else {
|
} else {
|
||||||
return crtc_.get_register();
|
return crtc_.get_register();
|
||||||
}
|
}
|
||||||
@ -519,11 +518,22 @@ class MDA {
|
|||||||
crt.set_display_type(Outputs::Display::DisplayType::RGB);
|
crt.set_display_type(Outputs::Display::DisplayType::RGB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_control(uint8_t control) {
|
||||||
|
// b0: 'high resolution' (probably breaks if not 1)
|
||||||
|
// b3: video enable
|
||||||
|
// b5: enable blink
|
||||||
|
control_ = control;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t control() {
|
||||||
|
return control_;
|
||||||
|
}
|
||||||
|
|
||||||
void perform_bus_cycle_phase1(const Motorola::CRTC::BusState &state) {
|
void perform_bus_cycle_phase1(const Motorola::CRTC::BusState &state) {
|
||||||
// Determine new output state.
|
// Determine new output state.
|
||||||
const OutputState new_state =
|
const OutputState new_state =
|
||||||
(state.hsync | state.vsync) ? OutputState::Sync :
|
(state.hsync | state.vsync) ? OutputState::Sync :
|
||||||
(state.display_enable ? OutputState::Pixels : OutputState::Border);
|
((state.display_enable && control_&0x08) ? OutputState::Pixels : OutputState::Border);
|
||||||
|
|
||||||
// Upon either a state change or just having accumulated too much local time...
|
// Upon either a state change or just having accumulated too much local time...
|
||||||
if(new_state != output_state || count > 882) {
|
if(new_state != output_state || count > 882) {
|
||||||
@ -585,6 +595,8 @@ class MDA {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: blink.
|
||||||
|
|
||||||
if(((attributes & 7) == 1) && state.row_address == 13) {
|
if(((attributes & 7) == 1) && state.row_address == 13) {
|
||||||
// Draw as underline.
|
// Draw as underline.
|
||||||
std::fill(pixel_pointer, pixel_pointer + 9, intensity);
|
std::fill(pixel_pointer, pixel_pointer + 9, intensity);
|
||||||
@ -631,6 +643,8 @@ class MDA {
|
|||||||
|
|
||||||
const uint8_t *ram = nullptr;
|
const uint8_t *ram = nullptr;
|
||||||
std::vector<uint8_t> font;
|
std::vector<uint8_t> font;
|
||||||
|
|
||||||
|
uint8_t control_ = 0;
|
||||||
} outputter_;
|
} outputter_;
|
||||||
Motorola::CRTC::CRTC6845<CRTCOutputter, Motorola::CRTC::CursorType::MDA> crtc_;
|
Motorola::CRTC::CRTC6845<CRTCOutputter, Motorola::CRTC::CursorType::MDA> crtc_;
|
||||||
|
|
||||||
@ -942,6 +956,8 @@ class IO {
|
|||||||
case 0x03f4: return fdc_.status();
|
case 0x03f4: return fdc_.status();
|
||||||
case 0x03f5: return fdc_.read();
|
case 0x03f5: return fdc_.read();
|
||||||
|
|
||||||
|
case 0x03b8: return mda_.read<8>();
|
||||||
|
|
||||||
case 0x02e8: case 0x02e9: case 0x02ea: case 0x02eb:
|
case 0x02e8: case 0x02e9: case 0x02ea: case 0x02eb:
|
||||||
case 0x02ec: case 0x02ed: case 0x02ee: case 0x02ef:
|
case 0x02ec: case 0x02ed: case 0x02ee: case 0x02ef:
|
||||||
case 0x02f8: case 0x02f9: case 0x02fa: case 0x02fb:
|
case 0x02f8: case 0x02f9: case 0x02fa: case 0x02fb:
|
||||||
|
Loading…
Reference in New Issue
Block a user