1 /* Print Motorola 68k instructions.
2 Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 #include "floatformat.h"
21 #include <libiberty.h>
24 #include "opcode/m68k.h"
26 /* Local function prototypes */
29 fetch_data
PARAMS ((struct disassemble_info
*, bfd_byte
*));
32 dummy_print_address
PARAMS ((bfd_vma
, struct disassemble_info
*));
35 fetch_arg
PARAMS ((unsigned char *, int, int, disassemble_info
*));
38 print_base
PARAMS ((int, bfd_vma
, disassemble_info
*));
40 static unsigned char *
41 print_indexed
PARAMS ((int, unsigned char *, bfd_vma
, disassemble_info
*));
44 print_insn_arg
PARAMS ((const char *, unsigned char *, unsigned char *,
45 bfd_vma
, disassemble_info
*));
47 CONST
char * CONST fpcr_names
[] = {
48 "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
49 "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"};
51 static char *const reg_names
[] = {
52 "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
53 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
56 /* Sign-extend an (unsigned char). */
58 #define COERCE_SIGNED_CHAR(ch) ((signed char)(ch))
60 #define COERCE_SIGNED_CHAR(ch) ((int)(((ch) ^ 0x80) & 0xFF) - 128)
63 /* Get a 1 byte signed integer. */
64 #define NEXTBYTE(p) (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
66 /* Get a 2 byte signed integer. */
67 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
69 (p += 2, FETCH_DATA (info, p), \
70 COERCE16 ((p[-2] << 8) + p[-1]))
72 /* Get a 4 byte signed integer. */
73 #define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
75 (p += 4, FETCH_DATA (info, p), \
76 (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
78 /* Get a 4 byte unsigned integer. */
79 #define NEXTULONG(p) \
80 (p += 4, FETCH_DATA (info, p), \
81 (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
83 /* Get a single precision float. */
84 #define NEXTSINGLE(val, p) \
85 (p += 4, FETCH_DATA (info, p), \
86 floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
88 /* Get a double precision float. */
89 #define NEXTDOUBLE(val, p) \
90 (p += 8, FETCH_DATA (info, p), \
91 floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
93 /* Get an extended precision float. */
94 #define NEXTEXTEND(val, p) \
95 (p += 12, FETCH_DATA (info, p), \
96 floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
98 /* Need a function to convert from packed to double
99 precision. Actually, it's easier to print a
100 packed number than a double anyway, so maybe
101 there should be a special case to handle this... */
102 #define NEXTPACKED(p) \
103 (p += 12, FETCH_DATA (info, p), 0.0)
106 /* Maximum length of an instruction. */
113 /* Points to first byte not fetched. */
114 bfd_byte
*max_fetched
;
115 bfd_byte the_buffer
[MAXLEN
];
120 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
121 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
123 #define FETCH_DATA(info, addr) \
124 ((addr) <= ((struct private *)(info->private_data))->max_fetched \
125 ? 1 : fetch_data ((info), (addr)))
128 fetch_data (info
, addr
)
129 struct disassemble_info
*info
;
133 struct private *priv
= (struct private *)info
->private_data
;
134 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
136 status
= (*info
->read_memory_func
) (start
,
138 addr
- priv
->max_fetched
,
142 (*info
->memory_error_func
) (status
, start
, info
);
143 longjmp (priv
->bailout
, 1);
146 priv
->max_fetched
= addr
;
150 /* This function is used to print to the bit-bucket. */
153 dummy_printer (FILE * file
, const char * format
, ...)
155 dummy_printer (file
) FILE *file
;
160 dummy_print_address (vma
, info
)
162 struct disassemble_info
*info
;
166 /* Print the m68k instruction at address MEMADDR in debugged memory,
167 on INFO->STREAM. Returns length of the instruction, in bytes. */
170 print_insn_m68k (memaddr
, info
)
172 disassemble_info
*info
;
175 register unsigned char *p
;
176 unsigned char *save_p
;
177 register const char *d
;
178 register unsigned long bestmask
;
179 const struct m68k_opcode
*best
= 0;
180 unsigned int arch_mask
;
182 bfd_byte
*buffer
= priv
.the_buffer
;
183 fprintf_ftype save_printer
= info
->fprintf_func
;
184 void (*save_print_address
) PARAMS((bfd_vma
, struct disassemble_info
*))
185 = info
->print_address_func
;
187 static int numopcodes
[16];
188 static const struct m68k_opcode
**opcodes
[16];
192 /* Speed up the matching by sorting the opcode table on the upper
193 four bits of the opcode. */
194 const struct m68k_opcode
**opc_pointer
[16];
196 /* First count how many opcodes are in each of the sixteen buckets. */
197 for (i
= 0; i
< m68k_numopcodes
; i
++)
198 numopcodes
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++;
200 /* Then create a sorted table of pointers that point into the
202 opc_pointer
[0] = ((const struct m68k_opcode
**)
203 xmalloc (sizeof (struct m68k_opcode
*)
205 opcodes
[0] = opc_pointer
[0];
206 for (i
= 1; i
< 16; i
++)
208 opc_pointer
[i
] = opc_pointer
[i
- 1] + numopcodes
[i
- 1];
209 opcodes
[i
] = opc_pointer
[i
];
212 for (i
= 0; i
< m68k_numopcodes
; i
++)
213 *opc_pointer
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++ = &m68k_opcodes
[i
];
217 info
->private_data
= (PTR
) &priv
;
218 /* Tell objdump to use two bytes per chunk and six bytes per line for
219 displaying raw data. */
220 info
->bytes_per_chunk
= 2;
221 info
->bytes_per_line
= 6;
222 info
->display_endian
= BFD_ENDIAN_BIG
;
223 priv
.max_fetched
= priv
.the_buffer
;
224 priv
.insn_start
= memaddr
;
225 if (setjmp (priv
.bailout
) != 0)
233 arch_mask
= (unsigned int) -1;
235 case bfd_mach_m68000
:
238 case bfd_mach_m68008
:
241 case bfd_mach_m68010
:
244 case bfd_mach_m68020
:
247 case bfd_mach_m68030
:
250 case bfd_mach_m68040
:
253 case bfd_mach_m68060
:
258 arch_mask
|= m68881
| m68851
;
261 FETCH_DATA (info
, buffer
+ 2);
262 major_opcode
= (buffer
[0] >> 4) & 15;
263 for (i
= 0; i
< numopcodes
[major_opcode
]; i
++)
265 const struct m68k_opcode
*opc
= opcodes
[major_opcode
][i
];
266 unsigned long opcode
= opc
->opcode
;
267 unsigned long match
= opc
->match
;
269 if (((0xff & buffer
[0] & (match
>> 24)) == (0xff & (opcode
>> 24)))
270 && ((0xff & buffer
[1] & (match
>> 16)) == (0xff & (opcode
>> 16)))
271 /* Only fetch the next two bytes if we need to. */
272 && (((0xffff & match
) == 0)
274 (FETCH_DATA (info
, buffer
+ 4)
275 && ((0xff & buffer
[2] & (match
>> 8)) == (0xff & (opcode
>> 8)))
276 && ((0xff & buffer
[3] & match
) == (0xff & opcode
)))
278 && (opc
->arch
& arch_mask
) != 0)
280 /* Don't use for printout the variants of divul and divsl
281 that have the same register number in two places.
282 The more general variants will match instead. */
283 for (d
= opc
->args
; *d
; d
+= 2)
287 /* Don't use for printout the variants of most floating
288 point coprocessor instructions which use the same
289 register number in two places, as above. */
291 for (d
= opc
->args
; *d
; d
+= 2)
295 /* Don't match fmovel with more than one register; wait for
299 for (d
= opc
->args
; *d
; d
+= 2)
301 if (d
[0] == 's' && d
[1] == '8')
305 val
= fetch_arg (buffer
, d
[1], 3, info
);
306 if ((val
& (val
- 1)) != 0)
312 if (*d
== '\0' && match
> bestmask
)
323 /* Point at first word of argument data,
324 and at descriptor for first argument. */
327 /* Figure out how long the fixed-size portion of the instruction is.
328 The only place this is stored in the opcode table is
329 in the arguments--look for arguments which specify fields in the 2nd
330 or 3rd words of the instruction. */
331 for (d
= best
->args
; *d
; d
+= 2)
333 /* I don't think it is necessary to be checking d[0] here; I suspect
334 all this could be moved to the case statement below. */
337 if (d
[1] == 'l' && p
- buffer
< 6)
339 else if (p
- buffer
< 4 && d
[1] != 'C' && d
[1] != '8' )
342 if ((d
[0] == 'L' || d
[0] == 'l') && d
[1] == 'w' && p
- buffer
< 4)
367 /* pflusha is an exceptions. It takes no arguments but is two words
368 long. Recognize it by looking at the lower 16 bits of the mask. */
369 if (p
- buffer
< 4 && (best
->match
& 0xFFFF) != 0)
372 /* lpstop is another exception. It takes a one word argument but is
375 && (best
->match
& 0xffff) == 0xffff
376 && best
->args
[0] == '#'
377 && best
->args
[1] == 'w')
379 /* Copy the one word argument into the usual location for a one
380 word argument, to simplify printing it. We can get away with
381 this because we know exactly what the second word is, and we
382 aren't going to print anything based on it. */
384 FETCH_DATA (info
, p
);
385 buffer
[2] = buffer
[4];
386 buffer
[3] = buffer
[5];
389 FETCH_DATA (info
, p
);
393 /* We can the operands twice. The first time we don't print anything,
394 but look for errors. */
397 info
->print_address_func
= dummy_print_address
;
398 info
->fprintf_func
= (fprintf_ftype
)dummy_printer
;
401 int eaten
= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
404 else if (eaten
== -1)
408 (*info
->fprintf_func
)(info
->stream
,
409 /* xgettext:c-format */
410 _("<internal error in opcode table: %s %s>\n"),
418 info
->fprintf_func
= save_printer
;
419 info
->print_address_func
= save_print_address
;
423 (*info
->fprintf_func
) (info
->stream
, "%s", best
->name
);
426 (*info
->fprintf_func
) (info
->stream
, " ");
430 p
+= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
432 if (*d
&& *(d
- 2) != 'I' && *d
!= 'k')
433 (*info
->fprintf_func
) (info
->stream
, ",");
438 /* Handle undefined instructions. */
439 info
->fprintf_func
= save_printer
;
440 info
->print_address_func
= save_print_address
;
441 (*info
->fprintf_func
) (info
->stream
, "0%o",
442 (buffer
[0] << 8) + buffer
[1]);
446 /* Returns number of bytes "eaten" by the operand, or
447 return -1 if an invalid operand was found, or -2 if
448 an opcode tabe error was found. */
451 print_insn_arg (d
, buffer
, p0
, addr
, info
)
453 unsigned char *buffer
;
455 bfd_vma addr
; /* PC for this arg to be relative to */
456 disassemble_info
*info
;
458 register int val
= 0;
459 register int place
= d
[1];
460 register unsigned char *p
= p0
;
462 register CONST
char *regname
;
463 register unsigned char *p1
;
471 case 'c': /* cache identifier */
473 static char *const cacheFieldName
[] = { "nc", "dc", "ic", "bc" };
474 val
= fetch_arg (buffer
, place
, 2, info
);
475 (*info
->fprintf_func
) (info
->stream
, cacheFieldName
[val
]);
479 case 'a': /* address register indirect only. Cf. case '+'. */
481 (*info
->fprintf_func
)
484 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
488 case '_': /* 32-bit absolute address for move16. */
490 uval
= NEXTULONG (p
);
491 (*info
->print_address_func
) (uval
, info
);
496 (*info
->fprintf_func
) (info
->stream
, "%%ccr");
500 (*info
->fprintf_func
) (info
->stream
, "%%sr");
504 (*info
->fprintf_func
) (info
->stream
, "%%usp");
508 (*info
->fprintf_func
) (info
->stream
, "%%acc");
512 (*info
->fprintf_func
) (info
->stream
, "%%macsr");
516 (*info
->fprintf_func
) (info
->stream
, "%%mask");
521 static const struct { char *name
; int value
; } names
[]
522 = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
523 {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
524 {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
525 {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
526 {"%msp", 0x803}, {"%isp", 0x804},
528 /* Should we be calling this psr like we do in case 'Y'? */
531 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
533 val
= fetch_arg (buffer
, place
, 12, info
);
534 for (regno
= sizeof names
/ sizeof names
[0] - 1; regno
>= 0; regno
--)
535 if (names
[regno
].value
== val
)
537 (*info
->fprintf_func
) (info
->stream
, "%s", names
[regno
].name
);
541 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
546 val
= fetch_arg (buffer
, place
, 3, info
);
547 /* 0 means 8, except for the bkpt instruction... */
548 if (val
== 0 && d
[1] != 's')
550 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
556 static char *const scalefactor_name
[] = { "<<", ">>" };
557 val
= fetch_arg (buffer
, place
, 1, info
);
558 (*info
->fprintf_func
) (info
->stream
, scalefactor_name
[val
]);
562 val
= fetch_arg (buffer
, place
, 8, info
);
565 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
570 val
= fetch_arg (buffer
, place
, 4, info
);
571 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
575 (*info
->fprintf_func
) (info
->stream
, "%s",
576 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
580 (*info
->fprintf_func
)
582 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 010]);
586 (*info
->fprintf_func
)
588 reg_names
[fetch_arg (buffer
, place
, 4, info
)]);
592 regno
= fetch_arg (buffer
, place
, 4, info
);
594 (*info
->fprintf_func
) (info
->stream
, "%s@", reg_names
[regno
]);
596 (*info
->fprintf_func
) (info
->stream
, "@(%s)", reg_names
[regno
]);
600 (*info
->fprintf_func
)
601 (info
->stream
, "%%fp%d",
602 fetch_arg (buffer
, place
, 3, info
));
606 val
= fetch_arg (buffer
, place
, 6, info
);
608 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
& 7]);
610 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
614 (*info
->fprintf_func
)
615 (info
->stream
, "%s@+",
616 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
620 (*info
->fprintf_func
)
621 (info
->stream
, "%s@-",
622 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
627 (*info
->fprintf_func
)
628 (info
->stream
, "{%s}",
629 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
630 else if (place
== 'C')
632 val
= fetch_arg (buffer
, place
, 7, info
);
633 if ( val
> 63 ) /* This is a signed constant. */
635 (*info
->fprintf_func
) (info
->stream
, "{#%d}", val
);
643 p1
= buffer
+ (*d
== '#' ? 2 : 4);
645 val
= fetch_arg (buffer
, place
, 4, info
);
646 else if (place
== 'C')
647 val
= fetch_arg (buffer
, place
, 7, info
);
648 else if (place
== '8')
649 val
= fetch_arg (buffer
, place
, 3, info
);
650 else if (place
== '3')
651 val
= fetch_arg (buffer
, place
, 8, info
);
652 else if (place
== 'b')
654 else if (place
== 'w' || place
== 'W')
656 else if (place
== 'l')
660 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
666 else if (place
== 'B')
667 disp
= COERCE_SIGNED_CHAR(buffer
[1]);
668 else if (place
== 'w' || place
== 'W')
670 else if (place
== 'l' || place
== 'L' || place
== 'C')
672 else if (place
== 'g')
674 disp
= NEXTBYTE (buffer
);
680 else if (place
== 'c')
682 if (buffer
[1] & 0x40) /* If bit six is one, long offset */
690 (*info
->print_address_func
) (addr
+ disp
, info
);
695 (*info
->fprintf_func
)
696 (info
->stream
, "%s@(%d)",
697 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8], val
);
701 (*info
->fprintf_func
) (info
->stream
, "%s",
702 fpcr_names
[fetch_arg (buffer
, place
, 3, info
)]);
706 /* Get coprocessor ID... */
707 val
= fetch_arg (buffer
, 'd', 3, info
);
709 if (val
!= 1) /* Unusual coprocessor ID? */
710 (*info
->fprintf_func
) (info
->stream
, "(cpid=%d) ", val
);
735 val
= fetch_arg (buffer
, 'x', 6, info
);
736 val
= ((val
& 7) << 3) + ((val
>> 3) & 7);
739 val
= fetch_arg (buffer
, 's', 6, info
);
741 /* Get register number assuming address register. */
742 regno
= (val
& 7) + 8;
743 regname
= reg_names
[regno
];
747 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
751 (*info
->fprintf_func
) (info
->stream
, "%s", regname
);
755 (*info
->fprintf_func
) (info
->stream
, "%s@", regname
);
759 (*info
->fprintf_func
) (info
->stream
, "%s@+", regname
);
763 (*info
->fprintf_func
) (info
->stream
, "%s@-", regname
);
768 (*info
->fprintf_func
) (info
->stream
, "%s@(%d)", regname
, val
);
772 p
= print_indexed (regno
, p
, addr
, info
);
780 (*info
->print_address_func
) (val
, info
);
784 uval
= NEXTULONG (p
);
785 (*info
->print_address_func
) (uval
, info
);
790 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
791 (*info
->print_address_func
) (addr
+ val
, info
);
792 (*info
->fprintf_func
) (info
->stream
, ")");
796 p
= print_indexed (-1, p
, addr
, info
);
800 flt_p
= 1; /* Assume it's a float... */
819 NEXTSINGLE(flval
, p
);
823 NEXTDOUBLE(flval
, p
);
827 NEXTEXTEND(flval
, p
);
831 flval
= NEXTPACKED(p
);
837 if ( flt_p
) /* Print a float? */
838 (*info
->fprintf_func
) (info
->stream
, "#%g", flval
);
840 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
856 /* Move the pointer ahead if this point is farther ahead
861 (*info
->fprintf_func
) (info
->stream
, "#0");
866 register int newval
= 0;
867 for (regno
= 0; regno
< 16; ++regno
)
868 if (val
& (0x8000 >> regno
))
869 newval
|= 1 << regno
;
874 for (regno
= 0; regno
< 16; ++regno
)
875 if (val
& (1 << regno
))
879 (*info
->fprintf_func
) (info
->stream
, "/");
881 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[regno
]);
883 while (val
& (1 << (regno
+ 1)))
885 if (regno
> first_regno
)
886 (*info
->fprintf_func
) (info
->stream
, "-%s",
890 else if (place
== '3')
894 val
= fetch_arg (buffer
, place
, 8, info
);
897 (*info
->fprintf_func
) (info
->stream
, "#0");
902 register int newval
= 0;
903 for (regno
= 0; regno
< 8; ++regno
)
904 if (val
& (0x80 >> regno
))
905 newval
|= 1 << regno
;
910 for (regno
= 0; regno
< 8; ++regno
)
911 if (val
& (1 << regno
))
915 (*info
->fprintf_func
) (info
->stream
, "/");
917 (*info
->fprintf_func
) (info
->stream
, "%%fp%d", regno
);
919 while (val
& (1 << (regno
+ 1)))
921 if (regno
> first_regno
)
922 (*info
->fprintf_func
) (info
->stream
, "-%%fp%d", regno
);
925 else if (place
== '8')
927 /* fmoveml for FP status registers */
928 (*info
->fprintf_func
) (info
->stream
, "%s",
929 fpcr_names
[fetch_arg (buffer
, place
, 3,
946 int val
= fetch_arg (buffer
, place
, 5, info
);
950 case 2: name
= "%tt0"; break;
951 case 3: name
= "%tt1"; break;
952 case 0x10: name
= "%tc"; break;
953 case 0x11: name
= "%drp"; break;
954 case 0x12: name
= "%srp"; break;
955 case 0x13: name
= "%crp"; break;
956 case 0x14: name
= "%cal"; break;
957 case 0x15: name
= "%val"; break;
958 case 0x16: name
= "%scc"; break;
959 case 0x17: name
= "%ac"; break;
960 case 0x18: name
= "%psr"; break;
961 case 0x19: name
= "%pcsr"; break;
965 int break_reg
= ((buffer
[3] >> 2) & 7);
966 (*info
->fprintf_func
)
967 (info
->stream
, val
== 0x1c ? "%%bad%d" : "%%bac%d",
972 (*info
->fprintf_func
) (info
->stream
, "<mmu register %d>", val
);
975 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
981 int fc
= fetch_arg (buffer
, place
, 5, info
);
983 (*info
->fprintf_func
) (info
->stream
, "%%dfc");
985 (*info
->fprintf_func
) (info
->stream
, "%%sfc");
987 /* xgettext:c-format */
988 (*info
->fprintf_func
) (info
->stream
, _("<function code %d>"), fc
);
993 (*info
->fprintf_func
) (info
->stream
, "%%val");
998 int level
= fetch_arg (buffer
, place
, 3, info
);
999 (*info
->fprintf_func
) (info
->stream
, "%d", level
);
1006 int reg
= fetch_arg (buffer
, place
, 5, info
);
1013 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1015 is_upper
? "u" : "l");
1026 /* Fetch BITS bits from a position in the instruction specified by CODE.
1027 CODE is a "place to put an argument", or 'x' for a destination
1028 that is a general address (mode and register).
1029 BUFFER contains the instruction. */
1032 fetch_arg (buffer
, code
, bits
, info
)
1033 unsigned char *buffer
;
1036 disassemble_info
*info
;
1038 register int val
= 0;
1045 case 'd': /* Destination, for register or quick. */
1046 val
= (buffer
[0] << 8) + buffer
[1];
1050 case 'x': /* Destination, for general arg */
1051 val
= (buffer
[0] << 8) + buffer
[1];
1056 FETCH_DATA (info
, buffer
+ 3);
1057 val
= (buffer
[3] >> 4);
1061 FETCH_DATA (info
, buffer
+ 3);
1066 FETCH_DATA (info
, buffer
+ 3);
1067 val
= (buffer
[2] << 8) + buffer
[3];
1072 FETCH_DATA (info
, buffer
+ 3);
1073 val
= (buffer
[2] << 8) + buffer
[3];
1079 FETCH_DATA (info
, buffer
+ 3);
1080 val
= (buffer
[2] << 8) + buffer
[3];
1084 FETCH_DATA (info
, buffer
+ 5);
1085 val
= (buffer
[4] << 8) + buffer
[5];
1090 FETCH_DATA (info
, buffer
+ 5);
1091 val
= (buffer
[4] << 8) + buffer
[5];
1096 FETCH_DATA (info
, buffer
+ 5);
1097 val
= (buffer
[4] << 8) + buffer
[5];
1101 FETCH_DATA (info
, buffer
+ 3);
1102 val
= (buffer
[2] << 8) + buffer
[3];
1107 FETCH_DATA (info
, buffer
+ 3);
1108 val
= (buffer
[2] << 8) + buffer
[3];
1113 FETCH_DATA (info
, buffer
+ 3);
1114 val
= (buffer
[2] << 8) + buffer
[3];
1119 val
= (buffer
[1] >> 6);
1123 val
= (buffer
[1] & 0x40 ? 0x8 : 0)
1124 | ((buffer
[0] >> 1) & 0x7)
1125 | (buffer
[3] & 0x80 ? 0x10 : 0);
1129 val
= (buffer
[1] & 0x40 ? 0x8 : 0) | ((buffer
[0] >> 1) & 0x7);
1133 val
= (buffer
[2] >> 4) | (buffer
[3] & 0x80 ? 0x10 : 0);
1137 val
= buffer
[1] | (buffer
[3] & 0x40 ? 0x10 : 0);
1141 val
= buffer
[3] | (buffer
[3] & 0x40 ? 0x10 : 0);
1145 val
= buffer
[2] >> 2;
1177 /* Print an indexed argument. The base register is BASEREG (-1 for pc).
1178 P points to extension word, in buffer.
1179 ADDR is the nominal core address of that extension word. */
1181 static unsigned char *
1182 print_indexed (basereg
, p
, addr
, info
)
1186 disassemble_info
*info
;
1189 static char *const scales
[] = {"", ":2", ":4", ":8"};
1195 word
= NEXTWORD (p
);
1197 /* Generate the text for the index register.
1198 Where this will be output is not yet determined. */
1199 sprintf (buf
, "%s:%c%s",
1200 reg_names
[(word
>> 12) & 0xf],
1201 (word
& 0x800) ? 'l' : 'w',
1202 scales
[(word
>> 9) & 3]);
1204 /* Handle the 68000 style of indexing. */
1206 if ((word
& 0x100) == 0)
1208 base_disp
= word
& 0xff;
1209 if ((base_disp
& 0x80) != 0)
1213 print_base (basereg
, base_disp
, info
);
1214 (*info
->fprintf_func
) (info
->stream
, ",%s)", buf
);
1218 /* Handle the generalized kind. */
1219 /* First, compute the displacement to add to the base register. */
1231 switch ((word
>> 4) & 3)
1234 base_disp
= NEXTWORD (p
);
1237 base_disp
= NEXTLONG (p
);
1242 /* Handle single-level case (not indirect) */
1244 if ((word
& 7) == 0)
1246 print_base (basereg
, base_disp
, info
);
1248 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1249 (*info
->fprintf_func
) (info
->stream
, ")");
1253 /* Two level. Compute displacement to add after indirection. */
1259 outer_disp
= NEXTWORD (p
);
1262 outer_disp
= NEXTLONG (p
);
1265 print_base (basereg
, base_disp
, info
);
1266 if ((word
& 4) == 0 && buf
[0] != '\0')
1268 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1271 sprintf_vma (vmabuf
, outer_disp
);
1272 (*info
->fprintf_func
) (info
->stream
, ")@(%s", vmabuf
);
1274 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1275 (*info
->fprintf_func
) (info
->stream
, ")");
1280 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
1281 REGNO = -1 for pc, -2 for none (suppressed). */
1284 print_base (regno
, disp
, info
)
1287 disassemble_info
*info
;
1291 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
1292 (*info
->print_address_func
) (disp
, info
);
1299 (*info
->fprintf_func
) (info
->stream
, "@(");
1300 else if (regno
== -3)
1301 (*info
->fprintf_func
) (info
->stream
, "%%zpc@(");
1303 (*info
->fprintf_func
) (info
->stream
, "%s@(", reg_names
[regno
]);
1305 sprintf_vma (buf
, disp
);
1306 (*info
->fprintf_func
) (info
->stream
, "%s", buf
);