mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-29 12:50:28 +00:00
Switches to latching video interrupts until acknowledged.
Seems to fix Cisco Heat, at least. I have no idea whether I'm latching the correct thing, whether IACK should clear both or only one, etc.
This commit is contained in:
parent
09513ec14c
commit
8e777c299f
@ -176,7 +176,10 @@ class ConcreteMachine:
|
|||||||
// An interrupt acknowledge, perhaps?
|
// An interrupt acknowledge, perhaps?
|
||||||
if(cycle.operation & Microcycle::InterruptAcknowledge) {
|
if(cycle.operation & Microcycle::InterruptAcknowledge) {
|
||||||
// Current implementation: everything other than 6 (i.e. the MFP is autovectored.
|
// Current implementation: everything other than 6 (i.e. the MFP is autovectored.
|
||||||
if((cycle.word_address()&7) != 6) {
|
const int interrupt_level = cycle.word_address()&7;
|
||||||
|
if(interrupt_level != 6) {
|
||||||
|
video_interrupts_pending_ &= ~interrupt_level;
|
||||||
|
update_interrupt_input();
|
||||||
mc68000_.set_is_peripheral_address(true);
|
mc68000_.set_is_peripheral_address(true);
|
||||||
return HalfCycles(0);
|
return HalfCycles(0);
|
||||||
} else {
|
} else {
|
||||||
@ -552,12 +555,27 @@ class ConcreteMachine:
|
|||||||
update_interrupt_input();
|
update_interrupt_input();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int video_interrupts_pending_ = 0;
|
||||||
|
bool previous_hsync_ = false, previous_vsync_ = false;
|
||||||
void update_interrupt_input() {
|
void update_interrupt_input() {
|
||||||
|
// Complete guess: set video interrupts pending if/when hsync of vsync
|
||||||
|
// go inactive. Reset upon IACK.
|
||||||
|
const bool hsync = video_.last_valid()->hsync();
|
||||||
|
const bool vsync = video_.last_valid()->vsync();
|
||||||
|
if(previous_hsync_ != hsync && previous_hsync_) {
|
||||||
|
video_interrupts_pending_ |= 2;
|
||||||
|
}
|
||||||
|
if(previous_vsync_ != vsync && previous_vsync_) {
|
||||||
|
video_interrupts_pending_ |= 4;
|
||||||
|
}
|
||||||
|
previous_vsync_ = vsync;
|
||||||
|
previous_hsync_ = hsync;
|
||||||
|
|
||||||
if(mfp_->get_interrupt_line()) {
|
if(mfp_->get_interrupt_line()) {
|
||||||
mc68000_.set_interrupt_level(6);
|
mc68000_.set_interrupt_level(6);
|
||||||
} else if(video_->vsync()) {
|
} else if(video_interrupts_pending_ & 4) {
|
||||||
mc68000_.set_interrupt_level(4);
|
mc68000_.set_interrupt_level(4);
|
||||||
} else if(video_->hsync()) {
|
} else if(video_interrupts_pending_ & 2) {
|
||||||
mc68000_.set_interrupt_level(2);
|
mc68000_.set_interrupt_level(2);
|
||||||
} else {
|
} else {
|
||||||
mc68000_.set_interrupt_level(0);
|
mc68000_.set_interrupt_level(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user