NAME
CPU::Z80::Assembler - a Z80 assembler
SYNOPSIS
use CPU::Z80::Assembler;
my $binary = z80asm(q{
ORG 0x1000
LD A, 1
...
});
DESCRIPTION
This module provides a single subroutine which implements a Z80 assembler.
EXPORTS
By default the 'z80asm' subroutine is exported. To disable that, do:
use CPU::Z80::Assembler ();
FUNCTIONS
z80asm
This takes one parameter, a string of Z80 assembler source. It returns the assembled version as a string. If you set the $verbose
variable it will also spit out an assembler listing:
$CPU::Z80::Assembler::verbose = 1;
z80asm calls internally CPU::Z80::Assembler::Lexer to split the input source into tokens, and CPU::Z80::Assembler::Parser to translate the assembly instructions into sequences of bytes.
CPU::Z80::Assembler::Lexer in turn, calls CPU::Z80::Assembler::Macro to handle macro expansion.
SYNTAX
Instructions are separated by new lines or colons ':', and have the following format, in ASCII. Comments start with ';'. Lines starting with '#' are ignored, to handle files generated by pre-processors.
; comment beginning with ;
# comment beginning with # as first char on a line
[LABEL [:]] INSTRUCTION [: INSTRUCTION ...] [; optional comments]
LABEL [:]
LABEL = EXPRFESSION [; ...]
See CPU::Z80::Assembler::Lexer for details on the allowed source file tokens.
Numbers
Numbers can be supplied in either decimal, hexadecimal, or binary. Numbers must start with a digit 0 to 9. Hex numbers have a leading 0x (0x****) or a trailing H (0****H). Binary numbers have a leading 0b (0b****) or a trailing B (****B).
Pseudo-instructions
- DEFB 0x12
-
A byte of data
- DEFW 0x1234
-
A 16-bit word of data, in little-endian order. So the example would actually insert 0x34 followed by 0x12.
- DEFT "literal text", 0x00
-
A literal string, either single- or double-quoted. Can optionally be followed by a comma-seperated list of bytes. Quoted text can not include the quotes surrounding it or newlines.
- ORG 0x4567
-
Tell the assembler to start building the code at this address. Must be the first instruction and can only appear once. If absent, defaults to 0x0000. This value is available in an assembler label called 'org'.
- INCLUDE "filename"
-
Include another file. This is not recursive. If you want recursion, use the C pre-processor.
Mnemonics
Standard Z80 mnemonics are used. The "unofficial" Z80 instructions are not yet supported.
RST vectors
The RST instruction takes as its parameter either the address to jump to or the reset vector number - this is just the address / 8.
This means that, for example, RST 0x28 == RST 5.
DJNZ and JR
The DJNZ and JR instructions take an address as their destination, not an offset. If you need to use an offset, do sums on $. Note that $ is the address of the *current* instruction. The offset needs to be calculated from the address of the *next* instruction, which for these instructions is always $ + 2.
STOP
This extra instruction (which assembles to 0xDD 0xDD 0x00) is provided for the convenience of those using the CPU::Emulator::Z80 module.
Labels
Labels may be preceded by a dollar sign '$', must start with a letter or underscore, and consist solely of letters, underscores and numbers. They default to having the value of the address they are created at. If you want to assign another value, then you can say:
label = 0x1234
You can use $ to refer to the current address. Mathemagical operations are allowed too - the value is parsed as perl, and you can refer to other labels as their name:
label = $ + 8
otherlabel = label / 2 + 3
Macros
Macros are supported. See CPU::Z80::Assembler::Macro for details.
BUGS and FEEDBACK
The "unofficial" instructions are supported but need to be tested.
We welcome feedback about our code, including constructive criticism. Bug reports should be made using http://rt.cpan.org/.
SEE ALSO
CPU::Z80::Assembler::Lexer CPU::Z80::Assembler::Macro CPU::Z80::Assembler::Parser CPU::Emulator::Z80
AUTHORS, COPYRIGHT and LICENCE
Copyright 2008 David Cantrell <david@cantrell.org.uk>, Paulo Custodio <pscust@cpan.org>
This software is free-as-in-speech software, and may be used, distributed, and modified under the terms of either the GNU General Public Licence version 2 or the Artistic Licence. It's up to you which one you use. The full text of the licences can be found in the files GPL2.txt and ARTISTIC.txt, respectively.
CONSPIRACY
This software is also free-as-in-mason.