1 @c Copyright (C) 2011-2026 Free Software Foundation, Inc. 2 @c This is part of the GAS manual. 3 @c For copying conditions, see the file as.texinfo. 4 5 @ifset GENERIC 6 @page 7 @node Z80-Dependent 8 @chapter Z80 Dependent Features 9 @end ifset 10 11 12 @ifclear GENERIC 13 @node Machine Dependencies 14 @chapter Z80 Dependent Features 15 @end ifclear 16 17 @cindex Z80 support 18 @menu 19 * Z80 Options:: Options 20 * Z80 Syntax:: Syntax 21 * Z80 Floating Point:: Floating Point 22 * Z80 Directives:: Z80 Machine Directives 23 * Z80 Opcodes:: Opcodes 24 @end menu 25 26 @node Z80 Options 27 @section Command-line Options 28 @cindex Z80 options 29 @cindex options for Z80 30 @c man begin OPTIONS 31 @table @gcctabopt 32 33 @cindex @code{-march=} command-line option, Z80 34 @item -march=@var{CPU}[-@var{EXT}@dots{}][+@var{EXT}@dots{}] 35 This option specifies the target processor. The assembler will issue 36 an error message if an attempt is made to assemble an instruction which 37 will not execute on the target processor. The following processor names 38 are recognized: 39 @code{z80}, 40 @code{z180}, 41 @code{ez80}, 42 @code{gbz80}, 43 @code{z80n}, 44 @code{r800}. 45 In addition to the basic instruction set, the assembler can be told to 46 accept some extension mnemonics. For example, 47 @code{-march=z180+sli+infc} extends @var{z180} with @var{SLI} instructions and 48 @var{IN F,(C)}. The following extensions are currently supported: 49 @code{full} (all known instructions), 50 @code{adl} (ADL CPU mode by default, eZ80 only), 51 @code{sli} (instruction known as @var{SLI}, @var{SLL} or @var{SL1}), 52 @code{xyhl} (instructions with halves of index registers: @var{IXL}, @var{IXH}, 53 @var{IYL}, @var{IYH}), 54 @code{xdcb} (instructions like @var{RotOp (II+d),R} and @var{BitOp n,(II+d),R}), 55 @code{infc} (instruction @var{IN F,(C)} or @var{IN (C)}), 56 @code{outc0} (instruction @var{OUT (C),0}). 57 Note that rather than extending a basic instruction set, the extension 58 mnemonics starting with @code{-} revoke the respective functionality: 59 @code{-march=z80-full+xyhl} first removes all default extensions and adds 60 support for index registers halves only. 61 62 If this option is not specified then @code{-march=z80+xyhl+infc} is assumed. 63 64 @cindex @code{-local-prefix} command-line option, Z80 65 @item -local-prefix=@var{prefix} 66 Mark all labels with specified prefix as local. But such label can be 67 marked global explicitly in the code. This option do not change default 68 local label prefix @code{.L}, it is just adds new one. 69 70 @cindex @code{-colonless} command-line option, Z80 71 @item -colonless 72 Accept colonless labels. All symbols at line begin are treated as labels. 73 74 @cindex @code{-sdcc} command-line option, Z80 75 @item -sdcc 76 Accept assembler code produced by SDCC. 77 78 @cindex @code{-fp-s} command-line option, Z80 79 @item -fp-s=@var{FORMAT} 80 Single precision floating point numbers format. Default: ieee754 (32 bit). 81 82 @cindex @code{-fp-d} command-line option, Z80 83 @item -fp-d=@var{FORMAT} 84 Double precision floating point numbers format. Default: ieee754 (64 bit). 85 @end table 86 @c man end 87 88 Floating point numbers formats. 89 @table @option 90 @item @code{ieee754} 91 Single or double precision IEEE754 compatible format. 92 93 @item @code{half} 94 Half precision IEEE754 compatible format (16 bits). 95 96 @item @code{single} 97 Single precision IEEE754 compatible format (32 bits). 98 99 @item @code{double} 100 Double precision IEEE754 compatible format (64 bits). 101 102 @item @code{zeda32} 103 32 bit floating point format from z80float library by Zeda. 104 105 @item @code{math48} 106 48 bit floating point format from Math48 package by Anders Hejlsberg. 107 @end table 108 109 @cindex Z80 Syntax 110 @node Z80 Syntax 111 @section Syntax 112 The assembler syntax closely follows the 'Z80 family CPU User Manual' by 113 Zilog. 114 In expressions a single @samp{=} may be used as ``is equal to'' 115 comparison operator. 116 117 Suffices can be used to indicate the radix of integer constants; 118 @samp{H} or @samp{h} for hexadecimal, @samp{D} or @samp{d} for decimal, 119 @samp{Q}, @samp{O}, @samp{q} or @samp{o} for octal, and @samp{B} for 120 binary. 121 122 The suffix @samp{b} denotes a backreference to local label. 123 124 @menu 125 * Z80-Chars:: Special Characters 126 * Z80-Regs:: Register Names 127 * Z80-Case:: Case Sensitivity 128 * Z80-Labels:: Labels 129 @end menu 130 131 @node Z80-Chars 132 @subsection Special Characters 133 134 @cindex line comment character, Z80 135 @cindex Z80 line comment character 136 The semicolon @samp{;} is the line comment character; 137 138 If a @samp{#} appears as the first character of a line then the whole 139 line is treated as a comment, but in this case the line could also be 140 a logical line number directive (@pxref{Comments}) or a preprocessor 141 control command (@pxref{Preprocessing}). 142 143 @cindex line separator, Z80 144 @cindex statement separator, Z80 145 @cindex Z80 line separator 146 The Z80 assembler does not support a line separator character. 147 148 @cindex location counter, Z80 149 @cindex hexadecimal prefix, Z80 150 @cindex Z80 $ 151 The dollar sign @samp{$} can be used as a prefix for hexadecimal numbers 152 and as a symbol denoting the current location counter. 153 154 @cindex character escapes, Z80 155 @cindex Z80, \ 156 A backslash @samp{\} is an ordinary character for the Z80 assembler. 157 158 @cindex character constant, Z80 159 @cindex single quote, Z80 160 @cindex Z80 ' 161 The single quote @samp{'} must be followed by a closing quote. If there 162 is one character in between, it is a character constant, otherwise it is 163 a string constant. 164 165 @node Z80-Regs 166 @subsection Register Names 167 @cindex Z80 registers 168 @cindex register names, Z80 169 170 The registers are referred to with the letters assigned to them by 171 Zilog. In addition @command{@value{AS}} recognizes @samp{ixl} and 172 @samp{ixh} as the least and most significant octet in @samp{ix}, and 173 similarly @samp{iyl} and @samp{iyh} as parts of @samp{iy}. 174 175 @c The @samp{'} in @samp{ex af,af'} may be omitted. 176 177 @node Z80-Case 178 @subsection Case Sensitivity 179 @cindex Z80, case sensitivity 180 @cindex case sensitivity, Z80 181 182 Upper and lower case are equivalent in register names, opcodes, 183 condition codes and assembler directives. 184 The case of letters is significant in labels and symbol names. The case 185 is also important to distinguish the suffix @samp{b} for a backward reference 186 to a local label from the suffix @samp{B} for a number in binary notation. 187 188 @node Z80-Labels 189 @subsection Labels 190 191 @cindex labels, Z80 192 @cindex Z80 labels 193 Labels started by @code{.L} acts as local labels. You may specify custom local 194 label prefix by @code{-local-prefix} command-line option. 195 Dollar, forward and backward local labels are supported. By default, all labels 196 are followed by colon. 197 Legacy code with colonless labels can be built with @code{-colonless} 198 command-line option specified. In this case all tokens at line begin are treated 199 as labels. 200 201 @node Z80 Floating Point 202 @section Floating Point 203 @cindex floating point, Z80 204 @cindex Z80 floating point 205 Floating-point numbers of following types are supported: 206 207 @table @option 208 @item @code{ieee754} 209 Supported half, single and double precision IEEE754 compatible numbers. 210 211 @item @code{zeda32} 212 32 bit floating point numbers from z80float library by Zeda. 213 214 @item @code{math48} 215 48 bit floating point numbers from Math48 package by Anders Hejlsberg. 216 @end table 217 218 @node Z80 Directives 219 @section Z80 Assembler Directives 220 @cindex Z80-only directives 221 222 @command{@value{AS}} for the Z80 supports some additional directives for 223 compatibility with other assemblers. 224 225 These are the additional directives in @code{@value{AS}} for the Z80: 226 227 @table @code 228 @item @code{.assume ADL = @var{expression}} 229 @cindex @code{.assume} directive, Z80 230 Set ADL status for eZ80. Non-zero value enable compilation in ADL mode else 231 used Z80 mode. ADL and Z80 mode produces incompatible object code. Mixing 232 both of them within one binary may lead problems with disassembler. 233 234 @item @code{db @var{expression}|@var{string}[,@var{expression}|@var{string}...]} 235 @cindex @code{db} directive, Z80 236 @itemx @code{defb @var{expression}|@var{string}[,@var{expression}|@var{string}...]} 237 @cindex @code{defb} directive, Z80 238 @itemx @code{defm @var{string}[,@var{string}...]} 239 @cindex @code{defm} directive, Z80 240 For each @var{string} the characters are copied to the object file, for 241 each other @var{expression} the value is stored in one byte. 242 A warning is issued in case of an overflow. 243 Backslash symbol in the strings is generic symbol, it cannot be used as 244 escape character. @xref{Ascii,,@code{.ascii}}. 245 246 @item @code{dw @var{expression}[,@var{expression}...]} 247 @cindex @code{dw} directive, Z80 248 @itemx @code{defw @var{expression}[,@var{expression}...]} 249 @cindex @code{defw} directive, Z80 250 For each @var{expression} the value is stored in two bytes, ignoring 251 overflow. 252 253 @item @code{d24 @var{expression}[,@var{expression}...]} 254 @cindex @code{d24} directive, Z80 255 @itemx @code{def24 @var{expression}[,@var{expression}...]} 256 @cindex @code{def24} directive, Z80 257 For each @var{expression} the value is stored in three bytes, ignoring 258 overflow. 259 260 @item @code{d32 @var{expression}[,@var{expression}...]} 261 @cindex @code{d32} directive, Z80 262 @itemx @code{def32 @var{expression}[,@var{expression}...]} 263 @cindex @code{def32} directive, Z80 264 For each @var{expression} the value is stored in four bytes, ignoring 265 overflow. 266 267 @item @code{ds @var{count}[, @var{value}]} 268 @cindex @code{ds} directive, Z80 269 @itemx @code{defs @var{count}[, @var{value}]} 270 @cindex @code{defs} directive, Z80 271 @c Synonyms for @code{ds.b}, 272 @c which should have been described elsewhere 273 Fill @var{count} bytes in the object file with @var{value}, if 274 @var{value} is omitted it defaults to zero. 275 276 @item @code{@var{symbol} defl @var{expression}} 277 @cindex @code{defl} directive, Z80 278 The @code{defl} directive is like @code{.set} but with different 279 syntax. @xref{Set,,@code{.set}}. 280 It set the value of @var{symbol} to @var{expression}. Symbols defined 281 with @code{defl} are not protected from redefinition. 282 283 @item @code{@var{symbol} equ @var{expression}} 284 @cindex @code{equ} directive, Z80 285 The @code{equ} directive is like @code{.equiv} but with different 286 syntax. @xref{Equiv, ,@code{.equiv}}. 287 It set the value of @var{symbol} to @var{expression}. It is an error 288 if @var{symbol} is already defined. Symbols defined with @code{equ} 289 are not protected from redefinition. 290 291 @item @code{psect @var{name}} 292 @cindex @code{psect} directive, Z80 293 A synonym for @code{.section}, no second argument should be given. 294 @xref{Section,,@code{.section}}. 295 296 @item @code{xdef @var{symbol}} 297 @cindex @code{xdef} directive, Z80 298 A synonym for @code{.global}, make @var{symbol} is visible to linker. 299 @xref{Global,,@code{.global}}. 300 301 @item @code{xref @var{name}} 302 @cindex @code{xref} directive, Z80 303 A synonym for @code{.extern} (@ref{Extern,,@code{.extern}}). 304 @ignore 305 306 The following attributes will possibly be recognized in the future 307 @table @code 308 @item abs 309 The section is to be absolute. @code{@value{AS}} will issue an error 310 message because it can not produce an absolute section. 311 @item global 312 The section is to be concatenated with other sections of the same name 313 by the linker, this is the default. 314 @item local 315 The section is not global. @code{@value{AS}} will issue a warning if 316 object file format is not soff. 317 @item ovrld 318 The section is to be overlapped with other sections of the same name by 319 the linker. @code{@value{AS}} will issue an error message 320 because it can not mark a section as such. 321 @item pure 322 The section is marked as read only. 323 @end table 324 @end ignore 325 326 @end table 327 328 @node Z80 Opcodes 329 @section Opcodes 330 In line with common practice, Z80 mnemonics are used for the Z80, 331 Z80N, Z180, eZ80, Ascii R800 and the GameBoy Z80. 332 333 In many instructions it is possible to use one of the half index 334 registers (@samp{ixl},@samp{ixh},@samp{iyl},@samp{iyh}) in stead of an 335 8-bit general purpose register. This yields instructions that are 336 documented on the eZ80 and the R800, undocumented on the Z80 and 337 unsupported on the Z180. 338 Similarly @code{in f,(c)} is documented on the R800, undocumented on 339 the Z80 and unsupported on the Z180 and the eZ80. 340 341 The assembler also supports the following undocumented Z80-instructions, 342 that have not been adopted in any other instruction set: 343 @table @code 344 @item out (c),0 345 Sends zero to the port pointed to by register @code{C}. 346 347 @item sli @var{m} 348 Equivalent to @code{@var{m} = (@var{m}<<1)+1}, the operand @var{m} can 349 be any operand that is valid for @samp{sla}. One can use @samp{sll} as a 350 synonym for @samp{sli}. 351 352 @item @var{op} (ix+@var{d}), @var{r} 353 This is equivalent to 354 355 @example 356 ld @var{r}, (ix+@var{d}) 357 @var{op} @var{r} 358 ld (ix+@var{d}), @var{r} 359 @end example 360 361 The operation @samp{@var{op}} may be any of @samp{res @var{b},}, 362 @samp{set @var{b},}, @samp{rl}, @samp{rlc}, @samp{rr}, @samp{rrc}, 363 @samp{sla}, @samp{sli}, @samp{sra} and @samp{srl}, and the register 364 @samp{@var{r}} may be any of @samp{a}, @samp{b}, @samp{c}, @samp{d}, 365 @samp{e}, @samp{h} and @samp{l}. 366 367 @item @var{op} (iy+@var{d}), @var{r} 368 As above, but with @samp{iy} instead of @samp{ix}. 369 @end table 370 371 The web site at @uref{http://www.z80.info} is a good starting place to 372 find more information on programming the Z80. 373 374 You may enable or disable any of these instructions for any target CPU 375 even this instruction is not supported by any real CPU of this type. 376 Useful for custom CPU cores. 377