1 /* tc-z80.c -- Assemble code for the Zilog Z80, Z180, EZ80 and ASCII R800
2 Copyright (C) 2005-2024 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 const 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 const 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 (%+" PRId64
")"), size
* 8,
1148 (int64_t) val
->X_add_number
);
1149 for (i
= 0; i
< size
; ++i
)
1150 p
[i
] = (val
->X_add_number
>> (i
* 8)) & 0xff;
1156 case 1: r_type
= BFD_RELOC_8
; break;
1157 case 2: r_type
= BFD_RELOC_16
; break;
1158 case 3: r_type
= BFD_RELOC_24
; break;
1159 case 4: r_type
= BFD_RELOC_32
; break;
1160 case 8: r_type
= BFD_RELOC_64
; break;
1162 as_fatal (_("invalid data size %d"), size
);
1165 if ( (val
->X_op
== O_register
)
1166 || (val
->X_op
== O_md1
)
1167 || contains_register (val
->X_add_symbol
)
1168 || contains_register (val
->X_op_symbol
))
1171 if (size
<= 2 && val
->X_op_symbol
)
1173 bool simplify
= true;
1174 int shift
= symbol_get_value_expression (val
->X_op_symbol
)->X_add_number
;
1175 if (val
->X_op
== O_bit_and
&& shift
== (1 << (size
*8))-1)
1177 else if (val
->X_op
!= O_right_shift
)
1184 case 0: r_type
= BFD_RELOC_Z80_BYTE0
; break;
1185 case 8: r_type
= BFD_RELOC_Z80_BYTE1
; break;
1186 case 16: r_type
= BFD_RELOC_Z80_BYTE2
; break;
1187 case 24: r_type
= BFD_RELOC_Z80_BYTE3
; break;
1188 default: simplify
= false;
1191 else /* if (size == 2) */
1195 case 0: r_type
= BFD_RELOC_Z80_WORD0
; break;
1196 case 16: r_type
= BFD_RELOC_Z80_WORD1
; break;
1198 case 24: /* add two byte fixups */
1199 val
->X_op
= O_symbol
;
1200 val
->X_op_symbol
= NULL
;
1201 val
->X_add_number
= 0;
1204 fix_new_exp (frag_now
, p
++ - frag_now
->fr_literal
, 1, val
, false,
1205 BFD_RELOC_Z80_BYTE1
);
1206 /* prepare to next byte */
1207 r_type
= BFD_RELOC_Z80_BYTE2
;
1210 r_type
= BFD_RELOC_Z80_BYTE3
; /* high byte will be 0 */
1214 default: simplify
= false;
1220 val
->X_op
= O_symbol
;
1221 val
->X_op_symbol
= NULL
;
1222 val
->X_add_number
= 0;
1226 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, size
, val
, false, r_type
);
1230 emit_byte (expressionS
* val
, bfd_reloc_code_real_type r_type
)
1234 if (r_type
== BFD_RELOC_8
)
1236 emit_data_val (val
, 1);
1240 *p
= val
->X_add_number
;
1241 if (contains_register (val
->X_add_symbol
) || contains_register (val
->X_op_symbol
))
1245 else if ((r_type
== BFD_RELOC_8_PCREL
) && (val
->X_op
== O_constant
))
1247 as_bad (_("cannot make a relative jump to an absolute location"));
1249 else if (val
->X_op
== O_constant
)
1251 if ((val
->X_add_number
< -128) || (val
->X_add_number
>= 128))
1253 if (r_type
== BFD_RELOC_Z80_DISP8
)
1254 as_bad (_("index overflow (%+" PRId64
")"),
1255 (int64_t) val
->X_add_number
);
1257 as_bad (_("offset overflow (%+" PRId64
")"),
1258 (int64_t) val
->X_add_number
);
1263 /* For symbols only, constants are stored at begin of function. */
1264 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, 1, val
,
1265 r_type
== BFD_RELOC_8_PCREL
, r_type
);
1270 emit_word (expressionS
* val
)
1272 emit_data_val (val
, (inst_mode
& INST_MODE_IL
) ? 3 : 2);
1276 emit_mx (char prefix
, char opcode
, int shift
, expressionS
* arg
)
1277 /* The operand m may be r, (hl), (ix+d), (iy+d),
1278 if 0 == prefix m may also be ixl, ixh, iyl, iyh. */
1283 rnum
= arg
->X_add_number
;
1299 if ((prefix
== 0) && (rnum
& R_INDEX
))
1301 prefix
= (rnum
& R_IX
) ? 0xDD : 0xFD;
1302 if (!(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
1303 check_mach (INS_IDX_HALF
);
1312 q
= frag_more (prefix
? 2 : 1);
1315 * q
++ = opcode
+ (rnum
<< shift
);
1318 if (ins_ok
& INS_GBZ80
)
1324 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1325 *q
= (prefix
) ? prefix
: (opcode
+ (6 << shift
));
1327 expressionS offset
= *arg
;
1328 offset
.X_op
= O_symbol
;
1329 offset
.X_add_number
= 0;
1330 emit_byte (&offset
, BFD_RELOC_Z80_DISP8
);
1335 *q
= opcode
+(6<<shift
);
1343 /* The operand m may be r, (hl), (ix+d), (iy+d),
1344 if 0 = prefix m may also be ixl, ixh, iyl, iyh. */
1346 emit_m (char prefix
, char opcode
, const char *args
)
1351 p
= parse_exp (args
, &arg_m
);
1356 emit_mx (prefix
, opcode
, 0, &arg_m
);
1364 /* The operand m may be as above or one of the undocumented
1365 combinations (ix+d),r and (iy+d),r (if unportable instructions
1369 emit_mr (char prefix
, char opcode
, const char *args
)
1371 expressionS arg_m
, arg_r
;
1374 p
= parse_exp (args
, & arg_m
);
1381 p
= parse_exp (p
+ 1, & arg_r
);
1383 if ((arg_r
.X_md
== 0)
1384 && (arg_r
.X_op
== O_register
)
1385 && (arg_r
.X_add_number
< 8))
1386 opcode
+= arg_r
.X_add_number
- 6; /* Emit_mx () will add 6. */
1392 if (!(ins_ok
& INS_Z80N
))
1393 check_mach (INS_ROT_II_LD
);
1397 emit_mx (prefix
, opcode
, 0, & arg_m
);
1406 emit_sx (char prefix
, char opcode
, expressionS
* arg_p
)
1410 switch (arg_p
->X_op
)
1414 emit_mx (prefix
, opcode
, 0, arg_p
);
1421 q
= frag_more (prefix
? 2 : 1);
1425 emit_byte (arg_p
, BFD_RELOC_8
);
1430 /* The operand s may be r, (hl), (ix+d), (iy+d), n. */
1432 emit_s (char prefix
, char opcode
, const char *args
)
1437 p
= parse_exp (args
, & arg_s
);
1438 if (*p
== ',' && arg_s
.X_md
== 0 && arg_s
.X_op
== O_register
&& arg_s
.X_add_number
== REG_A
)
1439 { /* possible instruction in generic format op A,x */
1440 if (!(ins_ok
& INS_EZ80
) && !sdcc_compat
)
1443 p
= parse_exp (p
, & arg_s
);
1445 emit_sx (prefix
, opcode
, & arg_s
);
1450 emit_sub (char prefix
, char opcode
, const char *args
)
1455 if (!(ins_ok
& INS_GBZ80
))
1456 return emit_s (prefix
, opcode
, args
);
1457 p
= parse_exp (args
, & arg_s
);
1460 error (_("bad instruction syntax"));
1464 if (arg_s
.X_md
!= 0 || arg_s
.X_op
!= O_register
|| arg_s
.X_add_number
!= REG_A
)
1467 p
= parse_exp (p
, & arg_s
);
1469 emit_sx (prefix
, opcode
, & arg_s
);
1474 emit_swap (char prefix
, char opcode
, const char *args
)
1480 if (!(ins_ok
& INS_Z80N
))
1481 return emit_mr (prefix
, opcode
, args
);
1483 /* check for alias swap a for swapnib of Z80N */
1484 p
= parse_exp (args
, ®
);
1485 if (reg
.X_md
!= 0 || reg
.X_op
!= O_register
|| reg
.X_add_number
!= REG_A
)
1495 emit_call (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1498 const char *p
; char *q
;
1500 p
= parse_exp_not_indexed (args
, &addr
);
1512 /* Operand may be rr, r, (hl), (ix+d), (iy+d). */
1514 emit_incdec (char prefix
, char opcode
, const char * args
)
1516 expressionS operand
;
1518 const char *p
; char *q
;
1520 p
= parse_exp (args
, &operand
);
1521 rnum
= operand
.X_add_number
;
1522 if ((! operand
.X_md
)
1523 && (operand
.X_op
== O_register
)
1526 q
= frag_more ((rnum
& R_INDEX
) ? 2 : 1);
1528 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1529 *q
= prefix
+ ((rnum
& 3) << 4);
1533 if ((operand
.X_op
== O_md1
) || (operand
.X_op
== O_register
))
1534 emit_mx (0, opcode
, 3, & operand
);
1542 emit_jr (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1548 p
= parse_exp_not_indexed (args
, &addr
);
1555 addr
.X_add_number
--; /* pcrel computes after offset code */
1556 emit_byte (&addr
, BFD_RELOC_8_PCREL
);
1562 emit_jp (char prefix
, char opcode
, const char * args
)
1569 p
= parse_exp_not_indexed (args
, & addr
);
1572 rnum
= addr
.X_add_number
;
1573 if ((O_register
== addr
.X_op
) && (REG_HL
== (rnum
& ~R_INDEX
)))
1575 q
= frag_more ((rnum
& R_INDEX
) ? 2 : 1);
1577 *q
++ = (rnum
& R_IX
) ? 0xDD : 0xFD;
1580 else if (addr
.X_op
== O_register
&& rnum
== REG_C
&& (ins_ok
& INS_Z80N
))
1599 emit_im (char prefix
, char opcode
, const char * args
)
1605 p
= parse_exp (args
, & mode
);
1606 if (mode
.X_md
|| (mode
.X_op
!= O_constant
))
1609 switch (mode
.X_add_number
)
1613 ++mode
.X_add_number
;
1618 *q
= opcode
+ 8*mode
.X_add_number
;
1627 emit_pop (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1633 p
= parse_exp (args
, & regp
);
1635 && (regp
.X_op
== O_register
)
1636 && (regp
.X_add_number
& R_STACKABLE
))
1640 rnum
= regp
.X_add_number
;
1644 *q
++ = (rnum
&R_IX
)?0xDD:0xFD;
1648 *q
= opcode
+ ((rnum
& 3) << 4);
1657 emit_push (char prefix
, char opcode
, const char * args
)
1663 p
= parse_exp (args
, & arg
);
1664 if (arg
.X_op
== O_register
)
1665 return emit_pop (prefix
, opcode
, args
);
1667 if (arg
.X_md
|| arg
.X_op
== O_md1
|| !(ins_ok
& INS_Z80N
))
1675 fix_new_exp (frag_now
, q
- frag_now
->fr_literal
, 2, &arg
, false,
1676 BFD_RELOC_Z80_16_BE
);
1682 emit_retcc (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
1687 p
= parse_cc (args
, &cc
);
1693 return p
? p
: args
;
1697 emit_adc (char prefix
, char opcode
, const char * args
)
1704 p
= parse_exp (args
, &term
);
1707 error (_("bad instruction syntax"));
1711 if ((term
.X_md
) || (term
.X_op
!= O_register
))
1714 switch (term
.X_add_number
)
1717 p
= emit_s (0, prefix
, p
);
1720 p
= parse_exp (p
, &term
);
1721 if ((!term
.X_md
) && (term
.X_op
== O_register
))
1723 rnum
= term
.X_add_number
;
1724 if (R_ARITH
== (rnum
& (R_ARITH
| R_INDEX
)))
1728 *q
= opcode
+ ((rnum
& 3) << 4);
1740 emit_add (char prefix
, char opcode
, const char * args
)
1747 p
= parse_exp (args
, &term
);
1750 error (_("bad instruction syntax"));
1754 if ((term
.X_md
) || (term
.X_op
!= O_register
))
1757 switch (term
.X_add_number
)
1760 p
= emit_s (0, prefix
, p
);
1763 p
= parse_exp (p
, &term
);
1764 if (!(ins_ok
& INS_GBZ80
) || term
.X_md
|| term
.X_op
== O_register
)
1768 emit_byte (&term
, BFD_RELOC_Z80_DISP8
);
1772 if (!(ins_ok
& INS_Z80N
))
1781 lhs
= term
.X_add_number
;
1782 p
= parse_exp (p
, &term
);
1783 rhs
= term
.X_add_number
;
1784 if (term
.X_md
!= 0 || term
.X_op
== O_md1
)
1786 else if ((term
.X_op
== O_register
) && (rhs
& R_ARITH
) && (rhs
== lhs
|| (rhs
& ~R_INDEX
) != REG_HL
))
1790 q
= frag_more ((lhs
& R_INDEX
) ? 2 : 1);
1792 *q
++ = (lhs
& R_IX
) ? 0xDD : 0xFD;
1793 *q
= opcode
+ ((rhs
& 3) << 4);
1797 else if (!(lhs
& R_INDEX
) && (ins_ok
& INS_Z80N
))
1799 if (term
.X_op
== O_register
&& rhs
== REG_A
)
1800 { /* ADD BC/DE/HL,A */
1803 *q
= 0x33 - (lhs
& 3);
1806 else if (term
.X_op
!= O_register
&& term
.X_op
!= O_md1
)
1807 { /* ADD BC/DE/HL,nn */
1810 *q
= 0x36 - (lhs
& 3);
1823 emit_bit (char prefix
, char opcode
, const char * args
)
1829 p
= parse_exp (args
, &b
);
1831 error (_("bad instruction syntax"));
1833 bn
= b
.X_add_number
;
1835 && (b
.X_op
== O_constant
)
1840 /* Bit : no optional third operand. */
1841 p
= emit_m (prefix
, opcode
+ (bn
<< 3), p
);
1843 /* Set, res : resulting byte can be copied to register. */
1844 p
= emit_mr (prefix
, opcode
+ (bn
<< 3), p
);
1851 /* BSLA DE,B; BSRA DE,B; BSRL DE,B; BSRF DE,B; BRLC DE,B (Z80N only) */
1853 emit_bshft (char prefix
, char opcode
, const char * args
)
1859 p
= parse_exp (args
, & r1
);
1861 error (_("bad instruction syntax"));
1862 p
= parse_exp (p
, & r2
);
1863 if (r1
.X_md
|| r1
.X_op
!= O_register
|| r1
.X_add_number
!= REG_DE
||
1864 r2
.X_md
|| r2
.X_op
!= O_register
|| r2
.X_add_number
!= REG_B
)
1873 emit_jpcc (char prefix
, char opcode
, const char * args
)
1878 p
= parse_cc (args
, & cc
);
1879 if (p
&& *p
++ == ',')
1880 p
= emit_call (0, opcode
+ cc
, p
);
1882 p
= (prefix
== (char)0xC3)
1883 ? emit_jp (0xE9, prefix
, args
)
1884 : emit_call (0, prefix
, args
);
1889 emit_jrcc (char prefix
, char opcode
, const char * args
)
1894 p
= parse_cc (args
, &cc
);
1895 if (p
&& *p
++ == ',')
1898 error (_("condition code invalid for jr"));
1900 p
= emit_jr (0, opcode
+ cc
, p
);
1903 p
= emit_jr (0, prefix
, args
);
1909 emit_ex (char prefix_in ATTRIBUTE_UNUSED
,
1910 char opcode_in ATTRIBUTE_UNUSED
, const char * args
)
1914 char prefix
, opcode
;
1916 p
= parse_exp_not_indexed (args
, &op
);
1920 error (_("bad instruction syntax"));
1924 prefix
= opcode
= 0;
1925 if (op
.X_op
== O_register
)
1926 switch (op
.X_add_number
| (op
.X_md
? 0x8000 : 0))
1929 if (TOLOWER (*p
++) == 'a' && TOLOWER (*p
++) == 'f')
1931 /* The scrubber changes '\'' to '`' in this context. */
1938 if (TOLOWER (*p
++) == 'h' && TOLOWER (*p
++) == 'l')
1942 p
= parse_exp (p
, & op
);
1943 if (op
.X_op
== O_register
1945 && (op
.X_add_number
& ~R_INDEX
) == REG_HL
)
1948 if (R_INDEX
& op
.X_add_number
)
1949 prefix
= (R_IX
& op
.X_add_number
) ? 0xDD : 0xFD;
1954 emit_insn (prefix
, opcode
, p
);
1962 emit_in (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
1965 expressionS reg
, port
;
1969 p
= parse_exp (args
, ®
);
1970 if (reg
.X_md
&& reg
.X_op
== O_register
&& reg
.X_add_number
== REG_C
)
1971 { /* permit instruction in (c) as alias for in f,(c) */
1974 reg
.X_add_number
= REG_F
;
1980 error (_("bad instruction syntax"));
1983 p
= parse_exp (p
, &port
);
1986 && reg
.X_op
== O_register
1987 && (reg
.X_add_number
<= 7 || reg
.X_add_number
== REG_F
)
1990 if (port
.X_op
!= O_md1
&& port
.X_op
!= O_register
)
1992 if (REG_A
== reg
.X_add_number
)
1996 emit_byte (&port
, BFD_RELOC_8
);
2003 if (port
.X_add_number
== REG_C
|| port
.X_add_number
== REG_BC
)
2005 if (port
.X_add_number
== REG_BC
&& !(ins_ok
& INS_EZ80
))
2007 else if (reg
.X_add_number
== REG_F
&& !(ins_ok
& (INS_R800
|INS_Z80N
)))
2008 check_mach (INS_IN_F_C
);
2011 *q
= 0x40|((reg
.X_add_number
&7)<<3);
2023 emit_in0 (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2026 expressionS reg
, port
;
2030 p
= parse_exp (args
, ®
);
2033 error (_("bad instruction syntax"));
2037 p
= parse_exp (p
, &port
);
2039 && reg
.X_op
== O_register
2040 && reg
.X_add_number
<= 7
2042 && port
.X_op
!= O_md1
2043 && port
.X_op
!= O_register
)
2047 *q
= 0x00|(reg
.X_add_number
<< 3);
2048 emit_byte (&port
, BFD_RELOC_8
);
2056 emit_out (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2059 expressionS reg
, port
;
2063 p
= parse_exp (args
, & port
);
2066 error (_("bad instruction syntax"));
2069 p
= parse_exp (p
, ®
);
2071 { ill_op (); return p
; }
2072 /* Allow "out (c), 0" as unportable instruction. */
2073 if (reg
.X_op
== O_constant
&& reg
.X_add_number
== 0)
2075 if (!(ins_ok
& INS_Z80N
))
2076 check_mach (INS_OUT_C_0
);
2077 reg
.X_op
= O_register
;
2078 reg
.X_add_number
= 6;
2081 || reg
.X_op
!= O_register
2082 || reg
.X_add_number
> 7)
2085 if (port
.X_op
!= O_register
&& port
.X_op
!= O_md1
)
2087 if (REG_A
== reg
.X_add_number
)
2091 emit_byte (&port
, BFD_RELOC_8
);
2098 if (REG_C
== port
.X_add_number
|| port
.X_add_number
== REG_BC
)
2100 if (port
.X_add_number
== REG_BC
&& !(ins_ok
& INS_EZ80
))
2104 *q
= 0x41 | (reg
.X_add_number
<< 3);
2113 emit_out0 (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2116 expressionS reg
, port
;
2120 p
= parse_exp (args
, & port
);
2123 error (_("bad instruction syntax"));
2126 p
= parse_exp (p
, ®
);
2128 && port
.X_op
!= O_register
2129 && port
.X_op
!= O_md1
2131 && reg
.X_op
== O_register
2132 && reg
.X_add_number
<= 7)
2136 *q
= 0x01 | (reg
.X_add_number
<< 3);
2137 emit_byte (&port
, BFD_RELOC_8
);
2145 emit_rst (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
2151 p
= parse_exp_not_indexed (args
, &addr
);
2152 if (addr
.X_op
!= O_constant
)
2154 error ("rst needs constant address");
2158 if (addr
.X_add_number
& ~(7 << 3))
2163 *q
= opcode
+ (addr
.X_add_number
& (7 << 3));
2168 /* For 8-bit indirect load to memory instructions like: LD (HL),n or LD (ii+d),n. */
2170 emit_ld_m_n (expressionS
*dst
, expressionS
*src
)
2174 expressionS dst_offset
;
2176 switch (dst
->X_add_number
)
2178 case REG_HL
: prefix
= 0x00; break;
2179 case REG_IX
: prefix
= 0xDD; break;
2180 case REG_IY
: prefix
= 0xFD; break;
2186 q
= frag_more (prefix
? 2 : 1);
2193 dst_offset
.X_op
= O_symbol
;
2194 dst_offset
.X_add_number
= 0;
2195 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2197 emit_byte (src
, BFD_RELOC_8
);
2200 /* For 8-bit load register to memory instructions: LD (<expression>),r. */
2202 emit_ld_m_r (expressionS
*dst
, expressionS
*src
)
2206 expressionS dst_offset
;
2211 if (ins_ok
& INS_GBZ80
)
2212 { /* LD (HL+),A or LD (HL-),A */
2213 if (src
->X_op
!= O_register
|| src
->X_add_number
!= REG_A
)
2215 *frag_more (1) = (dst
->X_add_number
== REG_HL
) ? 0x22 : 0x32;
2219 prefix
= (dst
->X_add_number
== REG_IX
) ? 0xDD : 0xFD;
2222 switch (dst
->X_add_number
)
2224 case REG_BC
: /* LD (BC),A */
2225 case REG_DE
: /* LD (DE),A */
2226 if (src
->X_add_number
== REG_A
)
2229 *q
= 0x02 | ((dst
->X_add_number
& 3) << 4);
2235 case REG_HL
: /* LD (HL),r or LD (ii+d),r */
2236 if (src
->X_add_number
<= 7)
2238 q
= frag_more (prefix
? 2 : 1);
2241 *q
= 0x70 | src
->X_add_number
;
2245 dst_offset
.X_op
= O_symbol
;
2246 dst_offset
.X_add_number
= 0;
2247 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2255 default: /* LD (nn),A */
2256 if (src
->X_add_number
== REG_A
)
2259 *q
= (ins_ok
& INS_GBZ80
) ? 0xEA : 0x32;
2268 /* For 16-bit load register to memory instructions: LD (<expression>),rr. */
2270 emit_ld_m_rr (expressionS
*dst
, expressionS
*src
)
2275 expressionS dst_offset
;
2279 case O_md1
: /* eZ80 instructions LD (ii+d),rr */
2280 case O_register
: /* eZ80 instructions LD (HL),rr */
2281 if (!(ins_ok
& INS_EZ80
)) /* 16-bit indirect load group is supported by eZ80 only */
2283 switch (dst
->X_add_number
)
2285 case REG_IX
: prefix
= 0xDD; break;
2286 case REG_IY
: prefix
= 0xFD; break;
2287 case REG_HL
: prefix
= 0xED; break;
2291 switch (src
->X_add_number
)
2293 case REG_BC
: opcode
= 0x0F; break;
2294 case REG_DE
: opcode
= 0x1F; break;
2295 case REG_HL
: opcode
= 0x2F; break;
2296 case REG_IX
: opcode
= (prefix
!= 0xFD) ? 0x3F : 0x3E; break;
2297 case REG_IY
: opcode
= (prefix
!= 0xFD) ? 0x3E : 0x3F; break;
2301 q
= frag_more (prefix
? 2 : 1);
2304 if (prefix
== 0xFD || prefix
== 0xDD)
2307 dst_offset
.X_op
= O_symbol
;
2308 dst_offset
.X_add_number
= 0;
2309 emit_byte (& dst_offset
, BFD_RELOC_Z80_DISP8
);
2312 default: /* LD (nn),rr */
2313 if (ins_ok
& INS_GBZ80
)
2315 /* GBZ80 supports only LD (nn),SP */
2316 if (src
->X_add_number
== REG_SP
)
2326 switch (src
->X_add_number
)
2328 case REG_BC
: prefix
= 0xED; opcode
= 0x43; break;
2329 case REG_DE
: prefix
= 0xED; opcode
= 0x53; break;
2330 case REG_HL
: prefix
= 0x00; opcode
= 0x22; break;
2331 case REG_IX
: prefix
= 0xDD; opcode
= 0x22; break;
2332 case REG_IY
: prefix
= 0xFD; opcode
= 0x22; break;
2333 case REG_SP
: prefix
= 0xED; opcode
= 0x73; break;
2338 q
= frag_more (prefix
? 2 : 1);
2347 emit_ld_r_m (expressionS
*dst
, expressionS
*src
)
2348 { /* for 8-bit memory load to register: LD r,(xxx) */
2352 expressionS src_offset
;
2354 if (dst
->X_add_number
== REG_A
&& src
->X_op
== O_register
)
2355 { /* LD A,(BC) or LD A,(DE) */
2356 switch (src
->X_add_number
)
2358 case REG_BC
: opcode
= 0x0A; break;
2359 case REG_DE
: opcode
= 0x1A; break;
2373 if (ins_ok
& INS_GBZ80
)
2374 { /* LD A,(HL+) or LD A,(HL-) */
2375 if (dst
->X_op
== O_register
&& dst
->X_add_number
== REG_A
)
2376 *frag_more (1) = (src
->X_add_number
== REG_HL
) ? 0x2A : 0x3A;
2383 if (dst
->X_add_number
> 7)
2385 opcode
= 0x46; /* LD B,(HL) */
2386 switch (src
->X_add_number
)
2388 case REG_HL
: prefix
= 0x00; break;
2389 case REG_IX
: prefix
= 0xDD; break;
2390 case REG_IY
: prefix
= 0xFD; break;
2394 q
= frag_more (prefix
? 2 : 1);
2397 *q
= opcode
| ((dst
->X_add_number
& 7) << 3);
2401 src_offset
.X_op
= O_symbol
;
2402 src_offset
.X_add_number
= 0;
2403 emit_byte (& src_offset
, BFD_RELOC_Z80_DISP8
);
2406 default: /* LD A,(nn) */
2407 if (dst
->X_add_number
== REG_A
)
2410 *q
= (ins_ok
& INS_GBZ80
) ? 0xFA : 0x3A;
2419 emit_ld_r_n (expressionS
*dst
, expressionS
*src
)
2420 { /* for 8-bit immediate value load to register: LD r,n */
2424 switch (dst
->X_add_number
)
2446 q
= frag_more (prefix
? 2 : 1);
2449 if (ins_ok
& INS_GBZ80
)
2451 else if (!(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
2452 check_mach (INS_IDX_HALF
);
2455 *q
= 0x06 | ((dst
->X_add_number
& 7) << 3);
2456 emit_byte (src
, BFD_RELOC_8
);
2460 emit_ld_r_r (expressionS
*dst
, expressionS
*src
)
2461 { /* mostly 8-bit load register from register instructions: LD r,r */
2462 /* there are some exceptions: LD SP,HL/IX/IY; LD I,HL and LD HL,I */
2468 switch (dst
->X_add_number
)
2471 switch (src
->X_add_number
)
2473 case REG_HL
: prefix
= 0x00; break;
2474 case REG_IX
: prefix
= 0xDD; break;
2475 case REG_IY
: prefix
= 0xFD; break;
2482 if (!(ins_ok
& INS_EZ80
))
2484 if (src
->X_add_number
!= REG_I
)
2487 error (_("ADL mode instruction"));
2493 if (src
->X_add_number
== REG_HL
)
2495 if (!(ins_ok
& INS_EZ80
))
2498 error (_("ADL mode instruction"));
2502 else if (src
->X_add_number
== REG_A
)
2511 if (!(ins_ok
& INS_EZ80
) || (src
->X_add_number
!= REG_A
))
2514 error (_("ADL mode instruction"));
2519 if (src
->X_add_number
== REG_A
) /* LD R,A */
2528 if (src
->X_add_number
== REG_I
) /* LD A,I */
2534 else if (src
->X_add_number
== REG_R
) /* LD A,R */
2540 else if (src
->X_add_number
== REG_MB
) /* LD A,MB */
2542 if (!(ins_ok
& INS_EZ80
))
2547 error (_("ADL mode instruction"));
2578 switch (src
->X_add_number
)
2589 ill_op (); /* LD iiH/L,H/L are not permitted */
2593 if (prefix
== 0xFD || dst
->X_add_number
== REG_H
|| dst
->X_add_number
== REG_L
)
2594 ill_op (); /* LD IYL,IXL and LD H,IXH are not permitted */
2600 if (prefix
== 0xDD || dst
->X_add_number
== REG_H
|| dst
->X_add_number
== REG_L
)
2601 ill_op (); /* LD IXH,IYH and LD L,IYL are not permitted */
2608 opcode
= 0x40 + ((dst
->X_add_number
& 7) << 3) + (src
->X_add_number
& 7);
2610 if ((ins_ok
& INS_GBZ80
) && prefix
!= 0)
2612 if (ii_halves
&& !(ins_ok
& (INS_EZ80
|INS_R800
|INS_Z80N
)))
2613 check_mach (INS_IDX_HALF
);
2614 if (prefix
== 0 && (ins_ok
& INS_EZ80
))
2618 case 0x40: /* SIS prefix, in Z80 it is LD B,B */
2619 case 0x49: /* LIS prefix, in Z80 it is LD C,C */
2620 case 0x52: /* SIL prefix, in Z80 it is LD D,D */
2621 case 0x5B: /* LIL prefix, in Z80 it is LD E,E */
2622 as_warn (_("unsupported instruction, assembled as NOP"));
2628 q
= frag_more (prefix
? 2 : 1);
2635 emit_ld_rr_m (expressionS
*dst
, expressionS
*src
)
2636 { /* for 16-bit indirect load from memory to register: LD rr,(xxx) */
2640 expressionS src_offset
;
2642 /* GBZ80 has no support for 16-bit load from memory instructions */
2643 if (ins_ok
& INS_GBZ80
)
2649 case O_md1
: /* LD rr,(ii+d) */
2650 prefix
= (src
->X_add_number
== REG_IX
) ? 0xDD : 0xFD;
2652 case O_register
: /* LD rr,(HL) */
2653 /* currently only EZ80 has support for 16bit indirect memory load instructions */
2654 if (!(ins_ok
& INS_EZ80
))
2656 switch (dst
->X_add_number
)
2658 case REG_BC
: opcode
= 0x07; break;
2659 case REG_DE
: opcode
= 0x17; break;
2660 case REG_HL
: opcode
= 0x27; break;
2661 case REG_IX
: opcode
= (prefix
== 0xED || prefix
== 0xDD) ? 0x37 : 0x31; break;
2662 case REG_IY
: opcode
= (prefix
== 0xED || prefix
== 0xDD) ? 0x31 : 0x37; break;
2672 src_offset
.X_op
= O_symbol
;
2673 src_offset
.X_add_number
= 0;
2674 emit_byte (& src_offset
, BFD_RELOC_Z80_DISP8
);
2677 default: /* LD rr,(nn) */
2678 switch (dst
->X_add_number
)
2680 case REG_BC
: prefix
= 0xED; opcode
= 0x4B; break;
2681 case REG_DE
: prefix
= 0xED; opcode
= 0x5B; break;
2682 case REG_HL
: prefix
= 0x00; opcode
= 0x2A; break;
2683 case REG_SP
: prefix
= 0xED; opcode
= 0x7B; break;
2684 case REG_IX
: prefix
= 0xDD; opcode
= 0x2A; break;
2685 case REG_IY
: prefix
= 0xFD; opcode
= 0x2A; break;
2689 q
= frag_more (prefix
? 2 : 1);
2699 emit_ld_rr_nn (expressionS
*dst
, expressionS
*src
)
2700 { /* mostly load imediate value to multibyte register instructions: LD rr,nn */
2703 int opcode
= 0x21; /* LD HL,nn */
2704 switch (dst
->X_add_number
)
2717 opcode
= 0x01 + ((dst
->X_add_number
& 3) << 4);
2723 if (prefix
&& (ins_ok
& INS_GBZ80
))
2725 q
= frag_more (prefix
? 2 : 1);
2733 emit_ld (char prefix_in ATTRIBUTE_UNUSED
, char opcode_in ATTRIBUTE_UNUSED
,
2736 expressionS dst
, src
;
2739 p
= parse_exp (args
, & dst
);
2741 error (_("bad instruction syntax"));
2742 p
= parse_exp (p
, & src
);
2746 if (src
.X_op
== O_register
)
2748 if (src
.X_add_number
<= 7)
2749 emit_ld_m_r (& dst
, & src
); /* LD (xxx),r */
2751 emit_ld_m_rr (& dst
, & src
); /* LD (xxx),rr */
2754 emit_ld_m_n (& dst
, & src
); /* LD (hl),n or LD (ix/y+r),n */
2756 else if (dst
.X_op
== O_register
)
2760 if (dst
.X_add_number
<= 7)
2761 emit_ld_r_m (& dst
, & src
);
2763 emit_ld_rr_m (& dst
, & src
);
2765 else if (src
.X_op
== O_register
)
2766 emit_ld_r_r (& dst
, & src
);
2767 else if ((dst
.X_add_number
& ~R_INDEX
) <= 7)
2768 emit_ld_r_n (& dst
, & src
);
2770 emit_ld_rr_nn (& dst
, & src
);
2779 emit_lddldi (char prefix
, char opcode
, const char * args
)
2781 expressionS dst
, src
;
2785 if (!(ins_ok
& INS_GBZ80
))
2786 return emit_insn (prefix
, opcode
, args
);
2788 p
= parse_exp (args
, & dst
);
2790 error (_("bad instruction syntax"));
2791 p
= parse_exp (p
, & src
);
2793 if (dst
.X_op
!= O_register
|| src
.X_op
!= O_register
)
2796 /* convert opcode 0xA0 . 0x22, 0xA8 . 0x32 */
2797 opcode
= (opcode
& 0x08) * 2 + 0x22;
2800 && dst
.X_add_number
== REG_HL
2802 && src
.X_add_number
== REG_A
)
2803 opcode
|= 0x00; /* LDx (HL),A */
2804 else if (dst
.X_md
== 0
2805 && dst
.X_add_number
== REG_A
2807 && src
.X_add_number
== REG_HL
)
2808 opcode
|= 0x08; /* LDx A,(HL) */
2818 emit_ldh (char prefix ATTRIBUTE_UNUSED
, char opcode ATTRIBUTE_UNUSED
,
2821 expressionS dst
, src
;
2825 p
= parse_exp (args
, & dst
);
2828 error (_("bad instruction syntax"));
2832 p
= parse_exp (p
, & src
);
2834 && dst
.X_op
== O_register
2835 && dst
.X_add_number
== REG_A
2837 && src
.X_op
!= O_md1
)
2839 if (src
.X_op
!= O_register
)
2843 emit_byte (& src
, BFD_RELOC_8
);
2845 else if (src
.X_add_number
== REG_C
)
2846 *frag_more (1) = 0xF2;
2850 else if (dst
.X_md
!= 0
2851 && dst
.X_op
!= O_md1
2853 && src
.X_op
== O_register
2854 && src
.X_add_number
== REG_A
)
2856 if (dst
.X_op
== O_register
)
2858 if (dst
.X_add_number
== REG_C
)
2870 emit_byte (& dst
, BFD_RELOC_8
);
2880 emit_ldhl (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
2882 expressionS dst
, src
;
2885 p
= parse_exp (args
, & dst
);
2888 error (_("bad instruction syntax"));
2892 p
= parse_exp (p
, & src
);
2893 if (dst
.X_md
|| dst
.X_op
!= O_register
|| dst
.X_add_number
!= REG_SP
2894 || src
.X_md
|| src
.X_op
== O_register
|| src
.X_op
== O_md1
)
2898 emit_byte (& src
, BFD_RELOC_Z80_DISP8
);
2903 parse_lea_pea_args (const char * args
, expressionS
*op
)
2906 p
= parse_exp (args
, op
);
2907 if (sdcc_compat
&& *p
== ',' && op
->X_op
== O_register
)
2910 p
= parse_exp (p
+ 1, &off
);
2912 op
->X_add_symbol
= make_expr_symbol (&off
);
2918 emit_lea (char prefix
, char opcode
, const char * args
)
2920 expressionS dst
, src
;
2925 p
= parse_exp (args
, & dst
);
2926 if (dst
.X_md
!= 0 || dst
.X_op
!= O_register
)
2929 rnum
= dst
.X_add_number
;
2935 opcode
= 0x02 | ((rnum
& 0x03) << 4);
2938 opcode
= 0x32; /* lea ix,ix+d has opcode 0x32; lea ix,iy+d has opcode 0x54 */
2941 opcode
= 0x33; /* lea iy,iy+d has opcode 0x33; lea iy,ix+d has opcode 0x55 */
2948 error (_("bad instruction syntax"));
2950 p
= parse_lea_pea_args (p
, & src
);
2951 if (src
.X_md
!= 0 || src
.X_op
!= O_add
/*&& src.X_op != O_register*/)
2954 rnum
= src
.X_add_number
;
2959 case O_register
: /* permit instructions like LEA rr,IX without displacement specified */
2960 src
.X_add_symbol
= zero
;
2969 opcode
= (opcode
== (char)0x33) ? 0x55 : (opcode
|0x00);
2972 opcode
= (opcode
== (char)0x32) ? 0x54 : (opcode
|0x01);
2979 src
.X_op
= O_symbol
;
2980 src
.X_add_number
= 0;
2981 emit_byte (& src
, BFD_RELOC_Z80_DISP8
);
2987 emit_mlt (char prefix
, char opcode
, const char * args
)
2993 p
= parse_exp (args
, & arg
);
2994 if (arg
.X_md
!= 0 || arg
.X_op
!= O_register
|| !(arg
.X_add_number
& R_ARITH
))
2998 if (ins_ok
& INS_Z80N
)
3000 if (arg
.X_add_number
!= REG_DE
)
3008 *q
= opcode
| ((arg
.X_add_number
& 3) << 4);
3014 /* MUL D,E (Z80N only) */
3016 emit_mul (char prefix
, char opcode
, const char * args
)
3022 p
= parse_exp (args
, & r1
);
3024 error (_("bad instruction syntax"));
3025 p
= parse_exp (p
, & r2
);
3027 if (r1
.X_md
!= 0 || r1
.X_op
!= O_register
|| r1
.X_add_number
!= REG_D
||
3028 r2
.X_md
!= 0 || r2
.X_op
!= O_register
|| r2
.X_add_number
!= REG_E
)
3039 emit_nextreg (char prefix
, char opcode ATTRIBUTE_UNUSED
, const char * args
)
3045 p
= parse_exp (args
, & rr
);
3047 error (_("bad instruction syntax"));
3048 p
= parse_exp (p
, & nn
);
3049 if (rr
.X_md
!= 0 || rr
.X_op
== O_register
|| rr
.X_op
== O_md1
||
3050 nn
.X_md
!= 0 || nn
.X_op
== O_md1
)
3054 emit_byte (&rr
, BFD_RELOC_8
);
3055 if (nn
.X_op
== O_register
&& nn
.X_add_number
== REG_A
)
3057 else if (nn
.X_op
!= O_register
)
3060 emit_byte (&nn
, BFD_RELOC_8
);
3068 emit_pea (char prefix
, char opcode
, const char * args
)
3074 p
= parse_lea_pea_args (args
, & arg
);
3076 || (/*arg.X_op != O_register &&*/ arg
.X_op
!= O_add
)
3077 || !(arg
.X_add_number
& R_INDEX
))
3079 /* PEA ii without displacement is mostly typo,
3080 because there is PUSH instruction which is shorter and faster */
3081 /*if (arg.X_op == O_register)
3082 as_warn (_("PEA is used without displacement, use PUSH instead"));*/
3086 *q
= opcode
+ (arg
.X_add_number
== REG_IY
? 1 : 0);
3088 arg
.X_op
= O_symbol
;
3089 arg
.X_add_number
= 0;
3090 emit_byte (& arg
, BFD_RELOC_Z80_DISP8
);
3096 emit_reti (char prefix
, char opcode
, const char * args
)
3098 if (ins_ok
& INS_GBZ80
)
3099 return emit_insn (0x00, 0xD9, args
);
3101 return emit_insn (prefix
, opcode
, args
);
3105 emit_tst (char prefix
, char opcode
, const char *args
)
3112 p
= parse_exp (args
, & arg_s
);
3113 if (*p
== ',' && arg_s
.X_md
== 0 && arg_s
.X_op
== O_register
&& arg_s
.X_add_number
== REG_A
)
3115 if (!(ins_ok
& INS_EZ80
))
3118 p
= parse_exp (p
, & arg_s
);
3121 rnum
= arg_s
.X_add_number
;
3128 rnum
= arg_s
.X_add_number
;
3129 if (arg_s
.X_md
!= 0)
3138 *q
= opcode
| (rnum
<< 3);
3144 if (ins_ok
& INS_Z80N
)
3154 emit_byte (& arg_s
, BFD_RELOC_8
);
3160 emit_insn_n (char prefix
, char opcode
, const char *args
)
3166 p
= parse_exp (args
, & arg
);
3167 if (arg
.X_md
|| arg
.X_op
== O_register
|| arg
.X_op
== O_md1
)
3173 emit_byte (& arg
, BFD_RELOC_8
);
3179 emit_data (int size ATTRIBUTE_UNUSED
)
3186 if (is_it_end_of_statement ())
3188 demand_empty_rest_of_line ();
3191 p
= skip_space (input_line_pointer
);
3195 if (*p
== '\"' || *p
== '\'')
3197 for (quote
= *p
, q
= ++p
, cnt
= 0; *p
&& quote
!= *p
; ++p
, ++cnt
)
3199 u
= frag_more (cnt
);
3202 as_warn (_("unterminated string"));
3204 p
= skip_space (p
+1);
3208 p
= parse_exp (p
, &exp
);
3209 if (exp
.X_op
== O_md1
|| exp
.X_op
== O_register
)
3215 as_warn (_("parentheses ignored"));
3216 emit_byte (&exp
, BFD_RELOC_8
);
3220 while (*p
++ == ',') ;
3221 input_line_pointer
= (char *)(p
-1);
3230 if (is_it_end_of_statement ())
3232 demand_empty_rest_of_line ();
3235 p
= skip_space (input_line_pointer
);
3239 p
= parse_exp (p
, &exp
);
3240 if (exp
.X_op
== O_md1
|| exp
.X_op
== O_register
)
3246 as_warn (_("parentheses ignored"));
3247 emit_data_val (&exp
, size
);
3249 } while (*p
++ == ',') ;
3250 input_line_pointer
= (char *)(p
-1);
3253 /* next functions were commented out because it is difficult to mix
3254 both ADL and Z80 mode instructions within one COFF file:
3255 objdump cannot recognize point of mode switching.
3258 set_cpu_mode (int mode
)
3260 if (ins_ok
& INS_EZ80
)
3263 error (_("CPU mode is unsupported by target"));
3267 assume (int arg ATTRIBUTE_UNUSED
)
3273 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3274 c
= get_symbol_name (& name
);
3275 if (strncasecmp (name
, "ADL", 4) != 0)
3281 restore_line_pointer (c
);
3282 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3283 if (*input_line_pointer
++ != '=')
3285 error (_("assignment expected"));
3288 input_line_pointer
= (char*)skip_space (input_line_pointer
);
3289 n
= get_single_number ();
3295 emit_mulub (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
3299 p
= skip_space (args
);
3300 if (TOLOWER (*p
++) != 'a' || *p
++ != ',')
3306 reg
= TOLOWER (*p
++);
3313 check_mach (INS_R800
);
3314 if (!*skip_space (p
))
3318 *q
= opcode
+ ((reg
- 'b') << 3);
3330 emit_muluw (char prefix ATTRIBUTE_UNUSED
, char opcode
, const char * args
)
3334 p
= skip_space (args
);
3335 if (TOLOWER (*p
++) != 'h' || TOLOWER (*p
++) != 'l' || *p
++ != ',')
3342 p
= parse_exp (p
, & reg
);
3344 if ((!reg
.X_md
) && reg
.X_op
== O_register
)
3345 switch (reg
.X_add_number
)
3349 check_mach (INS_R800
);
3352 *q
= opcode
+ ((reg
.X_add_number
& 3) << 4);
3362 assemble_suffix (const char **suffix
)
3365 const char sf
[8][4] =
3385 for (i
= 0; (i
< 3) && (ISALPHA (*p
)); i
++)
3386 sbuf
[i
] = TOLOWER (*p
++);
3387 if (*p
&& !ISSPACE (*p
))
3392 t
= bsearch (sbuf
, sf
, ARRAY_SIZE (sf
), sizeof (sf
[0]), (int(*)(const void*, const void*)) strcmp
);
3399 i
= cpu_mode
? 0x5B : 0x52;
3402 i
= cpu_mode
? 0x49 : 0x40;
3405 i
= cpu_mode
? 0x5B : 0x49;
3414 i
= cpu_mode
? 0x52 : 0x40;
3423 *frag_more (1) = (char)i
;
3426 case 0x40: inst_mode
= INST_MODE_FORCED
| INST_MODE_S
| INST_MODE_IS
; break;
3427 case 0x49: inst_mode
= INST_MODE_FORCED
| INST_MODE_L
| INST_MODE_IS
; break;
3428 case 0x52: inst_mode
= INST_MODE_FORCED
| INST_MODE_S
| INST_MODE_IL
; break;
3429 case 0x5B: inst_mode
= INST_MODE_FORCED
| INST_MODE_L
| INST_MODE_IL
; break;
3437 #if defined(OBJ_ELF)
3438 return obj_elf_section (arg
);
3439 #elif defined(OBJ_COFF)
3440 return obj_coff_section (arg
);
3442 #error Unknown object format
3452 as_fatal (_("Invalid directive"));
3455 ins_ok
&= INS_MARCH_MASK
;
3457 if (old_ins
!= ins_ok
)
3462 ignore (int arg ATTRIBUTE_UNUSED
)
3464 ignore_rest_of_line ();
3472 as_fatal (_("Invalid directive"));
3473 for (p
= input_line_pointer
; *p
&& *p
!= '(' && *p
!= '\n'; p
++)
3480 ignore_rest_of_line ();
3486 /* Port specific pseudo ops. */
3487 const pseudo_typeS md_pseudo_table
[] =
3489 { ".area", area
, 0},
3490 { ".assume", assume
, 0},
3491 { ".ez80", set_inss
, INS_EZ80
},
3492 { ".gbz80", set_inss
, INS_GBZ80
},
3493 { ".module", ignore
, 0},
3494 { ".optsdcc", ignore
, 0},
3495 { ".r800", set_inss
, INS_R800
},
3496 { ".set", s_set
, 0},
3497 { ".z180", set_inss
, INS_Z180
},
3498 { ".hd64", set_inss
, INS_Z180
},
3499 { ".z80", set_inss
, INS_Z80
},
3500 { ".z80n", set_inss
, INS_Z80N
},
3501 { "db" , emit_data
, 1},
3502 { "d24", z80_cons
, 3},
3503 { "d32", z80_cons
, 4},
3504 { "def24", z80_cons
, 3},
3505 { "def32", z80_cons
, 4},
3506 { "defb", emit_data
, 1},
3507 { "defm", emit_data
, 1},
3508 { "defs", s_space
, 1}, /* Synonym for ds on some assemblers. */
3509 { "defw", z80_cons
, 2},
3510 { "ds", s_space
, 1}, /* Fill with bytes rather than words. */
3511 { "dw", z80_cons
, 2},
3512 { "psect", psect
, 0}, /* TODO: Translate attributes. */
3513 { "set", 0, 0}, /* Real instruction on z80. */
3514 { "xdef", s_globl
, 0}, /* Synonym for .GLOBAL */
3515 { "xref", s_ignore
, 0}, /* Synonym for .EXTERN */
3519 static table_t instab
[] =
3521 { "adc", 0x88, 0x4A, emit_adc
, INS_ALL
},
3522 { "add", 0x80, 0x09, emit_add
, INS_ALL
},
3523 { "and", 0x00, 0xA0, emit_s
, INS_ALL
},
3524 { "bit", 0xCB, 0x40, emit_bit
, INS_ALL
},
3525 { "brlc", 0xED, 0x2C, emit_bshft
,INS_Z80N
},
3526 { "bsla", 0xED, 0x28, emit_bshft
,INS_Z80N
},
3527 { "bsra", 0xED, 0x29, emit_bshft
,INS_Z80N
},
3528 { "bsrf", 0xED, 0x2B, emit_bshft
,INS_Z80N
},
3529 { "bsrl", 0xED, 0x2A, emit_bshft
,INS_Z80N
},
3530 { "call", 0xCD, 0xC4, emit_jpcc
, INS_ALL
},
3531 { "ccf", 0x00, 0x3F, emit_insn
, INS_ALL
},
3532 { "cp", 0x00, 0xB8, emit_s
, INS_ALL
},
3533 { "cpd", 0xED, 0xA9, emit_insn
, INS_NOT_GBZ80
},
3534 { "cpdr", 0xED, 0xB9, emit_insn
, INS_NOT_GBZ80
},
3535 { "cpi", 0xED, 0xA1, emit_insn
, INS_NOT_GBZ80
},
3536 { "cpir", 0xED, 0xB1, emit_insn
, INS_NOT_GBZ80
},
3537 { "cpl", 0x00, 0x2F, emit_insn
, INS_ALL
},
3538 { "daa", 0x00, 0x27, emit_insn
, INS_ALL
},
3539 { "dec", 0x0B, 0x05, emit_incdec
,INS_ALL
},
3540 { "di", 0x00, 0xF3, emit_insn
, INS_ALL
},
3541 { "djnz", 0x00, 0x10, emit_jr
, INS_NOT_GBZ80
},
3542 { "ei", 0x00, 0xFB, emit_insn
, INS_ALL
},
3543 { "ex", 0x00, 0x00, emit_ex
, INS_NOT_GBZ80
},
3544 { "exx", 0x00, 0xD9, emit_insn
, INS_NOT_GBZ80
},
3545 { "halt", 0x00, 0x76, emit_insn
, INS_ALL
},
3546 { "im", 0xED, 0x46, emit_im
, INS_NOT_GBZ80
},
3547 { "in", 0x00, 0x00, emit_in
, INS_NOT_GBZ80
},
3548 { "in0", 0xED, 0x00, emit_in0
, INS_Z180
|INS_EZ80
},
3549 { "inc", 0x03, 0x04, emit_incdec
,INS_ALL
},
3550 { "ind", 0xED, 0xAA, emit_insn
, INS_NOT_GBZ80
},
3551 { "ind2", 0xED, 0x8C, emit_insn
, INS_EZ80
},
3552 { "ind2r",0xED, 0x9C, emit_insn
, INS_EZ80
},
3553 { "indm", 0xED, 0x8A, emit_insn
, INS_EZ80
},
3554 { "indmr",0xED, 0x9A, emit_insn
, INS_EZ80
},
3555 { "indr", 0xED, 0xBA, emit_insn
, INS_NOT_GBZ80
},
3556 { "indrx",0xED, 0xCA, emit_insn
, INS_EZ80
},
3557 { "ini", 0xED, 0xA2, emit_insn
, INS_NOT_GBZ80
},
3558 { "ini2", 0xED, 0x84, emit_insn
, INS_EZ80
},
3559 { "ini2r",0xED, 0x94, emit_insn
, INS_EZ80
},
3560 { "inim", 0xED, 0x82, emit_insn
, INS_EZ80
},
3561 { "inimr",0xED, 0x92, emit_insn
, INS_EZ80
},
3562 { "inir", 0xED, 0xB2, emit_insn
, INS_NOT_GBZ80
},
3563 { "inirx",0xED, 0xC2, emit_insn
, INS_EZ80
},
3564 { "jp", 0xC3, 0xC2, emit_jpcc
, INS_ALL
},
3565 { "jr", 0x18, 0x20, emit_jrcc
, INS_ALL
},
3566 { "ld", 0x00, 0x00, emit_ld
, INS_ALL
},
3567 { "ldd", 0xED, 0xA8, emit_lddldi
,INS_ALL
}, /* GBZ80 has special meaning */
3568 { "lddr", 0xED, 0xB8, emit_insn
, INS_NOT_GBZ80
},
3569 { "lddrx",0xED, 0xBC, emit_insn
, INS_Z80N
},
3570 { "lddx", 0xED, 0xAC, emit_insn
, INS_Z80N
},
3571 { "ldh", 0xE0, 0x00, emit_ldh
, INS_GBZ80
},
3572 { "ldhl", 0x00, 0xF8, emit_ldhl
, INS_GBZ80
},
3573 { "ldi", 0xED, 0xA0, emit_lddldi
,INS_ALL
}, /* GBZ80 has special meaning */
3574 { "ldir", 0xED, 0xB0, emit_insn
, INS_NOT_GBZ80
},
3575 { "ldirx",0xED, 0xB4, emit_insn
, INS_Z80N
},
3576 { "ldix", 0xED, 0xA4, emit_insn
, INS_Z80N
},
3577 { "ldpirx",0xED,0xB7, emit_insn
, INS_Z80N
},
3578 { "ldws", 0xED, 0xA5, emit_insn
, INS_Z80N
},
3579 { "lea", 0xED, 0x02, emit_lea
, INS_EZ80
},
3580 { "mirror",0xED,0x24, emit_insn
, INS_Z80N
},
3581 { "mlt", 0xED, 0x4C, emit_mlt
, INS_Z180
|INS_EZ80
|INS_Z80N
},
3582 { "mul", 0xED, 0x30, emit_mul
, INS_Z80N
},
3583 { "mulub",0xED, 0xC5, emit_mulub
,INS_R800
},
3584 { "muluw",0xED, 0xC3, emit_muluw
,INS_R800
},
3585 { "neg", 0xED, 0x44, emit_insn
, INS_NOT_GBZ80
},
3586 { "nextreg",0xED,0x91,emit_nextreg
,INS_Z80N
},
3587 { "nop", 0x00, 0x00, emit_insn
, INS_ALL
},
3588 { "or", 0x00, 0xB0, emit_s
, INS_ALL
},
3589 { "otd2r",0xED, 0xBC, emit_insn
, INS_EZ80
},
3590 { "otdm", 0xED, 0x8B, emit_insn
, INS_Z180
|INS_EZ80
},
3591 { "otdmr",0xED, 0x9B, emit_insn
, INS_Z180
|INS_EZ80
},
3592 { "otdr", 0xED, 0xBB, emit_insn
, INS_NOT_GBZ80
},
3593 { "otdrx",0xED, 0xCB, emit_insn
, INS_EZ80
},
3594 { "oti2r",0xED, 0xB4, emit_insn
, INS_EZ80
},
3595 { "otim", 0xED, 0x83, emit_insn
, INS_Z180
|INS_EZ80
},
3596 { "otimr",0xED, 0x93, emit_insn
, INS_Z180
|INS_EZ80
},
3597 { "otir", 0xED, 0xB3, emit_insn
, INS_NOT_GBZ80
},
3598 { "otirx",0xED, 0xC3, emit_insn
, INS_EZ80
},
3599 { "out", 0x00, 0x00, emit_out
, INS_NOT_GBZ80
},
3600 { "out0", 0xED, 0x01, emit_out0
, INS_Z180
|INS_EZ80
},
3601 { "outd", 0xED, 0xAB, emit_insn
, INS_NOT_GBZ80
},
3602 { "outd2",0xED, 0xAC, emit_insn
, INS_EZ80
},
3603 { "outi", 0xED, 0xA3, emit_insn
, INS_NOT_GBZ80
},
3604 { "outi2",0xED, 0xA4, emit_insn
, INS_EZ80
},
3605 { "outinb",0xED,0x90, emit_insn
, INS_Z80N
},
3606 { "pea", 0xED, 0x65, emit_pea
, INS_EZ80
},
3607 { "pixelad",0xED,0x94,emit_insn
, INS_Z80N
},
3608 { "pixeldn",0xED,0x93,emit_insn
, INS_Z80N
},
3609 { "pop", 0x00, 0xC1, emit_pop
, INS_ALL
},
3610 { "push", 0x00, 0xC5, emit_push
, INS_ALL
},
3611 { "res", 0xCB, 0x80, emit_bit
, INS_ALL
},
3612 { "ret", 0xC9, 0xC0, emit_retcc
,INS_ALL
},
3613 { "reti", 0xED, 0x4D, emit_reti
, INS_ALL
}, /*GBZ80 has its own opcode for it*/
3614 { "retn", 0xED, 0x45, emit_insn
, INS_NOT_GBZ80
},
3615 { "rl", 0xCB, 0x10, emit_mr
, INS_ALL
},
3616 { "rla", 0x00, 0x17, emit_insn
, INS_ALL
},
3617 { "rlc", 0xCB, 0x00, emit_mr
, INS_ALL
},
3618 { "rlca", 0x00, 0x07, emit_insn
, INS_ALL
},
3619 { "rld", 0xED, 0x6F, emit_insn
, INS_NOT_GBZ80
},
3620 { "rr", 0xCB, 0x18, emit_mr
, INS_ALL
},
3621 { "rra", 0x00, 0x1F, emit_insn
, INS_ALL
},
3622 { "rrc", 0xCB, 0x08, emit_mr
, INS_ALL
},
3623 { "rrca", 0x00, 0x0F, emit_insn
, INS_ALL
},
3624 { "rrd", 0xED, 0x67, emit_insn
, INS_NOT_GBZ80
},
3625 { "rsmix",0xED, 0x7E, emit_insn
, INS_EZ80
},
3626 { "rst", 0x00, 0xC7, emit_rst
, INS_ALL
},
3627 { "sbc", 0x98, 0x42, emit_adc
, INS_ALL
},
3628 { "scf", 0x00, 0x37, emit_insn
, INS_ALL
},
3629 { "set", 0xCB, 0xC0, emit_bit
, INS_ALL
},
3630 { "setae",0xED, 0x95, emit_insn
, INS_Z80N
},
3631 { "sl1", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3632 { "sla", 0xCB, 0x20, emit_mr
, INS_ALL
},
3633 { "sli", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3634 { "sll", 0xCB, 0x30, emit_mr
, INS_SLI
|INS_Z80N
},
3635 { "slp", 0xED, 0x76, emit_insn
, INS_Z180
|INS_EZ80
},
3636 { "sra", 0xCB, 0x28, emit_mr
, INS_ALL
},
3637 { "srl", 0xCB, 0x38, emit_mr
, INS_ALL
},
3638 { "stmix",0xED, 0x7D, emit_insn
, INS_EZ80
},
3639 { "stop", 0x00, 0x10, emit_insn
, INS_GBZ80
},
3640 { "sub", 0x00, 0x90, emit_sub
, INS_ALL
},
3641 { "swap", 0xCB, 0x30, emit_swap
, INS_GBZ80
|INS_Z80N
},
3642 { "swapnib",0xED,0x23,emit_insn
, INS_Z80N
},
3643 { "test", 0xED, 0x27, emit_insn_n
, INS_Z80N
},
3644 { "tst", 0xED, 0x04, emit_tst
, INS_Z180
|INS_EZ80
|INS_Z80N
},
3645 { "tstio",0xED, 0x74, emit_insn_n
,INS_Z180
|INS_EZ80
},
3646 { "xor", 0x00, 0xA8, emit_s
, INS_ALL
},
3650 md_assemble (char *str
)
3658 inst_mode
= cpu_mode
? (INST_MODE_L
| INST_MODE_IL
) : (INST_MODE_S
| INST_MODE_IS
);
3659 old_ptr
= input_line_pointer
;
3660 p
= skip_space (str
);
3661 for (i
= 0; (i
< BUFLEN
) && (ISALPHA (*p
) || ISDIGIT (*p
));)
3662 buf
[i
++] = TOLOWER (*p
++);
3666 buf
[BUFLEN
-3] = buf
[BUFLEN
-2] = '.'; /* Mark opcode as abbreviated. */
3668 as_bad (_("Unknown instruction '%s'"), buf
);
3672 dwarf2_emit_insn (0);
3673 if ((*p
) && (!ISSPACE (*p
)))
3675 if (*p
!= '.' || !(ins_ok
& INS_EZ80
) || !assemble_suffix (&p
))
3677 as_bad (_("syntax error"));
3685 insp
= bsearch (&key
, instab
, ARRAY_SIZE (instab
),
3686 sizeof (instab
[0]), key_cmp
);
3687 if (!insp
|| (insp
->inss
&& !(insp
->inss
& ins_ok
)))
3690 as_bad (_("Unknown instruction `%s'"), buf
);
3694 p
= insp
->fp (insp
->prefix
, insp
->opcode
, p
);
3696 if ((!err_flag
) && *p
)
3697 as_bad (_("junk at end of line, "
3698 "first unrecognized character is `%c'"), *p
);
3702 input_line_pointer
= old_ptr
;
3706 signed_overflow (signed long value
, unsigned bitsize
)
3708 signed long max
= (signed long) ((1UL << (bitsize
- 1)) - 1);
3709 return value
< -max
- 1 || value
> max
;
3713 unsigned_overflow (unsigned long value
, unsigned bitsize
)
3715 return value
>> (bitsize
- 1) >> 1 != 0;
3719 is_overflow (long value
, unsigned bitsize
)
3722 return signed_overflow (value
, bitsize
);
3723 return unsigned_overflow ((unsigned long)value
, bitsize
);
3727 md_apply_fix (fixS
* fixP
, valueT
* valP
, segT seg
)
3730 char *p_lit
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
3732 if (fixP
->fx_addsy
== NULL
)
3734 else if (fixP
->fx_pcrel
)
3736 segT s
= S_GET_SEGMENT (fixP
->fx_addsy
);
3737 if (s
== seg
|| s
== absolute_section
)
3739 val
+= S_GET_VALUE (fixP
->fx_addsy
);
3744 switch (fixP
->fx_r_type
)
3746 case BFD_RELOC_8_PCREL
:
3747 case BFD_RELOC_Z80_DISP8
:
3752 case BFD_RELOC_Z80_16_BE
:
3753 fixP
->fx_no_overflow
= 0;
3756 fixP
->fx_no_overflow
= 1;
3760 switch (fixP
->fx_r_type
)
3762 case BFD_RELOC_8_PCREL
:
3763 case BFD_RELOC_Z80_DISP8
:
3764 if (fixP
->fx_done
&& signed_overflow (val
, 8))
3765 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
3766 _("8-bit signed offset out of range (%+ld)"), val
);
3770 case BFD_RELOC_Z80_BYTE0
:
3774 case BFD_RELOC_Z80_BYTE1
:
3775 *p_lit
++ = (val
>> 8);
3778 case BFD_RELOC_Z80_BYTE2
:
3779 *p_lit
++ = (val
>> 16);
3782 case BFD_RELOC_Z80_BYTE3
:
3783 *p_lit
++ = (val
>> 24);
3787 if (fixP
->fx_done
&& is_overflow(val
, 8))
3788 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3789 _("8-bit overflow (%+ld)"), val
);
3793 case BFD_RELOC_Z80_WORD1
:
3794 *p_lit
++ = (val
>> 16);
3795 *p_lit
++ = (val
>> 24);
3798 case BFD_RELOC_Z80_WORD0
:
3800 *p_lit
++ = (val
>> 8);
3804 if (fixP
->fx_done
&& is_overflow(val
, 16))
3805 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3806 _("16-bit overflow (%+ld)"), val
);
3808 *p_lit
++ = (val
>> 8);
3811 case BFD_RELOC_24
: /* Def24 may produce this. */
3812 if (fixP
->fx_done
&& is_overflow(val
, 24))
3813 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3814 _("24-bit overflow (%+ld)"), val
);
3816 *p_lit
++ = (val
>> 8);
3817 *p_lit
++ = (val
>> 16);
3820 case BFD_RELOC_32
: /* Def32 and .long may produce this. */
3821 if (fixP
->fx_done
&& is_overflow(val
, 32))
3822 as_warn_where (fixP
->fx_file
, fixP
->fx_line
,
3823 _("32-bit overflow (%+ld)"), val
);
3825 *p_lit
++ = (val
>> 8);
3826 *p_lit
++ = (val
>> 16);
3827 *p_lit
++ = (val
>> 24);
3830 case BFD_RELOC_Z80_16_BE
: /* Z80N PUSH nn instruction produce this. */
3831 *p_lit
++ = val
>> 8;
3836 printf (_("md_apply_fix: unknown reloc type 0x%x\n"), fixP
->fx_r_type
);
3841 /* GAS will call this to generate a reloc. GAS will pass the
3842 resulting reloc to `bfd_install_relocation'. This currently works
3843 poorly, as `bfd_install_relocation' often does the wrong thing, and
3844 instances of `tc_gen_reloc' have been written to work around the
3845 problems, which in turns makes it difficult to fix
3846 `bfd_install_relocation'. */
3848 /* If while processing a fixup, a reloc really
3849 needs to be created then it is done here. */
3852 tc_gen_reloc (asection
*seg ATTRIBUTE_UNUSED
, fixS
*fixp
)
3856 if (fixp
->fx_subsy
!= NULL
)
3858 as_bad_subtract (fixp
);
3862 reloc
= XNEW (arelent
);
3863 reloc
->sym_ptr_ptr
= XNEW (asymbol
*);
3864 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
3865 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
3866 reloc
->addend
= fixp
->fx_offset
;
3867 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
3868 if (reloc
->howto
== NULL
)
3870 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
3871 _("reloc %d not supported by object file format"),
3872 (int) fixp
->fx_r_type
);
3876 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
3877 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
3878 reloc
->address
= fixp
->fx_offset
;
3884 z80_tc_labels_without_colon (void)
3886 return colonless_labels
;
3890 z80_tc_label_is_local (const char *name
)
3894 if (local_label_prefix
== NULL
)
3896 for (p
= local_label_prefix
, n
= name
; *p
&& *n
&& *n
== *p
; p
++, n
++)
3901 /* Parse floating point number from string and compute mantissa and
3902 exponent. Mantissa is normalized.
3904 #define EXP_MIN -0x10000
3905 #define EXP_MAX 0x10000
3907 str_to_broken_float (bool *signP
, uint64_t *mantissaP
, int *expP
)
3911 uint64_t mantissa
= 0;
3915 p
= (char*)skip_space (input_line_pointer
);
3918 if (sign
|| *p
== '+')
3920 if (strncasecmp (p
, "NaN", 3) == 0)
3924 input_line_pointer
= p
+ 3;
3927 if (strncasecmp (p
, "inf", 3) == 0)
3929 *mantissaP
= 1ull << 63;
3931 input_line_pointer
= p
+ 3;
3934 for (; ISDIGIT (*p
); ++p
)
3942 mantissa
= mantissa
* 10 + (*p
- '0');
3944 /* skip non-significant digits */
3945 for (; ISDIGIT (*p
); ++p
)
3951 if (!exponent
) /* If no precision overflow. */
3953 for (; ISDIGIT (*p
); ++p
, --exponent
)
3961 mantissa
= mantissa
* 10 + (*p
- '0');
3964 for (; ISDIGIT (*p
); ++p
)
3967 if (*p
== 'e' || *p
== 'E')
3973 if (es
|| *p
== '+')
3975 for (; ISDIGIT (*p
); ++p
)
3978 t
= t
* 10 + (*p
- '0');
3980 exponent
+= (es
) ? -t
: t
;
3982 if (ISALNUM (*p
) || *p
== '.')
3984 input_line_pointer
= p
;
3987 *mantissaP
= 1ull << 63;
3989 return 1; /* result is 0 */
3992 for (; mantissa
<= ~0ull/10; --exponent
)
3994 /* Now we have sign, mantissa, and signed decimal exponent
3995 need to recompute to binary exponent. */
3996 for (i
= 64; exponent
> 0; --exponent
)
3998 /* be sure that no integer overflow */
3999 while (mantissa
> ~0ull/10)
4006 for (; exponent
< 0; ++exponent
)
4008 while (!(mantissa
>> 63))
4016 for (; !(mantissa
>> 63); --i
)
4018 *mantissaP
= mantissa
;
4024 str_to_zeda32(char *litP
, int *sizeP
)
4032 if (!str_to_broken_float (&sign
, &mantissa
, &exponent
))
4033 return _("invalid syntax");
4034 /* I do not know why decrement is needed */
4036 /* shift by 39 bits right keeping 25 bit mantissa for rounding */
4040 /* make 24 bit mantissa */
4042 /* check for overflow */
4049 if (exponent
< -127)
4054 else if (exponent
> 127)
4057 mantissa
= sign
? 0xc00000 : 0x400000;
4059 else if (mantissa
== 0)
4062 mantissa
= 0x200000;
4065 mantissa
&= (1ull << 23) - 1;
4066 for (i
= 0; i
< 24; i
+= 8)
4067 *litP
++ = (char)(mantissa
>> i
);
4068 *litP
= (char)(0x80 + exponent
);
4073 Math48 by Anders Hejlsberg support.
4074 Mantissa is 39 bits wide, exponent 8 bit wide.
4077 bit 46-8: normalized mantissa (bits 38-0, bit39 assumed to be 1)
4078 bit 7-0: exponent+128 (0 - value is null)
4079 MIN: 2.938735877e-39
4080 MAX: 1.701411835e+38
4083 str_to_float48(char *litP
, int *sizeP
)
4091 if (!str_to_broken_float (&sign
, &mantissa
, &exponent
))
4092 return _("invalid syntax");
4093 /* shift by 23 bits right keeping 41 bit mantissa for rounding */
4097 /* make 40 bit mantissa */
4099 /* check for overflow */
4105 if (exponent
< -127)
4107 memset (litP
, 0, 6);
4111 return _("overflow");
4113 mantissa
&= (1ull << 39) - 1;
4114 *litP
++ = (char)(0x80 + exponent
);
4115 for (i
= 0; i
< 40; i
+= 8)
4116 *litP
++ = (char)(mantissa
>> i
);
4121 str_to_ieee754_h(char *litP
, int *sizeP
)
4123 return ieee_md_atof ('h', litP
, sizeP
, false);
4127 str_to_ieee754_s(char *litP
, int *sizeP
)
4129 return ieee_md_atof ('s', litP
, sizeP
, false);
4133 str_to_ieee754_d(char *litP
, int *sizeP
)
4135 return ieee_md_atof ('d', litP
, sizeP
, false);
4138 #ifdef TARGET_USE_CFIPOP
4139 /* Initialize the DWARF-2 unwind information for this procedure. */
4141 z80_tc_frame_initial_instructions (void)
4143 static int sp_regno
= -1;
4146 sp_regno
= z80_tc_regname_to_dw2regnum ("sp");
4148 cfi_add_CFA_def_cfa (sp_regno
, 0);
4152 z80_tc_regname_to_dw2regnum (const char *regname
)
4154 static const char *regs
[] =
4155 { /* same registers as for GDB */
4156 "af", "bc", "de", "hl",
4157 "sp", "pc", "ix", "iy",
4158 "af_", "bc_", "de_", "hl_",
4163 for (i
= 0; i
< ARRAY_SIZE(regs
); ++i
)
4164 if (!strcasecmp (regs
[i
], regname
))
4171 /* Implement DWARF2_ADDR_SIZE. */
4173 z80_dwarf2_addr_size (const bfd
*abfd
)
4175 switch (bfd_get_mach (abfd
))
4177 case bfd_mach_ez80_adl
: