1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-01-10 16:30:07 +00:00

Begin usage of RDY.

This commit is contained in:
Thomas Harte 2024-12-16 07:18:07 -05:00
parent 3d7e016b42
commit 709f350d60
2 changed files with 70 additions and 37 deletions

View File

@ -154,6 +154,10 @@ public:
video_.run_for(length);
if(operation == CPU::MOS6502::BusOperation::Ready) {
return length;
}
// Perform actual access.
if(address < 0x0002) {
// TODO: 0x0000: data directions for parallel IO; 1 = output.

View File

@ -116,9 +116,12 @@ public:
}
Cycles cycle_length([[maybe_unused]] bool is_ready) const {
// TODO: the complete test is more than this.
// TODO: if this is a RDY cycle, can reply with time until end-of-RDY.
const bool is_long_cycle = single_clock_ || refresh_;
if(is_ready) {
// return
// Cycles(EndCharacterFetchWindow - horizontal_counter_ + EndOfLine) * is_ntsc_ ? Cycles(4) : Cycles(5) / 2;
}
const bool is_long_cycle = single_clock_ || refresh_ || external_fetch_;
if(is_ntsc_) {
return is_long_cycle ? Cycles(16) : Cycles(8);
@ -202,33 +205,6 @@ public:
interrupts_.apply(Interrupts::Flag::Raster);
}
// List of events.
enum HorizontalEvent {
Begin38Columns = 3,
EndExternalFetchWindow = 288,
LatchCharacterPosition = 290,
EndCharacterFetchWindow = 296,
EndVideoShiftRegister = 304,
End38Columns = 307,
End40Columns = 315,
EndRefresh = 328,
IncrementBlink = 336,
BeginBlank = 344,
BeginSync = 358,
TestRasterInterrupt = 368,
IncrementVerticalLine = 376,
BeginBurst = 384,
EndSync = 390,
BeginExternalFetchWindow = 400,
EndBurst = 408,
EndBlank = 416,
IncrementCharacterPositionReload = 424,
BeginCharacterFetchWindow = 432,
BeginVideoShiftRegister = 440,
Begin40Columns = 451,
EndOfLine = 456,
};
const auto next = Numeric::upper_bound<
0, Begin38Columns,
EndExternalFetchWindow, LatchCharacterPosition,
@ -238,7 +214,7 @@ public:
BeginBlank, BeginSync,
TestRasterInterrupt, IncrementVerticalLine,
BeginBurst, EndSync,
BeginExternalFetchWindow, EndBurst,
BeginExternalFetchWindow, //EndBurst,
EndBlank, IncrementCharacterPositionReload,
BeginCharacterFetchWindow, BeginVideoShiftRegister,
Begin40Columns, EndOfLine
@ -255,6 +231,10 @@ public:
state = horizontal_burst_ ? OutputState::Burst : OutputState::Blank;
} else {
state = vertical_window_ && output_pixels_ ? OutputState::Pixels : OutputState::Border;
// if(output_pixels_) {
// printf("%d -> %d\n", horizontal_counter_, horizontal_counter_ + period);
// }
}
if(state != output_state_) {
@ -303,13 +283,34 @@ public:
break;
case BeginExternalFetchWindow:
// TODO: set RDY line if this is an appropriate row.
external_fetch_ = true;
switch(fetch_phase_) {
case FetchPhase::Waiting:
// TODO: the < 200 is obviously phoney baloney. Figure out what the actual condition is here.
if(vertical_counter_ < 200 && (vertical_counter_&7) == y_scroll_ && vertical_window_) {
fetch_phase_ = FetchPhase::FetchingCharacters;
}
break;
case FetchPhase::FetchingCharacters:
fetch_phase_ = FetchPhase::FetchingAttributes;
break;
case FetchPhase::FetchingAttributes:
fetch_phase_ = FetchPhase::Waiting;
break;
}
interrupts_.bus().set_ready_line(fetch_phase_ != FetchPhase::Waiting);
horizontal_burst_ = false;
break;
case LatchCharacterPosition: line_character_address_ = character_address_; break;
case LatchCharacterPosition:
line_character_address_ = character_address_;
break;
case EndCharacterFetchWindow:
fetch_characters_ = false;
external_fetch_ = false;
interrupts_.bus().set_ready_line(false);
break;
case BeginCharacterFetchWindow:
fetch_characters_ = true;
@ -339,7 +340,7 @@ public:
case BeginBlank: horizontal_blank_ = true; break;
case BeginSync: horizontal_sync_ = true; break;
case EndSync: horizontal_sync_ = false; break;
case EndBurst: horizontal_burst_ = false; break;
// case EndBurst: horizontal_burst_ = false; break;
case EndBlank: horizontal_blank_ = false; break;
case TestRasterInterrupt:
@ -409,8 +410,9 @@ private:
uint16_t character_address_ = 0;
uint16_t line_character_address_ = 0;
bool fetch_characters_;
bool output_pixels_;
bool fetch_characters_ = false;
bool external_fetch_ = false;
bool output_pixels_ = false;
bool refresh_ = false;
bool single_clock_ = false;
uint8_t ff07_;
@ -443,8 +445,35 @@ private:
enum class FetchPhase {
Waiting,
FetchingCharacters,
FetchingAttributs,
FetchingAttributes,
} fetch_phase_ = FetchPhase::Waiting;
// List of events.
enum HorizontalEvent {
Begin38Columns = 3,
EndExternalFetchWindow = 288,
LatchCharacterPosition = 290,
EndCharacterFetchWindow = 300, // 296
EndVideoShiftRegister = 304,
End38Columns = 307,
End40Columns = 315,
EndRefresh = 328,
IncrementBlink = 336,
BeginBlank = 344,
BeginSync = 358,
TestRasterInterrupt = 368,
IncrementVerticalLine = 376,
BeginBurst = 384,
EndSync = 390,
BeginExternalFetchWindow = 408, // 400,
// EndBurst = 408,
EndBlank = 416,
IncrementCharacterPositionReload = 424,
BeginCharacterFetchWindow = 436, // 432,
BeginVideoShiftRegister = 440,
Begin40Columns = 451,
EndOfLine = 456,
};
};
}