This guide covers NES-specific features and usage of retrodisasm.
- Bit-Perfect Reassembly - Generated assembly reassembles to produce the exact same ROM binary
- Execution Flow Tracing - Differentiates between code and data through program flow analysis
- Multiple Assembler Outputs - Generates assembly compatible with asm6, ca65, nesasm, and retroasm
- Smart Output - Does not output trailing zero bytes by default
- Outputs asm6*/ca65/nesasm/retroasm compatible assembly files
- Translates known RAM addresses to aliases
- Supports undocumented 6502 CPU opcodes
- Handles branching into opcode parts of instructions
- Experimental support for mappers with banking
* asm6f v1.6 (modifications v03) or later is required
Auto-detection from .nes extension:
retrodisasm -o output.asm input.nesExplicit system specification:
retrodisasm -s nes -o game.asm game.binChoose your preferred assembler with the -a flag:
retrodisasm -a asm6 -o output.asm input.nes
retrodisasm -a ca65 -o output.asm input.nes # default
retrodisasm -a nesasm -o output.asm input.nes
retrodisasm -a retroasm -o output.asm input.nesReset:
sei ; $8000 78
cld ; $8001 D8
lda #$10 ; $8002 A9 10
sta PPU_CTRL ; $8004 8D 00 20
...After disassembly, you can reassemble to verify bit-perfect output:
ca65:
ca65 output.asm -o output.o && ld65 output.o -t nes -o output.nesasm6:
asm6f output.asm output.nesnesasm:
nesasm output.asm -o output.nesretroasm:
retroasm output.asm -o output.nesUse CDL files from emulators to guide disassembly:
retrodisasm -cdl game.cdl -o output.asm input.nesSpecify a custom linker config:
retrodisasm -c custom.cfg -o output.asm input.nesAutomatically reassemble and verify bit-perfect output (requires asm6, ca65, or nesasm):
retrodisasm -verify -o output.asm input.nesThe verification uses the assembler specified with -a flag (default: ca65).
Output mnemonics for unofficial 6502 opcodes:
retrodisasm -output-unofficial -o output.asm input.nesStop tracing at unofficial opcodes unless branched to:
retrodisasm -stop-at-unofficial -o output.asm input.nesDisassemble raw binary without NES header:
retrodisasm -binary -base 8000 -o output.asm prg.binProcess multiple NES ROMs at once:
retrodisasm -batch "*.nes"This generates <romname>.asm for each ROM file.
Omit hex opcode bytes in comments:
retrodisasm -nohexcomments -o output.asm input.nesOmit file offsets in comments:
retrodisasm -nooffsets -o output.asm input.nesInclude trailing zero bytes in banks (default is to omit):
retrodisasm -z -o output.asm input.nesretrodisasm has experimental support for NES mappers with banking. The tool attempts to trace execution flow across bank switches and generate appropriate assembly output.
- Mapper support is experimental and may not handle all banking scenarios
- Some complex self-modifying code patterns may not disassemble perfectly
- Verification requires the assembler (asm6, ca65, or nesasm) to be installed in your PATH