554 lines
27 KiB
Plaintext
554 lines
27 KiB
Plaintext
![]() |
DSFX - SFX 65816 disassembler v1.20 - (c) 1992 The Voice Over
|
|||
|
|
|||
|
The SFX 65816 disassembler is a tool I threw together for the purpose of
|
|||
|
making it easier for me to find cheats, secret keys, etc. for SNES games. It
|
|||
|
is a symbolic disassembler that will use any SNES binary image file (such as
|
|||
|
those created by a Game Doctor/Super Magicom/Super Twin/etc.) for its input, and
|
|||
|
it will produce either source code that can be reassembled into object code
|
|||
|
(assuming you have a 65816 assembler and set up you OBJs and ORGs correctly) or
|
|||
|
a listing file, such as might be created by an assembler creating a .LST file
|
|||
|
to disk. Keep in mind when using it that I haven't spent a WHOLE lot of time
|
|||
|
on this ware; it may still have a bug or two, and it could certainly use one or
|
|||
|
two features. Okay...enough of this...on to the ware.
|
|||
|
|
|||
|
The command line for DSFX may contain the name of a file you wish to
|
|||
|
disassemble. If no file is specified, DSFX will simply come up in command mode,
|
|||
|
and most of the commands won't work until you use the LOAD command to specify
|
|||
|
a file for disassembly. For example, to start DSFX and specify that you want
|
|||
|
to work on a file called MARIOWRL.BIN, you'd use the following command line:
|
|||
|
|
|||
|
C:\DSFX>DSFX MARIOWRL.BIN
|
|||
|
|
|||
|
If the file you want to disassemble is not in the same subdirectory as
|
|||
|
DSFX, just provide the full pathname of the file. If a symbol table called
|
|||
|
"MARIOWRL.DST" exists in the same subdirectory as MARIOWRL.BIN, MARIOWRL.DST
|
|||
|
will be loaded as the default symbol table.
|
|||
|
When run, DSFX will attempt to load a symbol table called SFXDEF.DST if it
|
|||
|
has not loaded a symbol table associated with the file specified on the command
|
|||
|
line. If SFXDEF.DST is present in the current subdirectory, DSFX will load it
|
|||
|
as the default symbol table. I've included a generic header symbol table that
|
|||
|
specifies the reset and interrupt vectors for the 65816 as well as the short
|
|||
|
data area where the name of the SNES game is stored as data areas. This data
|
|||
|
area starts at $FFC0, and should be the logical starting point for disassembling
|
|||
|
any SNES game. Oh, also, you may notice that addresses are not entirely
|
|||
|
contiguous. IE., The address that follows $FFFF is $18000. This is because the
|
|||
|
Super Nintendo hardware maps the first 16 megabits of cartridge ROM into 32K
|
|||
|
segments, each of which starts at location $8000, in banks $00-$3F. DSFX
|
|||
|
converts the absolute addresses into the binary image file to the segmented
|
|||
|
addresses used by the SNES.
|
|||
|
|
|||
|
Once DSFX is run, the screen will clear, and you should see the following:
|
|||
|
|
|||
|
DSFX - SFX 65816 disassembler v1.20 - (c) 1992 The Voice Over
|
|||
|
*_
|
|||
|
|
|||
|
The *_ is the DSFX prompt (Yes, it's a throwback to the days of the Apple
|
|||
|
][ monitor). At this point, DSFX is ready for you to begin entering commands.
|
|||
|
|
|||
|
If you have any questions, comments, bug reports, or suggestions for future
|
|||
|
versions of DSFX, I can be contacted on:
|
|||
|
|
|||
|
The Software Mine II
|
|||
|
(303) 659-6748
|
|||
|
NUP: MINER69ER
|
|||
|
1.2 gigs
|
|||
|
IBM and Console support sections
|
|||
|
LSDNet/SharkNet
|
|||
|
|
|||
|
The Evil Palace Toxic Insult
|
|||
|
408-741-5584 203-327-0124
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HELP or ?: Displays the DSFX help screen, as follows:
|
|||
|
|
|||
|
*?
|
|||
|
DSFX - SFX 65816 disassembler v1.20 - (c) 1992 The Voice Over
|
|||
|
|
|||
|
QUIT - Exit D816
|
|||
|
LOAD name - Specify file to disassemble
|
|||
|
LSYM name - Load symbol table
|
|||
|
SSYM name - Save symbol table
|
|||
|
DASM name [start end] - Create source file
|
|||
|
FOUT name [start end] - Create list file
|
|||
|
HEDR val - Specify length of file header
|
|||
|
|
|||
|
[addr/label]L - Disassemble 22 lines
|
|||
|
LAB addr [label] - Assign label/Display label
|
|||
|
DELL addr/label - Delete label
|
|||
|
DC typ addr len label - Define constant- valid expressions for typ are:
|
|||
|
A - Address C - Characters/ASCII text W - Long word
|
|||
|
B - Banked (3-byte) address H - Hex data
|
|||
|
REG ax addr - Specify A & index register width (8[1] or 16[0] bits)
|
|||
|
DUMP [addr [len]] - Hex/ASCII dump
|
|||
|
XDUMP [addr [len]] val- Hex/ASCII dump exclusive-ored with val
|
|||
|
SFX addr - Print SFX equivalent of absolute address
|
|||
|
ABS addr - Print absolute equivalent of SFX address
|
|||
|
FIND xx [..16] - Find sequence of up to 16 bytes
|
|||
|
GRAB name start [end] - Write region from start-end into file
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
QUIT: Exits the DSFX disassembler. Note that if you have made changes to the
|
|||
|
symbol table that you have not yet saved, they will be lost if you quit.
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
LOAD pathname: Specifies the name of the file that DSFX is to disassemble. A
|
|||
|
full pathname may be specified, including extension. Examples:
|
|||
|
|
|||
|
*load mariowrl.bin
|
|||
|
*load \util\nintendo\sfxgames\addams.bin
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
LSYM filename: Specifies the name of a symbol table to be loaded as DSFX's
|
|||
|
current symbol table. Note that if a symbol table is already loaded, the new
|
|||
|
symbol table will replace the old, rather than having both present at once. No
|
|||
|
extension may be specified, as DSFX appends the extension ".DST" to the end of
|
|||
|
the filename you specify. Also, full pathnames are not allowed for the LSYM
|
|||
|
command. Example:
|
|||
|
|
|||
|
*lsym addams
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
SSYM filename: Saves the current symbol table. When specifying a filename,
|
|||
|
extensions and paths are not allowed, just as with LSYM. Example:
|
|||
|
|
|||
|
*ssym addams
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DASM pathname [start [end]]: Disassembles the current file into source code.
|
|||
|
Default start address is $8000, and default end address is the end of the binary
|
|||
|
file. Note that end address may not be specified unless start address is
|
|||
|
specified also. Examples:
|
|||
|
|
|||
|
*dasm mariowrl.asm 8000 ffff Disassembles the first 32K of the current
|
|||
|
file into a file called MARIOWRL.ASM
|
|||
|
|
|||
|
*dasm mariowrl.asm 1f0000 Disassembles the current file into a file
|
|||
|
called MARIOWRL.ASM, starting at address
|
|||
|
$1F0000
|
|||
|
|
|||
|
*dasm mariowrl.asm Disassembles the entire contents of the
|
|||
|
current file into a file called MARIOWRL.ASM
|
|||
|
|
|||
|
Note that disassembly files do not include addresses or opcode/operand
|
|||
|
data. They contain ONLY labels, mnemonics, and an operand field if appropriate.
|
|||
|
IE.:
|
|||
|
|
|||
|
ORG $8000
|
|||
|
RESET SEI
|
|||
|
STZ $4200
|
|||
|
STZ $420C
|
|||
|
STZ $420B
|
|||
|
STZ $2140
|
|||
|
STZ $2141
|
|||
|
STZ $2142
|
|||
|
STZ $2143
|
|||
|
LDA #$80
|
|||
|
STA $2100
|
|||
|
CLC
|
|||
|
XCE
|
|||
|
REP #$38
|
|||
|
LDA #$0000
|
|||
|
TCD
|
|||
|
LDA #$01FF
|
|||
|
TCS
|
|||
|
LDA #$F0A9
|
|||
|
STA RAMSTART
|
|||
|
LDX #$017D
|
|||
|
LDY #$03FD
|
|||
|
LDA #$008D
|
|||
|
: :
|
|||
|
|
|||
|
This file can then be assembled by a 65816 disassembler (it may or may not
|
|||
|
be necessary to change the assembler directives that DSFX outputs for things
|
|||
|
like hex data, etc. I used the assembler directives that I'm most familiar
|
|||
|
with, which are those of ORCA/M, for the Apple...I don't know how well they'll
|
|||
|
translate to the cross-assemblers that're available for the PC. As soon as I've
|
|||
|
got an idea of what cross-assemblers people are using (if they're using any at
|
|||
|
all), I may change DSFX's output format.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FOUT pathname [start [end]]: Similar to DASM, but produces "list file" style
|
|||
|
output rather than "source file" style output. Examples:
|
|||
|
|
|||
|
*fout mariowrl.asm 8000 ffff Lists the first 32K of the current file into
|
|||
|
a file called MARIOWRL.ASM
|
|||
|
|
|||
|
*fout mariowrl.asm 1f0000 Lists the current file into a file called
|
|||
|
MARIOWRL.ASM, starting at address $1F0000
|
|||
|
|
|||
|
*fout mariowrl.asm Lists the entire contents of the current file
|
|||
|
into a file called MARIOWRL.ASM
|
|||
|
|
|||
|
A list file will probably be the most useful, since it will include
|
|||
|
addresses that you will be able to search for using your favorite editor. An
|
|||
|
example of the output you might get using the FOUT command:
|
|||
|
|
|||
|
008000 78 RESET SEI
|
|||
|
008001 9C 00 42 STZ $4200
|
|||
|
008004 9C 0C 42 STZ $420C
|
|||
|
008007 9C 0B 42 STZ $420B
|
|||
|
00800A 9C 40 21 STZ $2140
|
|||
|
00800D 9C 41 21 STZ $2141
|
|||
|
008010 9C 42 21 STZ $2142
|
|||
|
008013 9C 43 21 STZ $2143
|
|||
|
008016 A9 80 LDA #$80
|
|||
|
008018 8D 00 21 STA $2100
|
|||
|
00801B 18 CLC
|
|||
|
00801C FB XCE
|
|||
|
00801D C2 38 REP #$38
|
|||
|
00801F A9 00 00 LDA #$0000
|
|||
|
008022 5B TCD
|
|||
|
008023 A9 FF 01 LDA #$01FF
|
|||
|
008026 1B TCS
|
|||
|
008027 A9 A9 F0 LDA #$F0A9
|
|||
|
00802A 8F 00 80 7F STA RAMSTART
|
|||
|
00802E A2 7D 01 LDX #$017D
|
|||
|
008031 A0 FD 03 LDY #$03FD
|
|||
|
008034 A9 8D 00 LDA #$008D
|
|||
|
: : : : : :
|
|||
|
|
|||
|
|
|||
|
Note that output produced with FOUT is the same as that of the L command.
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
HEDR val: Specify length of file header. This command allows you to specify a
|
|||
|
region at the start of the file being disassembled that is a header used by a
|
|||
|
game doctor and should be ignored by DSFX. Specifically, this option was added
|
|||
|
to make Super Magicom files disassembleable in their native format. Example:
|
|||
|
|
|||
|
*hedr 200 Specify a $200 (512) byte header at the start of the file.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[addr/label]L: Disassemble the next 22 lines of code to the screen. Specifying
|
|||
|
an address or a label before the "L" will cause disassembly to begin at the
|
|||
|
specified address. Examples:
|
|||
|
|
|||
|
*8000l
|
|||
|
008000 78 RESET SEI
|
|||
|
008001 9C 00 42 STZ $4200
|
|||
|
008004 9C 0C 42 STZ $420C
|
|||
|
008007 9C 0B 42 STZ $420B
|
|||
|
00800A 9C 40 21 STZ $2140
|
|||
|
00800D 9C 41 21 STZ $2141
|
|||
|
008010 9C 42 21 STZ $2142
|
|||
|
008013 9C 43 21 STZ $2143
|
|||
|
008016 A9 80 LDA #$80
|
|||
|
008018 8D 00 21 STA $2100
|
|||
|
00801B 18 CLC
|
|||
|
00801C FB XCE
|
|||
|
00801D C2 38 REP #$38
|
|||
|
00801F A9 00 00 LDA #$0000
|
|||
|
008022 5B TCD
|
|||
|
008023 A9 FF 01 LDA #$01FF
|
|||
|
008026 1B TCS
|
|||
|
008027 A9 A9 F0 LDA #$F0A9
|
|||
|
00802A 8F 00 80 7F STA RAMSTART
|
|||
|
00802E A2 7D 01 LDX #$017D
|
|||
|
008031 A0 FD 03 LDY #$03FD
|
|||
|
008034 A9 8D 00 LDA #$008D
|
|||
|
*titlel
|
|||
|
00FFC0 TITLE DC C,'SUPER MARIOWORLD '
|
|||
|
00FFD6 MISCINFO DC H,'02 09 01 00 01 00 7F 73'
|
|||
|
00FFDE DC H,'80 8C'
|
|||
|
00FFE0 FILLER1 DC H,'FF FF FF FF'
|
|||
|
00FFE4 COPVEC16 DC A,'82B4'
|
|||
|
00FFE6 BRKVEC16 DC A,'50B2'
|
|||
|
00FFE8 ABORTVEC16 DC A,'82B4'
|
|||
|
00FFEA NMIVEC16 DC A,'815B'
|
|||
|
00FFEC RESRVVEC2 DC A,'8000'
|
|||
|
00FFEE IRQVEC16 DC A,'8365'
|
|||
|
00FFF0 FILLER2 DC H,'FF FF FF FF'
|
|||
|
00FFF4 COPVEC DC A,'82B4'
|
|||
|
00FFF6 RESRVVEC1 DC A,'82B4'
|
|||
|
00FFF8 ABORTVEC DC A,'82B4'
|
|||
|
00FFFA NMIVEC DC A,'82B4'
|
|||
|
00FFFC RESETVEC DC A,'8000'
|
|||
|
00FFFE IRQVEC DC A,'82B4'
|
|||
|
018000 80 40 BRA $018042
|
|||
|
018002 20 10 08 JSR $0810
|
|||
|
018005 04 02 TSB $02
|
|||
|
018007 01 BD ORA ($BD,X)
|
|||
|
018009 88 DEY
|
|||
|
|
|||
|
|
|||
|
|
|||
|
LAB addr [label]: Defines a label at a given address, or displays the properties
|
|||
|
of a label that already exists for a given address, if no label is specified.
|
|||
|
If either the label or address specified in the LAB command already exists, you
|
|||
|
will be prompted to confirm replacement of the existing label/address.
|
|||
|
Examples:
|
|||
|
|
|||
|
*lab 7f8000 ramstart Defines a label called RAMSTART at address $7F8000
|
|||
|
*lab 7f8000 ramtop Replace label at $7F8000 with label "RAMTOP".
|
|||
|
This address is already associated with label RAMSTART.
|
|||
|
Press 'R' to replace, any other key to cancel: r
|
|||
|
*lab 8000 Displays information about label for address $8000
|
|||
|
Location: $8000
|
|||
|
Name: RESET
|
|||
|
*lab ffc0 Displays information about label for address $FFC0
|
|||
|
Location: $FFC0
|
|||
|
Name: TITLE
|
|||
|
Data type: ASCII text
|
|||
|
Elements: $16
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
DC type addr len label: Define a data area. This command allows you to specify
|
|||
|
parts of the object file that should be disassembled as data rather than as
|
|||
|
executable code. When specifying a data area, the following parameters MUST be
|
|||
|
included:
|
|||
|
|
|||
|
type: The type of data stored in this data area (see below).
|
|||
|
addr: The starting address of this data area.
|
|||
|
len: The hexadecimalnumber of ELEMENTS of data stored in this data area.
|
|||
|
label: The label for this data area.
|
|||
|
|
|||
|
There are five types of data recognized by DSFX, as shown in this table:
|
|||
|
|
|||
|
Type # Description
|
|||
|
---- - ------------------------------------------------------------------------
|
|||
|
A 2 Address - A two byte address, stored low-high.
|
|||
|
B 3 Banked address - A three byte address, stored low-high-bank.
|
|||
|
C 1 Characters - ASCII text.
|
|||
|
H 1 Hex - Hexadecimal data.
|
|||
|
W 4 Word - A four-byte word of data, stored lowest-low-high-highest.
|
|||
|
|
|||
|
The figure in the # column indicates how many bytes of memory are occupied
|
|||
|
by each element of data of this type. Thus, specifying a data area for data of
|
|||
|
type W (long word) with four elements of data causes sixteen bytes of code to
|
|||
|
be interpreted as data rather than as code, starting at the specified address.
|
|||
|
As with LAB, if the address or label specified already exists, you will be
|
|||
|
prompted to confirm replacement. Examples:
|
|||
|
|
|||
|
*dc a fffe 1 irqvec Specifies that a single two-byte address called
|
|||
|
"irqvec" is stored at location $FFFE. Two bytes
|
|||
|
of data will be reserved.
|
|||
|
*dc h ffd6 a miscinfo Specifies that a table of $A hex bytes called
|
|||
|
"miscinfo" is stored at location $FFD6. Ten
|
|||
|
bytes of data will be reserved.
|
|||
|
*dc w 290a1 4 longtable Specifies that a table called "longtable",
|
|||
|
consisting of four long words is stored at
|
|||
|
location $290A1. 16 bytes of data will be
|
|||
|
reserved.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REG ax addr: Specify register width, starting at address addr. This command
|
|||
|
allows you to specify the width of the accumulator and index registers,
|
|||
|
beginning at a specific address, and continuing on until one of the following
|
|||
|
conditions occurs:
|
|||
|
|
|||
|
1) A higher address with a different register width specification is reached.
|
|||
|
|
|||
|
2) An SEP or REP instruction is disassembled, which, if run, would affect the
|
|||
|
M or X flags of the 65816. (DSFX will automatically change the disassembly
|
|||
|
mode to reflect the change in register width that the SEP or REP instruction
|
|||
|
would cause).
|
|||
|
|
|||
|
Note that although DSFX will automatically adjust the register width for
|
|||
|
its output to reflect changes to the M and X flags caused by SEP and REP
|
|||
|
instructions, the REG command will cause DSFX to preselect the correct register
|
|||
|
width when you use the "L", "DASM", or "FOUT" commands. I recommend that you
|
|||
|
use the REG command to set a register width on any SEP and REP commands that
|
|||
|
affect the M or X flags, as well as the start of any subroutines you
|
|||
|
disassemble. Note that in this version of DSFX, the maximum number of register
|
|||
|
width changes that may be defined is 128, so if you're planning to do a full-
|
|||
|
tilt disassembly of a program, use them wisely.
|
|||
|
|
|||
|
The format of the command (REG ax addr) may seem a bit confusing, but is
|
|||
|
actually fairly easy to understand. The address at which the specified register
|
|||
|
widths are to become used is defined in addr. The widths of the accumulator and
|
|||
|
index registers are specified by supstituting a 1 or a 0 for a and x
|
|||
|
respectively. If a 1 is defined, the specified register's width will be 8 bits.
|
|||
|
If a 0 is defined, the specified register's width will be 16 bits. Examples:
|
|||
|
|
|||
|
*reg 11 8000 Specifies accumulator and index registers are 8 bits
|
|||
|
starting at address $8000.
|
|||
|
*reg 00 801d Specifies accumulator and index registers are 16 bits
|
|||
|
starting at address $801D.
|
|||
|
*reg 10 1E300 Specifies 8-bit accumulator and 16-bit index registers
|
|||
|
starting at address $1E300.
|
|||
|
*reg 01 39FFE Specifies 16-bit accumulator and 8-bit index registers
|
|||
|
starting at address $39FFE.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DUMP [addr [length]]: Perform a hex/ASCII dump of [length] bytes, starting at
|
|||
|
location [addr]. If a length is specified, a start address must be specified
|
|||
|
also. If no length is specified, 256 bytes will be dumped. If no starting
|
|||
|
address is specified, the current PC is used as the starting address. Examples:
|
|||
|
|
|||
|
*dump fff0
|
|||
|
$00FFF0: FF FF FF FF B4 82 B4 82 B4 82 B4 82 00 80 B4 82 -- ....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD>
|
|||
|
$018000: 80 40 20 10 08 04 02 01 BD 88 15 29 03 60 BD 88 -- <20>@ .....<2E><>.).`<60><>
|
|||
|
$018010: 15 29 04 60 BD 88 15 29 08 60 8B 4B AB 20 DB AB -- .).`<60><>.).`<60>K<EFBFBD> ۫
|
|||
|
$018020: AB 6B 8B 4B AB 20 CF AB AB 6B 8B 4B AB 20 32 90 -- <20>k<EFBFBD>K<EFBFBD> ϫ<>k<EFBFBD>K<EFBFBD> 2<>
|
|||
|
$018030: AB 6B 8B 4B AB 20 0D A4 AB 6B 8B 4B AB 20 C1 8F -- <20>k<EFBFBD>K<EFBFBD> .<2E><>k<EFBFBD>K<EFBFBD> <20><>
|
|||
|
$018040: AB 6B 8B 4B AB 20 F3 9C AB 6B 49 FF 1A 60 BD 88 -- <20>k<EFBFBD>K<EFBFBD> <20><><EFBFBD>kI.<`<60><>
|
|||
|
$018050: 15 F0 1F A5 13 29 03 05 86 D0 17 A9 04 85 00 A9 -- .<2E>.<2E>.)..<2E><>.<2E>.<2E>.<2E>
|
|||
|
$018060: 0A 85 01 20 CB 80 D0 0A A0 03 B9 C0 17 F0 04 88 -- .<2E>. ˀ<>.<2E>.<2E><>.<2E>.<2E>
|
|||
|
$018070: 10 F8 60 A9 03 99 C0 17 B5 E4 65 00 99 C8 17 B5 -- .<2E>`<60>.<2E><>.<2E><>e.<2E><>.<2E>
|
|||
|
$018080: D8 65 01 99 C4 17 A9 13 99 CC 17 60 8B 4B AB AD -- <20>e.<2E><>.<2E>.<2E><>.`<60>K<EFBFBD><4B>
|
|||
|
$018090: 8F 14 8D 70 14 9C 8F 14 9C 71 14 9C C2 18 AD DF -- <20>.<2E>p.<2E><>.<2E>q.<2E><>.<2E><>
|
|||
|
$0180A0: 18 8D E2 18 9C DF 18 A2 0B 8E E9 15 20 D2 80 20 -- .<2E><>.<2E><>.<2E>.<2E><>. Ҁ
|
|||
|
$0180B0: 27 81 CA 10 F4 AD B8 18 F0 04 22 1C F8 02 AD DF -- '<27><>.<2E><><EFBFBD>.<2E>.".<2E>.<2E><>
|
|||
|
$0180C0: 18 D0 06 9C 7A 18 9C 8B 18 AB 6B BD A0 15 1D 6C -- .<2E>.<2E>z.<2E><>.<2E>k<EFBFBD><6B>..l
|
|||
|
$0180D0: 18 60 DA 8A AE 92 16 18 7F B4 F0 07 AA BF 00 F0 -- .`ڊ<><DA8A>..<><7F>.<2E><>.<2E>
|
|||
|
$0180E0: 07 FA 9D EA 15 BD C8 14 F0 3C A5 9D D0 38 BD 40 -- .<2E><><EFBFBD>.<2E><>.<2E><<3C><><EFBFBD>8<EFBFBD>@
|
|||
|
*dump
|
|||
|
$0180F0: 15 F0 03 DE 40 15 BD 4C 15 F0 03 DE 4C 15 BD 58 -- .<2E>.<2E>@.<2E>L.<2E>.<2E>L.<2E>X
|
|||
|
$018100: 15 F0 03 DE 58 15 BD 64 15 F0 03 DE 64 15 BD E2 -- .<2E>.<2E>X.<2E>d.<2E>.<2E>d.<2E><>
|
|||
|
$018110: 1F F0 03 DE E2 1F BD AC 15 F0 03 DE AC 15 BD 3E -- .<2E>.<2E><>.<2E><>.<2E>.ެ.<2E>>
|
|||
|
$018120: 16 F0 03 DE 3E 16 60 BD C8 14 F0 25 C9 08 D0 03 -- .<2E>.<2E>>.`<60><>.<2E>%<25>.<2E>.
|
|||
|
$018130: 4C C3 85 22 74 86 00 51 81 72 81 A2 9A E4 9A 52 -- LÅ"t<>.Q<>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>R
|
|||
|
$018140: 9A 7B 9A 6D 81 56 81 C2 85 3C 95 13 99 71 9F 57 -- <20>{<7B>m<EFBFBD>V<EFBFBD>
<<3C>.<2E>q<EFBFBD>W
|
|||
|
$018150: 81 A9 FF 9D 1A 16 60 20 C3 85 20 34 AC 20 32 90 -- <20><>.<2E>..` Å 4<> 2<>
|
|||
|
$018160: D6 AA D6 AA 20 0E 80 F0 03 20 04 9A 60 22 49 FB -- ֪֪ .<2E><>. .<2E>`"I<>
|
|||
|
$018170: 00 60 A9 08 9D C8 14 B5 9E 22 74 86 00 75 85 75 -- .`<60>.<2E><>.<2E><>"t<>.u<>u
|
|||
|
$018180: 85 75 85 75 85 75 85 75 85 75 85 75 85 75 85 6E -- <20>u<EFBFBD>u<EFBFBD>u<EFBFBD>u<EFBFBD>u<EFBFBD>u<EFBFBD>u<EFBFBD>n
|
|||
|
$018190: 85 75 85 75 85 75 85 5D 85 C3 E1 75 85 75 85 75 -- <20>u<EFBFBD>u<EFBFBD>u<EFBFBD>]<5D><><EFBFBD>u<EFBFBD>u<EFBFBD>u
|
|||
|
$0181A0: 85 78 F8 75 85 75 85 11 B0 0B B0 14 B0 14 B0 DA -- <20>x<EFBFBD>u<EFBFBD>u<EFBFBD>.<2E>.<2E>.<2E>.<2E><>
|
|||
|
$0181B0: 83 B0 85 C2 85 DD 84 75 85 6B 84 C3 BD 83 85 7C -- <20><><EFBFBD>
݄u<DD84>k<EFBFBD>ý<EFBFBD><C3BD>|
|
|||
|
$0181C0: 85 49 B9 49 B9 3F B9 3F B9 96 AE A2 AE 87 F8 2F -- <20>I<EFBFBD>I<EFBFBD>?<3F>?<3F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/
|
|||
|
$0181D0: CD 9A 85 C2 85 39 83 35 84 F2 83 C2 85 7C 85 7C -- ͚<>
9<C285>5<EFBFBD><35><EFBFBD>
|<7C>|
|
|||
|
$0181E0: 85 7C 85 5B E0 C2 85 E0 83 C2 85 87 F8 7F F8 7F -- <20>|<7C>[<5B>
<EFBFBD><C285>
<EFBFBD><C285><EFBFBD>
|
|||
|
*dump 18020 14
|
|||
|
$018020: AB 6B 8B 4B AB 20 CF AB AB 6B 8B 4B AB 20 32 90 -- <20>k<EFBFBD>K<EFBFBD> ϫ<>k<EFBFBD>K<EFBFBD> 2<>
|
|||
|
$018030: AB 6B 8B 4B -- <20>k<EFBFBD>K
|
|||
|
|
|||
|
|
|||
|
|
|||
|
XDUMP [addr [length]] val: Perform a hex/ASCII dump of [length] bytes,
|
|||
|
exclusive-ored with the specified value, starting at the specified address. As
|
|||
|
with DUMP, if length is specified, start address must also be specified. The
|
|||
|
value with which to XOR the data is required. Examples:
|
|||
|
|
|||
|
*xdump ff Dumps 256 bytes, starting at the current PC, exclusive-
|
|||
|
oring them with $FF.
|
|||
|
*xdump ff00 ff Dumps 256 bytes, starting at $FF00, exclusive-oring
|
|||
|
them with $FF.
|
|||
|
*xdump ff00 14 aa Dumps $14 bytes, starting at $FF00, exclusive-oring
|
|||
|
them with $AA.
|
|||
|
|
|||
|
*xdump ff00 ff
|
|||
|
$00FF00: EB 14 4A 1B 3D DF 36 FF 00 CF FA 36 FF FE CF FC -- <20>.J.=<3D>6..<2E><>6.<2E><><EFBFBD>
|
|||
|
$00FF10: 56 FF FE 7A DD 1D DF 42 2B EB 14 4A 27 3D DF 7A -- V.<2E>z<EFBFBD>.<2E>B+<2B>.J'=<3D>z
|
|||
|
$00FF20: FF 56 5F FF C7 1A FF E7 92 77 E7 7A DB 1D DF 94 -- .V_.<2E>..<2E><>w<EFBFBD>z<EFBFBD>.ߔ
|
|||
|
$00FF30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FF90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FFA0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FFB0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -- ................
|
|||
|
$00FFC0: AC AA AF BA AD DF B2 BE AD B6 B0 A8 B0 AD B3 BB -- <20><><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><DFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
$00FFD0: DF DF DF DF DF DF FD F6 FE FF FE FF 80 8C 7F 73 -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>.<2E><>s
|
|||
|
$00FFE0: 00 00 00 00 4B 7D 4D AF 4B 7D A4 7E FF 7F 9A 7C -- ....K}M<>K}<7D>~.<>|
|
|||
|
$00FFF0: 00 00 00 00 4B 7D 4B 7D 4B 7D 4B 7D FF 7F 4B 7D -- ....K}K}K}K}.K}
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
SFX addr: Print SNES-equivalent banked address for specified absolute address.
|
|||
|
This command will allow you to enter absolute offsets within a file that you may
|
|||
|
find using Norton DiskEdit or other file editing program, and will return the
|
|||
|
banked address to which DSFX and the SNES will translate that offset. Example:
|
|||
|
|
|||
|
*sfx c203
|
|||
|
01C203
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
ABS addr: Similar to SFX, but accepts an SFX address as its input, and displays
|
|||
|
the equivalent absolute address. It occurred to me after I released v1.00 that
|
|||
|
it might be useful to know the offset into the image file of an address you
|
|||
|
find using DSFX. Example:
|
|||
|
|
|||
|
*abs 1c203
|
|||
|
00C203
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FIND xx [..16]: Search the file for a sequence of up to 16 bytes. Useful for
|
|||
|
locating instructions and data. Note that the fewer bytes you specify in your
|
|||
|
search, the more locations will be found containing the specified data. I
|
|||
|
recommend ALWAYS specifying at least two bytes to be found with the FIND
|
|||
|
command. Example:
|
|||
|
|
|||
|
*find a9 05
|
|||
|
0099D4 009B50 00ABC4 00ABFB 00AC24 00AC4D 00AD0B 00C33F 00C920 00E2C9
|
|||
|
00F145 00F1BC 00F288 00FB10 00FD08 00FE5C 018504 019330 0199CD 01C2A3
|
|||
|
01C507 01C816 01C843 01CE8E 01CF71 01D15C 01DC72 0285C5 028ACF 0290A9
|
|||
|
029AF0 029BEF 02A441 02A45B 02AA8D 02AD5E 02B794 02BF3D 02C23F 02C57C
|
|||
|
02C7D4 02D7FB 02F1FE 02F4BA 0394DA 039683 03ABB3 03AD78 03CE1D 048F26
|
|||
|
04901D 0491EE 04DCC2 04E522 04E529 04E637 04E826 04E864 04F76D 058202
|
|||
|
05BECF 0BFE62 0CCECB 0CD3AA 0CD8BB 0DA761 0DBAE8 0DEAC3
|
|||
|
|
|||
|
-------------------------------------------------------------------------------
|
|||
|
|
|||
|
GRAB name start [end]: Extracts the region from start to end from the file being
|
|||
|
disassembled, and writes it to a second file. If end address is not specified,
|
|||
|
the last address of the source file is assumed. I added this command because
|
|||
|
one of the suggestions I have received since I released v1.00 was to add the
|
|||
|
capability to disassemble code that's going to be run on the SNES' sound
|
|||
|
processor. I think the best way to handle that is to just have a seperate
|
|||
|
disassembler for that microprocessor, so if I ever actually DO write it, that's
|
|||
|
what the GRAB command is for...extracting code for the sound processor into a
|
|||
|
seperate file that can then be disassembled by another program. If anyone
|
|||
|
else comes up with a use for this, please let me know. Example:
|
|||
|
|
|||
|
*grab marsound.bin 17300 1ffff Extract the region from $17300 to $1FFFF
|
|||
|
from the source file, and write it to a
|
|||
|
file called "MARSOUND.BIN"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Revision history:
|
|||
|
|
|||
|
v1.00: Released 5/11/92.
|
|||
|
|
|||
|
v1.10: Corrected bug in DC that caused length to be interpreted as a decimal
|
|||
|
value rather than a hexadecimal value.
|
|||
|
Corrected bug in FOUT and DASM commands that caused auto-selection of
|
|||
|
start and end address to fail, causing a "Subscript out of range"
|
|||
|
error if start address was not specified.
|
|||
|
Corrected bug in FOUT and DASM commands that caused end address to
|
|||
|
be interpreted to be the same as start address if both start and end
|
|||
|
address were specified.
|
|||
|
Corrected bug which caused FOUT to not work at all.
|
|||
|
Corrected bug in LAB that caused a "Subscript out of range" error if
|
|||
|
the word LAB was followed by a non-hexadecimal expression that did
|
|||
|
not match a defined label.
|
|||
|
Corrected bug which caused default symbol table to not be loaded if
|
|||
|
a file with no associated symbol table was specified for disassembly
|
|||
|
on the command line.
|
|||
|
Added ABS command.
|
|||
|
Added GRAB command.
|
|||
|
Included default symbol table that I forgot to include with v1.00.
|
|||
|
|
|||
|
v1.20: Corrected bug which caused addresses produced by branch instructions
|
|||
|
to be misinterpreted when searching for associated labels.
|
|||
|
Corrected bug which caused the operands of short JMP and JSR instructions
|
|||
|
to be misinterpreted.
|
|||
|
Added HEDR command.
|
|||
|
Added DELL command.
|
|||
|
Added ability to replace existing labels.
|
|||
|
|
|||
|
Thanks to:
|
|||
|
|
|||
|
Fabulous Furlough- For the idea behind the HEDR command, as well as the impetus
|
|||
|
to add label deletion/replacement.
|
|||
|
|
|||
|
R. Bubba Magillicutty- For pointing out the problem with the disassembly of JMP
|
|||
|
and JSR instructions, because I'd have DIED before I noticed that as a problem.
|