My very first paid job in 1997 was extending a PC emulator product for an ARM desktop computer with a 486 co-processor. I was a teenager who knew a bit of C & ARM code, otherwise no hardware or x86 knowledge at all. Obviously PCs have always been quite well documented, and there were other emulators to look at for comparison. But where I couldn't work it out, and the few books I had were no use, I just had to experiment: write a bit of code, see what the response was (usually crash, sometimes the whole computer).
A lot of it is building a mental model of the enemy (for me: Windows NT early boot, DirectDraw initialisation) and writing code that got it to the next step, and the next step... It was always slow work, but therapeutic once you find a thread to pull on. When you get it right, the reward is sudden: you have this alien world that is running where it shouldn't, like a fish swimming in a tree.
A lot of it is building a mental model of the enemy (for me: Windows NT early boot, DirectDraw initialisation) and writing code that got it to the next step, and the next step... It was always slow work, but therapeutic once you find a thread to pull on. When you get it right, the reward is sudden: you have this alien world that is running where it shouldn't, like a fish swimming in a tree.
I'd love to do more of that kind of work!