1
0
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:
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);
// }
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?

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 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();