Very impressive, great job! Can you tell us a bit more about it? Maybe there was something interesting in implementation or some C++11 things that greatly helped you?
I've never done emulation, so this topic is pure magic for me.
I haven't particularly used much of modern C++ or any cool new features except for lambdas,
range-based for loops, std::chrono and other minor things.
Talking about the development, NES is fairly well documented.
The cpu 6502 was used in Apple I and II, several systems by Commodore and Atari,
so it has tons of documentation online.
Emulating a CPU involves reading the instructions made up of opcodes, specifying the operation and the operand.
These operate on the few registers 6502 has and the small 8-bit address space of which large portions are unmapped and
mirrored in the NES which consists of only 32KB for the read-only instructions and 2KB of RAM! (Aren't we privileged with gigabytes of memory to waste ?)
The CPU was then the easiest part of the development.
The NES sports a PPU, a Picture Processing Unit, the predecessor of the beasts we have as GPUs these days
The PPU too has only 2KB of (V)RAM plus 2KB for "name-tables" plus some bytes for the palette.
The resolution of the picture produced by the NES is 256x240 which is 61KB (with a color depth of 1 byte) is way more than the space we have.
So the picture is made up with the help of repeating patterns which you've obviously observed playing a game on it.
The background is thus made with patterns defined in the "pattern table", the screen is made of these patterns as arranged in the "name-tables".
It actually has address for four name-tables but space only for two, so two of these are mirrored.
The PPU thus offers scrolling between these name-tables which helped spawn all the platformers on the NES.
Making this PPU involved LOTS of bit-manipulations. I once spent
days tracking down a bug which came out to be ONE wrong BIT!
Anyway it was quite fun and I had it easy as most of reverse-engineering has already been done for the NES.
Edit: Oh and I gave up on trying to make a GUI with ImGui, remember my mail on fonts ?