mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-25 03:32:01 +00:00
Some minor optimisations and timing tweaks. Nothing of substance.
This commit is contained in:
parent
df3fff51c7
commit
20ac630e4d
@ -101,7 +101,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
if(isReadOperation(operation))
|
if(isReadOperation(operation))
|
||||||
{
|
{
|
||||||
*value = _interrupt_status;
|
*value = _interrupt_status;
|
||||||
_interrupt_status &= ~0x02;
|
_interrupt_status &= ~PowerOnReset;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -283,8 +283,8 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
unsigned int start_of_graphics = get_first_graphics_cycle();
|
unsigned int start_of_graphics = get_first_graphics_cycle();
|
||||||
const unsigned int real_time_clock_interrupt_time = start_of_graphics + 99*128;
|
const unsigned int real_time_clock_interrupt_time = start_of_graphics + 128*128;
|
||||||
const unsigned int display_end_interrupt_time = start_of_graphics + 257*128 + 64;
|
const unsigned int display_end_interrupt_time = start_of_graphics + 264*128;
|
||||||
|
|
||||||
if(_fieldCycles < real_time_clock_interrupt_time && _fieldCycles + cycles >= real_time_clock_interrupt_time)
|
if(_fieldCycles < real_time_clock_interrupt_time && _fieldCycles + cycles >= real_time_clock_interrupt_time)
|
||||||
{
|
{
|
||||||
|
@ -545,9 +545,15 @@ template <class T> class Processor {
|
|||||||
OperationMoveToNextProgram
|
OperationMoveToNextProgram
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// These plus program below act to give the compiler permission to update these values
|
||||||
|
// without touching the class storage (i.e. it explicitly says they need be completely up
|
||||||
|
// to date in this stack frame only); which saves some complicated addressing
|
||||||
|
unsigned int scheduleProgramsReadPointer = _scheduleProgramsReadPointer;
|
||||||
|
unsigned int scheduleProgramProgramCounter = _scheduleProgramProgramCounter;
|
||||||
|
|
||||||
#define checkSchedule(op) \
|
#define checkSchedule(op) \
|
||||||
if(!_scheduledPrograms[_scheduleProgramsReadPointer]) {\
|
if(!_scheduledPrograms[scheduleProgramsReadPointer]) {\
|
||||||
_scheduleProgramsReadPointer = _scheduleProgramsWritePointer = _scheduleProgramProgramCounter = 0;\
|
scheduleProgramsReadPointer = _scheduleProgramsWritePointer = scheduleProgramProgramCounter = 0;\
|
||||||
if(_reset_line_is_enabled)\
|
if(_reset_line_is_enabled)\
|
||||||
schedule_program(get_reset_program());\
|
schedule_program(get_reset_program());\
|
||||||
else\
|
else\
|
||||||
@ -561,25 +567,26 @@ template <class T> class Processor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
checkSchedule();
|
checkSchedule();
|
||||||
_cycles_left_to_run += number_of_cycles;
|
number_of_cycles += _cycles_left_to_run;
|
||||||
|
const MicroOp *program = _scheduledPrograms[scheduleProgramsReadPointer];
|
||||||
|
|
||||||
while(_cycles_left_to_run > 0) {
|
while(number_of_cycles > 0) {
|
||||||
|
|
||||||
while (_ready_is_active && _cycles_left_to_run > 0) {
|
while (_ready_is_active && number_of_cycles > 0) {
|
||||||
_cycles_left_to_run -= static_cast<T *>(this)->perform_bus_operation(BusOperation::Ready, _busAddress, _busValue);
|
number_of_cycles -= static_cast<T *>(this)->perform_bus_operation(BusOperation::Ready, _busAddress, _busValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!_ready_is_active && _cycles_left_to_run > 0) {
|
while (!_ready_is_active && number_of_cycles > 0) {
|
||||||
|
|
||||||
if (_nextBusOperation != BusOperation::None) {
|
if (_nextBusOperation != BusOperation::None) {
|
||||||
_irq_request_history[0] = _irq_request_history[1];
|
_irq_request_history[0] = _irq_request_history[1];
|
||||||
_irq_request_history[1] = _irq_line_is_enabled && !_interruptFlag;
|
_irq_request_history[1] = _irq_line_is_enabled && !_interruptFlag;
|
||||||
_cycles_left_to_run -= static_cast<T *>(this)->perform_bus_operation(_nextBusOperation, _busAddress, _busValue);
|
number_of_cycles -= static_cast<T *>(this)->perform_bus_operation(_nextBusOperation, _busAddress, _busValue);
|
||||||
_nextBusOperation = BusOperation::None;
|
_nextBusOperation = BusOperation::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MicroOp cycle = _scheduledPrograms[_scheduleProgramsReadPointer][_scheduleProgramProgramCounter];
|
const MicroOp cycle = program[scheduleProgramProgramCounter];
|
||||||
_scheduleProgramProgramCounter++;
|
scheduleProgramProgramCounter++;
|
||||||
|
|
||||||
#define read_op(val, addr) _nextBusOperation = BusOperation::ReadOpcode; _busAddress = addr; _busValue = &val
|
#define read_op(val, addr) _nextBusOperation = BusOperation::ReadOpcode; _busAddress = addr; _busValue = &val
|
||||||
#define read_mem(val, addr) _nextBusOperation = BusOperation::Read; _busAddress = addr; _busValue = &val
|
#define read_mem(val, addr) _nextBusOperation = BusOperation::Read; _busAddress = addr; _busValue = &val
|
||||||
@ -616,10 +623,11 @@ template <class T> class Processor {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OperationMoveToNextProgram:
|
case OperationMoveToNextProgram:
|
||||||
_scheduledPrograms[_scheduleProgramsReadPointer] = NULL;
|
_scheduledPrograms[scheduleProgramsReadPointer] = NULL;
|
||||||
_scheduleProgramsReadPointer = (_scheduleProgramsReadPointer+1)&3;
|
scheduleProgramsReadPointer = (scheduleProgramsReadPointer+1)&3;
|
||||||
_scheduleProgramProgramCounter = 0;
|
scheduleProgramProgramCounter = 0;
|
||||||
checkSchedule();
|
checkSchedule();
|
||||||
|
program = _scheduledPrograms[scheduleProgramsReadPointer];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#define push(v) \
|
#define push(v) \
|
||||||
@ -1035,6 +1043,10 @@ template <class T> class Processor {
|
|||||||
_ready_is_active = true;
|
_ready_is_active = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cycles_left_to_run = number_of_cycles;
|
||||||
|
_scheduleProgramsReadPointer = scheduleProgramsReadPointer;
|
||||||
|
_scheduleProgramProgramCounter = scheduleProgramProgramCounter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user