mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-02 01:31:15 +00:00
Played about with interrupt timing.
This commit is contained in:
parent
574985f9a2
commit
3754cf4bce
@ -282,16 +282,16 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
||||
// printf("%04x: %02x (%d)\n", address, *value, _fieldCycles);
|
||||
// }
|
||||
|
||||
unsigned int line_position = (unsigned int)get_line_output_position(_fieldCycles);
|
||||
const unsigned int real_time_clock_interrupt_time = (first_graphics_line + 99)*128 + first_graphics_cycle + 80;
|
||||
const unsigned int display_end_interrupt_time = (first_graphics_line + 255)*128 + first_graphics_cycle + 80;
|
||||
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 display_end_interrupt_time = start_of_graphics + 256*128;
|
||||
|
||||
if(line_position < real_time_clock_interrupt_time && line_position + cycles >= real_time_clock_interrupt_time)
|
||||
if(_fieldCycles < real_time_clock_interrupt_time && _fieldCycles + cycles >= real_time_clock_interrupt_time)
|
||||
{
|
||||
update_audio();
|
||||
signal_interrupt(Interrupt::RealTimeClock);
|
||||
}
|
||||
else if(line_position < display_end_interrupt_time && line_position + cycles >= display_end_interrupt_time)
|
||||
else if(_fieldCycles < display_end_interrupt_time && _fieldCycles + cycles >= display_end_interrupt_time)
|
||||
{
|
||||
update_audio();
|
||||
signal_interrupt(Interrupt::DisplayEnd);
|
||||
@ -371,17 +371,12 @@ inline void Machine::evaluate_interrupts()
|
||||
|
||||
inline void Machine::update_audio()
|
||||
{
|
||||
int difference = _fieldCycles - _audioOutputPosition;
|
||||
_audioOutputPosition = _fieldCycles;
|
||||
int difference = (int)_fieldCycles - _audioOutputPosition;
|
||||
_audioOutputPosition = (int)_fieldCycles;
|
||||
_speaker.run_for_cycles((_audioOutputPositionError + difference) >> 4);
|
||||
_audioOutputPositionError = (_audioOutputPositionError + difference)&15;
|
||||
}
|
||||
|
||||
inline int Machine::get_line_output_position(int field_address)
|
||||
{
|
||||
return field_address + (_is_odd_field ? 64 : 0);
|
||||
}
|
||||
|
||||
inline void Machine::reset_pixel_output()
|
||||
{
|
||||
display_x = 0;
|
||||
@ -549,6 +544,11 @@ inline void Machine::update_pixels_to_position(int x, int y)
|
||||
}
|
||||
}
|
||||
|
||||
inline unsigned int Machine::get_first_graphics_cycle()
|
||||
{
|
||||
return (first_graphics_line * cycles_per_line) - (_is_odd_field ? 0 : 64);
|
||||
}
|
||||
|
||||
inline void Machine::update_display()
|
||||
{
|
||||
/*
|
||||
@ -565,7 +565,7 @@ inline void Machine::update_display()
|
||||
|
||||
*/
|
||||
|
||||
const unsigned int end_of_top = (first_graphics_line * cycles_per_line) - (_is_odd_field ? 0 : 64);
|
||||
const unsigned int end_of_top = get_first_graphics_cycle();
|
||||
const unsigned int end_of_graphics = end_of_top + 256 * cycles_per_line;
|
||||
|
||||
// does the top region need to be output?
|
||||
|
@ -160,8 +160,8 @@ class Machine: public CPU6502::Processor<Machine>, Tape::Delegate {
|
||||
inline void output_pixels(int start_x, int number_of_pixels);
|
||||
inline void end_pixel_output();
|
||||
inline void reset_pixel_output();
|
||||
inline unsigned int get_first_graphics_cycle();
|
||||
|
||||
inline int get_line_output_position(int field_address);
|
||||
inline void update_audio();
|
||||
inline void signal_interrupt(Interrupt interrupt);
|
||||
inline void evaluate_interrupts();
|
||||
|
Loading…
x
Reference in New Issue
Block a user