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