Skip to content
Lesson 9 of 13

Step 1 of 5 · Reading · ~2 min

Read

Display & Input

FX0A: Blocking Key Wait

CHIP-8 has one blocking opcode: FX0A — Wait for a key press, store the key in VX.

FX0A: pause CPU
      wait until any key in [0..F] is pressed
      V[X] = key index
      advance PC

It is THE opcode that separates a "running" CPU loop from one that knows about events. Get it wrong and either games hang forever or they skip past the title screen instantly.

The wrong way: busy-loop in your interpreter

python

If your host thread sits in this loop, timers don't tick and the 60 Hz music silently degrades to "the last note, forever."

The right way: a "waiting" flag on the CPU

python

Now your outer loop runs unchanged:

python

Music plays. Display redraws. The title screen waits patiently.

The quirk: press vs release

Some interpretations require the key to be released before FX0A returns — the rationale being that a single keystroke shouldn't trigger 200 CPU steps during the press. Octo's docs note this; Timendus' test ROM probes for it.

Most modern emulators trigger on press for snappier feel. Production code exposes both as a toggle.

In one paragraph

FX0A is just an opcode that doesn't advance PC until a key arrives. Model it as a one-bit flag on the CPU and your dispatch loop stays trivial. The whole fix is six lines.

Up nextPutting It TogetherProduction

Discussion

Ask a question, share an insight, or help someone who’s stuck.

Sign in to post a comment or reply.

Loading…