Fix comment.
[platform/upstream/binutils.git] / gas / config / tc-z80.c
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