1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-08-12 09:25:19 +00:00

Played about with interrupt timing.

This commit is contained in:
Thomas Harte
2016-02-20 21:24:02 -05:00
parent 574985f9a2
commit 3754cf4bce
2 changed files with 14 additions and 14 deletions

View File

@@ -282,16 +282,16 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
// printf("%04x: %02x (%d)\n", address, *value, _fieldCycles); // printf("%04x: %02x (%d)\n", address, *value, _fieldCycles);
// } // }
unsigned int line_position = (unsigned int)get_line_output_position(_fieldCycles); unsigned int start_of_graphics = get_first_graphics_cycle();
const unsigned int real_time_clock_interrupt_time = (first_graphics_line + 99)*128 + first_graphics_cycle + 80; const unsigned int real_time_clock_interrupt_time = start_of_graphics + 99*128;
const unsigned int display_end_interrupt_time = (first_graphics_line + 255)*128 + first_graphics_cycle + 80; 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(); update_audio();
signal_interrupt(Interrupt::RealTimeClock); 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(); update_audio();
signal_interrupt(Interrupt::DisplayEnd); signal_interrupt(Interrupt::DisplayEnd);
@@ -371,17 +371,12 @@ inline void Machine::evaluate_interrupts()
inline void Machine::update_audio() inline void Machine::update_audio()
{ {
int difference = _fieldCycles - _audioOutputPosition; int difference = (int)_fieldCycles - _audioOutputPosition;
_audioOutputPosition = _fieldCycles; _audioOutputPosition = (int)_fieldCycles;
_speaker.run_for_cycles((_audioOutputPositionError + difference) >> 4); _speaker.run_for_cycles((_audioOutputPositionError + difference) >> 4);
_audioOutputPositionError = (_audioOutputPositionError + difference)&15; _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() inline void Machine::reset_pixel_output()
{ {
display_x = 0; 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() 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; const unsigned int end_of_graphics = end_of_top + 256 * cycles_per_line;
// does the top region need to be output? // does the top region need to be output?

View File

@@ -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 output_pixels(int start_x, int number_of_pixels);
inline void end_pixel_output(); inline void end_pixel_output();
inline void reset_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 update_audio();
inline void signal_interrupt(Interrupt interrupt); inline void signal_interrupt(Interrupt interrupt);
inline void evaluate_interrupts(); inline void evaluate_interrupts();