xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/cpu-z80.c (revision e992f068c547fd6e84b3f104dc2340adcc955732)
175fd0b74Schristos /* BFD library support routines for the Z80 architecture.
2*e992f068Schristos    Copyright (C) 2005-2022 Free Software Foundation, Inc.
375fd0b74Schristos    Contributed by Arnold Metselaar <arnold_m@operamail.com>
475fd0b74Schristos 
575fd0b74Schristos    This file is part of BFD, the Binary File Descriptor library.
675fd0b74Schristos 
775fd0b74Schristos    This program is free software; you can redistribute it and/or modify
875fd0b74Schristos    it under the terms of the GNU General Public License as published by
975fd0b74Schristos    the Free Software Foundation; either version 3 of the License, or
1075fd0b74Schristos    (at your option) any later version.
1175fd0b74Schristos 
1275fd0b74Schristos    This program is distributed in the hope that it will be useful,
1375fd0b74Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
1475fd0b74Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1575fd0b74Schristos    GNU General Public License for more details.
1675fd0b74Schristos 
1775fd0b74Schristos    You should have received a copy of the GNU General Public License
1875fd0b74Schristos    along with this program; if not, write to the Free Software
1975fd0b74Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2075fd0b74Schristos    MA 02110-1301, USA.  */
2175fd0b74Schristos 
2275fd0b74Schristos #include "sysdep.h"
2375fd0b74Schristos #include "bfd.h"
2475fd0b74Schristos #include "libbfd.h"
2575fd0b74Schristos 
2675fd0b74Schristos const bfd_arch_info_type bfd_z80_arch;
2775fd0b74Schristos 
2875fd0b74Schristos /* This routine is provided two arch_infos and
2975fd0b74Schristos    returns whether they'd be compatible.  */
3075fd0b74Schristos 
3175fd0b74Schristos static const bfd_arch_info_type *
compatible(const bfd_arch_info_type * a,const bfd_arch_info_type * b)3275fd0b74Schristos compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
3375fd0b74Schristos {
34*e992f068Schristos   if (a->arch != b->arch || a->arch != bfd_arch_z80)
3575fd0b74Schristos     return NULL;
3675fd0b74Schristos 
3775fd0b74Schristos   if (a->mach == b->mach)
3875fd0b74Schristos     return a;
39*e992f068Schristos   switch (a->mach)
40*e992f068Schristos     {
41*e992f068Schristos     case bfd_mach_z80:
42*e992f068Schristos     case bfd_mach_z80full:
43*e992f068Schristos     case bfd_mach_z80strict:
44*e992f068Schristos       switch (b->mach)
45*e992f068Schristos 	{
46*e992f068Schristos 	case bfd_mach_z80:
47*e992f068Schristos 	case bfd_mach_z80full:
48*e992f068Schristos 	case bfd_mach_z80strict:
49*e992f068Schristos 	  return & bfd_z80_arch;
50*e992f068Schristos 	case bfd_mach_z180:
51*e992f068Schristos 	case bfd_mach_ez80_z80:
52*e992f068Schristos 	case bfd_mach_ez80_adl:
53*e992f068Schristos 	case bfd_mach_z80n:
54*e992f068Schristos 	case bfd_mach_r800:
55*e992f068Schristos 	  return b;
56*e992f068Schristos 	}
57*e992f068Schristos       break;
58*e992f068Schristos     case bfd_mach_z80n:
59*e992f068Schristos     case bfd_mach_r800:
60*e992f068Schristos       switch (b->mach)
61*e992f068Schristos 	{
62*e992f068Schristos 	case bfd_mach_z80:
63*e992f068Schristos 	case bfd_mach_z80full:
64*e992f068Schristos 	case bfd_mach_z80strict:
65*e992f068Schristos 	  return a;
66*e992f068Schristos 	}
67*e992f068Schristos       break;
68*e992f068Schristos     case bfd_mach_z180:
69*e992f068Schristos       switch (b->mach)
70*e992f068Schristos 	{
71*e992f068Schristos 	case bfd_mach_z80:
72*e992f068Schristos 	case bfd_mach_z80full:
73*e992f068Schristos 	case bfd_mach_z80strict:
74*e992f068Schristos 	  return a;
75*e992f068Schristos 	case bfd_mach_ez80_z80:
76*e992f068Schristos 	case bfd_mach_ez80_adl:
77*e992f068Schristos 	  return b;
78*e992f068Schristos 	}
79*e992f068Schristos       break;
80*e992f068Schristos     case bfd_mach_ez80_z80:
81*e992f068Schristos     case bfd_mach_ez80_adl:
82*e992f068Schristos       switch (b->mach)
83*e992f068Schristos 	{
84*e992f068Schristos 	case bfd_mach_z80:
85*e992f068Schristos 	case bfd_mach_z80full:
86*e992f068Schristos 	case bfd_mach_z80strict:
87*e992f068Schristos 	case bfd_mach_z180:
88*e992f068Schristos 	case bfd_mach_ez80_z80:
89*e992f068Schristos 	  return a;
90*e992f068Schristos 	case bfd_mach_ez80_adl:
91*e992f068Schristos 	  return b;
92*e992f068Schristos 	}
93*e992f068Schristos       break;
94*e992f068Schristos     case bfd_mach_gbz80:
95*e992f068Schristos        return NULL;
96*e992f068Schristos     }
9775fd0b74Schristos 
98*e992f068Schristos   return NULL;
9975fd0b74Schristos }
10075fd0b74Schristos 
101012573ebSchristos #define N(name,print,bits,default,next)  \
102012573ebSchristos  { 16, bits, 8, bfd_arch_z80, name, "z80", print, 0, default, \
103012573ebSchristos    compatible, bfd_default_scan, bfd_arch_default_fill, next, 0 }
10475fd0b74Schristos 
10575fd0b74Schristos #define M(n) &arch_info_struct[n]
10675fd0b74Schristos 
10775fd0b74Schristos static const bfd_arch_info_type arch_info_struct[] =
10875fd0b74Schristos {
109*e992f068Schristos   N (bfd_mach_z80,	 "z80",        16, true,  M(1)),
110*e992f068Schristos   N (bfd_mach_z80strict, "z80-strict", 16, false, M(2)),
111*e992f068Schristos   N (bfd_mach_z80full,	 "z80-full",   16, false, M(3)),
112*e992f068Schristos   N (bfd_mach_r800,	 "r800",       16, false, M(4)),
113*e992f068Schristos   N (bfd_mach_gbz80,	 "gbz80",      16, false, M(5)),
114*e992f068Schristos   N (bfd_mach_z180,	 "z180",       16, false, M(6)),
115*e992f068Schristos   N (bfd_mach_z80n,	 "z80n",       16, false, M(7)),
116*e992f068Schristos   N (bfd_mach_ez80_z80,	 "ez80-z80",   16, false, M(8)),
117*e992f068Schristos   N (bfd_mach_ez80_adl,	 "ez80-adl",   24, false, NULL)
11875fd0b74Schristos };
11975fd0b74Schristos 
120012573ebSchristos const bfd_arch_info_type bfd_z80_arch =
121*e992f068Schristos   N (bfd_mach_z80,   "z80",   16, true,  M(1));
122