1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-06 01:28:57 +00:00

Made a quick attempt at reimplementing skip-to-the-end logic for ready waits.

This commit is contained in:
Thomas Harte 2015-08-09 02:42:01 -04:00
parent eb23a493e5
commit 987be65a59

View File

@ -203,12 +203,22 @@ void Machine::output_pixels(int count)
int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value)
{ {
uint8_t returnValue = 0xff; uint8_t returnValue = 0xff;
int cycles_run_for = 1;
const int32_t ready_line_disable_time = horizontalTimerReload-3;
output_pixels(3); if(operation == CPU6502::BusOperation::Ready) {
if(_horizontalTimer == horizontalTimerReload-3) int32_t distance_to_end_of_ready = _horizontalTimer - ready_line_disable_time + horizontalTimerReload;
cycles_run_for += distance_to_end_of_ready / 3;
output_pixels(distance_to_end_of_ready);
set_ready_line(false); set_ready_line(false);
} else {
output_pixels(3);
if(_horizontalTimer == horizontalTimerReload-3)
set_ready_line(false);
}
if(operation != CPU6502::BusOperation::Ready) { if(operation != CPU6502::BusOperation::Ready) {
// check for a ROM access // check for a ROM access
if ((address&0x1000) && isReadOperation(operation)) { if ((address&0x1000) && isReadOperation(operation)) {
returnValue &= _rom[address&_romMask]; returnValue &= _rom[address&_romMask];
@ -333,15 +343,15 @@ int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t add
} }
} }
if(_piaTimerValue) { if(_piaTimerValue >= cycles_run_for) {
_piaTimerValue --; _piaTimerValue -= cycles_run_for;
} else { } else {
_piaTimerValue = 0xff; _piaTimerValue += 0xff - cycles_run_for;
_piaTimerShift = 0; _piaTimerShift = 0;
_piaTimerStatus |= 0xc0; _piaTimerStatus |= 0xc0;
} }
return 1; return cycles_run_for;
} }
void Machine::set_rom(size_t length, const uint8_t *data) void Machine::set_rom(size_t length, const uint8_t *data)