view release on metacpan or search on metacpan
lib/CPU/Z80/Disassembler.pm view on Meta::CPAN
architecture.
It is an error to overwrite a control file.
The Control File is the input file for a disassembly run in an interactive disassembly
session, and the outout is the <bin_file>.asm. After each run, the user studies the output
.asm file, and includes new commands in the control file to add information to the
.asm file on the next run.
This function creates a template control file that contains just the hex dump of the
binary file and the decoded assembly instruction at each address, e.g.
0000 :F <bin_file>
0000 D3FD out ($FD),a
0002 01FF7F ld bc,$7FFF
0005 C3CB03 jp $03CB
The control file commands start with a ':' and refer to the hexadecimal address at the
start of the line.
Some commands operate on a range of addresses and accept the inclusive range limits separated
lib/CPU/Z80/Disassembler/Instruction.pm view on Meta::CPAN
=head2 disassemble
Factory method to create a new object by disassembling the given
L<CPU::Z80::Disassembler::Memory|CPU::Z80::Disassembler::Memory> object
at the given address.
The C<$limit_addr> argument, if defined, tells the disassembler to select
the longest possible instruction, that does not use the byte at C<$limit_add>.
The default is to select the shortest possible instruction.
For example, the sequence of bytes C<62 6B> is decoded as C<ld h,d> if
C<$limit_addr> is undef.
If C<$limit_addr> is defined with any value different from C<$addr + 1>, where
the second byte is stored, then the same sequence of bytes is decoded as
C<ld hl,de>.
To decode standard Z80 instructions, do not pass the C<$limit_addr> argument.
To decode extended Z80 instructions, pass the address of the next label after
C<$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 C<undef>.
lib/CPU/Z80/Disassembler/Instruction.pm view on Meta::CPAN
#------------------------------------------------------------------------------
sub disassemble {
my($class, $memory, $addr, $limit_addr) = @_;
my $self = bless { memory => $memory,
addr => $addr,
is_code => 1,
}, $class;
# save bytes of all decoded instructions
my @found; # other instructions found
my $table = Asm::Z80::Table->disasm_table;
for ( ;
# exit if second instruction goes over limit, e.g. label
! (defined($limit_addr) && @found && $addr == $limit_addr) ;
$addr++
) {
# fetch
my $byte = $memory->peek($addr);
t/data/zx48.asm view on Meta::CPAN
LD C,(IY+$07) ; pick up MODE (3 bytes)
LD D,(IY+$01) ; pick up FLAGS (3 bytes)
PUSH HL ; save state map location
; Note. could now have used, to avoid IY,
; ld l,$41; ld c,(hl); ld l,$3B; ld d,(hl).
; six and two threes of course.
CALL L0333 ; routine K-DECODE
POP HL ; restore map pointer
LD (HL),A ; put the decoded key in last location of map.
;; K-END
L0308: LD ($5C08),A ; update LASTK system variable.
SET 5,(IY+$01) ; update FLAGS - signal a new key.
RET ; return to interrupt routine.
; -----------------------
; THE 'REPEAT KEY' BRANCH
; -----------------------
; A possible repeat has been identified. HL addresses the raw key.
; The last location of the key map holds the decoded key from the first
; context. This could be a keyword and, with the exception of NOT a repeat
; is syntactically incorrect and not really desirable.
;; K-REPEAT
L0310: INC HL ; increment the map pointer to second location.
LD (HL),$05 ; maintain interrupt counter at 5.
INC HL ; now point to third location.
DEC (HL) ; decrease the REPDEL value which is used to
; time the delay of a repeat key.
RET NZ ; return if not yet zero.
LD A,($5C0A) ; fetch the system variable value REPPER.
LD (HL),A ; for subsequent repeats REPPER will be used.
INC HL ; advance
;
LD A,(HL) ; pick up the key decoded possibly in another
; context.
; Note. should compare with $A5 (RND) and make
; a simple return if this is a keyword.
; e.g. cp $a5; ret nc; (3 extra bytes)
JR L0308 ; back to K-END
; ----------------------
; THE 'KEY-TEST' ROUTINE
; ----------------------
; also called from s-inkey$
t/data/zx48.asm view on Meta::CPAN
; ---
;; K-@-CHAR
L03B2: LD A,$40 ; substitute ASCII '@'
RET ; return.
; ------------------------------------------------------------------------
; The Spectrum Input character keys. One or two are abbreviated.
; From $00 Flash 0 to $FF COPY. The routine above has decoded all these.
; | 00 Fl0| 01 Fl1| 02 Br0| 03 Br1| 04 In0| 05 In1| 06 CAP| 07 EDT|
; | 08 LFT| 09 RIG| 0A DWN| 0B UP | 0C DEL| 0D ENT| 0E SYM| 0F GRA|
; | 10 Ik0| 11 Ik1| 12 Ik2| 13 Ik3| 14 Ik4| 15 Ik5| 16 Ik6| 17 Ik7|
; | 18 Pa0| 19 Pa1| 1A Pa2| 1B Pa3| 1C Pa4| 1D Pa5| 1E Pa6| 1F Pa7|
; | 20 SP | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
; | 28 ( | 29 ) | 2A * | 2B + | 2C , | 2D - | 2E . | 2F / |
; | 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
; | 38 8 | 39 9 | 3A : | 3B ; | 3C < | 3D = | 3E > | 3F ? |
; | 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
t/data/zx48_base.asm view on Meta::CPAN
ld c,(iy+0x07) ; pick up MODE (3 bytes)
ld d,(iy+0x01) ; pick up FLAGS (3 bytes)
push hl ; save state map location
; Note. could now have used, to avoid IY,
; ld l,$41; ld c,(hl); ld l,$3B; ld d,(hl).
; six and two threes of course.
call K_DECODE ; routine K-DECODE
pop hl ; restore map pointer
ld (hl),a ; put the decoded key in last location of map.
;; K-END
K_END:
ld (0x5C08),a ; update LASTK system variable.
set 5,(iy+0x01) ; update FLAGS - signal a new key.
ret ; return to interrupt routine.
; -----------------------
; THE 'REPEAT KEY' BRANCH
; -----------------------
; A possible repeat has been identified. HL addresses the raw key.
; The last location of the key map holds the decoded key from the first
; context. This could be a keyword and, with the exception of NOT a repeat
; is syntactically incorrect and not really desirable.
;; K-REPEAT
K_REPEAT:
inc hl ; increment the map pointer to second location.
ld (hl),0x05 ; maintain interrupt counter at 5.
inc hl ; now point to third location.
dec (hl) ; decrease the REPDEL value which is used to
; time the delay of a repeat key.
ret nz ; return if not yet zero.
ld a,(0x5C0A) ; fetch the system variable value REPPER.
ld (hl),a ; for subsequent repeats REPPER will be used.
inc hl ; advance
ld a,(hl) ; pick up the key decoded possibly in another
; context.
; Note. should compare with $A5 (RND) and make
; a simple return if this is a keyword.
; e.g. cp $a5; ret nc; (3 extra bytes)
jr K_END ; back to K-END
; ----------------------
; THE 'KEY-TEST' ROUTINE
; ----------------------
; also called from s-inkey$
t/data/zx48_base.asm view on Meta::CPAN
; ---
;; K-@-CHAR
K___CHAR:
ld a,0x40 ; substitute ASCII '@'
ret ; return.
; ------------------------------------------------------------------------
; The Spectrum Input character keys. One or two are abbreviated.
; From $00 Flash 0 to $FF COPY. The routine above has decoded all these.
; | 00 Fl0| 01 Fl1| 02 Br0| 03 Br1| 04 In0| 05 In1| 06 CAP| 07 EDT|
; | 08 LFT| 09 RIG| 0A DWN| 0B UP | 0C DEL| 0D ENT| 0E SYM| 0F GRA|
; | 10 Ik0| 11 Ik1| 12 Ik2| 13 Ik3| 14 Ik4| 15 Ik5| 16 Ik6| 17 Ik7|
; | 18 Pa0| 19 Pa1| 1A Pa2| 1B Pa3| 1C Pa4| 1D Pa5| 1E Pa6| 1F Pa7|
; | 20 SP | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
; | 28 ( | 29 ) | 2A * | 2B + | 2C , | 2D - | 2E . | 2F / |
; | 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
; | 38 8 | 39 9 | 3A : | 3B ; | 3C < | 3D = | 3E > | 3F ? |
; | 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
t/data/zx48_benchmark.asm view on Meta::CPAN
ld c, (iy+MODE-IY0) ; pick up MODE (3 bytes)
ld d, (iy+FLAGS-IY0) ; pick up FLAGS (3 bytes)
push hl ; save state map location
; Note. could now have used, to avoid IY,
; ld l,$41; ld c,(hl); ld l,$3B; ld d,(hl).
; six and two threes of course.
call K_DECODE ; routine K-DECODE
pop hl ; restore map pointer
ld (hl), a ; put the decoded key in last location of map.
;; K-END
K_END:
ld (LAST_K), a ; update LASTK system variable.
set 5, (iy+FLAGS-IY0) ; update FLAGS - signal a new key.
ret ; return to interrupt routine.
; -----------------------
; THE 'REPEAT KEY' BRANCH
; -----------------------
; A possible repeat has been identified. HL addresses the raw key.
; The last location of the key map holds the decoded key from the first
; context. This could be a keyword and, with the exception of NOT a repeat
; is syntactically incorrect and not really desirable.
;; K-REPEAT
K_REPEAT:
inc hl ; increment the map pointer to second location.
ldi (hl), $05 ; maintain interrupt counter at 5.
; now point to third location.
dec (hl) ; decrease the REPDEL value which is used to
; time the delay of a repeat key.
ret nz ; return if not yet zero.
ld a, (REPPER) ; fetch the system variable value REPPER.
ldi (hl), a ; for subsequent repeats REPPER will be used.
; advance
ld a, (hl) ; pick up the key decoded possibly in another
; context.
; Note. should compare with $A5 (RND) and make
; a simple return if this is a keyword.
; e.g. cp $a5; ret nc; (3 extra bytes)
jr K_END ; back to K-END
; ----------------------
; THE 'KEY-TEST' ROUTINE
; ----------------------
t/data/zx48_benchmark.asm view on Meta::CPAN
;; K-@-CHAR
K___CHAR:
ld a, $40 ; substitute ASCII '@'
ret ; return.
; ------------------------------------------------------------------------
; The Spectrum Input character keys. One or two are abbreviated.
; From $00 Flash 0 to $FF COPY. The routine above has decoded all these.
; | 00 Fl0| 01 Fl1| 02 Br0| 03 Br1| 04 In0| 05 In1| 06 CAP| 07 EDT|
; | 08 LFT| 09 RIG| 0A DWN| 0B UP | 0C DEL| 0D ENT| 0E SYM| 0F GRA|
; | 10 Ik0| 11 Ik1| 12 Ik2| 13 Ik3| 14 Ik4| 15 Ik5| 16 Ik6| 17 Ik7|
; | 18 Pa0| 19 Pa1| 1A Pa2| 1B Pa3| 1C Pa4| 1D Pa5| 1E Pa6| 1F Pa7|
; | 20 SP | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
; | 28 ( | 29 ) | 2A * | 2B + | 2C , | 2D - | 2E . | 2F / |
; | 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
; | 38 8 | 39 9 | 3A : | 3B ; | 3C < | 3D = | 3E > | 3F ? |
; | 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
t/data/zx81.asm view on Meta::CPAN
;
ld bc, (LAST_K) ; sv LAST_K
call DEBOUNCE ; routine DEBOUNCE
call DECODE ; routine DECODE
;
jr nc, LOWER ; back to LOWER
;
; -------------------------------
; THE 'KEYBOARD DECODING' SECTION
; -------------------------------
; The decoded key value is in E and HL points to the position in the
; key table. D contains zero.
;; K-DECODE
K_DECODE:
ld a, (MODE) ; Fetch value of system variable MODE
dec a ; test the three values together
;
jp m, FETCH_2 ; forward, if was zero, to FETCH-2
;
t/data/zx81.ctl view on Meta::CPAN
04DD:C
04DD 3093 jr nc, $0472 :C
:; back to LOWER
:;
04DF:C
:#; -------------------------------
:#; THE 'KEYBOARD DECODING' SECTION
:#; -------------------------------
:#; The decoded key value is in E and HL points to the position in the
:#; key table. D contains zero.
:#
:#;; K-DECODE
04DF 3A0640 ld a, ($4006) :C K_DECODE
:; Fetch value of system variable MODE
04E2:C
04E2 3D dec a :C
:; test the three values together
:;
t/data/zx81_version_2_rom_source.asm view on Meta::CPAN
LD BC,($4025) ; sv LAST_K
CALL L0F4B ; routine DEBOUNCE
CALL L07BD ; routine DECODE
JR NC,L0472 ; back to LOWER
; -------------------------------
; THE 'KEYBOARD DECODING' SECTION
; -------------------------------
; The decoded key value is in E and HL points to the position in the
; key table. D contains zero.
;; K-DECODE
L04DF: LD A,($4006) ; Fetch value of system variable MODE
DEC A ; test the three values together
JP M,L0508 ; forward, if was zero, to FETCH-2
JR NZ,L04F7 ; forward, if was 2, to FETCH-1