37 lines
831 B
C++
Executable file
37 lines
831 B
C++
Executable file
void CPU::interrupt() {
|
|
op_readpc();
|
|
op_readpc();
|
|
op_writesp(regs.pc >> 8);
|
|
op_writesp(regs.pc >> 0);
|
|
op_writesp(regs.p | 0x20);
|
|
uint16 vector = 0xfffe; //IRQ
|
|
if(status.nmi_pending) {
|
|
status.nmi_pending = false;
|
|
vector = 0xfffa;
|
|
}
|
|
abs.l = op_read(vector++);
|
|
regs.p.i = 1;
|
|
regs.p.d = 0;
|
|
L abs.h = op_read(vector++);
|
|
regs.pc = abs.w;
|
|
}
|
|
|
|
void CPU::interrupt_test() {
|
|
status.interrupt_pending = ((status.irq_line | status.irq_apu_line) & ~regs.p.i) | status.nmi_pending;
|
|
}
|
|
|
|
void CPU::set_nmi_line(bool line) {
|
|
//edge-sensitive (0->1)
|
|
if(!status.nmi_line && line) status.nmi_pending = true;
|
|
status.nmi_line = line;
|
|
}
|
|
|
|
void CPU::set_irq_line(bool line) {
|
|
//level-sensitive
|
|
status.irq_line = line;
|
|
}
|
|
|
|
void CPU::set_irq_apu_line(bool line) {
|
|
//level-sensitive
|
|
status.irq_apu_line = line;
|
|
}
|