]>
Commit | Line | Data |
---|---|---|
a2c58332 | 1 | @c Copyright (C) 1991-2022 Free Software Foundation, Inc. |
60bcf0fa NC |
2 | @c This is part of the GAS manual. |
3 | @c For copying conditions, see the file as.texinfo. | |
4 | @ifset GENERIC | |
5 | @page | |
6 | @node M68HC11-Dependent | |
7 | @chapter M68HC11 and M68HC12 Dependent Features | |
8 | @end ifset | |
9 | @ifclear GENERIC | |
10 | @node Machine Dependencies | |
11 | @chapter M68HC11 and M68HC12 Dependent Features | |
12 | @end ifclear | |
13 | ||
14 | @cindex M68HC11 and M68HC12 support | |
15 | @menu | |
16 | * M68HC11-Opts:: M68HC11 and M68HC12 Options | |
17 | * M68HC11-Syntax:: Syntax | |
35b55ed2 SC |
18 | * M68HC11-Modifiers:: Symbolic Operand Modifiers |
19 | * M68HC11-Directives:: Assembler Directives | |
60bcf0fa NC |
20 | * M68HC11-Float:: Floating Point |
21 | * M68HC11-opcodes:: Opcodes | |
22 | @end menu | |
23 | ||
24 | @node M68HC11-Opts | |
25 | @section M68HC11 and M68HC12 Options | |
26 | ||
27 | @cindex options, M68HC11 | |
28 | @cindex M68HC11 options | |
35b55ed2 | 29 | The Motorola 68HC11 and 68HC12 version of @code{@value{AS}} have a few machine |
60bcf0fa NC |
30 | dependent options. |
31 | ||
35b55ed2 SC |
32 | @table @code |
33 | ||
60bcf0fa | 34 | @cindex @samp{-m68hc11} |
35b55ed2 | 35 | @item -m68hc11 |
6927f982 | 36 | This option switches the assembler into the M68HC11 mode. In this mode, |
60bcf0fa NC |
37 | the assembler only accepts 68HC11 operands and mnemonics. It produces |
38 | code for the 68HC11. | |
39 | ||
40 | @cindex @samp{-m68hc12} | |
35b55ed2 | 41 | @item -m68hc12 |
6927f982 | 42 | This option switches the assembler into the M68HC12 mode. In this mode, |
60bcf0fa | 43 | the assembler also accepts 68HC12 operands and mnemonics. It produces |
35b55ed2 | 44 | code for the 68HC12. A few 68HC11 instructions are replaced by |
60bcf0fa NC |
45 | some 68HC12 instructions as recommended by Motorola specifications. |
46 | ||
35b55ed2 SC |
47 | @cindex @samp{-m68hcs12} |
48 | @item -m68hcs12 | |
6927f982 | 49 | This option switches the assembler into the M68HCS12 mode. This mode is |
35b55ed2 SC |
50 | similar to @samp{-m68hc12} but specifies to assemble for the 68HCS12 |
51 | series. The only difference is on the assembling of the @samp{movb} | |
52 | and @samp{movw} instruction when a PC-relative operand is used. | |
53 | ||
6927f982 NC |
54 | @cindex @samp{-mm9s12x} |
55 | @item -mm9s12x | |
56 | This option switches the assembler into the M9S12X mode. This mode is | |
57 | similar to @samp{-m68hc12} but specifies to assemble for the S12X | |
58 | series which is a superset of the HCS12. | |
59 | ||
60 | @cindex @samp{-mm9s12xg} | |
61 | @item -mm9s12xg | |
62 | This option switches the assembler into the XGATE mode for the RISC | |
63 | co-processor featured on some S12X-family chips. | |
64 | ||
65 | @cindex @samp{--xgate-ramoffset} | |
66 | @item --xgate-ramoffset | |
67 | This option instructs the linker to offset RAM addresses from S12X address | |
68 | space into XGATE address space. | |
69 | ||
35b55ed2 SC |
70 | @cindex @samp{-mshort} |
71 | @item -mshort | |
72 | This option controls the ABI and indicates to use a 16-bit integer ABI. | |
73 | It has no effect on the assembled instructions. | |
74 | This is the default. | |
75 | ||
76 | @cindex @samp{-mlong} | |
77 | @item -mlong | |
78 | This option controls the ABI and indicates to use a 32-bit integer ABI. | |
79 | ||
80 | @cindex @samp{-mshort-double} | |
81 | @item -mshort-double | |
82 | This option controls the ABI and indicates to use a 32-bit float ABI. | |
83 | This is the default. | |
84 | ||
85 | @cindex @samp{-mlong-double} | |
86 | @item -mlong-double | |
87 | This option controls the ABI and indicates to use a 64-bit float ABI. | |
88 | ||
60bcf0fa | 89 | @cindex @samp{--strict-direct-mode} |
35b55ed2 | 90 | @item --strict-direct-mode |
60bcf0fa NC |
91 | You can use the @samp{--strict-direct-mode} option to disable |
92 | the automatic translation of direct page mode addressing into | |
93 | extended mode when the instruction does not support direct mode. | |
94 | For example, the @samp{clr} instruction does not support direct page | |
95 | mode addressing. When it is used with the direct page mode, | |
96 | @code{@value{AS}} will ignore it and generate an absolute addressing. | |
97 | This option prevents @code{@value{AS}} from doing this, and the wrong | |
98 | usage of the direct page mode will raise an error. | |
99 | ||
1370e33d NC |
100 | @cindex @samp{--short-branches} |
101 | @item --short-branches | |
102 | The @samp{--short-branches} option turns off the translation of | |
60bcf0fa NC |
103 | relative branches into absolute branches when the branch offset is |
104 | out of range. By default @code{@value{AS}} transforms the relative | |
105 | branch (@samp{bsr}, @samp{bgt}, @samp{bge}, @samp{beq}, @samp{bne}, | |
106 | @samp{ble}, @samp{blt}, @samp{bhi}, @samp{bcc}, @samp{bls}, | |
107 | @samp{bcs}, @samp{bmi}, @samp{bvs}, @samp{bvs}, @samp{bra}) into | |
108 | an absolute branch when the offset is out of the -128 .. 127 range. | |
109 | In that case, the @samp{bsr} instruction is translated into a | |
110 | @samp{jsr}, the @samp{bra} instruction is translated into a | |
1370e33d | 111 | @samp{jmp} and the conditional branches instructions are inverted and |
60bcf0fa NC |
112 | followed by a @samp{jmp}. This option disables these translations |
113 | and @code{@value{AS}} will generate an error if a relative branch | |
114 | is out of range. This option does not affect the optimization | |
115 | associated to the @samp{jbra}, @samp{jbsr} and @samp{jbXX} pseudo opcodes. | |
116 | ||
1370e33d NC |
117 | @cindex @samp{--force-long-branches} |
118 | @item --force-long-branches | |
119 | The @samp{--force-long-branches} option forces the translation of | |
60bcf0fa NC |
120 | relative branches into absolute branches. This option does not affect |
121 | the optimization associated to the @samp{jbra}, @samp{jbsr} and | |
34bca508 | 122 | @samp{jbXX} pseudo opcodes. |
60bcf0fa NC |
123 | |
124 | @cindex @samp{--print-insn-syntax} | |
35b55ed2 | 125 | @item --print-insn-syntax |
60bcf0fa NC |
126 | You can use the @samp{--print-insn-syntax} option to obtain the |
127 | syntax description of the instruction when an error is detected. | |
128 | ||
129 | @cindex @samp{--print-opcodes} | |
35b55ed2 | 130 | @item --print-opcodes |
60bcf0fa NC |
131 | The @samp{--print-opcodes} option prints the list of all the |
132 | instructions with their syntax. The first item of each line | |
133 | represents the instruction name and the rest of the line indicates | |
134 | the possible operands for that instruction. The list is printed | |
135 | in alphabetical order. Once the list is printed @code{@value{AS}} | |
136 | exits. | |
137 | ||
138 | @cindex @samp{--generate-example} | |
35b55ed2 | 139 | @item --generate-example |
60bcf0fa NC |
140 | The @samp{--generate-example} option is similar to @samp{--print-opcodes} |
141 | but it generates an example for each instruction instead. | |
35b55ed2 | 142 | @end table |
60bcf0fa NC |
143 | |
144 | @node M68HC11-Syntax | |
145 | @section Syntax | |
146 | ||
147 | @cindex M68HC11 syntax | |
148 | @cindex syntax, M68HC11 | |
149 | ||
150 | In the M68HC11 syntax, the instruction name comes first and it may | |
151 | be followed by one or several operands (up to three). Operands are | |
152 | separated by comma (@samp{,}). In the normal mode, | |
153 | @code{@value{AS}} will complain if too many operands are specified for | |
154 | a given instruction. In the MRI mode (turned on with @samp{-M} option), | |
155 | it will treat them as comments. Example: | |
156 | ||
157 | @smallexample | |
158 | inx | |
159 | lda #23 | |
160 | bset 2,x #4 | |
161 | brclr *bot #8 foo | |
162 | @end smallexample | |
163 | ||
7c31ae13 NC |
164 | @cindex line comment character, M68HC11 |
165 | @cindex M68HC11 line comment character | |
166 | The presence of a @samp{;} character or a @samp{!} character anywhere | |
167 | on a line indicates the start of a comment that extends to the end of | |
168 | that line. | |
169 | ||
170 | A @samp{*} or a @samp{#} character at the start of a line also | |
171 | introduces a line comment, but these characters do not work elsewhere | |
172 | on the line. If the first character of the line is a @samp{#} then as | |
173 | well as starting a comment, the line could also be logical line number | |
174 | directive (@pxref{Comments}) or a preprocessor control command | |
175 | (@pxref{Preprocessing}). | |
176 | ||
177 | @cindex line separator, M68HC11 | |
178 | @cindex statement separator, M68HC11 | |
179 | @cindex M68HC11 line separator | |
180 | The M68HC11 assembler does not currently support a line separator | |
181 | character. | |
182 | ||
60bcf0fa NC |
183 | @cindex M68HC11 addressing modes |
184 | @cindex addressing modes, M68HC11 | |
35b55ed2 | 185 | The following addressing modes are understood for 68HC11 and 68HC12: |
60bcf0fa NC |
186 | @table @dfn |
187 | @item Immediate | |
188 | @samp{#@var{number}} | |
189 | ||
190 | @item Address Register | |
191 | @samp{@var{number},X}, @samp{@var{number},Y} | |
192 | ||
193 | The @var{number} may be omitted in which case 0 is assumed. | |
194 | ||
195 | @item Direct Addressing mode | |
196 | @samp{*@var{symbol}}, or @samp{*@var{digits}} | |
197 | ||
198 | @item Absolute | |
199 | @samp{@var{symbol}}, or @samp{@var{digits}} | |
200 | @end table | |
201 | ||
35b55ed2 SC |
202 | The M68HC12 has other more complex addressing modes. All of them |
203 | are supported and they are represented below: | |
204 | ||
205 | @table @dfn | |
206 | @item Constant Offset Indexed Addressing Mode | |
207 | @samp{@var{number},@var{reg}} | |
208 | ||
209 | The @var{number} may be omitted in which case 0 is assumed. | |
210 | The register can be either @samp{X}, @samp{Y}, @samp{SP} or | |
211 | @samp{PC}. The assembler will use the smaller post-byte definition | |
212 | according to the constant value (5-bit constant offset, 9-bit constant | |
213 | offset or 16-bit constant offset). If the constant is not known by | |
214 | the assembler it will use the 16-bit constant offset post-byte and the value | |
215 | will be resolved at link time. | |
216 | ||
217 | @item Offset Indexed Indirect | |
218 | @samp{[@var{number},@var{reg}]} | |
219 | ||
220 | The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}. | |
221 | ||
222 | @item Auto Pre-Increment/Pre-Decrement/Post-Increment/Post-Decrement | |
223 | @samp{@var{number},-@var{reg}} | |
224 | @samp{@var{number},+@var{reg}} | |
225 | @samp{@var{number},@var{reg}-} | |
226 | @samp{@var{number},@var{reg}+} | |
227 | ||
228 | The number must be in the range @samp{-8}..@samp{+8} and must not be 0. | |
229 | The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}. | |
230 | ||
231 | @item Accumulator Offset | |
232 | @samp{@var{acc},@var{reg}} | |
233 | ||
234 | The accumulator register can be either @samp{A}, @samp{B} or @samp{D}. | |
235 | The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}. | |
236 | ||
237 | @item Accumulator D offset indexed-indirect | |
238 | @samp{[D,@var{reg}]} | |
239 | ||
240 | The register can be either @samp{X}, @samp{Y}, @samp{SP} or @samp{PC}. | |
241 | ||
242 | @end table | |
243 | ||
244 | For example: | |
245 | ||
246 | @smallexample | |
247 | ldab 1024,sp | |
248 | ldd [10,x] | |
249 | orab 3,+x | |
250 | stab -2,y- | |
251 | ldx a,pc | |
252 | sty [d,sp] | |
253 | @end smallexample | |
254 | ||
255 | ||
256 | @node M68HC11-Modifiers | |
257 | @section Symbolic Operand Modifiers | |
258 | ||
259 | @cindex M68HC11 modifiers | |
260 | @cindex syntax, M68HC11 | |
261 | ||
262 | The assembler supports several modifiers when using symbol addresses | |
263 | in 68HC11 and 68HC12 instruction operands. The general syntax is | |
264 | the following: | |
265 | ||
266 | @smallexample | |
267 | %modifier(symbol) | |
268 | @end smallexample | |
269 | ||
270 | @table @code | |
271 | @cindex symbol modifiers | |
272 | @item %addr | |
273 | This modifier indicates to the assembler and linker to use | |
274 | the 16-bit physical address corresponding to the symbol. This is intended | |
275 | to be used on memory window systems to map a symbol in the memory bank window. | |
276 | If the symbol is in a memory expansion part, the physical address | |
277 | corresponds to the symbol address within the memory bank window. | |
278 | If the symbol is not in a memory expansion part, this is the symbol address | |
279 | (using or not using the %addr modifier has no effect in that case). | |
280 | ||
281 | @item %page | |
282 | This modifier indicates to use the memory page number corresponding | |
283 | to the symbol. If the symbol is in a memory expansion part, its page | |
284 | number is computed by the linker as a number used to map the page containing | |
285 | the symbol in the memory bank window. If the symbol is not in a memory | |
286 | expansion part, the page number is 0. | |
287 | ||
288 | @item %hi | |
289 | This modifier indicates to use the 8-bit high part of the physical | |
290 | address of the symbol. | |
291 | ||
292 | @item %lo | |
293 | This modifier indicates to use the 8-bit low part of the physical | |
294 | address of the symbol. | |
295 | ||
296 | @end table | |
297 | ||
298 | For example a 68HC12 call to a function @samp{foo_example} stored in memory | |
299 | expansion part could be written as follows: | |
300 | ||
301 | @smallexample | |
302 | call %addr(foo_example),%page(foo_example) | |
303 | @end smallexample | |
304 | ||
305 | and this is equivalent to | |
306 | ||
307 | @smallexample | |
308 | call foo_example | |
309 | @end smallexample | |
310 | ||
311 | And for 68HC11 it could be written as follows: | |
312 | ||
313 | @smallexample | |
314 | ldab #%page(foo_example) | |
315 | stab _page_switch | |
316 | jsr %addr(foo_example) | |
317 | @end smallexample | |
318 | ||
319 | @node M68HC11-Directives | |
320 | @section Assembler Directives | |
321 | ||
322 | @cindex assembler directives, M68HC11 | |
323 | @cindex assembler directives, M68HC12 | |
324 | @cindex M68HC11 assembler directives | |
325 | @cindex M68HC12 assembler directives | |
326 | ||
327 | The 68HC11 and 68HC12 version of @code{@value{AS}} have the following | |
328 | specific assembler directives: | |
329 | ||
330 | @table @code | |
331 | @item .relax | |
332 | @cindex assembler directive .relax, M68HC11 | |
333 | @cindex M68HC11 assembler directive .relax | |
334 | The relax directive is used by the @samp{GNU Compiler} to emit a specific | |
335 | relocation to mark a group of instructions for linker relaxation. | |
336 | The sequence of instructions within the group must be known to the linker | |
337 | so that relaxation can be performed. | |
338 | ||
339 | @item .mode [mshort|mlong|mshort-double|mlong-double] | |
340 | @cindex assembler directive .mode, M68HC11 | |
341 | @cindex M68HC11 assembler directive .mode | |
342 | This directive specifies the ABI. It overrides the @samp{-mshort}, | |
343 | @samp{-mlong}, @samp{-mshort-double} and @samp{-mlong-double} options. | |
344 | ||
345 | @item .far @var{symbol} | |
346 | @cindex assembler directive .far, M68HC11 | |
347 | @cindex M68HC11 assembler directive .far | |
348 | This directive marks the symbol as a @samp{far} symbol meaning that it | |
349 | uses a @samp{call/rtc} calling convention as opposed to @samp{jsr/rts}. | |
350 | During a final link, the linker will identify references to the @samp{far} | |
351 | symbol and will verify the proper calling convention. | |
352 | ||
353 | @item .interrupt @var{symbol} | |
354 | @cindex assembler directive .interrupt, M68HC11 | |
355 | @cindex M68HC11 assembler directive .interrupt | |
356 | This directive marks the symbol as an interrupt entry point. | |
357 | This information is then used by the debugger to correctly unwind the | |
358 | frame across interrupts. | |
359 | ||
360 | @item .xrefb @var{symbol} | |
361 | @cindex assembler directive .xrefb, M68HC11 | |
362 | @cindex M68HC11 assembler directive .xrefb | |
363 | This directive is defined for compatibility with the | |
364 | @samp{Specification for Motorola 8 and 16-Bit Assembly Language Input | |
365 | Standard} and is ignored. | |
366 | ||
367 | @end table | |
368 | ||
60bcf0fa NC |
369 | @node M68HC11-Float |
370 | @section Floating Point | |
371 | ||
372 | @cindex floating point, M68HC11 | |
373 | @cindex M68HC11 floating point | |
374 | Packed decimal (P) format floating literals are not supported. | |
375 | Feel free to add the code! | |
376 | ||
377 | The floating point formats generated by directives are these. | |
378 | ||
379 | @table @code | |
380 | @cindex @code{float} directive, M68HC11 | |
381 | @item .float | |
382 | @code{Single} precision floating point constants. | |
383 | ||
384 | @cindex @code{double} directive, M68HC11 | |
385 | @item .double | |
386 | @code{Double} precision floating point constants. | |
387 | ||
388 | @cindex @code{extend} directive M68HC11 | |
389 | @cindex @code{ldouble} directive M68HC11 | |
390 | @item .extend | |
391 | @itemx .ldouble | |
392 | @code{Extended} precision (@code{long double}) floating point constants. | |
393 | @end table | |
394 | ||
395 | @need 2000 | |
396 | @node M68HC11-opcodes | |
397 | @section Opcodes | |
398 | ||
399 | @cindex M68HC11 opcodes | |
400 | @cindex opcodes, M68HC11 | |
401 | @cindex instruction set, M68HC11 | |
402 | ||
403 | @menu | |
404 | * M68HC11-Branch:: Branch Improvement | |
405 | @end menu | |
406 | ||
407 | @node M68HC11-Branch | |
408 | @subsection Branch Improvement | |
409 | ||
410 | @cindex pseudo-opcodes, M68HC11 | |
411 | @cindex M68HC11 pseudo-opcodes | |
412 | @cindex branch improvement, M68HC11 | |
413 | @cindex M68HC11 branch improvement | |
414 | ||
415 | Certain pseudo opcodes are permitted for branch instructions. | |
416 | They expand to the shortest branch instruction that reach the | |
417 | target. Generally these mnemonics are made by prepending @samp{j} to | |
418 | the start of Motorola mnemonic. These pseudo opcodes are not affected | |
1370e33d | 419 | by the @samp{--short-branches} or @samp{--force-long-branches} options. |
60bcf0fa NC |
420 | |
421 | The following table summarizes the pseudo-operations. | |
422 | ||
423 | @smallexample | |
35b55ed2 SC |
424 | Displacement Width |
425 | +-------------------------------------------------------------+ | |
426 | | Options | | |
1370e33d | 427 | | --short-branches --force-long-branches | |
35b55ed2 SC |
428 | +--------------------------+----------------------------------+ |
429 | Op |BYTE WORD | BYTE WORD | | |
430 | +--------------------------+----------------------------------+ | |
431 | bsr | bsr <pc-rel> <error> | jsr <abs> | | |
432 | bra | bra <pc-rel> <error> | jmp <abs> | | |
433 | jbsr | bsr <pc-rel> jsr <abs> | bsr <pc-rel> jsr <abs> | | |
434 | jbra | bra <pc-rel> jmp <abs> | bra <pc-rel> jmp <abs> | | |
34bca508 | 435 | bXX | bXX <pc-rel> <error> | bNX +3; jmp <abs> | |
35b55ed2 SC |
436 | jbXX | bXX <pc-rel> bNX +3; | bXX <pc-rel> bNX +3; jmp <abs> | |
437 | | jmp <abs> | | | |
438 | +--------------------------+----------------------------------+ | |
60bcf0fa NC |
439 | XX: condition |
440 | NX: negative of condition XX | |
441 | ||
442 | @end smallexample | |
443 | ||
444 | @table @code | |
445 | @item jbsr | |
446 | @itemx jbra | |
447 | These are the simplest jump pseudo-operations; they always map to one | |
448 | particular machine instruction, depending on the displacement to the | |
449 | branch target. | |
450 | ||
451 | @item jb@var{XX} | |
452 | Here, @samp{jb@var{XX}} stands for an entire family of pseudo-operations, | |
453 | where @var{XX} is a conditional branch or condition-code test. The full | |
454 | list of pseudo-ops in this family is: | |
455 | @smallexample | |
456 | jbcc jbeq jbge jbgt jbhi jbvs jbpl jblo | |
457 | jbcs jbne jblt jble jbls jbvc jbmi | |
458 | @end smallexample | |
459 | ||
460 | For the cases of non-PC relative displacements and long displacements, | |
461 | @code{@value{AS}} issues a longer code fragment in terms of | |
462 | @var{NX}, the opposite condition to @var{XX}. For example, for the | |
463 | non-PC relative case: | |
464 | @smallexample | |
465 | jb@var{XX} foo | |
466 | @end smallexample | |
467 | gives | |
468 | @smallexample | |
469 | b@var{NX}s oof | |
470 | jmp foo | |
471 | oof: | |
472 | @end smallexample | |
473 | ||
474 | @end table | |
475 | ||
476 |