mirror of
https://github.com/TomHarte/CLK.git
synced 2025-01-13 07:30:21 +00:00
Reinstituted something of the don't-do-pixel-work-until-an-affecting-write-occurs optimisation.
This commit is contained in:
parent
c1c70a767a
commit
f61176cd7d
@ -58,13 +58,13 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
||||
}
|
||||
else
|
||||
{
|
||||
update_display();
|
||||
if(address >= video_access_range_.low_address && address <= video_access_range_.high_address) update_display();
|
||||
ram_[address] = *value;
|
||||
}
|
||||
|
||||
// for the entire frame, RAM is accessible only on odd cycles; in modes below 4
|
||||
// it's also accessible only outside of the pixel regions
|
||||
cycles += video_output_->get_cycles_until_next_ram_availability(cycles_since_display_update_ + 1);
|
||||
cycles += video_output_->get_cycles_until_next_ram_availability((int)(cycles_since_display_update_ + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -109,6 +109,7 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
||||
{
|
||||
update_display();
|
||||
video_output_->set_register(address, *value);
|
||||
video_access_range_ = video_output_->get_memory_access_range();
|
||||
queue_next_display_interrupt();
|
||||
}
|
||||
break;
|
||||
@ -344,13 +345,13 @@ void Machine::configure_as_target(const StaticAnalyser::Target &target)
|
||||
|
||||
if(target.loadingCommand.length()) // TODO: and automatic loading option enabled
|
||||
{
|
||||
// set_typer_for_string(target.loadingCommand.c_str());
|
||||
set_typer_for_string(target.loadingCommand.c_str());
|
||||
}
|
||||
|
||||
if(target.acorn.should_hold_shift)
|
||||
{
|
||||
// set_key_state(KeyShift, true);
|
||||
// is_holding_shift_ = true;
|
||||
set_key_state(KeyShift, true);
|
||||
is_holding_shift_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,6 +134,7 @@ class Machine:
|
||||
unsigned int cycles_since_audio_update_;
|
||||
int cycles_until_display_interrupt_;
|
||||
Interrupt next_display_interrupt_;
|
||||
VideoOutput::Range video_access_range_;
|
||||
|
||||
// Tape
|
||||
Tape tape_;
|
||||
|
@ -417,7 +417,7 @@ unsigned int VideoOutput::get_cycles_until_next_ram_availability(int from_time)
|
||||
{
|
||||
const int current_column = graphics_column(position + (position&1));
|
||||
int current_line = graphics_line(position);
|
||||
if(current_line < 256)
|
||||
if(current_column < 80 && current_line < 256)
|
||||
{
|
||||
if(screen_mode_ == 3)
|
||||
{
|
||||
@ -433,6 +433,14 @@ unsigned int VideoOutput::get_cycles_until_next_ram_availability(int from_time)
|
||||
return result;
|
||||
}
|
||||
|
||||
VideoOutput::Range VideoOutput::get_memory_access_range()
|
||||
{
|
||||
VideoOutput::Range range;
|
||||
range.low_address = std::min(start_screen_address_, screen_mode_base_address_);
|
||||
range.high_address = 0x8000;
|
||||
return range;
|
||||
}
|
||||
|
||||
#pragma mark - The screen map
|
||||
|
||||
void VideoOutput::setup_screen_map()
|
||||
|
@ -30,6 +30,11 @@ class VideoOutput {
|
||||
|
||||
unsigned int get_cycles_until_next_ram_availability(int from_time);
|
||||
|
||||
struct Range {
|
||||
uint16_t low_address, high_address;
|
||||
};
|
||||
Range get_memory_access_range();
|
||||
|
||||
private:
|
||||
inline void start_pixel_line();
|
||||
inline void end_pixel_line();
|
||||
|
Loading…
x
Reference in New Issue
Block a user