{
  "schemaVersion": 1,
  "romSha256": "46160baa06362c711c9f1a5017cb7371026444936c8af5e93a78996cf32ff2a6",
  "wasmSha256": "cfec0e5915c4b3d03336482e990a7809f16b37909992f94631c2cad8e92b5aae",
  "cheats": {
    "invincibility": {
      "label": "Invincibility",
      "code": "01AFF4:4E75",
      "address": 110580,
      "original": 19000,
      "replacement": 20085,
      "meaning": "Return from HurtSonic before damage, ring loss or knockback."
    },
    "rings": {
      "label": "Keep rings when hit",
      "code": "01B002:6018",
      "address": 110594,
      "original": 20153,
      "replacement": 24600,
      "meaning": "Skip creating the lost-ring object; retain normal hurt animation, knockback and zero-ring death."
    },
    "lives": {
      "label": "Unlimited lives",
      "code": "0138A0:4A38",
      "address": 80032,
      "original": 21304,
      "replacement": 19000,
      "meaning": "Test the existing life count in place of decrementing it, retaining the normal death/restart flow."
    }
  },
  "tests": {
    "normal": {
      "enabled": {},
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 191,
          "mode": 12,
          "x": 765,
          "y": 940,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        }
      ],
      "after": {
        "mode": 12,
        "x": 729,
        "y": 896,
        "routine": 4,
        "rings": 0,
        "lives": 3,
        "flash": 120
      }
    },
    "invincibility": {
      "enabled": {
        "invincibility": true
      },
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        }
      ],
      "after": {
        "mode": 12,
        "x": 871,
        "y": 931,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      }
    },
    "invincibilityZeroRings": {
      "enabled": {
        "invincibility": true
      },
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 0,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 0,
          "lives": 3,
          "flash": 0
        }
      ],
      "after": {
        "mode": 12,
        "x": 871,
        "y": 931,
        "routine": 2,
        "rings": 0,
        "lives": 3,
        "flash": 0
      }
    },
    "rings": {
      "enabled": {
        "rings": true
      },
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 191,
          "mode": 12,
          "x": 765,
          "y": 940,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        }
      ],
      "after": {
        "mode": 12,
        "x": 729,
        "y": 896,
        "routine": 4,
        "rings": 20,
        "lives": 3,
        "flash": 120
      }
    },
    "ringsZeroRings": {
      "enabled": {
        "rings": true
      },
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 0,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 0,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 191,
          "mode": 12,
          "x": 765,
          "y": 940,
          "routine": 6,
          "rings": 0,
          "lives": 3,
          "flash": 0
        }
      ],
      "after": {
        "mode": 12,
        "x": 765,
        "y": 847,
        "routine": 6,
        "rings": 0,
        "lives": 3,
        "flash": 0
      }
    },
    "all": {
      "enabled": {
        "invincibility": true,
        "rings": true,
        "lives": true
      },
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        }
      ],
      "after": {
        "mode": 12,
        "x": 871,
        "y": 931,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      }
    },
    "restoredOriginal": {
      "enabled": {},
      "before": {
        "mode": 12,
        "x": 80,
        "y": 944,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 944,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 191,
          "mode": 12,
          "x": 765,
          "y": 940,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        }
      ],
      "after": {
        "mode": 12,
        "x": 729,
        "y": 896,
        "routine": 4,
        "rings": 0,
        "lives": 3,
        "flash": 120
      }
    },
    "normalSpikes": {
      "before": {
        "mode": 12,
        "x": 80,
        "y": 930,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 931,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 1,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 2,
          "mode": 12,
          "x": 82,
          "y": 924,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 3,
          "mode": 12,
          "x": 84,
          "y": 920,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 4,
          "mode": 12,
          "x": 86,
          "y": 916,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 5,
          "mode": 12,
          "x": 88,
          "y": 913,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 6,
          "mode": 12,
          "x": 90,
          "y": 910,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 7,
          "mode": 12,
          "x": 92,
          "y": 907,
          "routine": 4,
          "rings": 0,
          "lives": 3,
          "flash": 120
        }
      ],
      "after": {
        "mode": 12,
        "x": 92,
        "y": 907,
        "routine": 4,
        "rings": 0,
        "lives": 3,
        "flash": 120
      }
    },
    "invincibleSpikes": {
      "before": {
        "mode": 12,
        "x": 80,
        "y": 930,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 931,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 1,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 2,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 3,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 4,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 5,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 6,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 7,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        }
      ],
      "after": {
        "mode": 12,
        "x": 80,
        "y": 928,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      }
    },
    "keepRingsSpikes": {
      "before": {
        "mode": 12,
        "x": 80,
        "y": 930,
        "routine": 2,
        "rings": 20,
        "lives": 3,
        "flash": 0
      },
      "trace": [
        {
          "frame": 0,
          "mode": 12,
          "x": 80,
          "y": 931,
          "routine": 2,
          "rings": 20,
          "lives": 3,
          "flash": 0
        },
        {
          "frame": 1,
          "mode": 12,
          "x": 80,
          "y": 928,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 2,
          "mode": 12,
          "x": 82,
          "y": 924,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 3,
          "mode": 12,
          "x": 84,
          "y": 920,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 4,
          "mode": 12,
          "x": 86,
          "y": 916,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 5,
          "mode": 12,
          "x": 88,
          "y": 913,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 6,
          "mode": 12,
          "x": 90,
          "y": 910,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        },
        {
          "frame": 7,
          "mode": 12,
          "x": 92,
          "y": 907,
          "routine": 4,
          "rings": 20,
          "lives": 3,
          "flash": 120
        }
      ],
      "after": {
        "mode": 12,
        "x": 92,
        "y": 907,
        "routine": 4,
        "rings": 20,
        "lives": 3,
        "flash": 120
      }
    },
    "normalDeath": {
      "before": {
        "mode": 12,
        "x": 80,
        "y": 4096,
        "routine": 6,
        "rings": 0,
        "lives": 3,
        "flash": 0
      },
      "after": {
        "mode": 12,
        "x": 80,
        "y": 4095,
        "routine": 8,
        "rings": 0,
        "lives": 2,
        "flash": 0
      }
    },
    "unlimitedLives": {
      "before": {
        "mode": 12,
        "x": 80,
        "y": 4096,
        "routine": 6,
        "rings": 0,
        "lives": 3,
        "flash": 0
      },
      "after": {
        "mode": 12,
        "x": 80,
        "y": 4095,
        "routine": 8,
        "rings": 0,
        "lives": 3,
        "flash": 0
      }
    }
  },
  "instructionToggleWitness": [
    {
      "enabled": {
        "invincibility": true,
        "rings": true,
        "lives": true
      },
      "opcodes": {
        "invincibility": 20085,
        "rings": 24600,
        "lives": 19000
      }
    },
    {
      "enabled": {
        "rings": true
      },
      "opcodes": {
        "invincibility": 19000,
        "rings": 24600,
        "lives": 21304
      }
    },
    {
      "enabled": {
        "lives": true
      },
      "opcodes": {
        "invincibility": 19000,
        "rings": 20153,
        "lives": 19000
      }
    },
    {
      "enabled": {
        "invincibility": true
      },
      "opcodes": {
        "invincibility": 20085,
        "rings": 20153,
        "lives": 21304
      }
    },
    {
      "enabled": {},
      "opcodes": {
        "invincibility": 19000,
        "rings": 20153,
        "lives": 21304
      }
    }
  ],
  "snapshot": {
    "bytes": 1036312,
    "nativeLoadExact": true,
    "portableRoundTrip": true,
    "wrongGameRejected": true,
    "damagedRejected": true,
    "currentCheatSelectionSurvivesRestore": true
  },
  "fileRomUnchanged": true,
  "scope": "Actual retained Genesis WASM and supplied canonical REV00 cartridge. Private deterministic main-loop instrumentation; ordinary Start/right inputs collide with the first Green Hill enemy. Ring counts, an authentic spike-object placement and death position are explicit private test fixtures loaded through the native serializer. No public ROM patches or research states.",
  "primarySource": {
    "url": "https://github.com/sonicretro/s1disasm",
    "commit": "89c0e0e06b51fd9ebac44d988e4a89bd643fd031",
    "revisionSetting": 0,
    "buildMatchesRomExactly": true,
    "listing": {
      "HurtSonic": "0x1AFF4",
      "bounceSonicAway": "0x1B01C",
      "decrementLives": "0x138A0"
    }
  },
  "limitations": [
    "Invincibility bypasses HurtSonic damage, ring loss and knockback. Direct death routines for pits, drowning, crushing or timeout are unchanged. Solid level collision and collectible hitboxes remain.",
    "Keep-rings assist retains native hurt behavior and cannot prevent death from an ordinary hit at zero rings. It creates no duplicate dropped rings.",
    "Tests cover the first Green Hill enemy, a native spike object in a controlled placement and controlled death/snapshot fixtures, not a complete campaign or physical wireless controller. Browser rendering/audio proof is separate."
  ]
}
