1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
# license:BSD-3-Clause
# copyright-holders:Peter Trauner
# r65c02gk opcodes
brk_c_imp
if(irq_taken || nmi_state) {
read_pc_noinc();
} else {
read_pc();
}
write(SP, PC >> 8);
dec_SP();
write(SP, PC);
dec_SP();
write(SP, irq_taken || nmi_state ? P & ~F_B : P);
dec_SP();
if(irq_taken && nmi_state) {
PC = read_arg(0x7ffa);
PC = set_h(PC, read_arg(0x7ffb));
nmi_state = false;
standard_irq_callback(NMI_LINE);
} else {
static int level=interrupt_controller.getlevel(); // !no gameking dual core expected
if (level==IRQ_GK3A) {
PC = read_arg(0x7fe2);
PC = set_h(PC, read_arg(0x7fe3));
} else if (level==IRQ_GK3B) {
PC = read_arg(0x7fe4);
PC = set_h(PC, read_arg(0x7fe5));
} else if (level==IRQ_TIMERUSER) {
m_bank4000->set_base(bank4000_irq);
PC = read_arg(0x7fee);
PC = set_h(PC, read_arg(0x7fef));
} else if (level==IRQ_INPUTS) {
m_bank4000->set_base(bank4000_irq);
PC = read_arg(0x7ff0);
PC = set_h(PC, read_arg(0x7ff1));
} else if (level==IRQ_USER) {
m_bank4000->set_base(bank4000_irq);
PC = read_arg(0x7ff2);
PC = set_h(PC, read_arg(0x7ff3));
} else if (level==IRQ_TIMER/*INPUT_LINE_IRQ9*/) {
m_bank4000->set_base(bank4000_irq);
PC = read_arg(0x7ff4);
PC = set_h(PC, read_arg(0x7ff5));
} else if (level==IRQ_6606) {
PC = read_arg(0x7ff6);
PC = set_h(PC, read_arg(0x7ff7));
} else {
PC = read_arg(0x7ffe);
PC = set_h(PC, read_arg(0x7fff));
if(irq_taken)
standard_irq_callback(IRQ_LINE);
}
}
irq_taken = false;
P = (P | F_I) & ~F_D; // Do *not* move after the prefetch
prefetch();
inst_state = -1;
rti_imp
read_pc_noinc();
read(SP);
inc_SP();
P = read(SP) | (F_B|F_E);
inc_SP();
PC = read(SP);
inc_SP();
PC = set_h(PC, read(SP));
m_bank4000->set_base(bank4000_normal);
prefetch();
wai_imp
read_pc_noinc(); /* same as m65c02 version, seams to be right*/
read_pc_noinc();
while(!nmi_state && !irq_state) {
eat-all-cycles;
}
prefetch();
# exceptions
reset
PC = read_arg(0x7ffc);
PC = set_h(PC, read_arg(0x7ffd));
prefetch();
inst_state = -1;
|