--- title: "Corrected Spectrum ROM" id: 50504 type: "computer_media" slug: "2068-spectrum" url: "http://localhost/computer_media/2068-spectrum/" markdown_url: "http://localhost/computer_media/2068-spectrum.md" published_at: "2023-06-18T15:23:03+00:00" modified_at: "2026-03-31T14:59:46+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "Fixes a documented bug in the original Spectrum ROM, making the NMI reset mechanism actually work." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "Emulation" slug: "emulation" taxonomy: "genre" url: "http://localhost/type/emulation/" - name: "ROM" slug: "rom" taxonomy: "genre" url: "http://localhost/type/rom/" media_type: "ROM" download_url: "https://archive.org/download/timex-sinclair-software-archive/2068%20Spectrum.zip" related_products: - id: 50656 title: "2068 Spectrum ROM" type: "product" url: "http://localhost/product/2068-spectrum/" media_type_tags: "Emulation, ROM" --- This ROM corrects a well-known bug in the Spectrum’s NMI handler — one so notorious that the ROM disassembly flags it with an inline comment: “Note: This should have been ‘JR Z’!” The NMI routine (at `0066h`) is designed to allow a controlled system reset: if the system variable `NMIADD` holds a non-zero value when the NMI line fires, the CPU is supposed to jump to that address and reset. But in the original Spectrum ROM, a single wrong opcode — `JR NZ` (`20h`) instead of `JR Z` (`28h`) at `006Dh` — inverts the logic entirely, making the reset trigger when it shouldn’t and suppressing it when it should fire. The mechanism is effectively dead in every unmodified Spectrum. This ROM replaces `20h` with `28h`, applying the canonical one-byte correction. With `JR Z` in place, the routine behaves as intended: `NMIADD = 0000h` safely bypasses the reset, while any non-zero value causes the jump — giving NMI-capable hardware a working reset hook for the first time.