1 /* tc-z80.c -- Assemble code for the Zilog Z80, Z180, EZ80 and ASCII R800
2 Copyright (C) 2005-2023 Free Software Foundation, Inc.
3 Contributed by Arnold Metselaar <arnold_m@operamail.com>
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
29 /* Exported constants. */
30 const char comment_chars
[] = ";\0";
31 const char line_comment_chars
[] = "#;\0";
32 const char line_separator_chars
[] = "\0";
33 const char EXP_CHARS
[] = "eE\0";
34 const char FLT_CHARS
[] = "RrDdFfSsHh\0";
36 /* For machine specific options. */
37 const char * md_shortopts
= ""; /* None yet. */
41 OPTION_MARCH
= OPTION_MD_BASE
,
55 OPTION_FP_SINGLE_FORMAT
,
56 OPTION_FP_DOUBLE_FORMAT
,
57 OPTION_COMPAT_LL_PREFIX
,
58 OPTION_COMPAT_COLONLESS
,
62 #define INS_Z80 (1 << 0)
63 #define INS_R800 (1 << 1)
64 #define INS_GBZ80 (1 << 2)
65 #define INS_Z180 (1 << 3)
66 #define INS_EZ80 (1 << 4)
67 #define INS_Z80N (1 << 5)
68 #define INS_MARCH_MASK 0xffff
70 #define INS_IDX_HALF (1 << 16)
71 #define INS_IN_F_C (1 << 17)
72 #define INS_OUT_C_0 (1 << 18)
73 #define INS_SLI (1 << 19)
74 #define INS_ROT_II_LD (1 << 20) /* instructions like SLA (ii+d),r; which is: LD r,(ii+d); SLA r; LD (ii+d),r */
75 #define INS_TUNE_MASK 0xffff0000
77 #define INS_NOT_GBZ80 (INS_Z80 | INS_Z180 | INS_R800 | INS_EZ80 | INS_Z80N)
80 #define INS_UNDOC (INS_IDX_HALF | INS_IN_F_C)
81 #define INS_UNPORT (INS_OUT_C_0 | INS_SLI | INS_ROT_II_LD)
83 struct option md_longopts
[] =
85 { "march", required_argument
, NULL
, OPTION_MARCH
},
86 { "z80", no_argument
, NULL
, OPTION_MACH_Z80
},
87 { "r800", no_argument
, NULL
, OPTION_MACH_R800
},
88 { "z180", no_argument
, NULL
, OPTION_MACH_Z180
},
89 { "ez80", no_argument
, NULL
, OPTION_MACH_EZ80_Z80
},
90 { "ez80-adl", no_argument
, NULL
, OPTION_MACH_EZ80_ADL
},
91 { "fp-s", required_argument
, NULL
, OPTION_FP_SINGLE_FORMAT
},
92 { "fp-d", required_argument
, NULL
, OPTION_FP_DOUBLE_FORMAT
},
93 { "strict", no_argument
, NULL
, OPTION_MACH_FUD
},
94 { "full", no_argument
, NULL
, OPTION_MACH_IUP
},
95 { "with-inst", required_argument
, NULL
, OPTION_MACH_INST
},
96 { "Wnins", required_argument
, NULL
, OPTION_MACH_INST
},
97 { "without-inst", required_argument
, NULL
, OPTION_MACH_NO_INST
},
98 { "local-prefix", required_argument
, NULL
, OPTION_COMPAT_LL_PREFIX
},
99 { "colonless", no_argument
, NULL
, OPTION_COMPAT_COLONLESS
},
100 { "sdcc", no_argument
, NULL
, OPTION_COMPAT_SDCC
},
101 { "Fins", required_argument
, NULL
, OPTION_MACH_NO_INST
},
102 { "ignore-undocumented-instructions", no_argument
, NULL
, OPTION_MACH_IUD
},
103 { "Wnud", no_argument
, NULL
, OPTION_MACH_IUD
},
104 { "warn-undocumented-instructions", no_argument
, NULL
, OPTION_MACH_WUD
},
105 { "Wud", no_argument
, NULL
, OPTION_MACH_WUD
},
106 { "forbid-undocumented-instructions", no_argument
, NULL
, OPTION_MACH_FUD
},
107 { "Fud", no_argument
, NULL
, OPTION_MACH_FUD
},
108 { "ignore-unportable-instructions", no_argument
, NULL
, OPTION_MACH_IUP
},
109 { "Wnup", no_argument
, NULL
, OPTION_MACH_IUP
},
110 { "warn-unportable-instructions", no_argument
, NULL
, OPTION_MACH_WUP
},
111 { "Wup", no_argument
, NULL
, OPTION_MACH_WUP
},
112 { "forbid-unportable-instructions", no_argument
, NULL
, OPTION_MACH_FUP
},
113 { "Fup", no_argument
, NULL
, OPTION_MACH_FUP
},
115 { NULL
, no_argument
, NULL
, 0 }
118 size_t md_longopts_size
= sizeof (md_longopts
);
120 extern int coff_flags
;
121 /* Instruction classes that silently assembled. */
122 static int ins_ok
= INS_Z80
| INS_UNDOC
;
123 /* Instruction classes that generate errors. */
124 static int ins_err
= ~(INS_Z80
| INS_UNDOC
);
125 /* eZ80 CPU mode (ADL or Z80) */
126 static int cpu_mode
= 0; /* 0 - Z80, 1 - ADL */
127 /* accept SDCC specific instruction encoding */
128 static int sdcc_compat
= 0;
129 /* accept colonless labels */
130 static int colonless_labels
= 0;
131 /* local label prefix (NULL - default) */
132 static const char *local_label_prefix
= NULL
;
133 /* floating point support */
134 typedef const char *(*str_to_float_t
)(char *litP
, int *sizeP
);
135 static str_to_float_t str_to_float
;
136 static str_to_float_t str_to_double
;
138 /* mode of current instruction */
139 #define INST_MODE_S 0 /* short data mode */
140 #define INST_MODE_IS 0 /* short instruction mode */
141 #define INST_MODE_L 2 /* long data mode */
142 #define INST_MODE_IL 1 /* long instruction mode */
143 #define INST_MODE_FORCED 4 /* CPU mode changed by instruction suffix*/
144 static char inst_mode
;
155 static const struct match_info
158 {"z80", INS_Z80
, 0, 0, "Zilog Z80" },
159 {"ez80", INS_EZ80
, 0, 0, "Zilog eZ80" },
160 {"gbz80", INS_GBZ80
, INS_UNDOC
|INS_UNPORT
, 0, "GameBoy Z80" },
161 {"r800", INS_R800
, INS_UNPORT
, 0, "Ascii R800" },
162 {"z180", INS_Z180
, INS_UNDOC
|INS_UNPORT
, 0, "Zilog Z180" },
163 {"z80n", INS_Z80N
, 0, 0, "Z80 Next" }
166 static const struct match_info
169 {"full", INS_UNDOC
|INS_UNPORT
, 0, 0, "assemble all known instructions" },
170 {"adl", 0, 0, 1, "eZ80 ADL mode by default" },
171 {"xyhl", INS_IDX_HALF
, 0, 0, "instructions with halves of index registers" },
172 {"infc", INS_IN_F_C
, 0, 0, "instruction IN F,(C)" },
173 {"outc0", INS_OUT_C_0
, 0, 0, "instruction OUT (C),0" },
174 {"sli", INS_SLI
, 0, 0, "instruction known as SLI, SLL, or SL1" },
175 {"xdcb", INS_ROT_II_LD
, 0, 0, "instructions like RL (IX+d),R (DD/FD CB dd oo)" }
179 static int signed_overflow (signed long value
, unsigned bitsize
);
180 static int unsigned_overflow (unsigned long value
, unsigned bitsize
);
181 static int is_overflow (long value
, unsigned bitsize
);
184 setup_march (const char *name
, int *ok
, int *err
, int *mode
)
187 size_t len
= strcspn (name
, "+-");
188 for (i
= 0; i
< ARRAY_SIZE (match_cpu_table
); ++i
)
189 if (!strncasecmp (name
, match_cpu_table
[i
].name
, len
)
190 && strlen (match_cpu_table
[i
].name
) == len
)
192 *ok
= match_cpu_table
[i
].ins_ok
;
193 *err
= match_cpu_table
[i
].ins_err
;
194 *mode
= match_cpu_table
[i
].cpu_mode
;
198 if (i
>= ARRAY_SIZE (match_cpu_table
))
199 as_fatal (_("Invalid CPU is specified: %s"), name
);
203 name
= &name
[len
+ 1];
204 len
= strcspn (name
, "+-");
205 for (i
= 0; i
< ARRAY_SIZE (match_ext_table
); ++i
)
206 if (!strncasecmp (name
, match_ext_table
[i
].name
, len
)
207 && strlen (match_ext_table
[i
].name
) == len
)
211 *ok
|= match_ext_table
[i
].ins_ok
;
212 *err
&= ~match_ext_table
[i
].ins_ok
;
213 *mode
|= match_ext_table
[i
].cpu_mode
;
217 *ok
&= ~match_ext_table
[i
].ins_ok
;
218 *err
|= match_ext_table
[i
].ins_ok
;
219 *mode
&= ~match_ext_table
[i
].cpu_mode
;
223 if (i
>= ARRAY_SIZE (match_ext_table
))
224 as_fatal (_("Invalid EXTENSION is specified: %s"), name
);
229 setup_instruction (const char *inst
, int *add
, int *sub
)
232 if (!strcmp (inst
, "idx-reg-halves"))
234 else if (!strcmp (inst
, "sli"))
236 else if (!strcmp (inst
, "op-ii-ld"))
238 else if (!strcmp (inst
, "in-f-c"))
240 else if (!strcmp (inst
, "out-c-0"))
250 str_to_zeda32 (char *litP
, int *sizeP
);
252 str_to_float48 (char *litP
, int *sizeP
);
254 str_to_ieee754_h (char *litP
, int *sizeP
);
256 str_to_ieee754_s (char *litP
, int *sizeP
);
258 str_to_ieee754_d (char *litP
, int *sizeP
);
260 static str_to_float_t
261 get_str_to_float (const char *arg
)
263 if (strcasecmp (arg
, "zeda32") == 0)
264 return str_to_zeda32
;
266 if (strcasecmp (arg
, "math48") == 0)
267 return str_to_float48
;
269 if (strcasecmp (arg
, "half") != 0)
270 return str_to_ieee754_h
;
272 if (strcasecmp (arg
, "single") != 0)
273 return str_to_ieee754_s
;
275 if (strcasecmp (arg
, "double") != 0)
276 return str_to_ieee754_d
;
278 if (strcasecmp (arg
, "ieee754") == 0)
279 as_fatal (_("invalid floating point numbers type `%s'"), arg
);
284 setup_instruction_list (const char *list
, int *add
, int *sub
)
291 for (b
= list
; *b
!= '\0';)
298 if (sz
== 0 || sz
>= (int)sizeof (buf
))
300 as_bad (_("invalid INST in command line: %s"), b
);
305 if (setup_instruction (buf
, add
, sub
))
309 as_bad (_("invalid INST in command line: %s"), buf
);
320 md_parse_option (int c
, const char* arg
)
327 setup_march (arg
, & ins_ok
, & ins_err
, & cpu_mode
);
329 case OPTION_MACH_Z80
:
330 setup_march ("z80", & ins_ok
, & ins_err
, & cpu_mode
);
332 case OPTION_MACH_R800
:
333 setup_march ("r800", & ins_ok
, & ins_err
, & cpu_mode
);
335 case OPTION_MACH_Z180
:
336 setup_march ("z180", & ins_ok
, & ins_err
, & cpu_mode
);
338 case OPTION_MACH_EZ80_Z80
:
339 setup_march ("ez80", & ins_ok
, & ins_err
, & cpu_mode
);
341 case OPTION_MACH_EZ80_ADL
:
342 setup_march ("ez80+adl", & ins_ok
, & ins_err
, & cpu_mode
);
344 case OPTION_FP_SINGLE_FORMAT
:
345 str_to_float
= get_str_to_float (arg
);
347 case OPTION_FP_DOUBLE_FORMAT
:
348 str_to_double
= get_str_to_float (arg
);
350 case OPTION_MACH_INST
:
351 if ((ins_ok
& INS_GBZ80
) == 0)
352 return setup_instruction_list (arg
, & ins_ok
, & ins_err
);
354 case OPTION_MACH_NO_INST
:
355 if ((ins_ok
& INS_GBZ80
) == 0)
356 return setup_instruction_list (arg
, & ins_err
, & ins_ok
);
358 case OPTION_MACH_WUD
:
359 case OPTION_MACH_IUD
:
360 if ((ins_ok
& INS_GBZ80
) == 0)
363 ins_err
&= ~INS_UNDOC
;
366 case OPTION_MACH_WUP
:
367 case OPTION_MACH_IUP
:
368 if ((ins_ok
& INS_GBZ80
) == 0)
370 ins_ok
|= INS_UNDOC
| INS_UNPORT
;
371 ins_err
&= ~(INS_UNDOC
| INS_UNPORT
);
374 case OPTION_MACH_FUD
:
375 if ((ins_ok
& (INS_R800
| INS_GBZ80
)) == 0)
377 ins_ok
&= (INS_UNDOC
| INS_UNPORT
);
378 ins_err
|= INS_UNDOC
| INS_UNPORT
;
381 case OPTION_MACH_FUP
:
382 ins_ok
&= ~INS_UNPORT
;
383 ins_err
|= INS_UNPORT
;
385 case OPTION_COMPAT_LL_PREFIX
:
386 local_label_prefix
= (arg
&& *arg
) ? arg
: NULL
;
388 case OPTION_COMPAT_SDCC
:
391 case OPTION_COMPAT_COLONLESS
:
392 colonless_labels
= 1;
400 md_show_usage (FILE * f
)
404 CPU model options:\n\
405 -march=CPU[+EXT...][-EXT...]\n\
406 \t\t\t generate code for CPU, where CPU is one of:\n"));
407 for (i
= 0; i
< ARRAY_SIZE(match_cpu_table
); ++i
)
408 fprintf (f
, " %-8s\t\t %s\n", match_cpu_table
[i
].name
, match_cpu_table
[i
].comment
);
409 fprintf (f
, _("And EXT is combination (+EXT - add, -EXT - remove) of:\n"));
410 for (i
= 0; i
< ARRAY_SIZE(match_ext_table
); ++i
)
411 fprintf (f
, " %-8s\t\t %s\n", match_ext_table
[i
].name
, match_ext_table
[i
].comment
);
413 Compatibility options:\n\
414 -local-prefix=TEXT\t treat labels prefixed by TEXT as local\n\
415 -colonless\t\t permit colonless labels\n\
416 -sdcc\t\t\t accept SDCC specific instruction syntax\n\
417 -fp-s=FORMAT\t\t set single precision FP numbers format\n\
418 -fp-d=FORMAT\t\t set double precision FP numbers format\n\
419 Where FORMAT one of:\n\
420 ieee754\t\t IEEE754 compatible (depends on directive)\n\
421 half\t\t\t IEEE754 half precision (16 bit)\n\
422 single\t\t IEEE754 single precision (32 bit)\n\
423 double\t\t IEEE754 double precision (64 bit)\n\
424 zeda32\t\t Zeda z80float library 32 bit format\n\
425 math48\t\t 48 bit format from Math48 library\n\
427 Default: -march=z80+xyhl+infc\n"));
430 static symbolS
* zero
;
438 #define R_STACKABLE (0x80)
439 #define R_ARITH (0x40)
442 #define R_INDEX (R_IX | R_IY)
451 #define REG_F (6 | 8)
456 #define REG_AF (3 | R_STACKABLE)
457 #define REG_BC (0 | R_STACKABLE | R_ARITH)
458 #define REG_DE (1 | R_STACKABLE | R_ARITH)
459 #define REG_HL (2 | R_STACKABLE | R_ARITH)
460 #define REG_IX (REG_HL | R_IX)
461 #define REG_IY (REG_HL | R_IY)
462 #define REG_SP (3 | R_ARITH)
464 static const struct reg_entry regtable
[] =
466 {"a", REG_A
, INS_ALL
},
467 {"af", REG_AF
, INS_ALL
},
468 {"b", REG_B
, INS_ALL
},
469 {"bc", REG_BC
, INS_ALL
},
470 {"c", REG_C
, INS_ALL
},
471 {"d", REG_D
, INS_ALL
},
472 {"de", REG_DE
, INS_ALL
},
473 {"e", REG_E
, INS_ALL
},
474 {"f", REG_F
, INS_IN_F_C
| INS_Z80N
| INS_R800
},
475 {"h", REG_H
, INS_ALL
},
476 {"hl", REG_HL
, INS_ALL
},
477 {"i", REG_I
, INS_NOT_GBZ80
},
478 {"ix", REG_IX
, INS_NOT_GBZ80
},
479 {"ixh", REG_H
| R_IX
, INS_IDX_HALF
| INS_EZ80
| INS_R800
| INS_Z80N
},
480 {"ixl", REG_L
| R_IX
, INS_IDX_HALF
| INS_EZ80
| INS_R800
| INS_Z80N
},
481 {"iy", REG_IY
, INS_NOT_GBZ80
},
482 {"iyh", REG_H
| R_IY
, INS_IDX_HALF
| INS_EZ80
| INS_R800
| INS_Z80N
},
483 {"iyl", REG_L
| R_IY
, INS_IDX_HALF
| INS_EZ80
| INS_R800
| INS_Z80N
},
484 {"l", REG_L
, INS_ALL
},
485 {"mb", REG_MB
, INS_EZ80
},
486 {"r", REG_R
, INS_NOT_GBZ80
},
487 {"sp", REG_SP
, INS_ALL
},
490 #define BUFLEN 8 /* Large enough for any keyword. */
495 expressionS nul
, reg
;
497 unsigned int i
, j
, k
;
500 memset (®
, 0, sizeof (reg
));
501 memset (&nul
, 0, sizeof (nul
));
503 if (ins_ok
& INS_EZ80
) /* if select EZ80 cpu then */
504 listing_lhs_width
= 6; /* use 6 bytes per line in the listing */
506 reg
.X_op
= O_register
;
508 reg
.X_add_symbol
= reg
.X_op_symbol
= 0;
509 for ( i
= 0 ; i
< ARRAY_SIZE ( regtable
) ; ++i
)
511 if (regtable
[i
].isa
&& !(regtable
[i
].isa
& ins_ok
))
513 reg
.X_add_number
= regtable
[i
].number
;
514 k
= strlen ( regtable
[i
].name
);
518 for ( j
= ( 1<<k
) ; j
; --j
)
520 for ( k
= 0 ; regtable
[i
].name
[k
] ; ++k
)
522 buf
[k
] = ( j
& ( 1<<k
) ) ? TOUPPER (regtable
[i
].name
[k
]) : regtable
[i
].name
[k
];
524 symbolS
* psym
= symbol_find_or_make (buf
);
525 S_SET_SEGMENT (psym
, reg_section
);
526 symbol_set_value_expression (psym
, ®
);
530 p
= input_line_pointer
;
531 input_line_pointer
= (char *) "0";
534 input_line_pointer
= p
;
535 zero
= make_expr_symbol (& nul
);
536 /* We do not use relaxation (yet). */
545 switch (ins_ok
& INS_MARCH_MASK
)
548 mach_type
= bfd_mach_z80
;
551 mach_type
= bfd_mach_r800
;
554 mach_type
= bfd_mach_z180
;
557 mach_type
= bfd_mach_gbz80
;
560 mach_type
= cpu_mode
? bfd_mach_ez80_adl
: bfd_mach_ez80_z80
;
563 mach_type
= bfd_mach_z80n
;
568 bfd_set_arch_mach (stdoutput
, TARGET_ARCH
, mach_type
);
571 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
573 z80_elf_final_processing (void)
574 {/* nothing to do, all is done by BFD itself */
577 elf_elfheader (stdoutput)->e_flags = elf_flags;
583 skip_space (const char *s
)
585 while (*s
== ' ' || *s
== '\t')
590 /* A non-zero return-value causes a continue in the
591 function read_a_source_file () in ../read.c. */
593 z80_start_line_hook (void)
598 /* Convert one character constants. */
599 for (p
= input_line_pointer
; *p
&& *p
!= '\n'; ++p
)
604 if (p
[1] != 0 && p
[1] != '\'' && p
[2] == '\'')
606 snprintf (buf
, 4, "%3d", (unsigned char)p
[1]);
614 for (quote
= *p
++; quote
!= *p
&& '\n' != *p
; ++p
)
618 as_bad (_("-- unterminated string"));
619 ignore_rest_of_line ();
623 case '#': /* force to use next expression as immediate value in SDCC */
626 if (ISSPACE(p
[1]) && *skip_space (p
+ 1) == '(')
627 { /* ld a,# (expr)... -> ld a,0+(expr)... */
631 else /* ld a,#(expr)... -> ld a,+(expr); ld a,#expr -> ld a, expr */
632 *p
= (p
[1] == '(') ? '+' : ' ';
636 /* Check for <label>[:] =|([.](EQU|DEFL)) <value>. */
637 if (is_name_beginner (*input_line_pointer
))
640 char c
, *rest
, *line_start
;
643 line_start
= input_line_pointer
;
646 c
= get_symbol_name (&name
);
647 rest
= input_line_pointer
+ 1;
648 if (c
== ':' && *rest
== ':')
650 /* remove second colon if SDCC compatibility enabled */
655 rest
= (char*)skip_space (rest
);
657 len
= (rest
[1] == '=') ? 2 : 1;
662 if (strncasecmp (rest
, "EQU", 3) == 0)
664 else if (strncasecmp (rest
, "DEFL", 4) == 0)
669 if (len
&& (len
<= 2 || !ISALPHA (rest
[len
])))
671 /* Handle assignment here. */
672 if (line_start
[-1] == '\n')
674 bump_line_counters ();
677 input_line_pointer
= rest
+ len
- 1;
678 /* Allow redefining with "DEFL" (len == 4), but not with "EQU". */
681 case 1: /* label = expr */
682 case 4: /* label DEFL expr */
685 case 2: /* label == expr */
686 case 3: /* label EQU expr */
694 /* Restore line and pointer. */
695 (void) restore_line_pointer (c
);
696 input_line_pointer
= line_start
;
703 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
709 md_atof (int type
, char *litP
, int *sizeP
)
718 return str_to_float (litP
, sizeP
);
725 return str_to_double (litP
, sizeP
);
728 return ieee_md_atof (type
, litP
, sizeP
, false);
732 md_section_align (segT seg ATTRIBUTE_UNUSED
, valueT size
)
738 md_pcrel_from (fixS
* fixp
)
740 return fixp
->fx_where
+ fixp
->fx_frag
->fr_address
;
743 typedef const char * (asfunc
)(char, char, const char*);
745 typedef struct _table_t
748 unsigned char prefix
;
749 unsigned char opcode
;
751 unsigned inss
; /*0 - all CPU types or list of supported INS_* */
754 /* Compares the key for structs that start with a char * to the key. */
756 key_cmp (const void * a
, const void * b
)
758 const char *str_a
, *str_b
;
760 str_a
= *((const char**)a
);
761 str_b
= *((const char**)b
);
762 return strcmp (str_a
, str_b
);
766 const char *key
= buf
;
768 /* Prevent an error on a line from also generating
769 a "junk at end of line" error message. */
770 static char err_flag
;
773 error (const char * message
)
778 as_bad ("%s", message
);
785 error (_("illegal operand"));
789 wrong_mach (int ins_type
)
791 if (ins_type
& ins_err
)
794 as_warn (_("undocumented instruction"));
798 check_mach (int ins_type
)
800 if ((ins_type
& ins_ok
) == 0)
801 wrong_mach (ins_type
);
804 /* Check whether an expression is indirect. */
806 is_indir (const char *s
)
812 /* Indirection is indicated with parentheses. */
815 for (p
= s
, depth
= 0; *p
&& *p
!= ','; ++p
)
821 for (quote
= *p
++; quote
!= *p
&& *p
!= '\n'; ++p
)
822 if (*p
== '\\' && p
[1])
832 p
= skip_space (p
+ 1);
838 error (_("mismatched parentheses"));
844 error (_("mismatched parentheses"));
849 /* Check whether a symbol involves a register. */
851 contains_register (symbolS
*sym
)
855 expressionS
* ex
= symbol_get_value_expression (sym
);
864 if (ex
->X_op_symbol
&& contains_register (ex
->X_op_symbol
))
869 if (ex
->X_add_symbol
&& contains_register (ex
->X_add_symbol
))
881 /* Parse general expression, not looking for indexed addressing. */
883 parse_exp_not_indexed (const char *s
, expressionS
*op
)
889 memset (op
, 0, sizeof (*op
));
891 if (sdcc_compat
&& (*p
== '<' || *p
== '>'))
895 case '<': /* LSB request */
898 case '>': /* MSB request */
899 make_shift
= cpu_mode
? 16 : 8;
906 if (make_shift
== -1)
907 indir
= is_indir (p
);
911 if (indir
&& (ins_ok
& INS_GBZ80
))
912 { /* check for instructions like ld a,(hl+), ld (hl-),a */
913 p
= skip_space (p
+1);
914 if (!strncasecmp (p
, "hl", 2))
917 if (*skip_space(p
+1) == ')' && (*p
== '+' || *p
== '-'))
920 op
->X_add_symbol
= NULL
;
921 op
->X_add_number
= (*p
== '+') ? REG_HL
: -REG_HL
;
922 input_line_pointer
= (char*)skip_space(p
+ 1) + 1;
923 return input_line_pointer
;
927 input_line_pointer
= (char*) s
;
929 resolve_register (op
);
933 error (_("missing operand"));
936 error (_("bad expression syntax"));
944 /* replace [op] by [op >> shift] */
946 op
->X_add_symbol
= make_expr_symbol (op
);
947 op
->X_add_number
= 0;
948 op
->X_op
= O_right_shift
;
949 memset (&data
, 0, sizeof (data
));
950 data
.X_op
= O_constant
;
951 data
.X_add_number
= make_shift
;
952 op
->X_op_symbol
= make_expr_symbol (&data
);
954 return input_line_pointer
;
958 unify_indexed (expressionS
*op
)
960 if (O_register
!= symbol_get_value_expression (op
->X_add_symbol
)->X_op
)
963 int rnum
= symbol_get_value_expression (op
->X_add_symbol
)->X_add_number
;
964 if ( ((REG_IX
!= rnum
) && (REG_IY
!= rnum
)) || contains_register (op
->X_op_symbol
))
970 /* Convert subtraction to addition of negative value. */
971 if (O_subtract
== op
->X_op
)
974 memset (&minus
, 0, sizeof (minus
));
975 minus
.X_op
= O_uminus
;
976 minus
.X_add_symbol
= op
->X_op_symbol
;
977 op
->X_op_symbol
= make_expr_symbol (&minus
);
981 /* Clear X_add_number of the expression. */
982 if (op
->X_add_number
!= 0)
985 memset (&add
, 0, sizeof (add
));
987 add
.X_add_number
= op
->X_add_number
;
988 add
.X_add_symbol
= op
->X_op_symbol
;
989 op
->X_add_symbol
= make_expr_symbol (&add
);
992 op
->X_add_symbol
= op
->X_op_symbol
;
994 op
->X_add_number
= rnum
;
999 /* Parse expression, change operator to O_md1 for indexed addressing. */
1001 parse_exp (const char *s
, expressionS
*op
)
1003 const char* res
= parse_exp_not_indexed (s
, op
);
1008 if (unify_indexed (op
) && op
->X_md
)
1012 if (op
->X_md
&& ((REG_IX
== op
->X_add_number
) || (REG_IY
== op
->X_add_number
)))
1014 op
->X_add_symbol
= zero
;
1019 /* parse SDCC syntax where index register offset placed before parentheses */
1020 if (sdcc_compat
&& is_indir (res
))
1024 res
= parse_exp (res
, op
);
1025 if (op
->X_op
!= O_md1
|| op
->X_add_symbol
!= zero
)
1028 op
->X_add_symbol
= make_expr_symbol (&off
);
1037 /* Condition codes, including some synonyms provided by HiTech zas. */
1038 static const struct reg_entry cc_tab
[] =
1040 { "age", 6 << 3, INS_ALL
},
1041 { "alt", 7 << 3, INS_ALL
},
1042 { "c", 3 << 3, INS_ALL
},
1043 { "di", 4 << 3, INS_ALL
},
1044 { "ei", 5 << 3, INS_ALL
},
1045 { "lge", 2 << 3, INS_ALL
},
1046 { "llt", 3 << 3, INS_ALL
},
1047 { "m", 7 << 3, INS_ALL
},
1048 { "nc", 2 << 3, INS_ALL
},
1049 { "nz", 0 << 3, INS_ALL
},
1050 { "p", 6 << 3, INS_ALL
},
1051 { "pe", 5 << 3, INS_ALL
},
1052 { "po", 4 << 3, INS_ALL
},
1053 { "z", 1 << 3, INS_ALL
},
1056 /* Parse condition code. */
1058 parse_cc (const char *s
, char * op
)
1062 struct reg_entry
* cc_p
;
1064 for (i
= 0; i
< BUFLEN
; ++i
)
1066 if (!ISALPHA (s
[i
])) /* Condition codes consist of letters only. */
1068 buf
[i
] = TOLOWER (s
[i
]);
1072 && ((s
[i
] == 0) || (s
[i
] == ',')))
1075 cc_p
= bsearch (&key
, cc_tab
, ARRAY_SIZE (cc_tab
),
1076 sizeof (cc_tab
[0]), key_cmp
);
1093 emit_insn (char prefix
, char opcode
, const char * args
)
1108 void z80_cons_fix_new (fragS
*frag_p
, int offset
, int nbytes
, expressionS
*exp
)
1110 bfd_reloc_code_real_type r
[4] =
1118 if (nbytes
< 1 || nbytes
> 4)
1120 as_bad (_("unsupported BFD relocation size %u"), nbytes
);
1124 fix_new_exp (frag_p
, offset
, nbytes
, exp
, 0, r
[nbytes
-1]);
1129 emit_data_val (expressionS
* val
, int size
)
1132 bfd_reloc_code_real_type r_type
;
1134 p
= frag_more (size
);
1135 if (val
->X_op
== O_constant
)
1140 Check for overflow, but ignore values that were generated by bit
1141 manipulation operators (eg ~0xe6 and -7). This does mean that
1142 manipluated overlarge values will not be reported (eg ~0x1234),
1143 but it does help to maintain compatibility with earlier versions
1144 of the assembler. */
1145 if (! val
->X_extrabit
1146 && is_overflow (val
->X_add_number
, size
*8))
1147 as_warn ( _("%d-bit overflow (%+ld)"), size
*8, val
->X_add_number
);
1148 for (i
= 0; i
< size
; ++i
)
1149 p
[i
] = (char)(val
->X_add_number
>> (i
*8));
1155 case 1: r_type
= BFD_RELOC_8
; break;
1156 case 2: r_type
= BFD_RELOC_16
; break;
1157 case 3: r_type
= BFD_RELOC_24
; break;
1158 case 4: r_type
= BFD_RELOC_32
; break;
1159 case 8: r_type
= BFD_RELOC_64
; break;
1161 as_fatal (_("invalid data size %d"), size
);
1164 if ( (val
->X_op
== O_register
)
1165 || (val
->X_op
== O_md1
)
1166 || contains_register (val
->X_add_symbol
)
1167 || contains_register (val
->X_op_symbol
))
1170 if (size
<= 2 && val
->X_op_symbol
)
1172 bool simplify
= true;
1173 int shift
= symbol_get_value_expression (val
->X_op_symbol
)->X_add_number
;
1174 if (val
->X_op
== O_bit_and
&& shift
== (1 << (size
*8))-1)
1176 else if (val
->X_op
!= O_right_shift
)
1183 case 0: r_type
= BFD_RELOC_Z80_BYTE0
; break;
1184 case 8: r_type
= BFD_RELOC_Z80_BYTE1
; break;
1185 case 16: r_type
= BFD_RELOC_Z80_BYTE2
; break;
1186 case 24: r_type
= BFD_RELOC_Z80_BYTE3
; break;
1187 default: simplify
= false;
1190 else /* if (size == 2) */
1194 case 0: r_type
= BFD_RELOC_Z80_WORD0
; break;
1195 case 16: r_type
= BFD_RELOC_Z80_WORD1
; break;
1197 case 24: /* add two byte fixups */
1198 val
->X_op
= O_symbol
;
1199 val
->X_op_symbol
= NULL
;
1200 val
->X_add_number
= 0;
1203 fix_new_exp (frag_now
, p
++ - frag_now
->fr_literal
, 1, val
, false,
1204 BFD_RELOC_Z80_BYTE1
);
1205 /* prepare to next byte */
1206 r_type
= BFD_RELOC_Z80_BYTE2
;
1209 r_type
= BFD_RELOC_Z80_BYTE3
; /* high byte will be 0 */
1213 default: simplify
= false;
1219 val
->X_op
= O_symbol
;
1220 val
->X_op_symbol
= NULL
;
1221 val
->X_add_number
= 0;
1225 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
, val
, false, r_type
);
1229 emit_byte (expressionS
* val
, bfd_reloc_code_real_type r_type
)
1233 if (r_type
== BFD_RELOC_8
)
1235 emit_data_val (val
, 1);
1239 *p
= val
->X_add_number
;
1240 if (contains_register (val
->X_add_symbol
) || contains_register (val
->X_op_symbol
))
1244 else if ((r_type
== BFD_RELOC_8_PCREL
) && (val
->X_op
== O_constant
))
1246 as_bad (_("cannot make a relative jump to an absolute location"));
1248 else if (val
->X_op
== O_constant
)
1250 if ((val
->X_add_number
< -128) || (val
->X_add_number
>= 128))
1252 if (r_type
== BFD_RELOC_Z80_DISP8
)
1253 as_bad (_("index overflow (%+ld)"), val
->X_add_number
);
1255 as_bad (_("offset overflow (%+ld)"), val
->X_add_number
);
1260 /* For symbols only, constants are stored at begin of function. */
1261 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 1, val
,
1262 r_type
== BFD_RELOC_8_PCREL
, r_type
);
1267 emit_word (expressionS
* val
)
1269 emit_data_val (val
, (inst_mode
& INST_MODE_IL
) ? 3 : 2);
1273 emit_mx (char prefix
, char opcode
, int shift
, expressionS
* arg
)
1274 /* The operand m may be r, (hl), (ix+d), (iy+d),
1275 if 0 == prefix m may also be ixl, ixh, iyl, iyh. */
1280 rnum
= arg
->X_add_number
;
1296 if ((prefix
== 0) && (rnum
& R_INDEX
))
1298 prefix
= (rnum
& R_IX
) ? 0xDD : 0xFD;
1299 if (!(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
1300 check_mach (INS_IDX_HALF
);
1309 q
= frag_more (prefix
? 2 : 1);
1312 * q
++ = opcode
+ (rnum
<< shift
);
1315 if (ins_ok
& INS_GBZ80
)
1321 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1322 *q
= (prefix
) ? prefix
: (opcode
+ (6 << shift
));
1324 expressionS offset
= *arg
;
1325 offset
.X_op
= O_symbol
;
1326 offset
.X_add_number
= 0;
1327 emit_byte (&offset
, BFD_RELOC_Z80_DISP8
);
1332 *q
= opcode
+(6<<shift
);
1340 /* The operand m may be r, (hl), (ix+d), (iy+d),
1341 if 0 = prefix m may also be ixl, ixh, iyl, iyh. */
1343 emit_m (char prefix
, char opcode
, const char *args
)
1348 p
= parse_exp (args
, &arg_m
);
1353 emit_mx (prefix
, opcode
, 0, &arg_m
);
1361 /* The operand m may be as above or one of the undocumented
1362 combinations (ix+d),r and (iy+d),r (if unportable instructions
1366 emit_mr (char prefix
, char opcode
, const char *args
)
1368 expressionS arg_m
, arg_r
;
1371 p
= parse_exp (args
, & arg_m
);
1378 p
= parse_exp (p
+ 1, & arg_r
);
1380 if ((arg_r
.X_md
== 0)
1381 && (arg_r
.X_op
== O_register
)
1382 && (arg_r
.X_add_number
< 8))
1383 opcode
+= arg_r
.X_add_number
- 6; /* Emit_mx () will add 6. */
1389 if (!(ins_ok
& INS_Z80N
))
1390 check_mach (INS_ROT_II_LD
);
1394 emit_mx (prefix
, opcode
, 0, & arg_m
);
1403 emit_sx (char prefix
, char opcode
, expressionS
* arg_p
)
1407 switch (arg_p
->X_op
)
1411 emit_mx (prefix
, opcode
, 0, arg_p
);
1418 q
= frag_more (prefix
? 2 : 1);
1422 emit_byte (arg_p
, BFD_RELOC_8
);
1427 /* The operand s may be r, (hl), (ix+d), (iy+d), n. */
1429 emit_s (char prefix
, char opcode
, const char *args
)
1434 p
= parse_exp (args
, & arg_s
);
1435 if (*p
== ',' && arg_s
.X_md
== 0 && arg_s
.X_op
== O_register
&& arg_s
.X_add_number
== REG_A
)
1436 { /* possible instruction in generic format op A,x */
1437 if (!(ins_ok
& INS_EZ80
) && !sdcc_compat
)
1440 p
= parse_exp (p
, & arg_s
);
1442 emit_sx (prefix
, opcode
, & arg_s
);
1447 emit_sub (char prefix
, char opcode
, const char *args
)
1452 if (!(ins_ok
& INS_GBZ80
))
1453 return emit_s (prefix
, opcode
, args
);
1454 p
= parse_exp (args
, & arg_s
);
1457 error (_("bad instruction syntax"));
1461 if (arg_s
.X_md
!= 0 || arg_s
.X_op
!= O_register
|| arg_s
.X_add_number
!= REG_A
)
1464 p
= parse_exp (p
, & arg_s
);
1466 emit_sx (prefix
, opcode
, & arg_s
);
1471 emit_swap (char prefix
, char opcode
, const char *args
)
1477 if (!(ins_ok
& INS_Z80N
))
1478 return emit_mr (prefix
, opcode
, args
);
1480 /* check for alias swap a for swapnib of Z80N */
1481 p
= parse_exp (args
, ®
);
1482 if (reg
.X_md
!= 0 || reg
.X_op
!= O_register
|| reg
.X_add_number
!= REG_A
)
1492 emit_call (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1495 const char *p
; char *q
;
1497 p
= parse_exp_not_indexed (args
, &addr
);
1509 /* Operand may be rr, r, (hl), (ix+d), (iy+d). */
1511 emit_incdec (char prefix
, char opcode
, const char * args
)
1513 expressionS operand
;
1515 const char *p
; char *q
;
1517 p
= parse_exp (args
, &operand
);
1518 rnum
= operand
.X_add_number
;
1519 if ((! operand
.X_md
)
1520 && (operand
.X_op
== O_register
)
1523 q
= frag_more ((rnum
& R_INDEX
) ? 2 : 1);
1525 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1526 *q
= prefix
+ ((rnum
& 3) << 4);
1530 if ((operand
.X_op
== O_md1
) || (operand
.X_op
== O_register
))
1531 emit_mx (0, opcode
, 3, & operand
);
1539 emit_jr (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1545 p
= parse_exp_not_indexed (args
, &addr
);
1552 addr
.X_add_number
--; /* pcrel computes after offset code */
1553 emit_byte (&addr
, BFD_RELOC_8_PCREL
);
1559 emit_jp (char prefix
, char opcode
, const char * args
)
1566 p
= parse_exp_not_indexed (args
, & addr
);
1569 rnum
= addr
.X_add_number
;
1570 if ((O_register
== addr
.X_op
) && (REG_HL
== (rnum
& ~R_INDEX
)))
1572 q
= frag_more ((rnum
& R_INDEX
) ? 2 : 1);
1574 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1577 else if (addr
.X_op
== O_register
&& rnum
== REG_C
&& (ins_ok
& INS_Z80N
))
1596 emit_im (char prefix
, char opcode
, const char * args
)
1602 p
= parse_exp (args
, & mode
);
1603 if (mode
.X_md
|| (mode
.X_op
!= O_constant
))
1606 switch (mode
.X_add_number
)
1610 ++mode
.X_add_number
;
1615 *q
= opcode
+ 8*mode
.X_add_number
;
1624 emit_pop (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1630 p
= parse_exp (args
, & regp
);
1632 && (regp
.X_op
== O_register
)
1633 && (regp
.X_add_number
& R_STACKABLE
))
1637 rnum
= regp
.X_add_number
;
1641 *q
++ = (rnum
&R_IX
)?0xDD:0xFD;
1645 *q
= opcode
+ ((rnum
& 3) << 4);
1654 emit_push (char prefix
, char opcode
, const char * args
)
1660 p
= parse_exp (args
, & arg
);
1661 if (arg
.X_op
== O_register
)
1662 return emit_pop (prefix
, opcode
, args
);
1664 if (arg
.X_md
|| arg
.X_op
== O_md1
|| !(ins_ok
& INS_Z80N
))
1672 fix_new_exp (frag_now
, q
- frag_now
->fr_literal
, 2, &arg
, false,
1673 BFD_RELOC_Z80_16_BE
);
1679 emit_retcc (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1684 p
= parse_cc (args
, &cc
);
1690 return p
? p
: args
;
1694 emit_adc (char prefix
, char opcode
, const char * args
)
1701 p
= parse_exp (args
, &term
);
1704 error (_("bad instruction syntax"));
1708 if ((term
.X_md
) || (term
.X_op
!= O_register
))
1711 switch (term
.X_add_number
)
1714 p
= emit_s (0, prefix
, p
);
1717 p
= parse_exp (p
, &term
);
1718 if ((!term
.X_md
) && (term
.X_op
== O_register
))
1720 rnum
= term
.X_add_number
;
1721 if (R_ARITH
== (rnum
& (R_ARITH
| R_INDEX
)))
1725 *q
= opcode
+ ((rnum
& 3) << 4);
1737 emit_add (char prefix
, char opcode
, const char * args
)
1744 p
= parse_exp (args
, &term
);
1747 error (_("bad instruction syntax"));
1751 if ((term
.X_md
) || (term
.X_op
!= O_register
))
1754 switch (term
.X_add_number
)
1757 p
= emit_s (0, prefix
, p
);
1760 p
= parse_exp (p
, &term
);
1761 if (!(ins_ok
& INS_GBZ80
) || term
.X_md
|| term
.X_op
== O_register
)
1765 emit_byte (&term
, BFD_RELOC_Z80_DISP8
);
1769 if (!(ins_ok
& INS_Z80N
))
1778 lhs
= term
.X_add_number
;
1779 p
= parse_exp (p
, &term
);
1780 rhs
= term
.X_add_number
;
1781 if (term
.X_md
!= 0 || term
.X_op
== O_md1
)
1783 else if ((term
.X_op
== O_register
) && (rhs
& R_ARITH
) && (rhs
== lhs
|| (rhs
& ~R_INDEX
) != REG_HL
))
1787 q
= frag_more ((lhs
& R_INDEX
) ? 2 : 1);
1789 *q
++ = (lhs
& R_IX
) ? 0xDD : 0xFD;
1790 *q
= opcode
+ ((rhs
& 3) << 4);
1794 else if (!(lhs
& R_INDEX
) && (ins_ok
& INS_Z80N
))
1796 if (term
.X_op
== O_register
&& rhs
== REG_A
)
1797 { /* ADD BC/DE/HL,A */
1800 *q
= 0x33 - (lhs
& 3);
1803 else if (term
.X_op
!= O_register
&& term
.X_op
!= O_md1
)
1804 { /* ADD BC/DE/HL,nn */
1807 *q
= 0x36 - (lhs
& 3);
1820 emit_bit (char prefix
, char opcode
, const char * args
)
1826 p
= parse_exp (args
, &b
);
1828 error (_("bad instruction syntax"));
1830 bn
= b
.X_add_number
;
1832 && (b
.X_op
== O_constant
)
1837 /* Bit : no optional third operand. */
1838 p
= emit_m (prefix
, opcode
+ (bn
<< 3), p
);
1840 /* Set, res : resulting byte can be copied to register. */
1841 p
= emit_mr (prefix
, opcode
+ (bn
<< 3), p
);
1848 /* BSLA DE,B; BSRA DE,B; BSRL DE,B; BSRF DE,B; BRLC DE,B (Z80N only) */
1850 emit_bshft (char prefix
, char opcode
, const char * args
)
1856 p
= parse_exp (args
, & r1
);
1858 error (_("bad instruction syntax"));
1859 p
= parse_exp (p
, & r2
);
1860 if (r1
.X_md
|| r1
.X_op
!= O_register
|| r1
.X_add_number
!= REG_DE
||
1861 r2
.X_md
|| r2
.X_op
!= O_register
|| r2
.X_add_number
!= REG_B
)
1870 emit_jpcc (char prefix
, char opcode
, const char * args
)
1875 p
= parse_cc (args
, & cc
);
1876 if (p
&& *p
++ == ',')
1877 p
= emit_call (0, opcode
+ cc
, p
);
1879 p
= (prefix
== (char)0xC3)
1880 ? emit_jp (0xE9, prefix
, args
)
1881 : emit_call (0, prefix
, args
);
1886 emit_jrcc (char prefix
, char opcode
, const char * args
)
1891 p
= parse_cc (args
, &cc
);
1892 if (p
&& *p
++ == ',')
1895 error (_("condition code invalid for jr"));
1897 p
= emit_jr (0, opcode
+ cc
, p
);
1900 p
= emit_jr (0, prefix
, args
);
1906 emit_ex (char prefix_in ATTRIBUTE_UNUSED
,
1907 char opcode_in ATTRIBUTE_UNUSED
, const char * args
)
1911 char prefix
, opcode
;
1913 p
= parse_exp_not_indexed (args
, &op
);
1917 error (_("bad instruction syntax"));
1921 prefix
= opcode
= 0;
1922 if (op
.X_op
== O_register
)
1923 switch (op
.X_add_number
| (op
.X_md
? 0x8000 : 0))
1926 if (TOLOWER (*p
++) == 'a' && TOLOWER (*p
++) == 'f')
1928 /* The scrubber changes '\'' to '`' in this context. */
1935 if (TOLOWER (*p
++) == 'h' && TOLOWER (*p
++) == 'l')
1939 p
= parse_exp (p
, & op
);
1940 if (op
.X_op
== O_register
1942 && (op
.X_add_number
& ~R_INDEX
) == REG_HL
)
1945 if (R_INDEX
& op
.X_add_number
)
1946 prefix
= (R_IX
& op
.X_add_number
) ? 0xDD : 0xFD;
1951 emit_insn (prefix
, opcode
, p
);
1959 emit_in (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
1962 expressionS reg
, port
;
1966 p
= parse_exp (args
, ®
);
1967 if (reg
.X_md
&& reg
.X_op
== O_register
&& reg
.X_add_number
== REG_C
)
1968 { /* permit instruction in (c) as alias for in f,(c) */
1971 reg
.X_add_number
= REG_F
;
1977 error (_("bad instruction syntax"));
1980 p
= parse_exp (p
, &port
);
1983 && reg
.X_op
== O_register
1984 && (reg
.X_add_number
<= 7 || reg
.X_add_number
== REG_F
)
1987 if (port
.X_op
!= O_md1
&& port
.X_op
!= O_register
)
1989 if (REG_A
== reg
.X_add_number
)
1993 emit_byte (&port
, BFD_RELOC_8
);
2000 if (port
.X_add_number
== REG_C
|| port
.X_add_number
== REG_BC
)
2002 if (port
.X_add_number
== REG_BC
&& !(ins_ok
& INS_EZ80
))
2004 else if (reg
.X_add_number
== REG_F
&& !(ins_ok
& (INS_R800
|INS_Z80N
)))
2005 check_mach (INS_IN_F_C
);
2008 *q
= 0x40|((reg
.X_add_number
&7)<<3);
2020 emit_in0 (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2023 expressionS reg
, port
;
2027 p
= parse_exp (args
, ®
);
2030 error (_("bad instruction syntax"));
2034 p
= parse_exp (p
, &port
);
2036 && reg
.X_op
== O_register
2037 && reg
.X_add_number
<= 7
2039 && port
.X_op
!= O_md1
2040 && port
.X_op
!= O_register
)
2044 *q
= 0x00|(reg
.X_add_number
<< 3);
2045 emit_byte (&port
, BFD_RELOC_8
);
2053 emit_out (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2056 expressionS reg
, port
;
2060 p
= parse_exp (args
, & port
);
2063 error (_("bad instruction syntax"));
2066 p
= parse_exp (p
, ®
);
2068 { ill_op (); return p
; }
2069 /* Allow "out (c), 0" as unportable instruction. */
2070 if (reg
.X_op
== O_constant
&& reg
.X_add_number
== 0)
2072 if (!(ins_ok
& INS_Z80N
))
2073 check_mach (INS_OUT_C_0
);
2074 reg
.X_op
= O_register
;
2075 reg
.X_add_number
= 6;
2078 || reg
.X_op
!= O_register
2079 || reg
.X_add_number
> 7)
2082 if (port
.X_op
!= O_register
&& port
.X_op
!= O_md1
)
2084 if (REG_A
== reg
.X_add_number
)
2088 emit_byte (&port
, BFD_RELOC_8
);
2095 if (REG_C
== port
.X_add_number
|| port
.X_add_number
== REG_BC
)
2097 if (port
.X_add_number
== REG_BC
&& !(ins_ok
& INS_EZ80
))
2101 *q
= 0x41 | (reg
.X_add_number
<< 3);
2110 emit_out0 (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2113 expressionS reg
, port
;
2117 p
= parse_exp (args
, & port
);
2120 error (_("bad instruction syntax"));
2123 p
= parse_exp (p
, ®
);
2125 && port
.X_op
!= O_register
2126 && port
.X_op
!= O_md1
2128 && reg
.X_op
== O_register
2129 && reg
.X_add_number
<= 7)
2133 *q
= 0x01 | (reg
.X_add_number
<< 3);
2134 emit_byte (&port
, BFD_RELOC_8
);
2142 emit_rst (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
2148 p
= parse_exp_not_indexed (args
, &addr
);
2149 if (addr
.X_op
!= O_constant
)
2151 error ("rst needs constant address");
2155 if (addr
.X_add_number
& ~(7 << 3))
2160 *q
= opcode
+ (addr
.X_add_number
& (7 << 3));
2165 /* For 8-bit indirect load to memory instructions like: LD (HL),n or LD (ii+d),n. */
2167 emit_ld_m_n (expressionS
*dst
, expressionS
*src
)
2171 expressionS dst_offset
;
2173 switch (dst
->X_add_number
)
2175 case REG_HL
: prefix
= 0x00; break;
2176 case REG_IX
: prefix
= 0xDD; break;
2177 case REG_IY
: prefix
= 0xFD; break;
2183 q
= frag_more (prefix
? 2 : 1);
2190 dst_offset
.X_op
= O_symbol
;
2191 dst_offset
.X_add_number
= 0;
2192 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2194 emit_byte (src
, BFD_RELOC_8
);
2197 /* For 8-bit load register to memory instructions: LD (<expression>),r. */
2199 emit_ld_m_r (expressionS
*dst
, expressionS
*src
)
2203 expressionS dst_offset
;
2208 if (ins_ok
& INS_GBZ80
)
2209 { /* LD (HL+),A or LD (HL-),A */
2210 if (src
->X_op
!= O_register
|| src
->X_add_number
!= REG_A
)
2212 *frag_more (1) = (dst
->X_add_number
== REG_HL
) ? 0x22 : 0x32;
2216 prefix
= (dst
->X_add_number
== REG_IX
) ? 0xDD : 0xFD;
2219 switch (dst
->X_add_number
)
2221 case REG_BC
: /* LD (BC),A */
2222 case REG_DE
: /* LD (DE),A */
2223 if (src
->X_add_number
== REG_A
)
2226 *q
= 0x02 | ((dst
->X_add_number
& 3) << 4);
2232 case REG_HL
: /* LD (HL),r or LD (ii+d),r */
2233 if (src
->X_add_number
<= 7)
2235 q
= frag_more (prefix
? 2 : 1);
2238 *q
= 0x70 | src
->X_add_number
;
2242 dst_offset
.X_op
= O_symbol
;
2243 dst_offset
.X_add_number
= 0;
2244 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2252 default: /* LD (nn),A */
2253 if (src
->X_add_number
== REG_A
)
2256 *q
= (ins_ok
& INS_GBZ80
) ? 0xEA : 0x32;
2265 /* For 16-bit load register to memory instructions: LD (<expression>),rr. */
2267 emit_ld_m_rr (expressionS
*dst
, expressionS
*src
)
2272 expressionS dst_offset
;
2276 case O_md1
: /* eZ80 instructions LD (ii+d),rr */
2277 case O_register
: /* eZ80 instructions LD (HL),rr */
2278 if (!(ins_ok
& INS_EZ80
)) /* 16-bit indirect load group is supported by eZ80 only */
2280 switch (dst
->X_add_number
)
2282 case REG_IX
: prefix
= 0xDD; break;
2283 case REG_IY
: prefix
= 0xFD; break;
2284 case REG_HL
: prefix
= 0xED; break;
2288 switch (src
->X_add_number
)
2290 case REG_BC
: opcode
= 0x0F; break;
2291 case REG_DE
: opcode
= 0x1F; break;
2292 case REG_HL
: opcode
= 0x2F; break;
2293 case REG_IX
: opcode
= (prefix
!= 0xFD) ? 0x3F : 0x3E; break;
2294 case REG_IY
: opcode
= (prefix
!= 0xFD) ? 0x3E : 0x3F; break;
2298 q
= frag_more (prefix
? 2 : 1);
2301 if (prefix
== 0xFD || prefix
== 0xDD)
2304 dst_offset
.X_op
= O_symbol
;
2305 dst_offset
.X_add_number
= 0;
2306 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2309 default: /* LD (nn),rr */
2310 if (ins_ok
& INS_GBZ80
)
2312 /* GBZ80 supports only LD (nn),SP */
2313 if (src
->X_add_number
== REG_SP
)
2323 switch (src
->X_add_number
)
2325 case REG_BC
: prefix
= 0xED; opcode
= 0x43; break;
2326 case REG_DE
: prefix
= 0xED; opcode
= 0x53; break;
2327 case REG_HL
: prefix
= 0x00; opcode
= 0x22; break;
2328 case REG_IX
: prefix
= 0xDD; opcode
= 0x22; break;
2329 case REG_IY
: prefix
= 0xFD; opcode
= 0x22; break;
2330 case REG_SP
: prefix
= 0xED; opcode
= 0x73; break;
2335 q
= frag_more (prefix
? 2 : 1);
2344 emit_ld_r_m (expressionS
*dst
, expressionS
*src
)
2345 { /* for 8-bit memory load to register: LD r,(xxx) */
2349 expressionS src_offset
;
2351 if (dst
->X_add_number
== REG_A
&& src
->X_op
== O_register
)
2352 { /* LD A,(BC) or LD A,(DE) */
2353 switch (src
->X_add_number
)
2355 case REG_BC
: opcode
= 0x0A; break;
2356 case REG_DE
: opcode
= 0x1A; break;
2370 if (ins_ok
& INS_GBZ80
)
2371 { /* LD A,(HL+) or LD A,(HL-) */
2372 if (dst
->X_op
== O_register
&& dst
->X_add_number
== REG_A
)
2373 *frag_more (1) = (src
->X_add_number
== REG_HL
) ? 0x2A : 0x3A;
2380 if (dst
->X_add_number
> 7)
2382 opcode
= 0x46; /* LD B,(HL) */
2383 switch (src
->X_add_number
)
2385 case REG_HL
: prefix
= 0x00; break;
2386 case REG_IX
: prefix
= 0xDD; break;
2387 case REG_IY
: prefix
= 0xFD; break;
2391 q
= frag_more (prefix
? 2 : 1);
2394 *q
= opcode
| ((dst
->X_add_number
& 7) << 3);
2398 src_offset
.X_op
= O_symbol
;
2399 src_offset
.X_add_number
= 0;
2400 emit_byte (& src_offset
, BFD_RELOC_Z80_DISP8
);
2403 default: /* LD A,(nn) */
2404 if (dst
->X_add_number
== REG_A
)
2407 *q
= (ins_ok
& INS_GBZ80
) ? 0xFA : 0x3A;
2416 emit_ld_r_n (expressionS
*dst
, expressionS
*src
)
2417 { /* for 8-bit immediate value load to register: LD r,n */
2421 switch (dst
->X_add_number
)
2443 q
= frag_more (prefix
? 2 : 1);
2446 if (ins_ok
& INS_GBZ80
)
2448 else if (!(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
2449 check_mach (INS_IDX_HALF
);
2452 *q
= 0x06 | ((dst
->X_add_number
& 7) << 3);
2453 emit_byte (src
, BFD_RELOC_8
);
2457 emit_ld_r_r (expressionS
*dst
, expressionS
*src
)
2458 { /* mostly 8-bit load register from register instructions: LD r,r */
2459 /* there are some exceptions: LD SP,HL/IX/IY; LD I,HL and LD HL,I */
2465 switch (dst
->X_add_number
)
2468 switch (src
->X_add_number
)
2470 case REG_HL
: prefix
= 0x00; break;
2471 case REG_IX
: prefix
= 0xDD; break;
2472 case REG_IY
: prefix
= 0xFD; break;
2479 if (!(ins_ok
& INS_EZ80
))
2481 if (src
->X_add_number
!= REG_I
)
2484 error (_("ADL mode instruction"));
2490 if (src
->X_add_number
== REG_HL
)
2492 if (!(ins_ok
& INS_EZ80
))
2495 error (_("ADL mode instruction"));
2499 else if (src
->X_add_number
== REG_A
)
2508 if (!(ins_ok
& INS_EZ80
) || (src
->X_add_number
!= REG_A
))
2511 error (_("ADL mode instruction"));
2516 if (src
->X_add_number
== REG_A
) /* LD R,A */
2525 if (src
->X_add_number
== REG_I
) /* LD A,I */
2531 else if (src
->X_add_number
== REG_R
) /* LD A,R */
2537 else if (src
->X_add_number
== REG_MB
) /* LD A,MB */
2539 if (!(ins_ok
& INS_EZ80
))
2544 error (_("ADL mode instruction"));
2575 switch (src
->X_add_number
)
2586 ill_op (); /* LD iiH/L,H/L are not permitted */
2590 if (prefix
== 0xFD || dst
->X_add_number
== REG_H
|| dst
->X_add_number
== REG_L
)
2591 ill_op (); /* LD IYL,IXL and LD H,IXH are not permitted */
2597 if (prefix
== 0xDD || dst
->X_add_number
== REG_H
|| dst
->X_add_number
== REG_L
)
2598 ill_op (); /* LD IXH,IYH and LD L,IYL are not permitted */
2605 opcode
= 0x40 + ((dst
->X_add_number
& 7) << 3) + (src
->X_add_number
& 7);
2607 if ((ins_ok
& INS_GBZ80
) && prefix
!= 0)
2609 if (ii_halves
&& !(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
2610 check_mach (INS_IDX_HALF
);
2611 if (prefix
== 0 && (ins_ok
& INS_EZ80
))
2615 case 0x40: /* SIS prefix, in Z80 it is LD B,B */
2616 case 0x49: /* LIS prefix, in Z80 it is LD C,C */
2617 case 0x52: /* SIL prefix, in Z80 it is LD D,D */
2618 case 0x5B: /* LIL prefix, in Z80 it is LD E,E */
2619 as_warn (_("unsupported instruction, assembled as NOP"));
2625 q
= frag_more (prefix
? 2 : 1);
2632 emit_ld_rr_m (expressionS
*dst
, expressionS
*src
)
2633 { /* for 16-bit indirect load from memory to register: LD rr,(xxx) */
2637 expressionS src_offset
;
2639 /* GBZ80 has no support for 16-bit load from memory instructions */
2640 if (ins_ok
& INS_GBZ80
)
2646 case O_md1
: /* LD rr,(ii+d) */
2647 prefix
= (src
->X_add_number
== REG_IX
) ? 0xDD : 0xFD;
2649 case O_register
: /* LD rr,(HL) */
2650 /* currently only EZ80 has support for 16bit indirect memory load instructions */
2651 if (!(ins_ok
& INS_EZ80
))
2653 switch (dst
->X_add_number
)
2655 case REG_BC
: opcode
= 0x07; break;
2656 case REG_DE
: opcode
= 0x17; break;
2657 case REG_HL
: opcode
= 0x27; break;
2658 case REG_IX
: opcode
= (prefix
== 0xED || prefix
== 0xDD) ? 0x37 : 0x31; break;
2659 case REG_IY
: opcode
= (prefix
== 0xED || prefix
== 0xDD) ? 0x31 : 0x37; break;
2669 src_offset
.X_op
= O_symbol
;
2670 src_offset
.X_add_number
= 0;
2671 emit_byte (& src_offset
, BFD_RELOC_Z80_DISP8
);
2674 default: /* LD rr,(nn) */
2675 switch (dst
->X_add_number
)
2677 case REG_BC
: prefix
= 0xED; opcode
= 0x4B; break;
2678 case REG_DE
: prefix
= 0xED; opcode
= 0x5B; break;
2679 case REG_HL
: prefix
= 0x00; opcode
= 0x2A; break;
2680 case REG_SP
: prefix
= 0xED; opcode
= 0x7B; break;
2681 case REG_IX
: prefix
= 0xDD; opcode
= 0x2A; break;
2682 case REG_IY
: prefix
= 0xFD; opcode
= 0x2A; break;
2686 q
= frag_more (prefix
? 2 : 1);
2696 emit_ld_rr_nn (expressionS
*dst
, expressionS
*src
)
2697 { /* mostly load imediate value to multibyte register instructions: LD rr,nn */
2700 int opcode
= 0x21; /* LD HL,nn */
2701 switch (dst
->X_add_number
)
2714 opcode
= 0x01 + ((dst
->X_add_number
& 3) << 4);
2720 if (prefix
&& (ins_ok
& INS_GBZ80
))
2722 q
= frag_more (prefix
? 2 : 1);
2730 emit_ld (char prefix_in ATTRIBUTE_UNUSED
, char opcode_in ATTRIBUTE_UNUSED
,
2733 expressionS dst
, src
;
2736 p
= parse_exp (args
, & dst
);
2738 error (_("bad instruction syntax"));
2739 p
= parse_exp (p
, & src
);
2743 if (src
.X_op
== O_register
)
2745 if (src
.X_add_number
<= 7)
2746 emit_ld_m_r (& dst
, & src
); /* LD (xxx),r */
2748 emit_ld_m_rr (& dst
, & src
); /* LD (xxx),rr */
2751 emit_ld_m_n (& dst
, & src
); /* LD (hl),n or LD (ix/y+r),n */
2753 else if (dst
.X_op
== O_register
)
2757 if (dst
.X_add_number
<= 7)
2758 emit_ld_r_m (& dst
, & src
);
2760 emit_ld_rr_m (& dst
, & src
);
2762 else if (src
.X_op
== O_register
)
2763 emit_ld_r_r (& dst
, & src
);
2764 else if ((dst
.X_add_number
& ~R_INDEX
) <= 7)
2765 emit_ld_r_n (& dst
, & src
);
2767 emit_ld_rr_nn (& dst
, & src
);
2776 emit_lddldi (char prefix
, char opcode
, const char * args
)
2778 expressionS dst
, src
;
2782 if (!(ins_ok
& INS_GBZ80
))
2783 return emit_insn (prefix
, opcode
, args
);
2785 p
= parse_exp (args
, & dst
);
2787 error (_("bad instruction syntax"));
2788 p
= parse_exp (p
, & src
);
2790 if (dst
.X_op
!= O_register
|| src
.X_op
!= O_register
)
2793 /* convert opcode 0xA0 . 0x22, 0xA8 . 0x32 */
2794 opcode
= (opcode
& 0x08) * 2 + 0x22;
2797 && dst
.X_add_number
== REG_HL
2799 && src
.X_add_number
== REG_A
)
2800 opcode
|= 0x00; /* LDx (HL),A */
2801 else if (dst
.X_md
== 0
2802 && dst
.X_add_number
== REG_A
2804 && src
.X_add_number
== REG_HL
)
2805 opcode
|= 0x08; /* LDx A,(HL) */
2815 emit_ldh (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2818 expressionS dst
, src
;
2822 p
= parse_exp (args
, & dst
);
2825 error (_("bad instruction syntax"));
2829 p
= parse_exp (p
, & src
);
2831 && dst
.X_op
== O_register
2832 && dst
.X_add_number
== REG_A
2834 && src
.X_op
!= O_md1
)
2836 if (src
.X_op
!= O_register
)
2840 emit_byte (& src
, BFD_RELOC_8
);
2842 else if (src
.X_add_number
== REG_C
)
2843 *frag_more (1) = 0xF2;
2847 else if (dst
.X_md
!= 0
2848 && dst
.X_op
!= O_md1
2850 && src
.X_op
== O_register
2851 && src
.X_add_number
== REG_A
)
2853 if (dst
.X_op
== O_register
)
2855 if (dst
.X_add_number
== REG_C
)
2867 emit_byte (& dst
, BFD_RELOC_8
);
2877 emit_ldhl (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
2879 expressionS dst
, src
;
2882 p
= parse_exp (args
, & dst
);
2885 error (_("bad instruction syntax"));
2889 p
= parse_exp (p
, & src
);
2890 if (dst
.X_md
|| dst
.X_op
!= O_register
|| dst
.X_add_number
!= REG_SP
2891 || src
.X_md
|| src
.X_op
== O_register
|| src
.X_op
== O_md1
)
2895 emit_byte (& src
, BFD_RELOC_Z80_DISP8
);
2900 parse_lea_pea_args (const char * args
, expressionS
*op
)
2903 p
= parse_exp (args
, op
);
2904 if (sdcc_compat
&& *p
== ',' && op
->X_op
== O_register
)
2907 p
= parse_exp (p
+ 1, &off
);
2909 op
->X_add_symbol
= make_expr_symbol (&off
);
2915 emit_lea (char prefix
, char opcode
, const char * args
)
2917 expressionS dst
, src
;
2922 p
= parse_exp (args
, & dst
);
2923 if (dst
.X_md
!= 0 || dst
.X_op
!= O_register
)
2926 rnum
= dst
.X_add_number
;
2932 opcode
= 0x02 | ((rnum
& 0x03) << 4);
2935 opcode
= 0x32; /* lea ix,ix+d has opcode 0x32; lea ix,iy+d has opcode 0x54 */
2938 opcode
= 0x33; /* lea iy,iy+d has opcode 0x33; lea iy,ix+d has opcode 0x55 */
2945 error (_("bad instruction syntax"));
2947 p
= parse_lea_pea_args (p
, & src
);
2948 if (src
.X_md
!= 0 || src
.X_op
!= O_add
/*&& src.X_op != O_register*/)
2951 rnum
= src
.X_add_number
;
2956 case O_register
: /* permit instructions like LEA rr,IX without displacement specified */
2957 src
.X_add_symbol
= zero
;
2966 opcode
= (opcode
== (char)0x33) ? 0x55 : (opcode
|0x00);
2969 opcode
= (opcode
== (char)0x32) ? 0x54 : (opcode
|0x01);
2976 src
.X_op
= O_symbol
;
2977 src
.X_add_number
= 0;
2978 emit_byte (& src
, BFD_RELOC_Z80_DISP8
);
2984 emit_mlt (char prefix
, char opcode
, const char * args
)
2990 p
= parse_exp (args
, & arg
);
2991 if (arg
.X_md
!= 0 || arg
.X_op
!= O_register
|| !(arg
.X_add_number
& R_ARITH
))
2995 if (ins_ok
& INS_Z80N
)
2997 if (arg
.X_add_number
!= REG_DE
)
3005 *q
= opcode
| ((arg
.X_add_number
& 3) << 4);
3011 /* MUL D,E (Z80N only) */
3013 emit_mul (char prefix
, char opcode
, const char * args
)
3019 p
= parse_exp (args
, & r1
);
3021 error (_("bad instruction syntax"));
3022 p
= parse_exp (p
, & r2
);
3024 if (r1
.X_md
!= 0 || r1
.X_op
!= O_register
|| r1
.X_add_number
!= REG_D
||
3025 r2
.X_md
!= 0 || r2
.X_op
!= O_register
|| r2
.X_add_number
!= REG_E
)
3036 emit_nextreg (char prefix
, char opcode ATTRIBUTE_UNUSED
, const char * args
)
3042 p
= parse_exp (args
, & rr
);
3044 error (_("bad instruction syntax"));
3045 p
= parse_exp (p
, & nn
);
3046 if (rr
.X_md
!= 0 || rr
.X_op
== O_register
|| rr
.X_op
== O_md1
||
3047 nn
.X_md
!= 0 || nn
.X_op
== O_md1
)
3051 emit_byte (&rr
, BFD_RELOC_8
);
3052 if (nn
.X_op
== O_register
&& nn
.X_add_number
== REG_A
)
3054 else if (nn
.X_op
!= O_register
)
3057 emit_byte (&nn
, BFD_RELOC_8
);
3065 emit_pea (char prefix
, char opcode
, const char * args
)
3071 p
= parse_lea_pea_args (args
, & arg
);
3073 || (/*arg.X_op != O_register &&*/ arg
.X_op
!= O_add
)
3074 || !(arg
.X_add_number
& R_INDEX
))
3076 /* PEA ii without displacement is mostly typo,
3077 because there is PUSH instruction which is shorter and faster */
3078 /*if (arg.X_op == O_register)
3079 as_warn (_("PEA is used without displacement, use PUSH instead"));*/
3083 *q
= opcode
+ (arg
.X_add_number
== REG_IY
? 1 : 0);
3085 arg
.X_op
= O_symbol
;
3086 arg
.X_add_number
= 0;
3087 emit_byte (& arg
, BFD_RELOC_Z80_DISP8
);
3093 emit_reti (char prefix
, char opcode
, const char * args
)
3095 if (ins_ok
& INS_GBZ80
)
3096 return emit_insn (0x00, 0xD9, args
);
3098 return emit_insn (prefix
, opcode
, args
);
3102 emit_tst (char prefix
, char opcode
, const char *args
)
3109 p
= parse_exp (args
, & arg_s
);
3110 if (*p
== ',' && arg_s
.X_md
== 0 && arg_s
.X_op
== O_register
&& arg_s
.X_add_number
== REG_A
)
3112 if (!(ins_ok
& INS_EZ80
))
3115 p
= parse_exp (p
, & arg_s
);
3118 rnum
= arg_s
.X_add_number
;
3125 rnum
= arg_s
.X_add_number
;
3126 if (arg_s
.X_md
!= 0)
3135 *q
= opcode
| (rnum
<< 3);
3141 if (ins_ok
& INS_Z80N
)
3151 emit_byte (& arg_s
, BFD_RELOC_8
);
3157 emit_insn_n (char prefix
, char opcode
, const char *args
)
3163 p
= parse_exp (args
, & arg
);
3164 if (arg
.X_md
|| arg
.X_op
== O_register
|| arg
.X_op
== O_md1
)
3170 emit_byte (& arg
, BFD_RELOC_8
);
3176 emit_data (int size ATTRIBUTE_UNUSED
)
3183 if (is_it_end_of_statement ())
3185 demand_empty_rest_of_line ();
3188 p
= skip_space (input_line_pointer
);
3192 if (*p
== '\"' || *p
== '\'')
3194 for (quote
= *p
, q
= ++p
, cnt
= 0; *p
&& quote
!= *p
; ++p
, ++cnt
)
3196 u
= frag_more (cnt
);
3199 as_warn (_("unterminated string"));
3201 p
= skip_space (p
+1);
3205 p
= parse_exp (p
, &exp
);
3206 if (exp
.X_op
== O_md1
|| exp
.X_op
== O_register
)
3212 as_warn (_("parentheses ignored"));
3213 emit_byte (&exp
, BFD_RELOC_8
);
3217 while (*p
++ == ',') ;
3218 input_line_pointer
= (char *)(p
-1);
3227 if (is_it_end_of_statement ())
3229 demand_empty_rest_of_line ();
3232 p
= skip_space (input_line_pointer
);
3236 p
= parse_exp (p
, &exp
);
3237 if (exp
.X_op
== O_md1
|| exp
.X_op
== O_register
)
3243 as_warn (_("parentheses ignored"));
3244 emit_data_val (&exp
, size
);
3246 } while (*p
++ == ',') ;
3247 input_line_pointer
= (char *)(p
-1);
3250 /* next functions were commented out because it is difficult to mix
3251 both ADL and Z80 mode instructions within one COFF file:
3252 objdump cannot recognize point of mode switching.
3255 set_cpu_mode (int mode
)
3257 if (ins_ok
& INS_EZ80
)
3260 error (_("CPU mode is unsupported by target"));
3264 assume (int arg ATTRIBUTE_UNUSED
)
3270 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3271 c
= get_symbol_name (& name
);
3272 if (strncasecmp (name
, "ADL", 4) != 0)
3278 restore_line_pointer (c
);
3279 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3280 if (*input_line_pointer
++ != '=')
3282 error (_("assignment expected"));
3285 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3286 n
= get_single_number ();
3292 emit_mulub (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
3296 p
= skip_space (args
);
3297 if (TOLOWER (*p
++) != 'a' || *p
++ != ',')
3303 reg
= TOLOWER (*p
++);
3310 check_mach (INS_R800
);
3311 if (!*skip_space (p
))
3315 *q
= opcode
+ ((reg
- 'b') << 3);
3327 emit_muluw (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
3331 p
= skip_space (args
);
3332 if (TOLOWER (*p
++) != 'h' || TOLOWER (*p
++) != 'l' || *p
++ != ',')
3339 p
= parse_exp (p
, & reg
);
3341 if ((!reg
.X_md
) && reg
.X_op
== O_register
)
3342 switch (reg
.X_add_number
)
3346 check_mach (INS_R800
);
3349 *q
= opcode
+ ((reg
.X_add_number
& 3) << 4);
3359 assemble_suffix (const char **suffix
)
3362 const char sf
[8][4] =
3382 for (i
= 0; (i
< 3) && (ISALPHA (*p
)); i
++)
3383 sbuf
[i
] = TOLOWER (*p
++);
3384 if (*p
&& !ISSPACE (*p
))
3389 t
= bsearch (sbuf
, sf
, ARRAY_SIZE (sf
), sizeof (sf
[0]), (int(*)(const void*, const void*)) strcmp
);
3396 i
= cpu_mode
? 0x5B : 0x52;
3399 i
= cpu_mode
? 0x49 : 0x40;
3402 i
= cpu_mode
? 0x5B : 0x49;
3411 i
= cpu_mode
? 0x52 : 0x40;
3420 *frag_more (1) = (char)i
;
3423 case 0x40: inst_mode
= INST_MODE_FORCED
| INST_MODE_S
| INST_MODE_IS
; break;
3424 case 0x49: inst_mode
= INST_MODE_FORCED
| INST_MODE_L
| INST_MODE_IS
; break;
3425 case 0x52: inst_mode
= INST_MODE_FORCED
| INST_MODE_S
| INST_MODE_IL
; break;
3426 case 0x5B: inst_mode
= INST_MODE_FORCED
| INST_MODE_L
| INST_MODE_IL
; break;
3434 #if defined(OBJ_ELF)
3435 return obj_elf_section (arg
);
3436 #elif defined(OBJ_COFF)
3437 return obj_coff_section (arg
);
3439 #error Unknown object format
3449 as_fatal (_("Invalid directive"));
3452 ins_ok
&= INS_MARCH_MASK
;
3454 if (old_ins
!= ins_ok
)
3459 ignore (int arg ATTRIBUTE_UNUSED
)
3461 ignore_rest_of_line ();
3469 as_fatal (_("Invalid directive"));
3470 for (p
= input_line_pointer
; *p
&& *p
!= '(' && *p
!= '\n'; p
++)
3477 ignore_rest_of_line ();
3483 /* Handle the .bss pseudo-op. */
3486 s_bss (int ignore ATTRIBUTE_UNUSED
)
3488 subseg_set (bss_section
, 0);
3489 demand_empty_rest_of_line ();
3492 /* Port specific pseudo ops. */
3493 const pseudo_typeS md_pseudo_table
[] =
3495 { ".area", area
, 0},
3496 { ".assume", assume
, 0},
3497 { ".ez80", set_inss
, INS_EZ80
},
3498 { ".gbz80", set_inss
, INS_GBZ80
},
3499 { ".module", ignore
, 0},
3500 { ".optsdcc", ignore
, 0},
3501 { ".r800", set_inss
, INS_R800
},
3502 { ".set", s_set
, 0},
3503 { ".z180", set_inss
, INS_Z180
},
3504 { ".hd64", set_inss
, INS_Z180
},
3505 { ".z80", set_inss
, INS_Z80
},
3506 { ".z80n", set_inss
, INS_Z80N
},
3508 { "db" , emit_data
, 1},
3509 { "d24", z80_cons
, 3},
3510 { "d32", z80_cons
, 4},
3511 { "def24", z80_cons
, 3},
3512 { "def32", z80_cons
, 4},
3513 { "defb", emit_data
, 1},
3514 { "defm", emit_data
, 1},
3515 { "defs", s_space
, 1}, /* Synonym for ds on some assemblers. */
3516 { "defw", z80_cons
, 2},
3517 { "ds", s_space
, 1}, /* Fill with bytes rather than words. */
3518 { "dw", z80_cons
, 2},
3519 { "psect", psect
, 0}, /* TODO: Translate attributes. */
3520 { "set", 0, 0}, /* Real instruction on z80. */
3521 { "xdef", s_globl
, 0}, /* Synonym for .GLOBAL */
3522 { "xref", s_ignore
, 0}, /* Synonym for .EXTERN */
3526 static table_t instab
[] =
3528 { "adc", 0x88, 0x4A, emit_adc
, INS_ALL
},
3529 { "add", 0x80, 0x09, emit_add
, INS_ALL
},
3530 { "and", 0x00, 0xA0, emit_s
, INS_ALL
},
3531 { "bit", 0xCB, 0x40, emit_bit
, INS_ALL
},
3532 { "brlc", 0xED, 0x2C, emit_bshft
,INS_Z80N
},
3533 { "bsla", 0xED, 0x28, emit_bshft
,INS_Z80N
},
3534 { "bsra", 0xED, 0x29, emit_bshft
,INS_Z80N
},
3535 { "bsrf", 0xED, 0x2B, emit_bshft
,INS_Z80N
},
3536 { "bsrl", 0xED, 0x2A, emit_bshft
,INS_Z80N
},
3537 { "call", 0xCD, 0xC4, emit_jpcc
, INS_ALL
},
3538 { "ccf", 0x00, 0x3F, emit_insn
, INS_ALL
},
3539 { "cp", 0x00, 0xB8, emit_s
, INS_ALL
},
3540 { "cpd", 0xED, 0xA9, emit_insn
, INS_NOT_GBZ80
},
3541 { "cpdr", 0xED, 0xB9, emit_insn
, INS_NOT_GBZ80
},
3542 { "cpi", 0xED, 0xA1, emit_insn
, INS_NOT_GBZ80
},
3543 { "cpir", 0xED, 0xB1, emit_insn
, INS_NOT_GBZ80
},
3544 { "cpl", 0x00, 0x2F, emit_insn
, INS_ALL
},
3545 { "daa", 0x00, 0x27, emit_insn
, INS_ALL
},
3546 { "dec", 0x0B, 0x05, emit_incdec
,INS_ALL
},
3547 { "di", 0x00, 0xF3, emit_insn
, INS_ALL
},
3548 { "djnz", 0x00, 0x10, emit_jr
, INS_NOT_GBZ80
},
3549 { "ei", 0x00, 0xFB, emit_insn
, INS_ALL
},
3550 { "ex", 0x00, 0x00, emit_ex
, INS_NOT_GBZ80
},
3551 { "exx", 0x00, 0xD9, emit_insn
, INS_NOT_GBZ80
},
3552 { "halt", 0x00, 0x76, emit_insn
, INS_ALL
},
3553 { "im", 0xED, 0x46, emit_im
, INS_NOT_GBZ80
},
3554 { "in", 0x00, 0x00, emit_in
, INS_NOT_GBZ80
},
3555 { "in0", 0xED, 0x00, emit_in0
, INS_Z180
|INS_EZ80
},
3556 { "inc", 0x03, 0x04, emit_incdec
,INS_ALL
},
3557 { "ind", 0xED, 0xAA, emit_insn
, INS_NOT_GBZ80
},
3558 { "ind2", 0xED, 0x8C, emit_insn
, INS_EZ80
},
3559 { "ind2r",0xED, 0x9C, emit_insn
, INS_EZ80
},
3560 { "indm", 0xED, 0x8A, emit_insn
, INS_EZ80
},
3561 { "indmr",0xED, 0x9A, emit_insn
, INS_EZ80
},
3562 { "indr", 0xED, 0xBA, emit_insn
, INS_NOT_GBZ80
},
3563 { "indrx",0xED, 0xCA, emit_insn
, INS_EZ80
},
3564 { "ini", 0xED, 0xA2, emit_insn
, INS_NOT_GBZ80
},
3565 { "ini2", 0xED, 0x84, emit_insn
, INS_EZ80
},
3566 { "ini2r",0xED, 0x94, emit_insn
, INS_EZ80
},
3567 { "inim", 0xED, 0x82, emit_insn
, INS_EZ80
},
3568 { "inimr",0xED, 0x92, emit_insn
, INS_EZ80
},
3569 { "inir", 0xED, 0xB2, emit_insn
, INS_NOT_GBZ80
},
3570 { "inirx",0xED, 0xC2, emit_insn
, INS_EZ80
},
3571 { "jp", 0xC3, 0xC2, emit_jpcc
, INS_ALL
},
3572 { "jr", 0x18, 0x20, emit_jrcc
, INS_ALL
},
3573 { "ld", 0x00, 0x00, emit_ld
, INS_ALL
},
3574 { "ldd", 0xED, 0xA8, emit_lddldi
,INS_ALL
}, /* GBZ80 has special meaning */
3575 { "lddr", 0xED, 0xB8, emit_insn
, INS_NOT_GBZ80
},
3576 { "lddrx",0xED, 0xBC, emit_insn
, INS_Z80N
},
3577 { "lddx", 0xED, 0xAC, emit_insn
, INS_Z80N
},
3578 { "ldh", 0xE0, 0x00, emit_ldh
, INS_GBZ80
},
3579 { "ldhl", 0x00, 0xF8, emit_ldhl
, INS_GBZ80
},
3580 { "ldi", 0xED, 0xA0, emit_lddldi
,INS_ALL
}, /* GBZ80 has special meaning */
3581 { "ldir", 0xED, 0xB0, emit_insn
, INS_NOT_GBZ80
},
3582 { "ldirx",0xED, 0xB4, emit_insn
, INS_Z80N
},
3583 { "ldix", 0xED, 0xA4, emit_insn
, INS_Z80N
},
3584 { "ldpirx",0xED,0xB7, emit_insn
, INS_Z80N
},
3585 { "ldws", 0xED, 0xA5, emit_insn
, INS_Z80N
},
3586 { "lea", 0xED, 0x02, emit_lea
, INS_EZ80
},
3587 { "mirror",0xED,0x24, emit_insn
, INS_Z80N
},
3588 { "mlt", 0xED, 0x4C, emit_mlt
, INS_Z180
|INS_EZ80
|INS_Z80N
},
3589 { "mul", 0xED, 0x30, emit_mul
, INS_Z80N
},
3590 { "mulub",0xED, 0xC5, emit_mulub
,INS_R800
},
3591 { "muluw",0xED, 0xC3, emit_muluw
,INS_R800
},
3592 { "neg", 0xED, 0x44, emit_insn
, INS_NOT_GBZ80
},
3593 { "nextreg",0xED,0x91,emit_nextreg
,INS_Z80N
},
3594 { "nop", 0x00, 0x00, emit_insn
, INS_ALL
},
3595 { "or", 0x00, 0xB0, emit_s
, INS_ALL
},
3596 { "otd2r",0xED, 0xBC, emit_insn
, INS_EZ80
},
3597 { "otdm", 0xED, 0x8B, emit_insn
, INS_Z180
|INS_EZ80
},
3598 { "otdmr",0xED, 0x9B, emit_insn
, INS_Z180
|INS_EZ80
},
3599 { "otdr", 0xED, 0xBB, emit_insn
, INS_NOT_GBZ80
},
3600 { "otdrx",0xED, 0xCB, emit_insn
, INS_EZ80
},
3601 { "oti2r",0xED, 0xB4, emit_insn
, INS_EZ80
},
3602 { "otim", 0xED, 0x83, emit_insn
, INS_Z180
|INS_EZ80
},
3603 { "otimr",0xED, 0x93, emit_insn
, INS_Z180
|INS_EZ80
},
3604 { "otir", 0xED, 0xB3, emit_insn
, INS_NOT_GBZ80
},
3605 { "otirx",0xED, 0xC3, emit_insn
, INS_EZ80
},
3606 { "out", 0x00, 0x00, emit_out
, INS_NOT_GBZ80
},
3607 { "out0", 0xED, 0x01, emit_out0
, INS_Z180
|INS_EZ80
},
3608 { "outd", 0xED, 0xAB, emit_insn
, INS_NOT_GBZ80
},
3609 { "outd2",0xED, 0xAC, emit_insn
, INS_EZ80
},
3610 { "outi", 0xED, 0xA3, emit_insn
, INS_NOT_GBZ80
},
3611 { "outi2",0xED, 0xA4, emit_insn
, INS_EZ80
},
3612 { "outinb",0xED,0x90, emit_insn
, INS_Z80N
},
3613 { "pea", 0xED, 0x65, emit_pea
, INS_EZ80
},
3614 { "pixelad",0xED,0x94,emit_insn
, INS_Z80N
},
3615 { "pixeldn",0xED,0x93,emit_insn
, INS_Z80N
},
3616 { "pop", 0x00, 0xC1, emit_pop
, INS_ALL
},
3617 { "push", 0x00, 0xC5, emit_push
, INS_ALL
},
3618 { "res", 0xCB, 0x80, emit_bit
, INS_ALL
},
3619 { "ret", 0xC9, 0xC0, emit_retcc
,INS_ALL
},
3620 { "reti", 0xED, 0x4D, emit_reti
, INS_ALL
}, /*GBZ80 has its own opcode for it*/
3621 { "retn", 0xED, 0x45, emit_insn
, INS_NOT_GBZ80
},
3622 { "rl", 0xCB, 0x10, emit_mr
, INS_ALL
},
3623 { "rla", 0x00, 0x17, emit_insn
, INS_ALL
},
3624 { "rlc", 0xCB, 0x00, emit_mr
, INS_ALL
},
3625 { "rlca", 0x00, 0x07, emit_insn
, INS_ALL
},
3626 { "rld", 0xED, 0x6F, emit_insn
, INS_NOT_GBZ80
},
3627 { "rr", 0xCB, 0x18, emit_mr
, INS_ALL
},
3628 { "rra", 0x00, 0x1F, emit_insn
, INS_ALL
},
3629 { "rrc", 0xCB, 0x08, emit_mr
, INS_ALL
},
3630 { "rrca", 0x00, 0x0F, emit_insn
, INS_ALL
},
3631 { "rrd", 0xED, 0x67, emit_insn
, INS_NOT_GBZ80
},
3632 { "rsmix",0xED, 0x7E, emit_insn
, INS_EZ80
},
3633 { "rst", 0x00, 0xC7, emit_rst
, INS_ALL
},
3634 { "sbc", 0x98, 0x42, emit_adc
, INS_ALL
},
3635 { "scf", 0x00, 0x37, emit_insn
, INS_ALL
},
3636 { "set", 0xCB, 0xC0, emit_bit
, INS_ALL
},
3637 { "setae",0xED, 0x95, emit_insn
, INS_Z80N
},
3638 { "sl1", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3639 { "sla", 0xCB, 0x20, emit_mr
, INS_ALL
},
3640 { "sli", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3641 { "sll", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3642 { "slp", 0xED, 0x76, emit_insn
, INS_Z180
|INS_EZ80
},
3643 { "sra", 0xCB, 0x28, emit_mr
, INS_ALL
},
3644 { "srl", 0xCB, 0x38, emit_mr
, INS_ALL
},
3645 { "stmix",0xED, 0x7D, emit_insn
, INS_EZ80
},
3646 { "stop", 0x00, 0x10, emit_insn
, INS_GBZ80
},
3647 { "sub", 0x00, 0x90, emit_sub
, INS_ALL
},
3648 { "swap", 0xCB, 0x30, emit_swap
, INS_GBZ80
|INS_Z80N
},
3649 { "swapnib",0xED,0x23,emit_insn
, INS_Z80N
},
3650 { "test", 0xED, 0x27, emit_insn_n
, INS_Z80N
},
3651 { "tst", 0xED, 0x04, emit_tst
, INS_Z180
|INS_EZ80
|INS_Z80N
},
3652 { "tstio",0xED, 0x74, emit_insn_n
,INS_Z180
|INS_EZ80
},
3653 { "xor", 0x00, 0xA8, emit_s
, INS_ALL
},
3657 md_assemble (char *str
)
3665 inst_mode
= cpu_mode
? (INST_MODE_L
| INST_MODE_IL
) : (INST_MODE_S
| INST_MODE_IS
);
3666 old_ptr
= input_line_pointer
;
3667 p
= skip_space (str
);
3668 for (i
= 0; (i
< BUFLEN
) && (ISALPHA (*p
) || ISDIGIT (*p
));)
3669 buf
[i
++] = TOLOWER (*p
++);
3673 buf
[BUFLEN
-3] = buf
[BUFLEN
-2] = '.'; /* Mark opcode as abbreviated. */
3675 as_bad (_("Unknown instruction '%s'"), buf
);
3679 dwarf2_emit_insn (0);
3680 if ((*p
) && (!ISSPACE (*p
)))
3682 if (*p
!= '.' || !(ins_ok
& INS_EZ80
) || !assemble_suffix (&p
))
3684 as_bad (_("syntax error"));
3692 insp
= bsearch (&key
, instab
, ARRAY_SIZE (instab
),
3693 sizeof (instab
[0]), key_cmp
);
3694 if (!insp
|| (insp
->inss
&& !(insp
->inss
& ins_ok
)))
3697 as_bad (_("Unknown instruction `%s'"), buf
);
3701 p
= insp
->fp (insp
->prefix
, insp
->opcode
, p
);
3703 if ((!err_flag
) && *p
)
3704 as_bad (_("junk at end of line, "
3705 "first unrecognized character is `%c'"), *p
);
3709 input_line_pointer
= old_ptr
;
3713 signed_overflow (signed long value
, unsigned bitsize
)
3715 signed long max
= (signed long) ((1UL << (bitsize
- 1)) - 1);
3716 return value
< -max
- 1 || value
> max
;
3720 unsigned_overflow (unsigned long value
, unsigned bitsize
)
3722 return value
>> (bitsize
- 1) >> 1 != 0;
3726 is_overflow (long value
, unsigned bitsize
)
3729 return signed_overflow (value
, bitsize
);
3730 return unsigned_overflow ((unsigned long)value
, bitsize
);
3734 md_apply_fix (fixS
* fixP
, valueT
* valP
, segT seg
)
3737 char *p_lit
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
3739 if (fixP
->fx_addsy
== NULL
)
3741 else if (fixP
->fx_pcrel
)
3743 segT s
= S_GET_SEGMENT (fixP
->fx_addsy
);
3744 if (s
== seg
|| s
== absolute_section
)
3746 val
+= S_GET_VALUE (fixP
->fx_addsy
);
3751 switch (fixP
->fx_r_type
)
3753 case BFD_RELOC_8_PCREL
:
3754 case BFD_RELOC_Z80_DISP8
:
3759 case BFD_RELOC_Z80_16_BE
:
3760 fixP
->fx_no_overflow
= 0;
3763 fixP
->fx_no_overflow
= 1;
3767 switch (fixP
->fx_r_type
)
3769 case BFD_RELOC_8_PCREL
:
3770 case BFD_RELOC_Z80_DISP8
:
3771 if (fixP
->fx_done
&& signed_overflow (val
, 8))
3772 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3773 _("8-bit signed offset out of range (%+ld)"), val
);
3777 case BFD_RELOC_Z80_BYTE0
:
3781 case BFD_RELOC_Z80_BYTE1
:
3782 *p_lit
++ = (val
>> 8);
3785 case BFD_RELOC_Z80_BYTE2
:
3786 *p_lit
++ = (val
>> 16);
3789 case BFD_RELOC_Z80_BYTE3
:
3790 *p_lit
++ = (val
>> 24);
3794 if (fixP
->fx_done
&& is_overflow(val
, 8))
3795 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3796 _("8-bit overflow (%+ld)"), val
);
3800 case BFD_RELOC_Z80_WORD1
:
3801 *p_lit
++ = (val
>> 16);
3802 *p_lit
++ = (val
>> 24);
3805 case BFD_RELOC_Z80_WORD0
:
3807 *p_lit
++ = (val
>> 8);
3811 if (fixP
->fx_done
&& is_overflow(val
, 16))
3812 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3813 _("16-bit overflow (%+ld)"), val
);
3815 *p_lit
++ = (val
>> 8);
3818 case BFD_RELOC_24
: /* Def24 may produce this. */
3819 if (fixP
->fx_done
&& is_overflow(val
, 24))
3820 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3821 _("24-bit overflow (%+ld)"), val
);
3823 *p_lit
++ = (val
>> 8);
3824 *p_lit
++ = (val
>> 16);
3827 case BFD_RELOC_32
: /* Def32 and .long may produce this. */
3828 if (fixP
->fx_done
&& is_overflow(val
, 32))
3829 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3830 _("32-bit overflow (%+ld)"), val
);
3832 *p_lit
++ = (val
>> 8);
3833 *p_lit
++ = (val
>> 16);
3834 *p_lit
++ = (val
>> 24);
3837 case BFD_RELOC_Z80_16_BE
: /* Z80N PUSH nn instruction produce this. */
3838 *p_lit
++ = val
>> 8;
3843 printf (_("md_apply_fix: unknown reloc type 0x%x\n"), fixP
->fx_r_type
);
3848 /* GAS will call this to generate a reloc. GAS will pass the
3849 resulting reloc to `bfd_install_relocation'. This currently works
3850 poorly, as `bfd_install_relocation' often does the wrong thing, and
3851 instances of `tc_gen_reloc' have been written to work around the
3852 problems, which in turns makes it difficult to fix
3853 `bfd_install_relocation'. */
3855 /* If while processing a fixup, a reloc really
3856 needs to be created then it is done here. */
3859 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
3863 if (fixp
->fx_subsy
!= NULL
)
3865 as_bad_subtract (fixp
);
3869 reloc
= XNEW (arelent
);
3870 reloc
->sym_ptr_ptr
= XNEW (asymbol
*);
3871 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
3872 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3873 reloc
->addend
= fixp
->fx_offset
;
3874 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
3875 if (reloc
->howto
== NULL
)
3877 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
3878 _("reloc %d not supported by object file format"),
3879 (int) fixp
->fx_r_type
);
3883 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3884 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3885 reloc
->address
= fixp
->fx_offset
;
3891 z80_tc_labels_without_colon (void)
3893 return colonless_labels
;
3897 z80_tc_label_is_local (const char *name
)
3901 if (local_label_prefix
== NULL
)
3903 for (p
= local_label_prefix
, n
= name
; *p
&& *n
&& *n
== *p
; p
++, n
++)
3908 /* Parse floating point number from string and compute mantissa and
3909 exponent. Mantissa is normalized.
3911 #define EXP_MIN -0x10000
3912 #define EXP_MAX 0x10000
3914 str_to_broken_float (bool *signP
, uint64_t *mantissaP
, int *expP
)
3918 uint64_t mantissa
= 0;
3922 p
= (char*)skip_space (input_line_pointer
);
3925 if (sign
|| *p
== '+')
3927 if (strncasecmp (p
, "NaN", 3) == 0)
3931 input_line_pointer
= p
+ 3;
3934 if (strncasecmp (p
, "inf", 3) == 0)
3936 *mantissaP
= 1ull << 63;
3938 input_line_pointer
= p
+ 3;
3941 for (; ISDIGIT (*p
); ++p
)
3949 mantissa
= mantissa
* 10 + (*p
- '0');
3951 /* skip non-significant digits */
3952 for (; ISDIGIT (*p
); ++p
)
3958 if (!exponent
) /* If no precision overflow. */
3960 for (; ISDIGIT (*p
); ++p
, --exponent
)
3968 mantissa
= mantissa
* 10 + (*p
- '0');
3971 for (; ISDIGIT (*p
); ++p
)
3974 if (*p
== 'e' || *p
== 'E')
3980 if (es
|| *p
== '+')
3982 for (; ISDIGIT (*p
); ++p
)
3985 t
= t
* 10 + (*p
- '0');
3987 exponent
+= (es
) ? -t
: t
;
3989 if (ISALNUM (*p
) || *p
== '.')
3991 input_line_pointer
= p
;
3994 *mantissaP
= 1ull << 63;
3996 return 1; /* result is 0 */
3999 for (; mantissa
<= ~0ull/10; --exponent
)
4001 /* Now we have sign, mantissa, and signed decimal exponent
4002 need to recompute to binary exponent. */
4003 for (i
= 64; exponent
> 0; --exponent
)
4005 /* be sure that no integer overflow */
4006 while (mantissa
> ~0ull/10)
4013 for (; exponent
< 0; ++exponent
)
4015 while (!(mantissa
>> 63))
4023 for (; !(mantissa
>> 63); --i
)
4025 *mantissaP
= mantissa
;
4031 str_to_zeda32(char *litP
, int *sizeP
)
4039 if (!str_to_broken_float (&sign
, &mantissa
, &exponent
))
4040 return _("invalid syntax");
4041 /* I do not know why decrement is needed */
4043 /* shift by 39 bits right keeping 25 bit mantissa for rounding */
4047 /* make 24 bit mantissa */
4049 /* check for overflow */
4056 if (exponent
< -127)
4061 else if (exponent
> 127)
4064 mantissa
= sign
? 0xc00000 : 0x400000;
4066 else if (mantissa
== 0)
4069 mantissa
= 0x200000;
4072 mantissa
&= (1ull << 23) - 1;
4073 for (i
= 0; i
< 24; i
+= 8)
4074 *litP
++ = (char)(mantissa
>> i
);
4075 *litP
= (char)(0x80 + exponent
);
4080 Math48 by Anders Hejlsberg support.
4081 Mantissa is 39 bits wide, exponent 8 bit wide.
4084 bit 46-8: normalized mantissa (bits 38-0, bit39 assumed to be 1)
4085 bit 7-0: exponent+128 (0 - value is null)
4086 MIN: 2.938735877e-39
4087 MAX: 1.701411835e+38
4090 str_to_float48(char *litP
, int *sizeP
)
4098 if (!str_to_broken_float (&sign
, &mantissa
, &exponent
))
4099 return _("invalid syntax");
4100 /* shift by 23 bits right keeping 41 bit mantissa for rounding */
4104 /* make 40 bit mantissa */
4106 /* check for overflow */
4112 if (exponent
< -127)
4114 memset (litP
, 0, 6);
4118 return _("overflow");
4120 mantissa
&= (1ull << 39) - 1;
4121 *litP
++ = (char)(0x80 + exponent
);
4122 for (i
= 0; i
< 40; i
+= 8)
4123 *litP
++ = (char)(mantissa
>> i
);
4128 str_to_ieee754_h(char *litP
, int *sizeP
)
4130 return ieee_md_atof ('h', litP
, sizeP
, false);
4134 str_to_ieee754_s(char *litP
, int *sizeP
)
4136 return ieee_md_atof ('s', litP
, sizeP
, false);
4140 str_to_ieee754_d(char *litP
, int *sizeP
)
4142 return ieee_md_atof ('d', litP
, sizeP
, false);
4145 #ifdef TARGET_USE_CFIPOP
4146 /* Initialize the DWARF-2 unwind information for this procedure. */
4148 z80_tc_frame_initial_instructions (void)
4150 static int sp_regno
= -1;
4153 sp_regno
= z80_tc_regname_to_dw2regnum ("sp");
4155 cfi_add_CFA_def_cfa (sp_regno
, 0);
4159 z80_tc_regname_to_dw2regnum (const char *regname
)
4161 static const char *regs
[] =
4162 { /* same registers as for GDB */
4163 "af", "bc", "de", "hl",
4164 "sp", "pc", "ix", "iy",
4165 "af_", "bc_", "de_", "hl_",
4170 for (i
= 0; i
< ARRAY_SIZE(regs
); ++i
)
4171 if (!strcasecmp (regs
[i
], regname
))
4178 /* Implement DWARF2_ADDR_SIZE. */
4180 z80_dwarf2_addr_size (const bfd
*abfd
)
4182 switch (bfd_get_mach (abfd
))
4184 case bfd_mach_ez80_adl
: