CPU::Z80::Disassembler - Disassemble the flow of a Z80 program
use CPU::Z80::Disassembler; $dis = CPU::Z80::Disassembler->new; $dis->memory->load_file($file_name, $addr, $opt_skip_bytes, $opt_length); $dis->write_dump; $dis->write_dump($file); $dis->analyse; $dis->write_asm; $dis->write_asm($file); $dis->get_type($addr); $dis->set_type_code($addr [,$count]); $dis->set_type_byte($addr [,$count]); $dis->set_type_word($addr [,$count]); $dis->set_call($addr, 1); # this may be called $dis->set_call($addr, $sub); # @next_code = $sub->($self, $next_addr) will be called $dis->code($addr [, $label]); $dis->defb($addr [, $count][, $label]); $dis->defw($addr [, $count][, $label]); $dis->defm($addr, $size [, $label]); $dis->defmz($addr [, $count][, $label]); $dis->defm7($addr [, $count][, $label]); $dis->block_comment($addr, $block_comment); $dis->line_comments($addr, @line_comments); $dis->relative_arg($addr, $label_name); $dis->ix_base($addr); $dis->iy_base($addr);
Implements a Z80 disassembler. Loads a binary file into memory and dumps an unprocessed disassembly listing (see
Alternatively there are functions to tell the disassembler where there are data bytes and what are code entry points and labels. The disassembler will follow the code by simulating a Z80 processor, to find out where the code region finishes.
call instruction may be followed by data, the disassembler tries to find out if the called routine manipulates the return stack. If it does not, and ends with a
ret, then the routine is considered safe, and the disassembly continues after the
call instruction. If the routine is not considered safe, a message is written at the end of the disassembled file asking the used to check the routines manually; the
set_call method should then be used to tell how to handle calls to that routine on the next iteration.
analyse function can be called just before dumping the output to try to find higher level constructs in the assembly listing. For example, it transforms the sequence
ld b,h:ld c,l into
write_asm dumps an assembly listing that can be re-assembled to obtain the starting binary file. All the unknown region bytes are disassembled as
defb instructions, and a map is shown at the end of the file with the code regions (
C), byte regions (
B), word regions (
W) and unknown regions (
Creates the object.
CPU::Z80::Disassembler::Memory object containing the memory being analysed.
Reference to an array that contains all the disassembled instructions as CPU::Z80::Disassembler::Intruction objects, indexed by the address of the instruction. The entry is
undef if there is no disassembled instruction at that address (either not known, or pointing to the second, etc, bytes of a multi-byte instruction).
Returns the CPU::Z80::Disassembler::Labels object that contains all the defined labels.
Attributes containing blocks of text to dump before and after the assembly listing. They are used by
Base addess for (IX+DIS) and (IY+DIS) instructions, if constant in all the code. Causes the disassembly to dump:
IY0 equ 0xHHHH ; 0xHHHH is iy_base ... ld a,(iy+0xHHHH-IY0) ; 0xHHHH is the absolute address
Outputs a disassembly dump on the given file, or standard output if no file provided.
The disassembly dump shows the address and bytes of each instruction with the disassembled instruction.
Analyse the disassembled information looking for higher level constructs. For example, it replaces 'ld c,(hl):inc hl' by 'ldi c,(hl)'.
Should be called immediately before
Outputs a disassembly listing on the given file, or standard output if no file provided.
The disassembly listing can be assembled to obtain the original binary file.
Sets the type of the given address. An optional count allows the definitions of the type of consecutive memory locations.
It is an error to set a type of a not-defined memory location, or to redefine a type.
Gets the type at the given address, one of TYPE_UNKNOWN, TYPE_CODE, TYPE_BYTE or TYPE_WORD constants.
It is an error to set a type of a not-defined memory location.
Declates a subroutine at the given address, either with no stack impact (if 1 is passed as argument) or with a stack impact to be computed by the given code reference. This function is called with $self and the address after the call instruction as arguments and should return the next address(es) where the code stream shall continue.
Declares the given address and all following instructions up to an unconditional jump as a block of code, with an optional label.
Declares the given address as a def* instruction with an optional label.
Creates a block comment to insert before the given address.
Appends each of the given line comments to the instrutions starting at the given address, one comment per instruction.
Shows the instruction argument (NN or N) relative to a given label name. Label name can be '$' for a value relative to the instruction pointer.
<pscust at cpan.org>
Please report any bugs or feature requests through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CPU-Z80-Disassembler.
Copyright 2010 Paulo Custodio.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.
The Spectrum 48K ROM used in the test scripts is Copyright by Amstrad. Amstrad have kindly given their permission for the redistribution of their copyrighted material but retain that copyright (see http://www.worldofspectrum.org/permits/amstrad-roms.txt).