1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-07-05 10:28:58 +00:00

Causes the 65C02 not to accept interrupts immediately after untaken branches.

This commit is contained in:
Thomas Harte 2018-08-15 22:42:04 -04:00
parent 60e00ddd02
commit 592ec69d36
2 changed files with 11 additions and 2 deletions

View File

@ -533,7 +533,13 @@ if(number_of_cycles <= Cycles(0)) break;
// MARK: - Branching
#define BRA(condition) pc_.full++; if(condition) scheduled_program_counter_ = do_branch
#define BRA(condition) \
pc_.full++; \
if(condition) { \
scheduled_program_counter_ = do_branch; \
} else if(is_65c02(personality)) { \
scheduled_program_counter_ = fetch_decode_execute; \
}
case OperationBPL: BRA(!(negative_result_&0x80)); continue;
case OperationBMI: BRA(negative_result_&0x80); continue;

View File

@ -160,8 +160,11 @@ class ProcessorStorage {
OperationBCC, // schedules the branch program if the carry flag is clear
OperationBCS, // schedules the branch program if the carry flag is set
OperationBNE, // schedules the branch program if the zero flag is clear
OperationBEQ, // schedules the branch program if the zero flag is set
OperationBEQ, // schedules the branch program if the zero flag is set; 65C02: otherwise jumps straight into a fetch-decode-execute without considering whether to take an interrupt
OperationBRA, // schedules the branch program
// 65C02 modification to all branches: if the branch isn't taken, the next fetch-decode-execute
// sequence is scheduled immediately, without any possibility of responding to an interrupt.
// Cf. http://forum.6502.org/viewtopic.php?f=4&t=1634
OperationBBRBBS, // inspecting the operation_, if the appropriate bit of operand_ is set or clear schedules a program to read and act upon the second operand; otherwise schedule a program to read and discard it