The Universal Atari Disassembler

rg-dis

Free universal 680x0 and DSP 56k disassembler for Atari binaries.

Key features

  • Byte-Identical Re-assembly: Generates clean source code whose code and data sections re-assemble byte-for-byte through rg-asm (680x0 and DSP 56001), tested against a wide range of Atari binaries.
  • Motorola DSP 56001 & Mixed-Mode: Full unified support for Atari Falcon DSP binaries, with automatic detection, jump table reconstruction, and disassembly of embedded DSP microkernels in 680x0 executables.
  • OS Trap & Hardware Annotations: Automatic trap-call decoding for GEMDOS, BIOS, XBIOS, AES, VDI and Line-A calls with function names and stack arguments, plus built-in knowledge of Atari hardware registers (MFP, Blitter, YM2149, VIDEL) and system vectors.
  • Smart Labelling & String Analysis: Derives contextual names for subroutines, branch targets, and variables to make disassembly read like original source code. Identifies readable text strings and decodes VT-52 terminal escape sequences with descriptive labels.
  • Instruction Cycle Annotations & Metrics: Annotates every instruction line with dynamically calculated 68000 and 68030 cycle costs. Maps routine extents with function-level cycle and byte rollups exportable to terminal tables or JSON.
  • Floppy Images, Boot Sectors & Containers: Direct inspection and disassembly of executable boot blocks, raw tracks, and filesystem contents across .ST, .MSA, and Pasti .STX floppy images, as well as nested .ZIP archives.
  • Symbol Recovery & Binary Formats: Supports GEMDOS executables, raw ROM dumps, and static libraries, recovering embedded symbol tables from DRI/Alcyon, Devpac GST, ELF, and VBCC formats.
rg-dis; OS trap argument decode & hardware memory map
$ rg-dis GAME.TOS
 
  █▀▀▄ █▀▀▀
  █▀█▄ █ ▀█   RESERVOIR GODS
  ▀  ▀ ▀▀▀▀   rg-dis · m68k disassembler
 
  ✓ Disassembling GAME.TOS (564,066 bytes)
  ✓ Disassembled 564,066 bytes in 1.69s
 
_start:
    MOVE.L    4(A7),A5                   ; basepage pointer
    MOVE.L    $0C(A5),D0                  ; text size
    ADD.L     $14(A5),D0                  ; data size
    ADD.L     $1C(A5),D0                  ; bss size
    ADDI.L    #$0100,D0                   ; basepage header (256 bytes)
    MOVE.L    D0,-(A7)                    ; newsiz - new size in bytes
    MOVE.L    A5,-(A7)                    ; block - start of block to shrink
    CLR.W     -(A7)                       ; zero - reserved, must be 0
    MOVE.W    #74,-(A7)                   ; Mshrink - shrink a memory block
    TRAP      #1                          ; GEMDOS #74 (Mshrink)
    LEA       $C(A7),A7
    CLR.L     -(A7)                       ; Super(0) -> enter supervisor mode
    MOVE.W    #32,-(A7)                   ; GEMDOS #32 (Super)
    TRAP      #1                          ; GEMDOS #32 -> D0 = old SSP
    LEA       6(A7),A7
    MOVE.W    #$0000,($FFFF8240).W        ; write palette[0]
    MOVE.B    #$00,($FFFF8260).W          ; sshiftmod - ST low resolution
    …
$ 

Quick start

rg-dis game.tos -o game.s                        # disassemble executable → .s
rg-dis game.tos --annotate-cycles -o game.s       # per-instruction CPU cycle costs
rg-dis dsp_prog.p56                              # disassemble Falcon DSP 56001 binary
rg-dis game.tos --inspect                        # inspect header, requirements & sections
rg-dis demo.msa --bootsector                     # extract & disassemble floppy boot sector

Verify

After unzipping, check the extracted files (the archive includes SHA256SUMS):

sha256sum -c SHA256SUMS

Learn more