I want to make an NES emulator. Where do I start?

That's good that you want to make an NES emulator, but you should know that there are already countless NES emulators out there right now. Do you want to make an emulator that stands out from all the rest, or are you making it just for the Hell of it? If you cannot think of any way to make your emulator better than all the other functional but mediocre ones out there, then you should keep the emu to yourself, just for your own private use and education.

Anyway, of course, you can't make an emu for a game system if you aren't already familiar with the system itself. This is why I recommend always making some of your own NES demos before you even begin thinking about an emulator. You have to know how the CPU works, how the PPU behaves, and how the audio channels work, and this can best be done through testing them all out in NES test programs which you write yourself. Really, that's the best way to do it. So, that's the NES side of things.

On the PC side of things (by PC, I mean a generic Personal Computer, not an IBM PC specifically), you should be familiar with producing a fast graphics display in various video modes, interfacing with the sound hardware of your computer, and handling keyboard, mouse, and joystick inputs. Setting up stable 60Hz (or whatever) timing is also very important for a console emulator such as the NES. If you aren't familiar with this, then it's the same recommendation: I suggest you write demos or even a small game on your PC. Making an emulator really is like a software marriage between two systems: If you aren't proficient and knowledgeable in both the computer on which you are programming, and the system which you are emulating, then it will show through in a shoddy emulator.