-Wimplicit-fallthrough warning fixes
[external/binutils.git] / gas / config / tc-z80.c
1 /* tc-z80.c -- Assemble code for the Zilog Z80 and ASCII R800
2    Copyright (C) 2005-2016 Free Software Foundation, Inc.
3    Contributed by Arnold Metselaar <arnold_m@operamail.com>
4
5    This file is part of GAS, the GNU Assembler.
6
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)
10    any later version.
11
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.
16
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
20    02110-1301, USA.  */
21
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25
26 /* Exported constants.  */
27 const char comment_chars[] = ";\0";
28 const char line_comment_chars[] = "#;\0";
29 const char line_separator_chars[] = "\0";
30 const char EXP_CHARS[] = "eE\0";
31 const char FLT_CHARS[] = "RrFf\0";
32
33 /* For machine specific options.  */
34 const char * md_shortopts = ""; /* None yet.  */
35
36 enum options
37 {
38   OPTION_MACH_Z80 = OPTION_MD_BASE,
39   OPTION_MACH_R800,
40   OPTION_MACH_IUD,
41   OPTION_MACH_WUD,
42   OPTION_MACH_FUD,
43   OPTION_MACH_IUP,
44   OPTION_MACH_WUP,
45   OPTION_MACH_FUP
46 };
47
48 #define INS_Z80    1
49 #define INS_UNDOC  2
50 #define INS_UNPORT 4
51 #define INS_R800   8
52
53 struct option md_longopts[] =
54 {
55   { "z80",       no_argument, NULL, OPTION_MACH_Z80},
56   { "r800",      no_argument, NULL, OPTION_MACH_R800},
57   { "ignore-undocumented-instructions", no_argument, NULL, OPTION_MACH_IUD },
58   { "Wnud",  no_argument, NULL, OPTION_MACH_IUD },
59   { "warn-undocumented-instructions",  no_argument, NULL, OPTION_MACH_WUD },
60   { "Wud",  no_argument, NULL, OPTION_MACH_WUD },
61   { "forbid-undocumented-instructions", no_argument, NULL, OPTION_MACH_FUD },
62   { "Fud",  no_argument, NULL, OPTION_MACH_FUD },
63   { "ignore-unportable-instructions", no_argument, NULL, OPTION_MACH_IUP },
64   { "Wnup",  no_argument, NULL, OPTION_MACH_IUP },
65   { "warn-unportable-instructions",  no_argument, NULL, OPTION_MACH_WUP },
66   { "Wup",  no_argument, NULL, OPTION_MACH_WUP },
67   { "forbid-unportable-instructions", no_argument, NULL, OPTION_MACH_FUP },
68   { "Fup",  no_argument, NULL, OPTION_MACH_FUP },
69
70   { NULL, no_argument, NULL, 0 }
71 } ;
72
73 size_t md_longopts_size = sizeof (md_longopts);
74
75 extern int coff_flags;
76 /* Instruction classes that silently assembled.  */
77 static int ins_ok = INS_Z80 | INS_UNDOC;
78 /* Instruction classes that generate errors.  */
79 static int ins_err = INS_R800;
80 /* Instruction classes actually used, determines machine type.  */
81 static int ins_used = INS_Z80;
82
83 int
84 md_parse_option (int c, const char* arg ATTRIBUTE_UNUSED)
85 {
86   switch (c)
87     {
88     default:
89       return 0;
90     case OPTION_MACH_Z80:
91       ins_ok &= ~INS_R800;
92       ins_err |= INS_R800;
93       break;
94     case OPTION_MACH_R800:
95       ins_ok = INS_Z80 | INS_UNDOC | INS_R800;
96       ins_err = INS_UNPORT;
97       break;
98     case OPTION_MACH_IUD:
99       ins_ok |= INS_UNDOC;
100       ins_err &= ~INS_UNDOC;
101       break;
102     case OPTION_MACH_IUP:
103       ins_ok |= INS_UNDOC | INS_UNPORT;
104       ins_err &= ~(INS_UNDOC | INS_UNPORT);
105       break;
106     case OPTION_MACH_WUD:
107       if ((ins_ok & INS_R800) == 0)
108         {
109           ins_ok &= ~(INS_UNDOC|INS_UNPORT);
110           ins_err &= ~INS_UNDOC;
111         }
112       break;
113     case OPTION_MACH_WUP:
114       ins_ok &= ~INS_UNPORT;
115       ins_err &= ~(INS_UNDOC|INS_UNPORT);
116       break;
117     case OPTION_MACH_FUD:
118       if ((ins_ok & INS_R800) == 0)
119         {
120           ins_ok &= (INS_UNDOC | INS_UNPORT);
121           ins_err |= INS_UNDOC | INS_UNPORT;
122         }
123       break;
124     case OPTION_MACH_FUP:
125       ins_ok &= ~INS_UNPORT;
126       ins_err |= INS_UNPORT;
127       break;
128     }
129
130   return 1;
131 }
132
133 void
134 md_show_usage (FILE * f)
135 {
136   fprintf (f, "\n\
137 CPU model/instruction set options:\n\
138 \n\
139   -z80\t\t  assemble for Z80\n\
140   -ignore-undocumented-instructions\n\
141   -Wnud\n\
142 \tsilently assemble undocumented Z80-instructions that work on R800\n\
143   -ignore-unportable-instructions\n\
144   -Wnup\n\
145 \tsilently assemble all undocumented Z80-instructions\n\
146   -warn-undocumented-instructions\n\
147   -Wud\n\
148 \tissue warnings for undocumented Z80-instructions that work on R800\n\
149   -warn-unportable-instructions\n\
150   -Wup\n\
151 \tissue warnings for other undocumented Z80-instructions\n\
152   -forbid-undocumented-instructions\n\
153   -Fud\n\
154 \ttreat all undocumented z80-instructions as errors\n\
155   -forbid-unportable-instructions\n\
156   -Fup\n\
157 \ttreat undocumented z80-instructions that do not work on R800 as errors\n\
158   -r800\t  assemble for R800\n\n\
159 Default: -z80 -ignore-undocument-instructions -warn-unportable-instructions.\n");
160 }
161
162 static symbolS * zero;
163
164 struct reg_entry
165 {
166   const char* name;
167   int number;
168 };
169 #define R_STACKABLE (0x80)
170 #define R_ARITH     (0x40)
171 #define R_IX        (0x20)
172 #define R_IY        (0x10)
173 #define R_INDEX     (R_IX | R_IY)
174
175 #define REG_A (7)
176 #define REG_B (0)
177 #define REG_C (1)
178 #define REG_D (2)
179 #define REG_E (3)
180 #define REG_H (4)
181 #define REG_L (5)
182 #define REG_F (6 | 8)
183 #define REG_I (9)
184 #define REG_R (10)
185
186 #define REG_AF (3 | R_STACKABLE)
187 #define REG_BC (0 | R_STACKABLE | R_ARITH)
188 #define REG_DE (1 | R_STACKABLE | R_ARITH)
189 #define REG_HL (2 | R_STACKABLE | R_ARITH)
190 #define REG_IX (REG_HL | R_IX)
191 #define REG_IY (REG_HL | R_IY)
192 #define REG_SP (3 | R_ARITH)
193
194 static const struct reg_entry regtable[] =
195 {
196   {"a",  REG_A },
197   {"af", REG_AF },
198   {"b",  REG_B },
199   {"bc", REG_BC },
200   {"c",  REG_C },
201   {"d",  REG_D },
202   {"de", REG_DE },
203   {"e",  REG_E },
204   {"f",  REG_F },
205   {"h",  REG_H },
206   {"hl", REG_HL },
207   {"i",  REG_I },
208   {"ix", REG_IX },
209   {"ixh",REG_H | R_IX },
210   {"ixl",REG_L | R_IX },
211   {"iy", REG_IY },
212   {"iyh",REG_H | R_IY },
213   {"iyl",REG_L | R_IY },
214   {"l",  REG_L },
215   {"r",  REG_R },
216   {"sp", REG_SP },
217 } ;
218
219 #define BUFLEN 8 /* Large enough for any keyword.  */
220
221 void
222 md_begin (void)
223 {
224   expressionS nul, reg;
225   char * p;
226   unsigned int i, j, k;
227   char buf[BUFLEN];
228
229   reg.X_op = O_register;
230   reg.X_md = 0;
231   reg.X_add_symbol = reg.X_op_symbol = 0;
232   for ( i = 0 ; i < ARRAY_SIZE ( regtable ) ; ++i )
233     {
234       reg.X_add_number = regtable[i].number;
235       k = strlen ( regtable[i].name );
236       buf[k] = 0;
237       if ( k+1 < BUFLEN )
238         {
239           for ( j = ( 1<<k ) ; j ; --j )
240             {
241               for ( k = 0 ; regtable[i].name[k] ; ++k )
242                 {
243                   buf[k] = ( j & ( 1<<k ) ) ? TOUPPER ( regtable[i].name[k] ) : regtable[i].name[k];
244                 }
245               symbolS * psym = symbol_find_or_make(buf);
246               S_SET_SEGMENT(psym, reg_section);
247               symbol_set_value_expression(psym, &reg);
248             }
249         }
250     }
251   p = input_line_pointer;
252   input_line_pointer = (char *) "0";
253   nul.X_md=0;
254   expression (& nul);
255   input_line_pointer = p;
256   zero = make_expr_symbol (& nul);
257   /* We do not use relaxation (yet).  */
258   linkrelax = 0;
259 }
260
261 void
262 z80_md_end (void)
263 {
264   int mach_type;
265
266   if (ins_used & (INS_UNPORT | INS_R800))
267     ins_used |= INS_UNDOC;
268
269   switch (ins_used)
270     {
271     case INS_Z80:
272       mach_type = bfd_mach_z80strict;
273       break;
274     case INS_Z80|INS_UNDOC:
275       mach_type = bfd_mach_z80;
276       break;
277     case INS_Z80|INS_UNDOC|INS_UNPORT:
278       mach_type = bfd_mach_z80full;
279       break;
280     case INS_Z80|INS_UNDOC|INS_R800:
281       mach_type = bfd_mach_r800;
282       break;
283     default:
284       mach_type = 0;
285     }
286
287   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach_type);
288 }
289
290 static const char *
291 skip_space (const char *s)
292 {
293   while (*s == ' ' || *s == '\t')
294     ++s;
295   return s;
296 }
297
298 /* A non-zero return-value causes a continue in the
299    function read_a_source_file () in ../read.c.  */
300 int
301 z80_start_line_hook (void)
302 {
303   char *p, quote;
304   char buf[4];
305
306   /* Convert one character constants.  */
307   for (p = input_line_pointer; *p && *p != '\n'; ++p)
308     {
309       switch (*p)
310         {
311         case '\'':
312           if (p[1] != 0 && p[1] != '\'' && p[2] == '\'')
313             {
314               snprintf (buf, 4, "%3d", (unsigned char)p[1]);
315               *p++ = buf[0];
316               *p++ = buf[1];
317               *p++ = buf[2];
318               break;
319             }
320           /* Fall through.  */
321         case '"':
322           for (quote = *p++; quote != *p && '\n' != *p; ++p)
323             /* No escapes.  */ ;
324           if (quote != *p)
325             {
326               as_bad (_("-- unterminated string"));
327               ignore_rest_of_line ();
328               return 1;
329             }
330           break;
331         }
332     }
333   /* Check for <label>[:] [.](EQU|DEFL) <value>.  */
334   if (is_name_beginner (*input_line_pointer))
335     {
336       char *name;
337       char c, *rest, *line_start;
338       int len;
339
340       line_start = input_line_pointer;
341       if (ignore_input ())
342         return 0;
343
344       c = get_symbol_name (&name);
345       rest = input_line_pointer + 1;
346
347       if (*rest == ':')
348         ++rest;
349       if (*rest == ' ' || *rest == '\t')
350         ++rest;
351       if (*rest == '.')
352         ++rest;
353       if (strncasecmp (rest, "EQU", 3) == 0)
354         len = 3;
355       else if (strncasecmp (rest, "DEFL", 4) == 0)
356         len = 4;
357       else
358         len = 0;
359       if (len && (!ISALPHA(rest[len]) ) )
360         {
361           /* Handle assignment here.  */
362           if (line_start[-1] == '\n')
363             {
364               bump_line_counters ();
365               LISTING_NEWLINE ();
366             }
367           input_line_pointer = rest + len - 1;
368           /* Allow redefining with "DEFL" (len == 4), but not with "EQU".  */
369           equals (name, len == 4);
370           return 1;
371         }
372       else
373         {
374           /* Restore line and pointer.  */
375           (void) restore_line_pointer (c);
376           input_line_pointer = line_start;
377         }
378     }
379   return 0;
380 }
381
382 symbolS *
383 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
384 {
385   return NULL;
386 }
387
388 const char *
389 md_atof (int type ATTRIBUTE_UNUSED, char *litP ATTRIBUTE_UNUSED,
390          int *sizeP ATTRIBUTE_UNUSED)
391 {
392   return _("floating point numbers are not implemented");
393 }
394
395 valueT
396 md_section_align (segT seg ATTRIBUTE_UNUSED, valueT size)
397 {
398   return size;
399 }
400
401 long
402 md_pcrel_from (fixS * fixp)
403 {
404   return fixp->fx_where +
405     fixp->fx_frag->fr_address + 1;
406 }
407
408 typedef const char * (asfunc)(char, char, const char*);
409
410 typedef struct _table_t
411 {
412   const char* name;
413   unsigned char prefix;
414   unsigned char opcode;
415   asfunc * fp;
416 } table_t;
417
418 /* Compares the key for structs that start with a char * to the key.  */
419 static int
420 key_cmp (const void * a, const void * b)
421 {
422   const char *str_a, *str_b;
423
424   str_a = *((const char**)a);
425   str_b = *((const char**)b);
426   return strcmp (str_a, str_b);
427 }
428
429 char buf[BUFLEN];
430 const char *key = buf;
431
432 /* Prevent an error on a line from also generating
433    a "junk at end of line" error message.  */
434 static char err_flag;
435
436 static void
437 error (const char * message)
438 {
439   as_bad ("%s", message);
440   err_flag = 1;
441 }
442
443 static void
444 ill_op (void)
445 {
446   error (_("illegal operand"));
447 }
448
449 static void
450 wrong_mach (int ins_type)
451 {
452   const char *p;
453
454   switch (ins_type)
455     {
456     case INS_UNDOC:
457       p = "undocumented instruction";
458       break;
459     case INS_UNPORT:
460       p = "instruction does not work on R800";
461       break;
462     case INS_R800:
463       p = "instruction only works R800";
464       break;
465     default:
466       p = 0; /* Not reachable.  */
467     }
468
469   if (ins_type & ins_err)
470     error (_(p));
471   else
472     as_warn ("%s", _(p));
473 }
474
475 static void
476 check_mach (int ins_type)
477 {
478   if ((ins_type & ins_ok) == 0)
479     wrong_mach (ins_type);
480   ins_used |= ins_type;
481 }
482
483 /* Check whether an expression is indirect.  */
484 static int
485 is_indir (const char *s)
486 {
487   char quote;
488   const char *p;
489   int indir, depth;
490
491   /* Indirection is indicated with parentheses.  */
492   indir = (*s == '(');
493
494   for (p = s, depth = 0; *p && *p != ','; ++p)
495     {
496       switch (*p)
497         {
498         case '"':
499         case '\'':
500           for (quote = *p++; quote != *p && *p != '\n'; ++p)
501             if (*p == '\\' && p[1])
502               ++p;
503           break;
504         case '(':
505           ++ depth;
506           break;
507         case ')':
508           -- depth;
509           if (depth == 0)
510             {
511               p = skip_space (p + 1);
512               if (*p && *p != ',')
513                 indir = 0;
514               --p;
515             }
516           if (depth < 0)
517             error (_("mismatched parentheses"));
518           break;
519         }
520     }
521
522   if (depth != 0)
523     error (_("mismatched parentheses"));
524
525   return indir;
526 }
527
528 /* Check whether a symbol involves a register.  */
529 static int
530 contains_register(symbolS *sym)
531 {
532   if (sym)
533   {
534     expressionS * ex = symbol_get_value_expression(sym);
535     return (O_register == ex->X_op)
536       || (ex->X_add_symbol && contains_register(ex->X_add_symbol))
537       || (ex->X_op_symbol && contains_register(ex->X_op_symbol));
538   }
539   else
540     return 0;
541 }
542
543 /* Parse general expression, not loooking for indexed adressing.  */
544 static const char *
545 parse_exp_not_indexed (const char *s, expressionS *op)
546 {
547   const char *p;
548   int indir;
549
550   p = skip_space (s);
551   op->X_md = indir = is_indir (p);
552   input_line_pointer = (char*) s ;
553   expression (op);
554   switch (op->X_op)
555     {
556     case O_absent:
557       error (_("missing operand"));
558       break;
559     case O_illegal:
560       error (_("bad expression syntax"));
561       break;
562     default:
563       break;
564     }
565   return input_line_pointer;
566 }
567
568 /* Parse expression, change operator to O_md1 for indexed addressing*/
569 static const char *
570 parse_exp (const char *s, expressionS *op)
571 {
572   const char* res = parse_exp_not_indexed (s, op);
573   switch (op->X_op)
574     {
575     case O_add:
576     case O_subtract:
577       if (op->X_md && (O_register == symbol_get_value_expression(op->X_add_symbol)->X_op))
578         {
579           int rnum = symbol_get_value_expression(op->X_add_symbol)->X_add_number;
580           if ( ((REG_IX != rnum) && (REG_IY != rnum)) || contains_register(op->X_op_symbol) )
581             {
582               ill_op();
583             }
584           else
585             {
586               if (O_subtract == op->X_op)
587                 {
588                   expressionS minus;
589                   minus.X_op = O_uminus;
590                   minus.X_add_number = 0;
591                   minus.X_add_symbol = op->X_op_symbol;
592                   minus.X_op_symbol = 0;
593                   op->X_op_symbol = make_expr_symbol(&minus);
594                   op->X_op = O_add;
595                 }
596               symbol_get_value_expression(op->X_op_symbol)->X_add_number += op->X_add_number;
597               op->X_add_number = rnum;
598               op->X_add_symbol = op->X_op_symbol;
599               op->X_op_symbol = 0;
600               op->X_op = O_md1;
601             }
602         }
603       break;
604     case O_register:
605       if ( op->X_md && ((REG_IX == op->X_add_number)||(REG_IY == op->X_add_number)) )
606         {
607           op->X_add_symbol = zero;
608           op->X_op = O_md1;
609         }
610         break;
611     default:
612       break;
613     }
614   return res;
615 }
616
617 /* Condition codes, including some synonyms provided by HiTech zas.  */
618 static const struct reg_entry cc_tab[] =
619 {
620   { "age", 6 << 3 },
621   { "alt", 7 << 3 },
622   { "c",   3 << 3 },
623   { "di",  4 << 3 },
624   { "ei",  5 << 3 },
625   { "lge", 2 << 3 },
626   { "llt", 3 << 3 },
627   { "m",   7 << 3 },
628   { "nc",  2 << 3 },
629   { "nz",  0 << 3 },
630   { "p",   6 << 3 },
631   { "pe",  5 << 3 },
632   { "po",  4 << 3 },
633   { "z",   1 << 3 },
634 } ;
635
636 /* Parse condition code.  */
637 static const char *
638 parse_cc (const char *s, char * op)
639 {
640   const char *p;
641   int i;
642   struct reg_entry * cc_p;
643
644   for (i = 0; i < BUFLEN; ++i)
645     {
646       if (!ISALPHA (s[i])) /* Condition codes consist of letters only.  */
647         break;
648       buf[i] = TOLOWER (s[i]);
649     }
650
651   if ((i < BUFLEN)
652       && ((s[i] == 0) || (s[i] == ',')))
653     {
654       buf[i] = 0;
655       cc_p = bsearch (&key, cc_tab, ARRAY_SIZE (cc_tab),
656                       sizeof (cc_tab[0]), key_cmp);
657     }
658   else
659     cc_p = NULL;
660
661   if (cc_p)
662     {
663       *op = cc_p->number;
664       p = s + i;
665     }
666   else
667     p = NULL;
668
669   return p;
670 }
671
672 static const char *
673 emit_insn (char prefix, char opcode, const char * args)
674 {
675   char *p;
676
677   if (prefix)
678     {
679       p = frag_more (2);
680       *p++ = prefix;
681     }
682   else
683     p = frag_more (1);
684   *p = opcode;
685   return args;
686 }
687
688 void z80_cons_fix_new (fragS *frag_p, int offset, int nbytes, expressionS *exp)
689 {
690   bfd_reloc_code_real_type r[4] =
691     {
692       BFD_RELOC_8,
693       BFD_RELOC_16,
694       BFD_RELOC_24,
695       BFD_RELOC_32
696     };
697
698   if (nbytes < 1 || nbytes > 4)
699     {
700       as_bad (_("unsupported BFD relocation size %u"), nbytes);
701     }
702   else
703     {
704       fix_new_exp (frag_p, offset, nbytes, exp, 0, r[nbytes-1]);
705     }
706 }
707
708 static void
709 emit_byte (expressionS * val, bfd_reloc_code_real_type r_type)
710 {
711   char *p;
712   int lo, hi;
713
714   p = frag_more (1);
715   *p = val->X_add_number;
716   if ( contains_register(val->X_add_symbol) || contains_register(val->X_op_symbol) )
717     {
718       ill_op();
719     }
720   else if ((r_type == BFD_RELOC_8_PCREL) && (val->X_op == O_constant))
721     {
722       as_bad (_("cannot make a relative jump to an absolute location"));
723     }
724   else if (val->X_op == O_constant)
725     {
726       lo = -128;
727       hi = (BFD_RELOC_8 == r_type) ? 255 : 127;
728
729       if ((val->X_add_number < lo) || (val->X_add_number > hi))
730         {
731           if (r_type == BFD_RELOC_Z80_DISP8)
732             as_bad (_("offset too large"));
733           else
734             as_warn (_("overflow"));
735         }
736     }
737   else
738     {
739       fix_new_exp (frag_now, p - frag_now->fr_literal, 1, val,
740                    (r_type == BFD_RELOC_8_PCREL) ? TRUE : FALSE, r_type);
741       /* FIXME : Process constant offsets immediately.  */
742     }
743 }
744
745 static void
746 emit_word (expressionS * val)
747 {
748   char *p;
749
750   p = frag_more (2);
751   if (   (val->X_op == O_register)
752       || (val->X_op == O_md1)
753       || contains_register(val->X_add_symbol)
754       || contains_register(val->X_op_symbol) )
755     ill_op ();
756   else
757     {
758       *p = val->X_add_number;
759       p[1] = (val->X_add_number>>8);
760       if (val->X_op != O_constant)
761         fix_new_exp (frag_now, p - frag_now->fr_literal, 2,
762                      val, FALSE, BFD_RELOC_16);
763     }
764 }
765
766 static void
767 emit_mx (char prefix, char opcode, int shift, expressionS * arg)
768      /* The operand m may be r, (hl), (ix+d), (iy+d),
769         if 0 == prefix m may also be ixl, ixh, iyl, iyh.  */
770 {
771   char *q;
772   int rnum;
773
774   rnum = arg->X_add_number;
775   switch (arg->X_op)
776     {
777     case O_register:
778       if (arg->X_md)
779         {
780           if (rnum != REG_HL)
781             {
782               ill_op ();
783               break;
784             }
785           else
786             rnum = 6;
787         }
788       else
789         {
790           if ((prefix == 0) && (rnum & R_INDEX))
791             {
792               prefix = (rnum & R_IX) ? 0xDD : 0xFD;
793               check_mach (INS_UNDOC);
794               rnum &= ~R_INDEX;
795             }
796           if (rnum > 7)
797             {
798               ill_op ();
799               break;
800             }
801         }
802       q = frag_more (prefix ? 2 : 1);
803       if (prefix)
804         * q ++ = prefix;
805       * q ++ = opcode + (rnum << shift);
806       break;
807     case O_md1:
808       q = frag_more (2);
809       *q++ = (rnum & R_IX) ? 0xDD : 0xFD;
810       *q = (prefix) ? prefix : (opcode + (6 << shift));
811       {
812         expressionS offset = *arg;
813         offset.X_op = O_symbol;
814         offset.X_add_number = 0;
815         emit_byte (&offset, BFD_RELOC_Z80_DISP8);
816       }
817       if (prefix)
818         {
819           q = frag_more (1);
820           *q = opcode+(6<<shift);
821         }
822       break;
823     default:
824       abort ();
825     }
826 }
827
828 /* The operand m may be r, (hl), (ix+d), (iy+d),
829    if 0 = prefix m may also be ixl, ixh, iyl, iyh.  */
830 static const char *
831 emit_m (char prefix, char opcode, const char *args)
832 {
833   expressionS arg_m;
834   const char *p;
835
836   p = parse_exp (args, &arg_m);
837   switch (arg_m.X_op)
838     {
839     case O_md1:
840     case O_register:
841       emit_mx (prefix, opcode, 0, &arg_m);
842       break;
843     default:
844       ill_op ();
845     }
846   return p;
847 }
848
849 /* The operand m may be as above or one of the undocumented
850    combinations (ix+d),r and (iy+d),r (if unportable instructions
851    are allowed).  */
852 static const char *
853 emit_mr (char prefix, char opcode, const char *args)
854 {
855   expressionS arg_m, arg_r;
856   const char *p;
857
858   p = parse_exp (args, & arg_m);
859
860   switch (arg_m.X_op)
861     {
862     case O_md1:
863       if (*p == ',')
864         {
865           p = parse_exp (p + 1, & arg_r);
866
867           if ((arg_r.X_md == 0)
868               && (arg_r.X_op == O_register)
869               && (arg_r.X_add_number < 8))
870             opcode += arg_r.X_add_number-6; /* Emit_mx () will add 6.  */
871           else
872             {
873               ill_op ();
874               break;
875             }
876           check_mach (INS_UNPORT);
877         }
878       /* Fall through.  */
879     case O_register:
880       emit_mx (prefix, opcode, 0, & arg_m);
881       break;
882     default:
883       ill_op ();
884     }
885   return p;
886 }
887
888 static void
889 emit_sx (char prefix, char opcode, expressionS * arg_p)
890 {
891   char *q;
892
893   switch (arg_p->X_op)
894     {
895     case O_register:
896     case O_md1:
897       emit_mx (prefix, opcode, 0, arg_p);
898       break;
899     default:
900       if (arg_p->X_md)
901         ill_op ();
902       else
903         {
904           q = frag_more (prefix ? 2 : 1);
905           if (prefix)
906             *q++ = prefix;
907           *q = opcode ^ 0x46;
908           emit_byte (arg_p, BFD_RELOC_8);
909         }
910     }
911 }
912
913 /* The operand s may be r, (hl), (ix+d), (iy+d), n.  */
914 static const char *
915 emit_s (char prefix, char opcode, const char *args)
916 {
917   expressionS arg_s;
918   const char *p;
919
920   p = parse_exp (args, & arg_s);
921   emit_sx (prefix, opcode, & arg_s);
922   return p;
923 }
924
925 static const char *
926 emit_call (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
927 {
928   expressionS addr;
929   const char *p;  char *q;
930
931   p = parse_exp_not_indexed (args, &addr);
932   if (addr.X_md)
933     ill_op ();
934   else
935     {
936       q = frag_more (1);
937       *q = opcode;
938       emit_word (& addr);
939     }
940   return p;
941 }
942
943 /* Operand may be rr, r, (hl), (ix+d), (iy+d).  */
944 static const char *
945 emit_incdec (char prefix, char opcode, const char * args)
946 {
947   expressionS operand;
948   int rnum;
949   const char *p;  char *q;
950
951   p = parse_exp (args, &operand);
952   rnum = operand.X_add_number;
953   if ((! operand.X_md)
954       && (operand.X_op == O_register)
955       && (R_ARITH&rnum))
956     {
957       q = frag_more ((rnum & R_INDEX) ? 2 : 1);
958       if (rnum & R_INDEX)
959         *q++ = (rnum & R_IX) ? 0xDD : 0xFD;
960       *q = prefix + ((rnum & 3) << 4);
961     }
962   else
963     {
964       if ((operand.X_op == O_md1) || (operand.X_op == O_register))
965         emit_mx (0, opcode, 3, & operand);
966       else
967         ill_op ();
968     }
969   return p;
970 }
971
972 static const char *
973 emit_jr (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
974 {
975   expressionS addr;
976   const char *p;
977   char *q;
978
979   p = parse_exp_not_indexed (args, &addr);
980   if (addr.X_md)
981     ill_op ();
982   else
983     {
984       q = frag_more (1);
985       *q = opcode;
986       emit_byte (&addr, BFD_RELOC_8_PCREL);
987     }
988   return p;
989 }
990
991 static const char *
992 emit_jp (char prefix, char opcode, const char * args)
993 {
994   expressionS addr;
995   const char *p;
996   char *q;
997   int rnum;
998
999   p = parse_exp_not_indexed (args, & addr);
1000   if (addr.X_md)
1001     {
1002       rnum = addr.X_add_number;
1003       if ((O_register == addr.X_op) && (REG_HL == (rnum & ~R_INDEX)))
1004         {
1005           q = frag_more ((rnum & R_INDEX) ? 2 : 1);
1006           if (rnum & R_INDEX)
1007             *q++ = (rnum & R_IX) ? 0xDD : 0xFD;
1008           *q = prefix;
1009         }
1010       else
1011         ill_op ();
1012     }
1013   else
1014     {
1015       q = frag_more (1);
1016       *q = opcode;
1017       emit_word (& addr);
1018     }
1019   return p;
1020 }
1021
1022 static const char *
1023 emit_im (char prefix, char opcode, const char * args)
1024 {
1025   expressionS mode;
1026   const char *p;
1027   char *q;
1028
1029   p = parse_exp (args, & mode);
1030   if (mode.X_md || (mode.X_op != O_constant))
1031     ill_op ();
1032   else
1033     switch (mode.X_add_number)
1034       {
1035       case 1:
1036       case 2:
1037         ++mode.X_add_number;
1038         /* Fall through.  */
1039       case 0:
1040         q = frag_more (2);
1041         *q++ = prefix;
1042         *q = opcode + 8*mode.X_add_number;
1043         break;
1044       default:
1045         ill_op ();
1046       }
1047   return p;
1048 }
1049
1050 static const char *
1051 emit_pop (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
1052 {
1053   expressionS regp;
1054   const char *p;
1055   char *q;
1056
1057   p = parse_exp (args, & regp);
1058   if ((!regp.X_md)
1059       && (regp.X_op == O_register)
1060       && (regp.X_add_number & R_STACKABLE))
1061     {
1062       int rnum;
1063
1064       rnum = regp.X_add_number;
1065       if (rnum&R_INDEX)
1066         {
1067           q = frag_more (2);
1068           *q++ = (rnum&R_IX)?0xDD:0xFD;
1069         }
1070       else
1071         q = frag_more (1);
1072       *q = opcode + ((rnum & 3) << 4);
1073     }
1074   else
1075     ill_op ();
1076
1077   return p;
1078 }
1079
1080 static const char *
1081 emit_retcc (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
1082 {
1083   char cc, *q;
1084   const char *p;
1085
1086   p = parse_cc (args, &cc);
1087   q = frag_more (1);
1088   if (p)
1089     *q = opcode + cc;
1090   else
1091     *q = prefix;
1092   return p ? p : args;
1093 }
1094
1095 static const char *
1096 emit_adc (char prefix, char opcode, const char * args)
1097 {
1098   expressionS term;
1099   int rnum;
1100   const char *p;
1101   char *q;
1102
1103   p = parse_exp (args, &term);
1104   if (*p++ != ',')
1105     {
1106       error (_("bad instruction syntax"));
1107       return p;
1108     }
1109
1110   if ((term.X_md) || (term.X_op != O_register))
1111     ill_op ();
1112   else
1113     switch (term.X_add_number)
1114       {
1115       case REG_A:
1116         p = emit_s (0, prefix, p);
1117         break;
1118       case REG_HL:
1119         p = parse_exp (p, &term);
1120         if ((!term.X_md) && (term.X_op == O_register))
1121           {
1122             rnum = term.X_add_number;
1123             if (R_ARITH == (rnum & (R_ARITH | R_INDEX)))
1124               {
1125                 q = frag_more (2);
1126                 *q++ = 0xED;
1127                 *q = opcode + ((rnum & 3) << 4);
1128                 break;
1129               }
1130           }
1131         /* Fall through.  */
1132       default:
1133         ill_op ();
1134       }
1135   return p;
1136 }
1137
1138 static const char *
1139 emit_add (char prefix, char opcode, const char * args)
1140 {
1141   expressionS term;
1142   int lhs, rhs;
1143   const char *p;
1144   char *q;
1145
1146   p = parse_exp (args, &term);
1147   if (*p++ != ',')
1148     {
1149       error (_("bad instruction syntax"));
1150       return p;
1151     }
1152
1153   if ((term.X_md) || (term.X_op != O_register))
1154     ill_op ();
1155   else
1156     switch (term.X_add_number & ~R_INDEX)
1157       {
1158       case REG_A:
1159         p = emit_s (0, prefix, p);
1160         break;
1161       case REG_HL:
1162         lhs = term.X_add_number;
1163         p = parse_exp (p, &term);
1164         if ((!term.X_md) && (term.X_op == O_register))
1165           {
1166             rhs = term.X_add_number;
1167             if ((rhs & R_ARITH)
1168                 && ((rhs == lhs) || ((rhs & ~R_INDEX) != REG_HL)))
1169               {
1170                 q = frag_more ((lhs & R_INDEX) ? 2 : 1);
1171                 if (lhs & R_INDEX)
1172                   *q++ = (lhs & R_IX) ? 0xDD : 0xFD;
1173                 *q = opcode + ((rhs & 3) << 4);
1174                 break;
1175               }
1176           }
1177         /* Fall through.  */
1178       default:
1179         ill_op ();
1180       }
1181   return p;
1182 }
1183
1184 static const char *
1185 emit_bit (char prefix, char opcode, const char * args)
1186 {
1187   expressionS b;
1188   int bn;
1189   const char *p;
1190
1191   p = parse_exp (args, &b);
1192   if (*p++ != ',')
1193     error (_("bad instruction syntax"));
1194
1195   bn = b.X_add_number;
1196   if ((!b.X_md)
1197       && (b.X_op == O_constant)
1198       && (0 <= bn)
1199       && (bn < 8))
1200     {
1201       if (opcode == 0x40)
1202         /* Bit : no optional third operand.  */
1203         p = emit_m (prefix, opcode + (bn << 3), p);
1204       else
1205         /* Set, res : resulting byte can be copied to register.  */
1206         p = emit_mr (prefix, opcode + (bn << 3), p);
1207     }
1208   else
1209     ill_op ();
1210   return p;
1211 }
1212
1213 static const char *
1214 emit_jpcc (char prefix, char opcode, const char * args)
1215 {
1216   char cc;
1217   const char *p;
1218
1219   p = parse_cc (args, & cc);
1220   if (p && *p++ == ',')
1221     p = emit_call (0, opcode + cc, p);
1222   else
1223     p = (prefix == (char)0xC3)
1224       ? emit_jp (0xE9, prefix, args)
1225       : emit_call (0, prefix, args);
1226   return p;
1227 }
1228
1229 static const char *
1230 emit_jrcc (char prefix, char opcode, const char * args)
1231 {
1232   char cc;
1233   const char *p;
1234
1235   p = parse_cc (args, &cc);
1236   if (p && *p++ == ',')
1237     {
1238       if (cc > (3 << 3))
1239         error (_("condition code invalid for jr"));
1240       else
1241         p = emit_jr (0, opcode + cc, p);
1242     }
1243   else
1244     p = emit_jr (0, prefix, args);
1245
1246   return p;
1247 }
1248
1249 static const char *
1250 emit_ex (char prefix_in ATTRIBUTE_UNUSED,
1251          char opcode_in ATTRIBUTE_UNUSED, const char * args)
1252 {
1253   expressionS op;
1254   const char * p;
1255   char prefix, opcode;
1256
1257   p = parse_exp_not_indexed (args, &op);
1258   p = skip_space (p);
1259   if (*p++ != ',')
1260     {
1261       error (_("bad instruction syntax"));
1262       return p;
1263     }
1264
1265   prefix = opcode = 0;
1266   if (op.X_op == O_register)
1267     switch (op.X_add_number | (op.X_md ? 0x8000 : 0))
1268       {
1269       case REG_AF:
1270         if (TOLOWER (*p++) == 'a' && TOLOWER (*p++) == 'f')
1271           {
1272             /* The scrubber changes '\'' to '`' in this context.  */
1273             if (*p == '`')
1274               ++p;
1275             opcode = 0x08;
1276           }
1277         break;
1278       case REG_DE:
1279         if (TOLOWER (*p++) == 'h' && TOLOWER (*p++) == 'l')
1280           opcode = 0xEB;
1281         break;
1282       case REG_SP|0x8000:
1283         p = parse_exp (p, & op);
1284         if (op.X_op == O_register
1285             && op.X_md == 0
1286             && (op.X_add_number & ~R_INDEX) == REG_HL)
1287           {
1288             opcode = 0xE3;
1289             if (R_INDEX & op.X_add_number)
1290               prefix = (R_IX & op.X_add_number) ? 0xDD : 0xFD;
1291           }
1292         break;
1293       }
1294   if (opcode)
1295     emit_insn (prefix, opcode, p);
1296   else
1297     ill_op ();
1298
1299   return p;
1300 }
1301
1302 static const char *
1303 emit_in (char prefix ATTRIBUTE_UNUSED, char opcode ATTRIBUTE_UNUSED,
1304         const char * args)
1305 {
1306   expressionS reg, port;
1307   const char *p;
1308   char *q;
1309
1310   p = parse_exp (args, &reg);
1311   if (*p++ != ',')
1312     {
1313       error (_("bad instruction syntax"));
1314       return p;
1315     }
1316
1317   p = parse_exp (p, &port);
1318   if (reg.X_md == 0
1319       && reg.X_op == O_register
1320       && (reg.X_add_number <= 7 || reg.X_add_number == REG_F)
1321       && (port.X_md))
1322     {
1323       if (port.X_op != O_md1 && port.X_op != O_register)
1324         {
1325           if (REG_A == reg.X_add_number)
1326             {
1327               q = frag_more (1);
1328               *q = 0xDB;
1329               emit_byte (&port, BFD_RELOC_8);
1330             }
1331           else
1332             ill_op ();
1333         }
1334       else
1335         {
1336           if (port.X_add_number == REG_C)
1337             {
1338               if (reg.X_add_number == REG_F)
1339                 check_mach (INS_UNDOC);
1340               else
1341                 {
1342                   q = frag_more (2);
1343                   *q++ = 0xED;
1344                   *q = 0x40|((reg.X_add_number&7)<<3);
1345                 }
1346             }
1347           else
1348             ill_op ();
1349         }
1350     }
1351   else
1352     ill_op ();
1353   return p;
1354 }
1355
1356 static const char *
1357 emit_out (char prefix ATTRIBUTE_UNUSED, char opcode ATTRIBUTE_UNUSED,
1358          const char * args)
1359 {
1360   expressionS reg, port;
1361   const char *p;
1362   char *q;
1363
1364   p = parse_exp (args, & port);
1365   if (*p++ != ',')
1366     {
1367       error (_("bad instruction syntax"));
1368       return p;
1369     }
1370   p = parse_exp (p, &reg);
1371   if (!port.X_md)
1372     { ill_op (); return p; }
1373   /* Allow "out (c), 0" as unportable instruction.  */
1374   if (reg.X_op == O_constant && reg.X_add_number == 0)
1375     {
1376       check_mach (INS_UNPORT);
1377       reg.X_op = O_register;
1378       reg.X_add_number = 6;
1379     }
1380   if (reg.X_md
1381       || reg.X_op != O_register
1382       || reg.X_add_number > 7)
1383     ill_op ();
1384   else
1385     if (port.X_op != O_register && port.X_op != O_md1)
1386       {
1387         if (REG_A == reg.X_add_number)
1388           {
1389             q = frag_more (1);
1390             *q = 0xD3;
1391             emit_byte (&port, BFD_RELOC_8);
1392           }
1393         else
1394           ill_op ();
1395       }
1396     else
1397       {
1398         if (REG_C == port.X_add_number)
1399           {
1400             q = frag_more (2);
1401             *q++ = 0xED;
1402             *q = 0x41 | (reg.X_add_number << 3);
1403           }
1404         else
1405           ill_op ();
1406       }
1407   return p;
1408 }
1409
1410 static const char *
1411 emit_rst (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
1412 {
1413   expressionS addr;
1414   const char *p;
1415   char *q;
1416
1417   p = parse_exp_not_indexed (args, &addr);
1418   if (addr.X_op != O_constant)
1419     {
1420       error ("rst needs constant address");
1421       return p;
1422     }
1423
1424   if (addr.X_add_number & ~(7 << 3))
1425     ill_op ();
1426   else
1427     {
1428       q = frag_more (1);
1429       *q = opcode + (addr.X_add_number & (7 << 3));
1430     }
1431   return p;
1432 }
1433
1434 static void
1435 emit_ldxhl (char prefix, char opcode, expressionS *src, expressionS *d)
1436 {
1437   char *q;
1438
1439   if (src->X_md)
1440     ill_op ();
1441   else
1442     {
1443       if (src->X_op == O_register)
1444         {
1445           if (src->X_add_number>7)
1446             ill_op ();
1447           if (prefix)
1448             {
1449               q = frag_more (2);
1450               *q++ = prefix;
1451             }
1452           else
1453         q = frag_more (1);
1454           *q = opcode + src->X_add_number;
1455           if (d)
1456             emit_byte (d, BFD_RELOC_Z80_DISP8);
1457         }
1458       else
1459         {
1460           if (prefix)
1461             {
1462               q = frag_more (2);
1463               *q++ = prefix;
1464             }
1465           else
1466             q = frag_more (1);
1467           *q = opcode^0x46;
1468           if (d)
1469             emit_byte (d, BFD_RELOC_Z80_DISP8);
1470           emit_byte (src, BFD_RELOC_8);
1471         }
1472     }
1473 }
1474
1475 static void
1476 emit_ldreg (int dest, expressionS * src)
1477 {
1478   char *q;
1479   int rnum;
1480
1481   switch (dest)
1482     {
1483       /* 8 Bit ld group:  */
1484     case REG_I:
1485     case REG_R:
1486       if (src->X_md == 0 && src->X_op == O_register && src->X_add_number == REG_A)
1487         {
1488           q = frag_more (2);
1489           *q++ = 0xED;
1490           *q = (dest == REG_I) ? 0x47 : 0x4F;
1491         }
1492       else
1493         ill_op ();
1494       break;
1495
1496     case REG_A:
1497       if ((src->X_md) && src->X_op != O_register && src->X_op != O_md1)
1498         {
1499           q = frag_more (1);
1500           *q = 0x3A;
1501           emit_word (src);
1502           break;
1503         }
1504
1505       if ((src->X_md)
1506           && src->X_op == O_register
1507           && (src->X_add_number == REG_BC || src->X_add_number == REG_DE))
1508         {
1509           q = frag_more (1);
1510           *q = 0x0A + ((src->X_add_number & 1) << 4);
1511           break;
1512         }
1513
1514       if ((!src->X_md)
1515           && src->X_op == O_register
1516           && (src->X_add_number == REG_R || src->X_add_number == REG_I))
1517         {
1518           q = frag_more (2);
1519           *q++ = 0xED;
1520           *q = (src->X_add_number == REG_I) ? 0x57 : 0x5F;
1521           break;
1522         }
1523       /* Fall through.  */
1524     case REG_B:
1525     case REG_C:
1526     case REG_D:
1527     case REG_E:
1528       emit_sx (0, 0x40 + (dest << 3), src);
1529       break;
1530
1531     case REG_H:
1532     case REG_L:
1533       if ((src->X_md == 0)
1534           && (src->X_op == O_register)
1535           && (src->X_add_number & R_INDEX))
1536         ill_op ();
1537       else
1538         emit_sx (0, 0x40 + (dest << 3), src);
1539       break;
1540
1541     case R_IX | REG_H:
1542     case R_IX | REG_L:
1543     case R_IY | REG_H:
1544     case R_IY | REG_L:
1545       if (src->X_md)
1546         {
1547           ill_op ();
1548           break;
1549         }
1550       check_mach (INS_UNDOC);
1551       if (src-> X_op == O_register)
1552         {
1553           rnum = src->X_add_number;
1554           if ((rnum & ~R_INDEX) < 8
1555               && ((rnum & R_INDEX) == (dest & R_INDEX)
1556                    || (   (rnum & ~R_INDEX) != REG_H
1557                        && (rnum & ~R_INDEX) != REG_L)))
1558             {
1559               q = frag_more (2);
1560               *q++ = (dest & R_IX) ? 0xDD : 0xFD;
1561               *q = 0x40 + ((dest & 0x07) << 3) + (rnum & 7);
1562             }
1563           else
1564             ill_op ();
1565         }
1566       else
1567         {
1568           q = frag_more (2);
1569           *q++ = (dest & R_IX) ? 0xDD : 0xFD;
1570           *q = 0x06 + ((dest & 0x07) << 3);
1571           emit_byte (src, BFD_RELOC_8);
1572         }
1573       break;
1574
1575       /* 16 Bit ld group:  */
1576     case REG_SP:
1577       if (src->X_md == 0
1578           && src->X_op == O_register
1579           && REG_HL == (src->X_add_number &~ R_INDEX))
1580         {
1581           q = frag_more ((src->X_add_number & R_INDEX) ? 2 : 1);
1582           if (src->X_add_number & R_INDEX)
1583             *q++ = (src->X_add_number & R_IX) ? 0xDD : 0xFD;
1584           *q = 0xF9;
1585           break;
1586         }
1587       /* Fall through.  */
1588     case REG_BC:
1589     case REG_DE:
1590       if (src->X_op == O_register || src->X_op == O_md1)
1591         ill_op ();
1592       q = frag_more (src->X_md ? 2 : 1);
1593       if (src->X_md)
1594         {
1595           *q++ = 0xED;
1596           *q = 0x4B + ((dest & 3) << 4);
1597         }
1598       else
1599         *q = 0x01 + ((dest & 3) << 4);
1600       emit_word (src);
1601       break;
1602
1603     case REG_HL:
1604     case REG_HL | R_IX:
1605     case REG_HL | R_IY:
1606       if (src->X_op == O_register || src->X_op == O_md1)
1607         ill_op ();
1608       q = frag_more ((dest & R_INDEX) ? 2 : 1);
1609       if (dest & R_INDEX)
1610         * q ++ = (dest & R_IX) ? 0xDD : 0xFD;
1611       *q = (src->X_md) ? 0x2A : 0x21;
1612       emit_word (src);
1613       break;
1614
1615     case REG_AF:
1616     case REG_F:
1617       ill_op ();
1618       break;
1619
1620     default:
1621       abort ();
1622     }
1623 }
1624
1625 static const char *
1626 emit_ld (char prefix_in ATTRIBUTE_UNUSED, char opcode_in ATTRIBUTE_UNUSED,
1627         const char * args)
1628 {
1629   expressionS dst, src;
1630   const char *p;
1631   char *q;
1632   char prefix, opcode;
1633
1634   p = parse_exp (args, &dst);
1635   if (*p++ != ',')
1636     error (_("bad instruction syntax"));
1637   p = parse_exp (p, &src);
1638
1639   switch (dst.X_op)
1640     {
1641     case O_md1:
1642       {
1643         expressionS dst_offset = dst;
1644         dst_offset.X_op = O_symbol;
1645         dst_offset.X_add_number = 0;
1646         emit_ldxhl ((dst.X_add_number & R_IX) ? 0xDD : 0xFD, 0x70,
1647                     &src, &dst_offset);
1648       }
1649       break;
1650
1651     case O_register:
1652       if (dst.X_md)
1653         {
1654           switch (dst.X_add_number)
1655             {
1656             case REG_BC:
1657             case REG_DE:
1658               if (src.X_md == 0 && src.X_op == O_register && src.X_add_number == REG_A)
1659                 {
1660                   q = frag_more (1);
1661                   *q = 0x02 + ( (dst.X_add_number & 1) << 4);
1662                 }
1663               else
1664                 ill_op ();
1665               break;
1666             case REG_HL:
1667               emit_ldxhl (0, 0x70, &src, NULL);
1668               break;
1669             default:
1670               ill_op ();
1671             }
1672         }
1673       else
1674         emit_ldreg (dst.X_add_number, &src);
1675       break;
1676
1677     default:
1678       if (src.X_md != 0 || src.X_op != O_register)
1679         ill_op ();
1680       prefix = opcode = 0;
1681       switch (src.X_add_number)
1682         {
1683         case REG_A:
1684           opcode = 0x32; break;
1685         case REG_BC: case REG_DE: case REG_SP:
1686           prefix = 0xED; opcode = 0x43 + ((src.X_add_number&3)<<4); break;
1687         case REG_HL:
1688           opcode = 0x22; break;
1689         case REG_HL|R_IX:
1690           prefix = 0xDD; opcode = 0x22; break;
1691         case REG_HL|R_IY:
1692           prefix = 0xFD; opcode = 0x22; break;
1693         }
1694       if (opcode)
1695         {
1696           q = frag_more (prefix?2:1);
1697           if (prefix)
1698             *q++ = prefix;
1699           *q = opcode;
1700           emit_word (&dst);
1701         }
1702       else
1703         ill_op ();
1704     }
1705   return p;
1706 }
1707
1708 static void
1709 emit_data (int size ATTRIBUTE_UNUSED)
1710 {
1711   const char *p, *q;
1712   char *u, quote;
1713   int cnt;
1714   expressionS exp;
1715
1716   if (is_it_end_of_statement ())
1717     {
1718       demand_empty_rest_of_line ();
1719       return;
1720     }
1721   p = skip_space (input_line_pointer);
1722
1723   do
1724     {
1725       if (*p == '\"' || *p == '\'')
1726         {
1727             for (quote = *p, q = ++p, cnt = 0; *p && quote != *p; ++p, ++cnt)
1728               ;
1729             u = frag_more (cnt);
1730             memcpy (u, q, cnt);
1731             if (!*p)
1732               as_warn (_("unterminated string"));
1733             else
1734               p = skip_space (p+1);
1735         }
1736       else
1737         {
1738           p = parse_exp (p, &exp);
1739           if (exp.X_op == O_md1 || exp.X_op == O_register)
1740             {
1741               ill_op ();
1742               break;
1743             }
1744           if (exp.X_md)
1745             as_warn (_("parentheses ignored"));
1746           emit_byte (&exp, BFD_RELOC_8);
1747           p = skip_space (p);
1748         }
1749     }
1750   while (*p++ == ',') ;
1751   input_line_pointer = (char *)(p-1);
1752 }
1753
1754 static const char *
1755 emit_mulub (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
1756 {
1757   const char *p;
1758
1759   p = skip_space (args);
1760   if (TOLOWER (*p++) != 'a' || *p++ != ',')
1761     ill_op ();
1762   else
1763     {
1764       char *q, reg;
1765
1766       reg = TOLOWER (*p++);
1767       switch (reg)
1768         {
1769         case 'b':
1770         case 'c':
1771         case 'd':
1772         case 'e':
1773           check_mach (INS_R800);
1774           if (!*skip_space (p))
1775             {
1776               q = frag_more (2);
1777               *q++ = prefix;
1778               *q = opcode + ((reg - 'b') << 3);
1779               break;
1780             }
1781           /* Fall through.  */
1782         default:
1783           ill_op ();
1784         }
1785     }
1786   return p;
1787 }
1788
1789 static const char *
1790 emit_muluw (char prefix ATTRIBUTE_UNUSED, char opcode, const char * args)
1791 {
1792   const char *p;
1793
1794   p = skip_space (args);
1795   if (TOLOWER (*p++) != 'h' || TOLOWER (*p++) != 'l' || *p++ != ',')
1796     ill_op ();
1797   else
1798     {
1799       expressionS reg;
1800       char *q;
1801
1802       p = parse_exp (p, & reg);
1803
1804       if ((!reg.X_md) && reg.X_op == O_register)
1805         switch (reg.X_add_number)
1806           {
1807           case REG_BC:
1808           case REG_SP:
1809             check_mach (INS_R800);
1810             q = frag_more (2);
1811             *q++ = prefix;
1812             *q = opcode + ((reg.X_add_number & 3) << 4);
1813             break;
1814           default:
1815             ill_op ();
1816           }
1817     }
1818   return p;
1819 }
1820
1821 /* Port specific pseudo ops.  */
1822 const pseudo_typeS md_pseudo_table[] =
1823 {
1824   { "db" , emit_data, 1},
1825   { "d24", cons, 3},
1826   { "d32", cons, 4},
1827   { "def24", cons, 3},
1828   { "def32", cons, 4},
1829   { "defb", emit_data, 1},
1830   { "defs", s_space, 1}, /* Synonym for ds on some assemblers.  */
1831   { "defw", cons, 2},
1832   { "ds",   s_space, 1}, /* Fill with bytes rather than words.  */
1833   { "dw", cons, 2},
1834   { "psect", obj_coff_section, 0}, /* TODO: Translate attributes.  */
1835   { "set", 0, 0},               /* Real instruction on z80.  */
1836   { NULL, 0, 0 }
1837 } ;
1838
1839 static table_t instab[] =
1840 {
1841   { "adc",  0x88, 0x4A, emit_adc },
1842   { "add",  0x80, 0x09, emit_add },
1843   { "and",  0x00, 0xA0, emit_s },
1844   { "bit",  0xCB, 0x40, emit_bit },
1845   { "call", 0xCD, 0xC4, emit_jpcc },
1846   { "ccf",  0x00, 0x3F, emit_insn },
1847   { "cp",   0x00, 0xB8, emit_s },
1848   { "cpd",  0xED, 0xA9, emit_insn },
1849   { "cpdr", 0xED, 0xB9, emit_insn },
1850   { "cpi",  0xED, 0xA1, emit_insn },
1851   { "cpir", 0xED, 0xB1, emit_insn },
1852   { "cpl",  0x00, 0x2F, emit_insn },
1853   { "daa",  0x00, 0x27, emit_insn },
1854   { "dec",  0x0B, 0x05, emit_incdec },
1855   { "di",   0x00, 0xF3, emit_insn },
1856   { "djnz", 0x00, 0x10, emit_jr },
1857   { "ei",   0x00, 0xFB, emit_insn },
1858   { "ex",   0x00, 0x00, emit_ex},
1859   { "exx",  0x00, 0xD9, emit_insn },
1860   { "halt", 0x00, 0x76, emit_insn },
1861   { "im",   0xED, 0x46, emit_im },
1862   { "in",   0x00, 0x00, emit_in },
1863   { "inc",  0x03, 0x04, emit_incdec },
1864   { "ind",  0xED, 0xAA, emit_insn },
1865   { "indr", 0xED, 0xBA, emit_insn },
1866   { "ini",  0xED, 0xA2, emit_insn },
1867   { "inir", 0xED, 0xB2, emit_insn },
1868   { "jp",   0xC3, 0xC2, emit_jpcc },
1869   { "jr",   0x18, 0x20, emit_jrcc },
1870   { "ld",   0x00, 0x00, emit_ld },
1871   { "ldd",  0xED, 0xA8, emit_insn },
1872   { "lddr", 0xED, 0xB8, emit_insn },
1873   { "ldi",  0xED, 0xA0, emit_insn },
1874   { "ldir", 0xED, 0xB0, emit_insn },
1875   { "mulub", 0xED, 0xC5, emit_mulub }, /* R800 only.  */
1876   { "muluw", 0xED, 0xC3, emit_muluw }, /* R800 only.  */
1877   { "neg",  0xed, 0x44, emit_insn },
1878   { "nop",  0x00, 0x00, emit_insn },
1879   { "or",   0x00, 0xB0, emit_s },
1880   { "otdr", 0xED, 0xBB, emit_insn },
1881   { "otir", 0xED, 0xB3, emit_insn },
1882   { "out",  0x00, 0x00, emit_out },
1883   { "outd", 0xED, 0xAB, emit_insn },
1884   { "outi", 0xED, 0xA3, emit_insn },
1885   { "pop",  0x00, 0xC1, emit_pop },
1886   { "push", 0x00, 0xC5, emit_pop },
1887   { "res",  0xCB, 0x80, emit_bit },
1888   { "ret",  0xC9, 0xC0, emit_retcc },
1889   { "reti", 0xED, 0x4D, emit_insn },
1890   { "retn", 0xED, 0x45, emit_insn },
1891   { "rl",   0xCB, 0x10, emit_mr },
1892   { "rla",  0x00, 0x17, emit_insn },
1893   { "rlc",  0xCB, 0x00, emit_mr },
1894   { "rlca", 0x00, 0x07, emit_insn },
1895   { "rld",  0xED, 0x6F, emit_insn },
1896   { "rr",   0xCB, 0x18, emit_mr },
1897   { "rra",  0x00, 0x1F, emit_insn },
1898   { "rrc",  0xCB, 0x08, emit_mr },
1899   { "rrca", 0x00, 0x0F, emit_insn },
1900   { "rrd",  0xED, 0x67, emit_insn },
1901   { "rst",  0x00, 0xC7, emit_rst},
1902   { "sbc",  0x98, 0x42, emit_adc },
1903   { "scf",  0x00, 0x37, emit_insn },
1904   { "set",  0xCB, 0xC0, emit_bit },
1905   { "sla",  0xCB, 0x20, emit_mr },
1906   { "sli",  0xCB, 0x30, emit_mr },
1907   { "sll",  0xCB, 0x30, emit_mr },
1908   { "sra",  0xCB, 0x28, emit_mr },
1909   { "srl",  0xCB, 0x38, emit_mr },
1910   { "sub",  0x00, 0x90, emit_s },
1911   { "xor",  0x00, 0xA8, emit_s },
1912 } ;
1913
1914 void
1915 md_assemble (char* str)
1916 {
1917   const char *p;
1918   char * old_ptr;
1919   int i;
1920   table_t *insp;
1921
1922   err_flag = 0;
1923   old_ptr = input_line_pointer;
1924   p = skip_space (str);
1925   for (i = 0; (i < BUFLEN) && (ISALPHA (*p));)
1926     buf[i++] = TOLOWER (*p++);
1927
1928   if (i == BUFLEN)
1929     {
1930       buf[BUFLEN-3] = buf[BUFLEN-2] = '.'; /* Mark opcode as abbreviated.  */
1931       buf[BUFLEN-1] = 0;
1932       as_bad (_("Unknown instruction '%s'"), buf);
1933     }
1934   else if ((*p) && (!ISSPACE (*p)))
1935     as_bad (_("syntax error"));
1936   else
1937     {
1938       buf[i] = 0;
1939       p = skip_space (p);
1940       key = buf;
1941
1942       insp = bsearch (&key, instab, ARRAY_SIZE (instab),
1943                     sizeof (instab[0]), key_cmp);
1944       if (!insp)
1945         as_bad (_("Unknown instruction '%s'"), buf);
1946       else
1947         {
1948           p = insp->fp (insp->prefix, insp->opcode, p);
1949           p = skip_space (p);
1950         if ((!err_flag) && *p)
1951           as_bad (_("junk at end of line, first unrecognized character is `%c'"),
1952                   *p);
1953         }
1954     }
1955   input_line_pointer = old_ptr;
1956 }
1957
1958 void
1959 md_apply_fix (fixS * fixP, valueT* valP, segT seg ATTRIBUTE_UNUSED)
1960 {
1961   long val = * (long *) valP;
1962   char *p_lit = fixP->fx_where + fixP->fx_frag->fr_literal;
1963
1964   switch (fixP->fx_r_type)
1965     {
1966     case BFD_RELOC_8_PCREL:
1967       if (fixP->fx_addsy)
1968         {
1969           fixP->fx_no_overflow = 1;
1970           fixP->fx_done = 0;
1971         }
1972       else
1973         {
1974           fixP->fx_no_overflow = (-128 <= val && val < 128);
1975           if (!fixP->fx_no_overflow)
1976             as_bad_where (fixP->fx_file, fixP->fx_line,
1977                           _("relative jump out of range"));
1978           *p_lit++ = val;
1979           fixP->fx_done = 1;
1980         }
1981       break;
1982
1983     case BFD_RELOC_Z80_DISP8:
1984       if (fixP->fx_addsy)
1985         {
1986           fixP->fx_no_overflow = 1;
1987           fixP->fx_done = 0;
1988         }
1989       else
1990         {
1991           fixP->fx_no_overflow = (-128 <= val && val < 128);
1992           if (!fixP->fx_no_overflow)
1993             as_bad_where (fixP->fx_file, fixP->fx_line,
1994                           _("index offset  out of range"));
1995           *p_lit++ = val;
1996           fixP->fx_done = 1;
1997         }
1998       break;
1999
2000     case BFD_RELOC_8:
2001       if (val > 255 || val < -128)
2002         as_warn_where (fixP->fx_file, fixP->fx_line, _("overflow"));
2003       *p_lit++ = val;
2004       fixP->fx_no_overflow = 1;
2005       if (fixP->fx_addsy == NULL)
2006         fixP->fx_done = 1;
2007       break;
2008
2009     case BFD_RELOC_16:
2010       *p_lit++ = val;
2011       *p_lit++ = (val >> 8);
2012       fixP->fx_no_overflow = 1;
2013       if (fixP->fx_addsy == NULL)
2014         fixP->fx_done = 1;
2015       break;
2016
2017     case BFD_RELOC_24: /* Def24 may produce this.  */
2018       *p_lit++ = val;
2019       *p_lit++ = (val >> 8);
2020       *p_lit++ = (val >> 16);
2021       fixP->fx_no_overflow = 1;
2022       if (fixP->fx_addsy == NULL)
2023         fixP->fx_done = 1;
2024       break;
2025
2026     case BFD_RELOC_32: /* Def32 and .long may produce this.  */
2027       *p_lit++ = val;
2028       *p_lit++ = (val >> 8);
2029       *p_lit++ = (val >> 16);
2030       *p_lit++ = (val >> 24);
2031       if (fixP->fx_addsy == NULL)
2032         fixP->fx_done = 1;
2033       break;
2034
2035     default:
2036       printf (_("md_apply_fix: unknown r_type 0x%x\n"), fixP->fx_r_type);
2037       abort ();
2038     }
2039 }
2040
2041 /* GAS will call this to generate a reloc.  GAS will pass the
2042    resulting reloc to `bfd_install_relocation'.  This currently works
2043    poorly, as `bfd_install_relocation' often does the wrong thing, and
2044    instances of `tc_gen_reloc' have been written to work around the
2045    problems, which in turns makes it difficult to fix
2046    `bfd_install_relocation'.  */
2047
2048 /* If while processing a fixup, a reloc really
2049    needs to be created then it is done here.  */
2050
2051 arelent *
2052 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED , fixS *fixp)
2053 {
2054   arelent *reloc;
2055
2056   if (! bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type))
2057     {
2058       as_bad_where (fixp->fx_file, fixp->fx_line,
2059                     _("reloc %d not supported by object file format"),
2060                     (int) fixp->fx_r_type);
2061       return NULL;
2062     }
2063
2064   reloc               = XNEW (arelent);
2065   reloc->sym_ptr_ptr  = XNEW (asymbol *);
2066   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2067   reloc->address      = fixp->fx_frag->fr_address + fixp->fx_where;
2068   reloc->howto        = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2069   reloc->addend       = fixp->fx_offset;
2070
2071   return reloc;
2072 }