{"abstract":"Returning from a subroutine skips the first byte of the following instruction.","category":"Instruction set emulation","checks":7,"contract":"Input [pc, sp, ops] for an 8-bit stack pointer addressing page 0x100. push stores at 0x100+sp then decrements sp (wrapping in 8 bits); pull increments sp (wrapping) then reads (unwritten bytes read 0). jsr t (3 bytes at pc) pushes (pc+2) high byte then low byte and jumps; rts pulls low then high and resumes at that address + 1 (16-bit wrap). pha v pushes v, pla pulls; both and nop advance pc by 1. Return [[pc, sp, pulled value or None] per op, sorted [address, byte] of written stack memory].","evaluation_group":"w2-instruction-set-emulation-hw-stack","failed_approach":"Pushing pc+1 returns into the middle of the call instruction.","family":"w2-instruction-set-emulation-hw-stack-pushed-return-address","id":"FA-89396","implementations":{"attempt":{"sha256":"f976a5e077dee60fdda77e1b14969ce92edc3235fa58472ccdef8668d3599adb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    pc, sp, ops = args\n    mem = {}\n    trace = []\n    def push(v):\n        nonlocal sp\n        mem[0x100 + sp] = v & 0xFF\n        sp = (sp - 1) & 0xFF\n    def pull():\n        nonlocal sp\n        sp = (sp + 1) & 0xFF\n        return mem.get(0x100 + sp, 0)\n    for op in ops:\n        got = None\n        if op[0] == 'jsr':\n            ret = (pc + 1) & 0xFFFF\n            push(ret >> 8)\n            push(ret)\n            pc = op[1]\n        elif op[0] == 'rts':\n            lo = pull()\n            hi = pull()\n            pc = ((hi << 8 | lo) + 1) & 0xFFFF\n        elif op[0] == 'pha':\n            push(op[1])\n            pc += 1\n        elif op[0] == 'pla':\n            got = pull()\n            pc += 1\n        else:\n            pc += 1\n        trace.append([pc, sp, got])\n    return [trace, [[k, mem[k]] for k in sorted(mem)]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 18], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 86], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2289, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2292, 255, None]], [[508, 2], [509, 9], [510, 243], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 129, [['jsr', 4660], ['rts']]], [[[4660, 127, None], [0, 129, None]], [[384, 255], [385, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 19], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 19]], [[510, 34], [511, 19]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 87], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 87]], [[256, 68], [257, 51], [511, 87]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2290, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2293, 255, None]], [[508, 2], [509, 9], [510, 244], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 130, [['jsr', 4660], ['rts']]], [[[4660, 128, None], [0, 130, None]], [[385, 255], [386, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 20], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 20]], [[510, 34], [511, 20]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 88], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 88]], [[256, 68], [257, 51], [511, 88]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2291, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2294, 255, None]], [[508, 2], [509, 9], [510, 245], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 131, [['jsr', 4660], ['rts']]], [[[4660, 129, None], [0, 131, None]], [[386, 255], [387, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 21], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 21]], [[510, 34], [511, 21]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 89], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 89]], [[256, 68], [257, 51], [511, 89]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2292, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2295, 255, None]], [[508, 2], [509, 9], [510, 246], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 132, [['jsr', 4660], ['rts']]], [[[4660, 130, None], [0, 132, None]], [[387, 255], [388, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 22], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 22]], [[510, 34], [511, 22]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 90], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 90]], [[256, 68], [257, 51], [511, 90]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2293, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2296, 255, None]], [[508, 2], [509, 9], [510, 247], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 133, [['jsr', 4660], ['rts']]], [[[4660, 131, None], [0, 133, None]], [[388, 255], [389, 255]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"cb1656169ed556cae64699bec10e9c476c531cfdcb263273b47c09a1b7d428f8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    pc, sp, ops = args\n    mem = {}\n    trace = []\n    def push(v):\n        nonlocal sp\n        mem[0x100 + sp] = v & 0xFF\n        sp = (sp - 1) & 0xFF\n    def pull():\n        nonlocal sp\n        sp = (sp + 1) & 0xFF\n        return mem.get(0x100 + sp, 0)\n    for op in ops:\n        got = None\n        if op[0] == 'jsr':\n            ret = (pc + 3) & 0xFFFF\n            push(ret >> 8)\n            push(ret)\n            pc = op[1]\n        elif op[0] == 'rts':\n            lo = pull()\n            hi = pull()\n            pc = ((hi << 8 | lo) + 1) & 0xFFFF\n        elif op[0] == 'pha':\n            push(op[1])\n            pc += 1\n        elif op[0] == 'pla':\n            got = pull()\n            pc += 1\n        else:\n            pc += 1\n        trace.append([pc, sp, got])\n    return [trace, [[k, mem[k]] for k in sorted(mem)]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 18], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 86], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2289, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2292, 255, None]], [[508, 2], [509, 9], [510, 243], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 129, [['jsr', 4660], ['rts']]], [[[4660, 127, None], [0, 129, None]], [[384, 255], [385, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 19], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 19]], [[510, 34], [511, 19]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 87], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 87]], [[256, 68], [257, 51], [511, 87]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2290, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2293, 255, None]], [[508, 2], [509, 9], [510, 244], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 130, [['jsr', 4660], ['rts']]], [[[4660, 128, None], [0, 130, None]], [[385, 255], [386, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 20], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 20]], [[510, 34], [511, 20]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 88], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 88]], [[256, 68], [257, 51], [511, 88]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2291, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2294, 255, None]], [[508, 2], [509, 9], [510, 245], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 131, [['jsr', 4660], ['rts']]], [[[4660, 129, None], [0, 131, None]], [[386, 255], [387, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 21], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 21]], [[510, 34], [511, 21]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 89], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 89]], [[256, 68], [257, 51], [511, 89]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2292, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2295, 255, None]], [[508, 2], [509, 9], [510, 246], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 132, [['jsr', 4660], ['rts']]], [[[4660, 130, None], [0, 132, None]], [[387, 255], [388, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 22], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 22]], [[510, 34], [511, 22]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 90], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 90]], [[256, 68], [257, 51], [511, 90]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2293, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2296, 255, None]], [[508, 2], [509, 9], [510, 247], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 133, [['jsr', 4660], ['rts']]], [[[4660, 131, None], [0, 133, None]], [[388, 255], [389, 255]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"e0b46f79f177f7411586b3f1799cbeb36c75e28fc35f0841f0668f6f994b36a4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(*args):\n    pc, sp, ops = args\n    mem = {}\n    trace = []\n    def push(v):\n        nonlocal sp\n        mem[0x100 + sp] = v & 0xFF\n        sp = (sp - 1) & 0xFF\n    def pull():\n        nonlocal sp\n        sp = (sp + 1) & 0xFF\n        return mem.get(0x100 + sp, 0)\n    for op in ops:\n        got = None\n        if op[0] == 'jsr':\n            ret = (pc + 2) & 0xFFFF\n            push(ret >> 8)\n            push(ret)\n            pc = op[1]\n        elif op[0] == 'rts':\n            lo = pull()\n            hi = pull()\n            pc = ((hi << 8 | lo) + 1) & 0xFFFF\n        elif op[0] == 'pha':\n            push(op[1])\n            pc += 1\n        elif op[0] == 'pla':\n            got = pull()\n            pc += 1\n        else:\n            pc += 1\n        trace.append([pc, sp, got])\n    return [trace, [[k, mem[k]] for k in sorted(mem)]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 18], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 86], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2289, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2292, 255, None]], [[508, 2], [509, 9], [510, 243], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 129, [['jsr', 4660], ['rts']]], [[[4660, 127, None], [0, 129, None]], [[384, 255], [385, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 19], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 19]], [[510, 34], [511, 19]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 87], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 87]], [[256, 68], [257, 51], [511, 87]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2290, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2293, 255, None]], [[508, 2], [509, 9], [510, 244], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 130, [['jsr', 4660], ['rts']]], [[[4660, 128, None], [0, 130, None]], [[385, 255], [386, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 20], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 20]], [[510, 34], [511, 20]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 88], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 88]], [[256, 68], [257, 51], [511, 88]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2291, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2294, 255, None]], [[508, 2], [509, 9], [510, 245], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 131, [['jsr', 4660], ['rts']]], [[[4660, 129, None], [0, 131, None]], [[386, 255], [387, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 21], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 21]], [[510, 34], [511, 21]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 89], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 89]], [[256, 68], [257, 51], [511, 89]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2292, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2295, 255, None]], [[508, 2], [509, 9], [510, 246], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 132, [['jsr', 4660], ['rts']]], [[[4660, 130, None], [0, 132, None]], [[387, 255], [388, 255]]])], [('call and return', [1536, 253, [['jsr', 1792], ['nop'], ['rts']]], [[[1792, 251, None], [1793, 251, None], [1539, 253, None]], [[508, 2], [509, 6]]]), ('push and pull', [512, 255, [['pha', 22], ['pha', 34], ['pla'], ['pla']]], [[[513, 254, None], [514, 253, None], [515, 254, 34], [516, 255, 22]], [[510, 34], [511, 22]]]), ('stack pointer wraps below page start', [768, 1, [['pha', 51], ['pha', 68], ['pha', 90], ['pla']]], [[[769, 0, None], [770, 255, None], [771, 254, None], [772, 255, 90]], [[256, 68], [257, 51], [511, 90]]]), ('pull wraps above page end', [1024, 254, [['pla'], ['pla'], ['pla']]], [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []]), ('nested calls', [2293, 255, [['jsr', 2304], ['jsr', 2560], ['rts'], ['rts']]], [[[2304, 253, None], [2560, 251, None], [2307, 253, None], [2296, 255, None]], [[508, 2], [509, 9], [510, 247], [511, 8]]]), ('return address carries into high byte', [4350, 240, [['jsr', 8192], ['rts']]], [[[8192, 238, None], [4353, 240, None]], [[495, 0], [496, 17]]]), ('return from top of memory', [65533, 133, [['jsr', 4660], ['rts']]], [[[4660, 131, None], [0, 133, None]], [[388, 255], [389, 255]]])]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-instruction-set-emulation-hw-stack-pushed-return-address","generated_at":"2026-09-29T14:51:16.872006+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Emulated call/return must reproduce the exact stack image because programs inspect and manipulate return addresses on the stack.","repair":"Push the address of the last byte of the call (pc+2).","root_cause":"jsr pushes pc+3 although rts adds one to the pulled address.","sha256":"4b6d7c663210e40d85ab7a2cac50e39e75d524abcd447156e5dea27d0645ca37","title":"Call pushes the true next-instruction address · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.501,"exit_code":1,"observations":[{"actual":[[[1792,251,null],[1793,251,null],[1538,253,null]],[[508,1],[509,6]]],"check":"call and return","expected":[[[1792,251,null],[1793,251,null],[1539,253,null]],[[508,2],[509,6]]],"passed":false},{"actual":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"check":"push and pull","expected":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"passed":true},{"actual":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"check":"stack pointer wraps below page start","expected":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"passed":true},{"actual":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"check":"pull wraps above page end","expected":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"passed":true},{"actual":[[[2304,253,null],[2560,251,null],[2306,253,null],[2291,255,null]],[[508,1],[509,9],[510,242],[511,8]]],"check":"nested calls","expected":[[[2304,253,null],[2560,251,null],[2307,253,null],[2292,255,null]],[[508,2],[509,9],[510,243],[511,8]]],"passed":false},{"actual":[[[8192,238,null],[4352,240,null]],[[495,255],[496,16]]],"check":"return address carries into high byte","expected":[[[8192,238,null],[4353,240,null]],[[495,0],[496,17]]],"passed":false},{"actual":[[[4660,127,null],[65535,129,null]],[[384,254],[385,255]]],"check":"return from top of memory","expected":[[[4660,127,null],[0,129,null]],[[384,255],[385,255]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"call and return\", \"actual\": [[[1792, 251, null], [1793, 251, null], [1538, 253, null]], [[508, 1], [509, 6]]], \"expected\": [[[1792, 251, null], [1793, 251, null], [1539, 253, null]], [[508, 2], [509, 6]]], \"passed\": false}, {\"check\": \"push and pull\", \"actual\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"expected\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"passed\": true}, {\"check\": \"stack pointer wraps below page start\", \"actual\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"expected\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"passed\": true}, {\"check\": \"pull wraps above page end\", \"actual\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"expected\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"passed\": true}, {\"check\": \"nested calls\", \"actual\": [[[2304, 253, null], [2560, 251, null], [2306, 253, null], [2291, 255, null]], [[508, 1], [509, 9], [510, 242], [511, 8]]], \"expected\": [[[2304, 253, null], [2560, 251, null], [2307, 253, null], [2292, 255, null]], [[508, 2], [509, 9], [510, 243], [511, 8]]], \"passed\": false}, {\"check\": \"return address carries into high byte\", \"actual\": [[[8192, 238, null], [4352, 240, null]], [[495, 255], [496, 16]]], \"expected\": [[[8192, 238, null], [4353, 240, null]], [[495, 0], [496, 17]]], \"passed\": false}, {\"check\": \"return from top of memory\", \"actual\": [[[4660, 127, null], [65535, 129, null]], [[384, 254], [385, 255]]], \"expected\": [[[4660, 127, null], [0, 129, null]], [[384, 255], [385, 255]]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.603,"exit_code":1,"observations":[{"actual":[[[1792,251,null],[1793,251,null],[1540,253,null]],[[508,3],[509,6]]],"check":"call and return","expected":[[[1792,251,null],[1793,251,null],[1539,253,null]],[[508,2],[509,6]]],"passed":false},{"actual":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"check":"push and pull","expected":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"passed":true},{"actual":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"check":"stack pointer wraps below page start","expected":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"passed":true},{"actual":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"check":"pull wraps above page end","expected":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"passed":true},{"actual":[[[2304,253,null],[2560,251,null],[2308,253,null],[2293,255,null]],[[508,3],[509,9],[510,244],[511,8]]],"check":"nested calls","expected":[[[2304,253,null],[2560,251,null],[2307,253,null],[2292,255,null]],[[508,2],[509,9],[510,243],[511,8]]],"passed":false},{"actual":[[[8192,238,null],[4354,240,null]],[[495,1],[496,17]]],"check":"return address carries into high byte","expected":[[[8192,238,null],[4353,240,null]],[[495,0],[496,17]]],"passed":false},{"actual":[[[4660,127,null],[1,129,null]],[[384,0],[385,0]]],"check":"return from top of memory","expected":[[[4660,127,null],[0,129,null]],[[384,255],[385,255]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"call and return\", \"actual\": [[[1792, 251, null], [1793, 251, null], [1540, 253, null]], [[508, 3], [509, 6]]], \"expected\": [[[1792, 251, null], [1793, 251, null], [1539, 253, null]], [[508, 2], [509, 6]]], \"passed\": false}, {\"check\": \"push and pull\", \"actual\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"expected\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"passed\": true}, {\"check\": \"stack pointer wraps below page start\", \"actual\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"expected\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"passed\": true}, {\"check\": \"pull wraps above page end\", \"actual\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"expected\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"passed\": true}, {\"check\": \"nested calls\", \"actual\": [[[2304, 253, null], [2560, 251, null], [2308, 253, null], [2293, 255, null]], [[508, 3], [509, 9], [510, 244], [511, 8]]], \"expected\": [[[2304, 253, null], [2560, 251, null], [2307, 253, null], [2292, 255, null]], [[508, 2], [509, 9], [510, 243], [511, 8]]], \"passed\": false}, {\"check\": \"return address carries into high byte\", \"actual\": [[[8192, 238, null], [4354, 240, null]], [[495, 1], [496, 17]]], \"expected\": [[[8192, 238, null], [4353, 240, null]], [[495, 0], [496, 17]]], \"passed\": false}, {\"check\": \"return from top of memory\", \"actual\": [[[4660, 127, null], [1, 129, null]], [[384, 0], [385, 0]]], \"expected\": [[[4660, 127, null], [0, 129, null]], [[384, 255], [385, 255]]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.063,"exit_code":0,"observations":[{"actual":[[[1792,251,null],[1793,251,null],[1539,253,null]],[[508,2],[509,6]]],"check":"call and return","expected":[[[1792,251,null],[1793,251,null],[1539,253,null]],[[508,2],[509,6]]],"passed":true},{"actual":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"check":"push and pull","expected":[[[513,254,null],[514,253,null],[515,254,34],[516,255,18]],[[510,34],[511,18]]],"passed":true},{"actual":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"check":"stack pointer wraps below page start","expected":[[[769,0,null],[770,255,null],[771,254,null],[772,255,86]],[[256,68],[257,51],[511,86]]],"passed":true},{"actual":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"check":"pull wraps above page end","expected":[[[1025,255,0],[1026,0,0],[1027,1,0]],[]],"passed":true},{"actual":[[[2304,253,null],[2560,251,null],[2307,253,null],[2292,255,null]],[[508,2],[509,9],[510,243],[511,8]]],"check":"nested calls","expected":[[[2304,253,null],[2560,251,null],[2307,253,null],[2292,255,null]],[[508,2],[509,9],[510,243],[511,8]]],"passed":true},{"actual":[[[8192,238,null],[4353,240,null]],[[495,0],[496,17]]],"check":"return address carries into high byte","expected":[[[8192,238,null],[4353,240,null]],[[495,0],[496,17]]],"passed":true},{"actual":[[[4660,127,null],[0,129,null]],[[384,255],[385,255]]],"check":"return from top of memory","expected":[[[4660,127,null],[0,129,null]],[[384,255],[385,255]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"call and return\", \"actual\": [[[1792, 251, null], [1793, 251, null], [1539, 253, null]], [[508, 2], [509, 6]]], \"expected\": [[[1792, 251, null], [1793, 251, null], [1539, 253, null]], [[508, 2], [509, 6]]], \"passed\": true}, {\"check\": \"push and pull\", \"actual\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"expected\": [[[513, 254, null], [514, 253, null], [515, 254, 34], [516, 255, 18]], [[510, 34], [511, 18]]], \"passed\": true}, {\"check\": \"stack pointer wraps below page start\", \"actual\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"expected\": [[[769, 0, null], [770, 255, null], [771, 254, null], [772, 255, 86]], [[256, 68], [257, 51], [511, 86]]], \"passed\": true}, {\"check\": \"pull wraps above page end\", \"actual\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"expected\": [[[1025, 255, 0], [1026, 0, 0], [1027, 1, 0]], []], \"passed\": true}, {\"check\": \"nested calls\", \"actual\": [[[2304, 253, null], [2560, 251, null], [2307, 253, null], [2292, 255, null]], [[508, 2], [509, 9], [510, 243], [511, 8]]], \"expected\": [[[2304, 253, null], [2560, 251, null], [2307, 253, null], [2292, 255, null]], [[508, 2], [509, 9], [510, 243], [511, 8]]], \"passed\": true}, {\"check\": \"return address carries into high byte\", \"actual\": [[[8192, 238, null], [4353, 240, null]], [[495, 0], [496, 17]]], \"expected\": [[[8192, 238, null], [4353, 240, null]], [[495, 0], [496, 17]]], \"passed\": true}, {\"check\": \"return from top of memory\", \"actual\": [[[4660, 127, null], [0, 129, null]], [[384, 255], [385, 255]]], \"expected\": [[[4660, 127, null], [0, 129, null]], [[384, 255], [385, 255]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}