FAILURE MAP
← Case archive

FA-89576 / Instruction set emulation / Open access

IRQ ignores the interrupt disable flag · case 01

An IRQ is taken while I is set.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The IRQ acceptance test omits the I flag.

VERIFIED REPAIR

Accept IRQ only when I is clear.

Unsuccessful approach: Masking by handler nesting depth instead of I lets IRQs through after sei.

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 nprev == 0 and nmi == 1:
            stack += [pc, i]
            i = 1
            pc = 0x9000
            ev = 'nmi'
        elif irq == 1:
            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 fixtureActualExpectedOutcome
masked irq waits for cli[['irq', 32768, 1], ['irq', 32768, 1], ['irq', 32768, 1], ['rti', 32768, 1], ['nop', 32769, 1]][['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]]Failed
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], ['irq', 32768, 1], ['rti', 36864, 1], ['rti', 769, 0]][['nmi', 36864, 1], ['nop', 36865, 1], ['rti', 769, 0], ['rti', 770, 0]]Failed
irq handler masks nested irq[['irq', 32768, 1], ['irq', 32768, 1], ['irq', 32768, 1], ['rti', 32768, 1], ['nop', 32769, 1]][['irq', 32768, 1], ['nop', 32769, 1], ['nop', 32770, 1], ['rti', 1024, 0], ['nop', 1025, 0]]Failed
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], ['irq', 32768, 1], ['cli', 32769, 0], ['irq', 32768, 1]][['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]]Failed

SHA-256 / be034faf7fe6a78a4225069cd6b0b4dadbf05af5fabbf2f97587bc0800e0f6d7

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 == 0 and nmi == 1:
            stack += [pc, i]
            i = 1
            pc = 0x9000
            ev = 'nmi'
        elif irq == 1 and not stack:
            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 fixtureActualExpectedOutcome
masked irq waits for cli[['irq', 32768, 1], ['cli', 32769, 0], ['nop', 32770, 0], ['rti', 256, 1], ['nop', 257, 1]][['nop', 257, 1], ['cli', 258, 0], ['irq', 32768, 1], ['rti', 258, 0], ['nop', 259, 0]]Failed
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], ['irq', 32768, 1], ['cli', 32769, 0], ['nop', 32770, 0]][['sei', 1793, 1], ['nop', 1794, 1], ['cli', 1795, 0], ['irq', 32768, 1]]Failed

SHA-256 / d3752445eb3216f1547c3ab53faad028d5b44c5b14d4b6da1f223051bf0c6e8a

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 fixtureActualExpectedOutcome
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.666482+00:00.

Case digest / babcad6eb6c4a6711b7ffb108da1ec907be8f7324b54a1f58a4b01526b033396