aboutsummaryrefslogtreecommitdiff
path: root/gas/doc/c-h8300.texi
blob: d75f7381d7777a68779e7bf1b3d8ef478210e1b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
@c Copyright (C) 1991, 1992, 1993, 1994, 1995, 2003
@c Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@ifset GENERIC
@page
@end ifset
@node H8/300-Dependent
@chapter H8/300 Dependent Features

@cindex H8/300 support
@menu
* H8/300 Options::              Options
* H8/300 Syntax::               Syntax
* H8/300 Floating Point::       Floating Point
* H8/300 Directives::           H8/300 Machine Directives
* H8/300 Opcodes::              Opcodes
@end menu

@node H8/300 Options
@section Options

@cindex H8/300 options (none)
@cindex options, H8/300 (none)
@code{@value{AS}} has no additional command-line options for the
Renesas (formerly Hitachi) H8/300 family.

@node H8/300 Syntax
@section Syntax
@menu
* H8/300-Chars::                Special Characters
* H8/300-Regs::                 Register Names
* H8/300-Addressing::           Addressing Modes
@end menu

@node H8/300-Chars
@subsection Special Characters

@cindex line comment character, H8/300
@cindex H8/300 line comment character
@samp{;} is the line comment character.

@cindex line separator, H8/300
@cindex statement separator, H8/300
@cindex H8/300 line separator
@samp{$} can be used instead of a newline to separate statements.
Therefore @emph{you may not use @samp{$} in symbol names} on the H8/300.

@node H8/300-Regs
@subsection Register Names

@cindex H8/300 registers
@cindex register names, H8/300
You can use predefined symbols of the form @samp{r@var{n}h} and
@samp{r@var{n}l} to refer to the H8/300 registers as sixteen 8-bit
general-purpose registers.  @var{n} is a digit from @samp{0} to
@samp{7}); for instance, both @samp{r0h} and @samp{r7l} are valid
register names.

You can also use the eight predefined symbols @samp{r@var{n}} to refer
to the H8/300 registers as 16-bit registers (you must use this form for
addressing).

On the H8/300H, you can also use the eight predefined symbols
@samp{er@var{n}} (@samp{er0} @dots{} @samp{er7}) to refer to the 32-bit
general purpose registers.

The two control registers are called @code{pc} (program counter; a
16-bit register, except on the H8/300H where it is 24 bits) and
@code{ccr} (condition code register; an 8-bit register).  @code{r7} is
used as the stack pointer, and can also be called @code{sp}.

@node H8/300-Addressing
@subsection Addressing Modes

@cindex addressing modes, H8/300
@cindex H8/300 addressing modes
@value{AS} understands the following addressing modes for the H8/300:
@table @code
@item r@var{n}
Register direct

@item @@r@var{n}
Register indirect

@need 1200
@item @@(@var{d}, r@var{n})
@itemx @@(@var{d}:16, r@var{n})
@itemx @@(@var{d}:24, r@var{n})
Register indirect: 16-bit or 24-bit displacement @var{d} from register
@var{n}.  (24-bit displacements are only meaningful on the H8/300H.)

@item @@r@var{n}+
Register indirect with post-increment

@item @@-r@var{n}
Register indirect with pre-decrement

@item @code{@@}@var{aa}
@itemx @code{@@}@var{aa}:8
@itemx @code{@@}@var{aa}:16
@itemx @code{@@}@var{aa}:24
Absolute address @code{aa}.  (The address size @samp{:24} only makes
sense on the H8/300H.)

@item #@var{xx}
@itemx #@var{xx}:8
@itemx #@var{xx}:16
@itemx #@var{xx}:32
Immediate data @var{xx}.  You may specify the @samp{:8}, @samp{:16}, or
@samp{:32} for clarity, if you wish; but @code{@value{AS}} neither
requires this nor uses it---the data size required is taken from
context.

@item @code{@@}@code{@@}@var{aa}
@itemx @code{@@}@code{@@}@var{aa}:8
Memory indirect.  You may specify the @samp{:8} for clarity, if you
wish; but @code{@value{AS}} neither requires this nor uses it.
@end table

@node H8/300 Floating Point
@section Floating Point

@cindex floating point, H8/300 (@sc{ieee})
@cindex H8/300 floating point (@sc{ieee})
The H8/300 family has no hardware floating point, but the @code{.float}
directive generates @sc{ieee} floating-point numbers for compatibility
with other development tools.

@page
@node H8/300 Directives
@section H8/300 Machine Directives

@cindex H8/300 machine directives (none)
@cindex machine directives, H8/300 (none)
@cindex @code{word} directive, H8/300
@cindex @code{int} directive, H8/300
@code{@value{AS}} has the following machine-dependent directives for
the H8/300:

@table @code
@cindex H8/300H, assembling for
@item .h8300h
Recognize and emit additional instructions for the H8/300H variant, and
also make @code{.int} emit 32-bit numbers rather than the usual (16-bit)
for the H8/300 family.

@item .h8300s
Recognize and emit additional instructions for the H8S variant, and
also make @code{.int} emit 32-bit numbers rather than the usual (16-bit)
for the H8/300 family.

@item .h8300hn
Recognize and emit additional instructions for the H8/300H variant in
normal mode, and also make @code{.int} emit 32-bit numbers rather than 
the usual (16-bit) for the H8/300 family.

@item .h8300sn
Recognize and emit additional instructions for the H8S variant in
normal mode, and also make @code{.int} emit 32-bit numbers rather than 
the usual (16-bit) for the H8/300 family.
@end table

On the H8/300 family (including the H8/300H) @samp{.word} directives
generate 16-bit numbers.

@node H8/300 Opcodes
@section Opcodes

@cindex H8/300 opcode summary
@cindex opcode summary, H8/300
@cindex mnemonics, H8/300
@cindex instruction summary, H8/300
For detailed information on the H8/300 machine instruction set, see
@cite{H8/300 Series Programming Manual}.  For information specific to
the H8/300H, see @cite{H8/300H Series Programming Manual} (Renesas).

@code{@value{AS}} implements all the standard H8/300 opcodes.  No additional
pseudo-instructions are needed on this family.

@ifset SMALL
@c this table, due to the multi-col faking and hardcoded order, looks silly
@c except in smallbook.  See comments below "@set SMALL" near top of this file.

The following table summarizes the H8/300 opcodes, and their arguments.
Entries marked @samp{*} are opcodes used only on the H8/300H.

@smallexample
@c Using @group seems to use the normal baselineskip, not the smallexample
@c baselineskip; looks approx doublespaced.
         @i{Legend:}
            Rs   @r{source register}
            Rd   @r{destination register}
            abs  @r{absolute address}
            imm  @r{immediate data}
         disp:N  @r{N-bit displacement from a register}
        pcrel:N  @r{N-bit displacement relative to program counter}

   add.b #imm,rd              *  andc #imm,ccr
   add.b rs,rd                   band #imm,rd
   add.w rs,rd                   band #imm,@@rd
*  add.w #imm,rd                 band #imm,@@abs:8
*  add.l rs,rd                   bra  pcrel:8
*  add.l #imm,rd              *  bra  pcrel:16
   adds #imm,rd                  bt   pcrel:8
   addx #imm,rd               *  bt   pcrel:16
   addx rs,rd                    brn  pcrel:8
   and.b #imm,rd              *  brn  pcrel:16
   and.b rs,rd                   bf   pcrel:8
*  and.w rs,rd                *  bf   pcrel:16
*  and.w #imm,rd                 bhi  pcrel:8
*  and.l #imm,rd              *  bhi  pcrel:16
*  and.l rs,rd                   bls  pcrel:8
@page
*  bls  pcrel:16                 bld  #imm,rd
   bcc  pcrel:8                  bld  #imm,@@rd
*  bcc  pcrel:16                 bld  #imm,@@abs:8
   bhs  pcrel:8                  bnot #imm,rd
*  bhs  pcrel:16                 bnot #imm,@@rd
   bcs  pcrel:8                  bnot #imm,@@abs:8
*  bcs  pcrel:16                 bnot rs,rd
   blo  pcrel:8                  bnot rs,@@rd
*  blo  pcrel:16                 bnot rs,@@abs:8
   bne  pcrel:8                  bor  #imm,rd
*  bne  pcrel:16                 bor  #imm,@@rd
   beq  pcrel:8                  bor  #imm,@@abs:8
*  beq  pcrel:16                 bset #imm,rd
   bvc  pcrel:8                  bset #imm,@@rd
*  bvc  pcrel:16                 bset #imm,@@abs:8
   bvs  pcrel:8                  bset rs,rd
*  bvs  pcrel:16                 bset rs,@@rd
   bpl  pcrel:8                  bset rs,@@abs:8
*  bpl  pcrel:16                 bsr  pcrel:8
   bmi  pcrel:8                  bsr  pcrel:16
*  bmi  pcrel:16                 bst  #imm,rd
   bge  pcrel:8                  bst  #imm,@@rd
*  bge  pcrel:16                 bst  #imm,@@abs:8
   blt  pcrel:8                  btst #imm,rd
*  blt  pcrel:16                 btst #imm,@@rd
   bgt  pcrel:8                  btst #imm,@@abs:8
*  bgt  pcrel:16                 btst rs,rd
   ble  pcrel:8                  btst rs,@@rd
*  ble  pcrel:16                 btst rs,@@abs:8
   bclr #imm,rd                  bxor #imm,rd
   bclr #imm,@@rd                 bxor #imm,@@rd
   bclr #imm,@@abs:8              bxor #imm,@@abs:8
   bclr rs,rd                    cmp.b #imm,rd
   bclr rs,@@rd                   cmp.b rs,rd
   bclr rs,@@abs:8                cmp.w rs,rd
   biand #imm,rd                 cmp.w rs,rd
   biand #imm,@@rd             *  cmp.w #imm,rd
   biand #imm,@@abs:8          *  cmp.l #imm,rd
   bild #imm,rd               *  cmp.l rs,rd
   bild #imm,@@rd                 daa  rs
   bild #imm,@@abs:8              das  rs
   bior #imm,rd                  dec.b rs
   bior #imm,@@rd              *  dec.w #imm,rd
   bior #imm,@@abs:8           *  dec.l #imm,rd
   bist #imm,rd                  divxu.b rs,rd
   bist #imm,@@rd              *  divxu.w rs,rd
   bist #imm,@@abs:8           *  divxs.b rs,rd
   bixor #imm,rd              *  divxs.w rs,rd
   bixor #imm,@@rd                eepmov
   bixor #imm,@@abs:8          *  eepmovw
@page
*  exts.w rd                     mov.w rs,@@abs:16
*  exts.l rd                  *  mov.l #imm,rd
*  extu.w rd                  *  mov.l rs,rd
*  extu.l rd                  *  mov.l @@rs,rd
   inc  rs                    *  mov.l @@(disp:16,rs),rd
*  inc.w #imm,rd              *  mov.l @@(disp:24,rs),rd
*  inc.l #imm,rd              *  mov.l @@rs+,rd
   jmp  @@rs                   *  mov.l @@abs:16,rd
   jmp  abs                   *  mov.l @@abs:24,rd
   jmp  @@@@abs:8               *  mov.l rs,@@rd
   jsr  @@rs                   *  mov.l rs,@@(disp:16,rd)
   jsr  abs                   *  mov.l rs,@@(disp:24,rd)
   jsr  @@@@abs:8               *  mov.l rs,@@-rd
   ldc  #imm,ccr              *  mov.l rs,@@abs:16
   ldc  rs,ccr                *  mov.l rs,@@abs:24
*  ldc  @@abs:16,ccr              movfpe @@abs:16,rd
*  ldc  @@abs:24,ccr              movtpe rs,@@abs:16
*  ldc  @@(disp:16,rs),ccr        mulxu.b rs,rd
*  ldc  @@(disp:24,rs),ccr     *  mulxu.w rs,rd
*  ldc  @@rs+,ccr              *  mulxs.b rs,rd
*  ldc  @@rs,ccr               *  mulxs.w rs,rd
*  mov.b @@(disp:24,rs),rd        neg.b rs
*  mov.b rs,@@(disp:24,rd)     *  neg.w rs
   mov.b @@abs:16,rd           *  neg.l rs
   mov.b rs,rd                   nop
   mov.b @@abs:8,rd               not.b rs
   mov.b rs,@@abs:8            *  not.w rs
   mov.b rs,rd                *  not.l rs
   mov.b #imm,rd                 or.b #imm,rd
   mov.b @@rs,rd                  or.b rs,rd
   mov.b @@(disp:16,rs),rd     *  or.w #imm,rd
   mov.b @@rs+,rd              *  or.w rs,rd
   mov.b @@abs:8,rd            *  or.l #imm,rd
   mov.b rs,@@rd               *  or.l rs,rd
   mov.b rs,@@(disp:16,rd)        orc  #imm,ccr
   mov.b rs,@@-rd                 pop.w rs
   mov.b rs,@@abs:8            *  pop.l rs
   mov.w rs,@@rd                  push.w rs
*  mov.w @@(disp:24,rs),rd     *  push.l rs
*  mov.w rs,@@(disp:24,rd)        rotl.b rs
*  mov.w @@abs:24,rd           *  rotl.w rs
*  mov.w rs,@@abs:24           *  rotl.l rs
   mov.w rs,rd                   rotr.b rs
   mov.w #imm,rd              *  rotr.w rs
   mov.w @@rs,rd               *  rotr.l rs
   mov.w @@(disp:16,rs),rd        rotxl.b rs
   mov.w @@rs+,rd              *  rotxl.w rs
   mov.w @@abs:16,rd           *  rotxl.l rs
   mov.w rs,@@(disp:16,rd)        rotxr.b rs
   mov.w rs,@@-rd              *  rotxr.w rs
@page
*  rotxr.l rs                 *  stc  ccr,@@(disp:24,rd)
   bpt                        *  stc  ccr,@@-rd
   rte                        *  stc  ccr,@@abs:16
   rts                        *  stc  ccr,@@abs:24
   shal.b rs                     sub.b rs,rd
*  shal.w rs                     sub.w rs,rd
*  shal.l rs                  *  sub.w #imm,rd
   shar.b rs                  *  sub.l rs,rd
*  shar.w rs                  *  sub.l #imm,rd
*  shar.l rs                     subs #imm,rd
   shll.b rs                     subx #imm,rd
*  shll.w rs                     subx rs,rd
*  shll.l rs                  *  trapa #imm
   shlr.b rs                     xor  #imm,rd
*  shlr.w rs                     xor  rs,rd
*  shlr.l rs                  *  xor.w #imm,rd
   sleep                      *  xor.w rs,rd
   stc  ccr,rd                *  xor.l #imm,rd
*  stc  ccr,@@rs               *  xor.l rs,rd
*  stc  ccr,@@(disp:16,rd)        xorc #imm,ccr
@end smallexample
@end ifset

@cindex size suffixes, H8/300
@cindex H8/300 size suffixes
Four H8/300 instructions (@code{add}, @code{cmp}, @code{mov},
@code{sub}) are defined with variants using the suffixes @samp{.b},
@samp{.w}, and @samp{.l} to specify the size of a memory operand.
@code{@value{AS}} supports these suffixes, but does not require them;
since one of the operands is always a register, @code{@value{AS}} can
deduce the correct size.

For example, since @code{r0} refers to a 16-bit register,
@example
mov    r0,@@foo
@exdent is equivalent to
mov.w  r0,@@foo
@end example

If you use the size suffixes, @code{@value{AS}} issues a warning when
the suffix and the register size do not match.