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