NAME
CPU::Z80::Disassembler::Instruction - One Z80 disassembled instruction
SYNOPSIS
use CPU::Z80::Disassembler::Instruction;
$instr = CPU::Z80::Disassembler::Instruction->disassemble(
$memory, $addr, $limit_addr);
$instr = CPU::Z80::Disassembler::Instruction->defb($memory, $addr, $count);
$instr = CPU::Z80::Disassembler::Instruction->defb2($memory, $addr, $count);
$instr = CPU::Z80::Disassembler::Instruction->defw($memory, $addr, $count);
$instr = CPU::Z80::Disassembler::Instruction->defm($memory, $addr, $length);
$instr = CPU::Z80::Disassembler::Instruction->defmz($memory, $addr);
$instr = CPU::Z80::Disassembler::Instruction->defm7($memory, $addr);
$instr = CPU::Z80::Disassembler::Instruction->org($memory, $addr);
$instr->addr; $instr->next_addr;
$instr->bytes; $instr->opcode; $instr->N; $instr->NN; $instr->DIS; $instr->STR;
$instr->comment;
print $instr->dump;
print $instr->asm;
print $instr->as_string, "\n";
DESCRIPTION
This module represents one disassembled instruction. The object is constructed by one of the factory methods, and has attributes to ease the interpretation of the instruction.
CONSTRUCTORS
disassemble
Factory method to create a new object by disassembling the given CPU::Z80::Disassembler::Memory object at the given address.
The $limit_addr
argument, if defined, tells the disassembler to select the longest possible instruction, that does not use the byte at $limit_add
. The default is to select the shortest possible instruction.
For example, the sequence of bytes 62 6B
is decoded as ld h,d
if $limit_addr
is undef.
If $limit_addr
is defined with any value different from $addr + 1
, where the second byte is stored, then the same sequence of bytes is decoded as ld hl,de
.
To decode standard Z80 instructions, do not pass the $limit_addr
argument.
To decode extended Z80 instructions, pass the address of the next label after $addr
, or 0x10000 to get always the longest instruction.
If the instruction at the given address is an invalid opcode, or if there are no loaded bytes at the given address, the instrution object is not constructed and the factory returns undef
.
defb
Factory method to create a new object by disassembling a defb
instruction at the given address, reading one or $count
byte(s) from memory.
defb2
Same as defb but shows binary data.
defw
Factory method to create a new object by disassembling a defw
instruction at the given address, reading one or $count
word(s) from memory.
defm
Factory method to create a new object by disassembling a defm
instruction at the given address, reading $length
character(s) from memory.
defmz
Factory method to create a new object by disassembling a defmz
instruction at the given address, reading character(s) from memory until a zero terminator is found.
defm7
Factory method to create a new object by disassembling a defm7
instruction at the given address, reading character(s) from memory until a character with bit 7 set is found.
org
Factory method to create a new ORG instruction.
ATTRIBUTES
memory
Point to the memory object from where this instruction was disassembled.
addr
Address of the instruction.
size
Size of the instruction, in bytes.
next_addr
Returns the address that follows this instruction.
next_code
Returns the list with the next possible addresses where the code flow can continue.
For an instruction that does not branch, this is the same as next_addr
.
For a decision-branch instruction, these are the next_addr
and the NN
.
For an instruction that breaks the flow (e.g. ret
), this is an empty list.
A call
or rst
instruction is considered as breaking the flow, because the called routine might manipulate the return pointer in the stack, and the bytes after the call
or rst
instruction can be data bytes.
bytes
Reference to a list of the instruction bytes. The bytes are retrieved from the CPU::Z80::Disassembler::Memory object.
opcode
Canonical assembly instruction, e.g. 'ld a,(NN)'. The possible argument types are N, NN, DIS and STR. There is one method to get/set each of the argument types.
N
8-bit data used by the instruction.
N2
8-bit data used by the instruction, to be shown in base 2.
NN
16-bit data used by the instruction.
DIS
Offset for index register.
STR
String for defm* instructions.
comment
Comment to be written after a '; ' at the end of the line.
format
Returs the hash of special formating functions for each type of argument. These functions, if defined, are called instead of the ones in the CPU::Z80::Disassembler::Format module to format each type of argument.
For example, to format the 8-bit argument of an instruction as decimal:
$instr->format->{N} = sub { my $v = shift; return "$v" };
PREDICATES
is_code
Return TRUE if the instruction is a Z80 assembly opcode, FALSE if it is one of the data definition or org instructions.
is_call
Return TRUE if the instruction is a call instruction, i.e. call
or rst
.
is_branch
Return TRUE if the instruction may branch to another address, the address is stored in the NN
attribute. This is either a jump or a call instruction.
is_break_flow
Return TRUE if the instruction breaks the flow at this point and jumps to some other part of the code. A call instruction is considered as breaking the flow, see next_code
above.
FUNCTIONS
as_string
Returns the disassembled instruction opcode and arguments.
dump
Returns the disassembly dump ready to print, containing address, bytes and instruction, followed by newline.
asm
Returns the disassembly asm line ready to print, containing instruction and comments, followed by newline.