DFR is a free disassembler for the Fujitsu FR, written in ANSI C.

It supports mapping input file sections to memory addresses, and specifying certain disassembly formats (e.g code, vectors, data) or exclusion of memory ranges. (Unspecified areas are currently treated as code; a future version may try to distinguish code from data.)

A few lines of sample output:

100081E6  9F80 1000 0AAA              LDI:32  #0x10000AAA,R0
100081EC  CF01                        LDI:8   #0xF0,R1
100081EE  9F20                        RET:D   
100081F0  1501                         STH    R1,@R0              ; 0x10000AAA

000FFFF8  0700 0000                   DL      0x07000000          ; INT #0x01
000FFFFC  000D 55BA                   DL      0x000D55BA          ; INT #0x00

105A3ABC  0001 0004                   DR      1/4                 ; 0.25
105A3AC0  0001 0006                   DR      1/6                 ; 0.166667

  -d range          -- disassemble only specified range
  -f range=address  -- map range of input file to memory address
  -h                -- display this message
  -i range=offset   -- map range of memory to input file offset
  -l                -- little-endian input file
  -m range=type     -- describe memory range (use -m? to list types)
  -o filename       -- output file
  -r                -- separate output file for each memory range
  -t address        -- equivalent to -m address,0x400=DATA:V
  -v                -- verbose
  -w options        -- output options (use -w? to list options)
  -x file           -- read options from file

Numbers are C-style. A range is start-end or start,length.

Memory types (for -m) are:

  NONE              -- do not disassemble
  UNKNOWN           -- unknown contents
  CODE              -- disassemble as code where possible
  DATA[:spec]       -- disassemble as data; spec is up to 8 of:         
                         L -- long (32-bit) data
                         N -- long (32-bit) data, no labels
                         R -- rational
                         V -- vector
                         W -- word (16-bit) data

Output options (for -w) are:

  -w cstyle         -- use C-style operands
  -w dmov           -- use alternates for DMOV
  -w dollar         -- use $ for hexadecimal
  -w filemap        -- generate input file map
  -w memorymap      -- generate memory map
  -w register       -- use AC, FP, SP
  -w shift          -- use large shift constants
  -w specials       -- use special registers
  -w stack          -- use PUSH and POP

A -w option may be turned off using -w nooption.

On startup, dfr looks for the following files:


These files, along with any specified in a -x option, may contain options as above, one per line, and comments where the first non-blank character on a line is '#' (currently comments may not appear on the same line as an option). The four predefined files are read before options on the command line; -x files are read at the point the option is encountered. Later options override earlier ones.

Further documentation and symbol support TBD. Please report bugs on the talk page.

Some suggested options for K10D firmware

Put this in a file dfr.txt or .dfrrc in your working directory, or use the -x option. Based on Memory layout.

# Output formatting options:
-w register,shift,stack
-w filemap,memorymap                                                            

# Split output into one file for each memory range (dfr 1.01):

# File map:
-i 0x000C0000-0x000FFFFF=0x00800000
-i 0x10000000-0x107FFFFF=0x00000000
-i 0x80000000-0x80000447=0x000F03C0

# Memory map:
-m 0x000C0000-0x000C007F=DATA:L
-m 0x000C0080-0x000F8979=CODE
-m 0x000F9040-0x000F90DF=DATA:L
-m 0x000F90E0-0x000F9267=UNKNOWN
-m 0x000F9268-0x000F9AC7=DATA:L
-m 0x000F9AC8-0x000F9B0B=DATA:W
-m 0x000F9B0C-0x000F9BFF=DATA:L
-m 0x000F9C00-0x000FA01B=DATA:W
-m 0x000FA01C-0x000FA097=DATA:L
-m 0x000FA098-0x000FA0BB=DATA:W
-m 0x000FA0BC-0x000FA103=DATA:L
-m 0x000FA104-0x000FA1FF=DATA:W
-m 0x000FA200-0x000FA7BF=DATA:L
-m 0x000FA7C0-0x000FADF3=DATA:W
-m 0x000FADF4-0x000FAE47=DATA:L
-m 0x000FAE48-0x000FAE7F=DATA:W
-m 0x000FAE80-0x000FAEFF=DATA:L
-m 0x000FAF00-0x000FB067=DATA:W
-m 0x000FB068-0x000FB083=DATA:L
-m 0x000FB084-0x000FB22B=DATA:W
-m 0x000FB22C-0x000FB277=DATA:L
-m 0x000FB278-0x000FB29F=DATA:W
-m 0x000FB2A0-0x000FB303=DATA:L
-m 0x000FB304-0x000FB36B=DATA:W
-m 0x000FB36C-0x000FB407=DATA:L
-m 0x000FB408-0x000FB50B=DATA:W
-m 0x000FB50C-0x000FBF5F=DATA:L
-m 0x000FBF60-0x000FC1D3=DATA:W
-m 0x000FC1D4-0x000FC307=DATA:L
-m 0x000FC308-0x000FC35B=DATA:W
-m 0x000FC35C-0x000FC38F=DATA:L
-m 0x000FC390-0x000FC4C7=DATA:W
-m 0x000FC4C8-0x000FC55F=DATA:L
-m 0x000FC560-0x000FC57F=DATA:W
-m 0x000FC580-0x000FC5BF=DATA:L
-m 0x000FC5C0-0x000FC5F7=DATA:W
-m 0x000FC5F8-0x000FC6E7=DATA:L
-m 0x000FC6E8-0x000FC72B=DATA:W
-m 0x000FC72C-0x000FC83B=DATA:L
-m 0x000FC83C-0x000FC89F=DATA:W
-m 0x000FC8A0-0x000FC8E6=DATA:L
-m 0x000FC8E8-0x000FC90F=DATA:W
-m 0x000FC910-0x000FC95B=DATA:L
-m 0x000FC95C-0x000FF9FF=NONE
-m 0x000FFA00-0x000FFBFF=DATA:W
-m 0x000FFC00-0x000FFFFF=DATA:V
-m 0x10000000-0x10003BFF=NONE
-m 0x10003C00-0x10003FFF=DATA:V
-m 0x10004000-0x1000423F=DATA:W
-m 0x10004240-0x100060FF=NONE
-m 0x10006410-0x10007FFF=NONE
-m 0x10008000-0x10009705=CODE
-m 0x100F2050-0x100FFFFF=NONE
-m 0x105A39D0-0x105A3EC1=DATA:R
-m 0x105A3EC4-0x105A4957=DATA:W
-m 0x105A4958-0x105A5BFF=DATA:L
-m 0x80000000-0x80000447=CODE

Obtaining DFR

Source: or

Version 1.00 2007/11/05

First release.

Version 1.01 2007/11/06

Added the -r option to split output among multiple files; begins a new file for each change of memory type or gap in memory range. Fixed some option processing problems (and, oops, broke -m?). Use ANSI standard types (uintX_t). Some output tweaks.

Version 1.02 2007/11/07

Some bug fixes, and the beginnings of a feature.

Version 1.03 2007/11/15

Fixed a stupid bug. Sorry for the delay; I'm on vacation.