Classic Controller High Resolution Mode

Contents:

Summary

The Classic Controller (and Controller Pro) supports an improved data format which offers more resolution (and therefore potentially finer in-game control) than what was used by Virtual Console games. As far as we know, Nintendo only began using this format on the Classic Editions consoles.

Some of our adapters make use of this feature to get the best out of those excellent classic controllers and therefore send the best possible data to the game. When we mention on a product page that the Classic Controller High Resolution Mode is supported, this is what we mean.

The goal of this page is to provide background information on what this High Resolution Mode actually is, and why it is desirable to use it.

A bit of history

The Classic controllers were the official controllers for use with Virtual Console Games downloaded from the Wii store, but many still prefered the original controllers. So we designed and built adapters which would on one side poll an original controller (N64 for instance), and pretend to be a Classic Controller (i.e. it talks to the console like one) on the other side, as that is what Virtual Console titles required.

Such adapters include:
When Nintendo released the NES Classic mini (or Classic Edition) a few years later, for the controller ports they used the same connector they had on Wiimotes.

The bundled NES controller also pretended to be a Classic controller, presumably for backward compatibility reasons, so it could be directly used with existing Virtual Console titles. Likewise, Classic controllers also functioned correctly when connected to a NES Classic Mini. (All this also applies to the SNES Classic Mini / Classic Edition).


Something unexpected

Given the excellent compatibility noted above, we expected our adapters to work fine on the Classic Edition too since, after all, they were pretending to be Classic Controllers too. But contrary to our expectations, our adapters did not work. And many 3rd party controllers did not work either.

What was going on?
Nintendo started using a feature that was hidden in the Classic controller from the beginning: A different data format for transmitting controller status (button states and values of analog sticks) we had never seen before!
Of course we quickly figured it out and implemented it so our adapters would also work on the Classic Editions. But there was more to it. That new data format actually offered greater resolution, i.e. finer steps, for the analog sticks!

The old and new data formats

Ok, so what does this means exactly? What does greater resolution provides? It provides a greater number of steps, i.e. numerical values representing the amount of physical deflection/current angle of the joystick. Here is simple illustration to visualize the concept:




The above is just for illustration. Here is a table with the actual numbers:
Old data format (Virtual console)New data format (Classic editions)
Left stick data bits: 6 bits 8 bits
Left stick values: approx. -25 to 25 approx. -100 to 100.
Right stick data bits: 5 bits 8 bits
Right stick values: approx. -13 to 13 approx. -100 to 100
Left/Right triggers bits: 5 bits 8 bits
Left/Right triggers values: approx. 2 to 30 approx. 20 to 250

The above shows that: The left stick has 4 times more steps, and the right stick and triggers have about 8 times more steps!. This means potentially finer control over how fast one runs or turns in a game. Of course in the end it depends on the game, but by using the high resolution data format, controller adapters can at least avoid an early (and unnecessary) drop in resolution.

We have been in fact using this new data format in our Classic controller to Gamecube and N64 adapters from day one, and High Resolution Mode support for our Classic controller to USB adapter is in beta.

For programmers

To enable High Resolution Mode, you simply write 0x03 to address 0xFE in the extension controller memory. Then you poll the controller by reading 8 bytes at address 0x00 instead of only 6. You can also restore the original format by writing the original value back to address 0xFE at any time.

For the exact data structure, have a look to the notes we took when we first observed this new data format on the NES Classic a few years ago:
https://github.com/raphnet/extenmote/blob/master/notes_nes_classic.txt

Conclusion

The new data format, or High Resolution Mode provides 4 to 8 times finer control, and that's why we use it in our adapters!

Thanks for reading!