CPU-Z80-Disassembler
view release on metacpan or search on metacpan
lib/CPU/Z80/Disassembler.pm view on Meta::CPAN
=cut
#------------------------------------------------------------------------------
# Hold a disassembly session
use base 'Class::Accessor';
__PACKAGE__->mk_accessors(
'memory', # memory to disassemble
'_type', # identified type of each memory address, TYPE_xxx
'instr', # array of Instruction objects at each address
'labels', # all defined labels
'_call_instr', # hash of all call instructions where we are blocked
'_can_call', # hash of all subroutines we may call:
# 1 : can be called, no stack impact
# 0 : has stack impact, needs to be checked manually
# sub {} : call sub->($self, $next_addr) to handle
# stack impact and return next code addresses
# to continue disassembly after call
'_block_comments',
# array of block comment string at each address, printed before
# the address
'header', 'footer',
lib/CPU/Z80/Disassembler.pm view on Meta::CPAN
}
elsif ($can_call) {
push @stack, $instr->next_addr; # can continue
}
}
# continue on next addresses
push @stack, $instr->next_code;
}
# check if we can unwind any blocked calls, after all paths without calls are
# exhausted
push @stack, $self->_check_call_instr;
}
}
#------------------------------------------------------------------------------
sub _check_call_instr {
my($self) = @_;
my @stack;
# check simple call instructions where we blocked
for my $addr (keys %{$self->_call_instr}) {
my $instr = $self->_get_instr($addr);
my $call_addr = $instr->NN;
if ( # if any of the calls is conditional, then _can_call
$instr->opcode =~ /call \w+,NN/
||
# if address after the call is CODE, then _can_call
$self->get_type($instr->next_addr) eq TYPE_CODE
) {
t/data/zx48.asm view on Meta::CPAN
; in the BC register or zero if no digits exist before commands.
; It is called from LINE-SCAN to check the syntax of the digits.
; It is called from MAIN-3 to extract the line number in preparation for
; inclusion of the line in the BASIC program area.
;
; Interestingly the calculator stack is moved from its normal place at the
; end of dynamic memory to an adequate area within the system variables area.
; This ensures that in a low memory situation, that valid line numbers can
; be extracted without raising an error and that memory can be reclaimed
; by deleting lines. If the stack was in its normal place then a situation
; arises whereby the Spectrum becomes locked with no means of reclaiming space.
;; E-LINE-NO
L19FB: LD HL,($5C59) ; load HL from system variable E_LINE.
DEC HL ; decrease so that NEXT_CHAR can be used
; without skipping the first digit.
LD ($5C5D),HL ; store in the system variable CH_ADD.
RST 20H ; NEXT-CHAR skips any noise and white-space
t/data/zx48_base.asm view on Meta::CPAN
; in the BC register or zero if no digits exist before commands.
; It is called from LINE-SCAN to check the syntax of the digits.
; It is called from MAIN-3 to extract the line number in preparation for
; inclusion of the line in the BASIC program area.
;
; Interestingly the calculator stack is moved from its normal place at the
; end of dynamic memory to an adequate area within the system variables area.
; This ensures that in a low memory situation, that valid line numbers can
; be extracted without raising an error and that memory can be reclaimed
; by deleting lines. If the stack was in its normal place then a situation
; arises whereby the Spectrum becomes locked with no means of reclaiming space.
;; E-LINE-NO
E_LINE_NO:
ld hl,(0x5C59) ; load HL from system variable E_LINE.
dec hl ; decrease so that NEXT_CHAR can be used
; without skipping the first digit.
ld (0x5C5D),hl ; store in the system variable CH_ADD.
t/data/zx48_benchmark.asm view on Meta::CPAN
; in the BC register or zero if no digits exist before commands.
; It is called from LINE-SCAN to check the syntax of the digits.
; It is called from MAIN-3 to extract the line number in preparation for
; inclusion of the line in the BASIC program area.
;
; Interestingly the calculator stack is moved from its normal place at the
; end of dynamic memory to an adequate area within the system variables area.
; This ensures that in a low memory situation, that valid line numbers can
; be extracted without raising an error and that memory can be reclaimed
; by deleting lines. If the stack was in its normal place then a situation
; arises whereby the Spectrum becomes locked with no means of reclaiming space.
;; E-LINE-NO
E_LINE_NO:
ld hl, (E_LINE) ; load HL from system variable E_LINE.
dec hl ; decrease so that NEXT_CHAR can be used
; without skipping the first digit.
ld (CH_ADD), hl ; store in the system variable CH_ADD.
( run in 1.191 second using v1.01-cache-2.11-cpan-49f99fa48dc )