General Resources

Most people start with a CHIP-8 emulator. As with any system, see <#482208284032499713> to get started. Note: A great guide that still keeps it challenging is https://tobiasvl.github.io/blog/write-a-chip-8-emulator/.

After that, you can pretty much move to whatever system you want to. You don’t have to “work your way up” to it as many seem to think (relevant opinionated thread here: https://goo.gl/CAvrd4). Just make sure you have the basics down first, study the source code of existing emulators (super important) and if you get stuck, ask questions here or in the subreddit. If you contribute to a project that has its own community/resources, you should probably prioritize that.

Emulation Terms

Explanations for some terms you might come across. (for more info, look at source code of existing emulators, or ask others)

HLE vs LLE

High Level Emulation vs Low Level Emulation

CPU Emulation: Cached Interpeters

CPU Emulation: JIT (Just-In-Time) Compilers / “Dynarecs”

Just-In-Time and Ahead-of-Time compilers.

CPU Emulation: AOT (Ahead-of-Time) Compilers

Intermediate representation

Makes it easier to optimize and port to multiple host targets.

Optimizations

fastmem

Fast memory accesses using host MMU.

Software Rasterization

For emulating 3D systems.

Hardware Rasterization

Audio

FPGAs

Integrated Circuits

Save States

Emulator Update Loop

Useful libraries


Reverse Engineering

In emulation, RE-ing is often needed for system BIOSes, operating systems, drivers, OS modules and games to aid in understanding of what the hardware does & emulate it properly when the documentation is insufficient or incomplete (ie. always). It’s a huge area of expertise & there is no be-all end-all resource, but a decent starting point might be https://beginners.re (older but free mirror: https://mirrors.ocf.berkeley.edu/parrot/misc/openbooks/programming/ReverseEngineeringForBeginners.en.pdf)

Static analysis

The industry standard tools are:

Dynamic analysis / Debugging

The standard tool that’s cross-platform and supports many architectures is gdb.


Contributing

Have something to add to this list? Submit a pull request here.

Note: If you’re new here, scroll up to the top!