Spencer's Z80 Assembler Manual

Sections
General Information
Specific Instructions
Terminal Use
#comment
#include
.echo
.org

Background Information
This assembler was written not add another generic tool to the oversaturated assembler "marketplace," but to actually do something different. I needed a fast assembler. TASM wasn't cutting it. When you're impatient, you debug often, or are writing too much code for other assemblers to handle, this assembler is your new best friend.

Examples in this readme are going to be written in z80-assembly, as this is the intended target. Though, with other table files, other architectures are certainly possible.

General Information
Labels:
Labels in SPASM are much like TASM 3.2. The prefered style of label is the colon terminated, like this:
Label:
	ld a,30
	ret

;With labels, you can use this syntax:

Label2:	ld a,25 \ ret
Also permitted is the non-colon terminated line label.
label
	xor a
	ld (ram_loc),a
	ret

;Like above, the following is acceptable:

label2	inc a
	ld (ram_loc+1),a
	ret

Arithmetic: SPASM uses no-questions-asked order of operations: left-to-right. This is prefered for speed reasons as well as ambiguity between operators -- who really knows which of these operators should come first? % or &?

The operators available are as follows: * / - + % ^ & | << >>

 ld a,10*15		;= 150  multiply
 ld b,254/12		;= 12   integer divide (it truncates)
 ld c,10-30		;= -20  subtract
 ld d,-(10-23)		;= 13   negate
 ld e,10+10		;= 20   addition
 ld h,10^3		;= 9    bitwise exclusive or
 ld l,17 & 1		;= 1    bitwise and
 .db 10 | 5		;= 15   bitwise or
 .dw 1<<4		;= 16   arithmetic left shift
 ld hl,16>>4		;= 1    arithmetic right shift

;Example of order of operations:

 ld hl,25*256+10	;h = 25, l = 10
 ld hl,10+25*256	;h = 250,l = 0
 ld hl,10+(25*256)	;h = 25, l = 10

Macros:
SPASM macros were built to be fast, more than anything else. I generally preserve the functionality of other assemblers while keeping it simple. There are three types of macros, all invoked by the preprocess keyword #define:
  • Dimensionless Macros (Boolean Defines)
  • Replacement Macros (Defines)
  • Argumented Replacement Macros
Dimensionless:
Macros of this nature are not defined explicitly by the programmer, rather they are set to an arbitrary default. SPASM uses these as a quick Boolean Define for the #IFDEF preprocess.

#define on_emulator

#ifdef on_emulator
	push de
	pop ix
#else
	ld ixl,e
	ld ixh,d
#endif

Replacement: Replacement macros are the equivalent of a "named" copy and paste. They are not parsed until they are substituted, so they're ideal for making forward label references. Keep in mind that they can only make forward references to other defines as long as the define does not reference them in return.
#define value 56
#define other_value value+10

;Defines like these can be used in the #IF preprocess:
#if other_value > value
	.dw other_value
#else
	.dw value
#endif


Argumented Replacement:
The most complex of the macros, argumented replacement macros allows certain values of replacement macro to be changed before parsing. This allows the same macro to be used under multiple circumstances.
#define my_modulo(base, mod) (base - (base*(base/mod)))
#define llo(val) (val & $FF)
 .db llo( my_modulo(10,3))
 .db my_modulo(10,3)

Example code
label:
	ld hl,20
	ld a,20		;20's for everyone!
#comment
	This is a block comment.
	Woohoo.
#endcomment
Terminal Use
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\assembly>dir
03/20/2006  03:19 AM  52,000 assembler.exe
03/23/2006  03:04 PM   4,000 assemblyfile.asm
03/20/2006  03:19 AM  23,080 tasm80.tab

C:\assembly>assembler assemblyfile.asm -T
Spencer's Assembler, March 2006
Beginning assembly ...
Pass 1 ...
Done.
Pass 2 ...
Done.
C:\assembly>dir
03/20/2006  03:19 AM  52,000 assembler.exe
03/23/2006  03:04 PM   4,000 assemblyfile.asm
03/23/2006  03:09 PM     900 assemblyfile.bin
03/23/2006  03:09 PM   4,800 assemblyfile.lst
03/20/2006  03:19 AM  23,080 tasm80.tab