Another thing to make the entry easier: Create a "Memory" label for the memory area. You mention it in the intro text but color it in the R12 address color which was confusing for me.
Missed that memory space totally while playing the first two times.
Uses the Gamepad API. I found it very easy to work with, in large part thanks to the corresponding MDN docs.
The only weird part about the Gamepad API is that you have to poll it rather than handling events the way you normally would for other, similar stuff in JavaScript. In practice, this means that you have to do your own debouncing for handling things like key combos, but that doesn't really affect individual button presses too much.