FA-89571 / Instruction set emulation / Open access
NMI treated as level triggered · case 01
Holding the NMI line high re-enters the NMI handler on every step.
ROOT CAUSE
NMI is taken whenever the line is high instead of on its rising edge.
VERIFIED REPAIR
Take NMI only on a 0-to-1 transition of the line.
Unsuccessful approach: Triggering on any change also takes an NMI when the line falls.
Case contract
Input [pc, i, steps] with steps [irq, nmi, instr]. Each step: an NMI 0->1 edge (the line starts low) is taken first; otherwise a high IRQ line is taken when the I flag is 0; otherwise the instruction runs (nop/cli/sei advance pc by 1, rti pops I then pc if the stack is non-empty). Taking an interrupt pushes pc then I, sets I=1 and jumps to 0x9000 (NMI) or 0x8000 (IRQ). The NMI edge detector samples the line every step. Return [event, pc, I] per step.
Why this case matters
Interrupt controllers in CPU emulators must separate edge- and level-triggered sources, masking and nesting to reproduce handler timing.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
pc, i, steps = args
stack = []
nprev = 0
log = []
for irq, nmi, ins in steps:
if nmi == 1:
stack += [pc, i]
i = 1
pc = 0x9000
ev = 'nmi'
elif irq == 1 and i == 0:
stack += [pc, i]
i = 1
pc = 0x8000
ev = 'irq'
elif ins == 'rti' and stack:
i = stack.pop()
pc = stack.pop()
ev = 'rti'
else:
if ins == 'cli': i = 0
elif ins == 'sei': i = 1
pc += 1
ev = ins
nprev = nmi
log.append([ev, pc, i])
return log
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [769, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [770, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 770, 0], ['rti', 771, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [771, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 771, 0], ['rti', 772, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [772, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 772, 0], ['rti', 773, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0], ['nop', 263, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [773, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 773, 0], ['rti', 774, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0], ['nop', 1285, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['nop', 36870, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| masked irq waits for cli | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | Passed |
| nmi is edge triggered | [['nmi', 36864, 1], ['nmi', 36864, 1], ['nmi', 36864, 1], ['nop', 36865, 1], ['nmi', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]] | Failed |
| nmi wins over irq | [['nmi', 36864, 1], ['nmi', 36864, 1], ['nmi', 36864, 1], ['rti', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]] | Failed |
| irq handler masks nested irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | Passed |
| nmi nested inside irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['nmi', 36864, 1], ['rti', 36864, 1], ['nop', 36865, 1]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]] | Failed |
| nmi held across entry | [['nmi', 36864, 1], ['nmi', 36864, 1], ['nmi', 36864, 1], ['rti', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]] | Failed |
| sei then irq | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | Passed |
SHA-256 / d5bd180958029963b397222f63b23cc192201df44825c5b532f20e1acef309d1
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
pc, i, steps = args
stack = []
nprev = 0
log = []
for irq, nmi, ins in steps:
if nprev != nmi:
stack += [pc, i]
i = 1
pc = 0x9000
ev = 'nmi'
elif irq == 1 and i == 0:
stack += [pc, i]
i = 1
pc = 0x8000
ev = 'irq'
elif ins == 'rti' and stack:
i = stack.pop()
pc = stack.pop()
ev = 'rti'
else:
if ins == 'cli': i = 0
elif ins == 'sei': i = 1
pc += 1
ev = ins
nprev = nmi
log.append([ev, pc, i])
return log
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [769, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [770, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 770, 0], ['rti', 771, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [771, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 771, 0], ['rti', 772, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [772, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 772, 0], ['rti', 773, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0], ['nop', 263, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [773, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 773, 0], ['rti', 774, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0], ['nop', 1285, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['nop', 36870, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| masked irq waits for cli | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | Passed |
| nmi is edge triggered | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nmi', 36864, 1], ['nmi', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]] | Failed |
| nmi wins over irq | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['nmi', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]] | Failed |
| irq handler masks nested irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | Passed |
| nmi nested inside irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['nmi', 36864, 1], ['nop', 36865, 1]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]] | Failed |
| nmi held across entry | [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nmi', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]] | Failed |
| sei then irq | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | Passed |
SHA-256 / 493b8224c60eb5e1948591686ccd88e7052b15acb10e63eac617ffd3580d75ae
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
pc, i, steps = args
stack = []
nprev = 0
log = []
for irq, nmi, ins in steps:
if nprev == 0 and nmi == 1:
stack += [pc, i]
i = 1
pc = 0x9000
ev = 'nmi'
elif irq == 1 and i == 0:
stack += [pc, i]
i = 1
pc = 0x8000
ev = 'irq'
elif ins == 'rti' and stack:
i = stack.pop()
pc = stack.pop()
ev = 'rti'
else:
if ins == 'cli': i = 0
elif ins == 'sei': i = 1
pc += 1
ev = ins
nprev = nmi
log.append([ev, pc, i])
return log
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [769, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [770, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 770, 0], ['rti', 771, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [771, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 771, 0], ['rti', 772, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [772, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 772, 0], ['rti', 773, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])], [('masked irq waits for cli', [256, 1, [[1, 0, 'nop'], [1, 0, 'cli'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0], ['nop', 260, 0], ['nop', 261, 0], ['nop', 262, 0], ['nop', 263, 0]]), ('nmi is edge triggered', [512, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'nop'], [0, 1, 'nop']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]]), ('nmi wins over irq', [773, 0, [[1, 1, 'nop'], [1, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 773, 0], ['rti', 774, 0]]), ('irq handler masks nested irq', [1024, 0, [[1, 0, 'nop'], [1, 0, 'nop'], [1, 0, 'nop'], [0, 0, 'rti'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]), ('nmi nested inside irq', [1280, 0, [[1, 0, 'nop'], [0, 0, 'nop'], [0, 1, 'nop'], [0, 1, 'rti'], [0, 0, 'rti'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop'], [0, 0, 'nop']]], [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0], ['nop', 1282, 0], ['nop', 1283, 0], ['nop', 1284, 0], ['nop', 1285, 0]]), ('nmi held across entry', [1536, 1, [[0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 1, 'nop'], [0, 0, 'rti']]], [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['nop', 36867, 1], ['nop', 36868, 1], ['nop', 36869, 1], ['nop', 36870, 1], ['rti', 1536, 1]]), ('sei then irq', [1792, 0, [[0, 0, 'sei'], [1, 0, 'nop'], [0, 0, 'cli'], [1, 0, 'nop']]], [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| masked irq waits for cli | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | [['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]] | Passed |
| nmi is edge triggered | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 512, 1], ['nop', 513, 1], ['nmi', 36864, 1]] | Passed |
| nmi wins over irq | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]] | Passed |
| irq handler masks nested irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]] | Passed |
| nmi nested inside irq | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]] | [['irq', 32768, 1], ['nop', 32769, 1], ['nmi', 36864, 1], ['rti', 32769, 1], ['rti', 1280, 0], ['nop', 1281, 0]] | Passed |
| nmi held across entry | [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]] | [['nmi', 36864, 1], ['nop', 36865, 1], ['nop', 36866, 1], ['rti', 1536, 1]] | Passed |
| sei then irq | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | [['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]] | Passed |
SHA-256 / 1c63fbf08b3079cca219c8a221e3b6cdbb348c954b4258b62c21afa1c9460be5
Verification & scope
A deterministic bounded teaching model of one emulator rule; the instruction semantics are a stipulated contract inspired by common ISAs and are not a claim of cycle-exact or architectural conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:18.663595+00:00.
Case digest / f9c409ab863cb84f9d90417ed5c190a10a98723eb0498fd2348d7ae2a732fb80