Commit | Line | Data |
---|---|---|
3c9b82ba NC |
1 | # This shell script emits C code -*- C -*- |
2 | # to keep track of the machine type of Z80 object files | |
3 | # It does some substitutions. | |
4 | ||
5 | LDEMUL_BEFORE_PARSE=gldz80_before_parse | |
6 | LDEMUL_RECOGNIZED_FILE=gldz80_recognized_file | |
7 | LDEMUL_AFTER_OPEN=gldz80_after_open | |
8 | ||
9 | cat >>e${EMULATION_NAME}.c <<EOF | |
10 | /* --- \begin{z80.em} */ | |
11 | /* Codes for machine types, bitwise or gives the code to use for the | |
12 | output. */ | |
13 | #define M_Z80STRICT 1 | |
14 | #define M_Z80 3 | |
15 | #define M_Z80FULL 7 | |
16 | #define M_R800 11 | |
17 | #define M_Z80ANY 15 | |
18 | ||
19 | /* Bitwise or of the machine types seen so far. */ | |
20 | static int result_mach_type; | |
21 | ||
22 | static void | |
23 | ${LDEMUL_BEFORE_PARSE} (void) | |
24 | { | |
25 | #ifndef TARGET_ /* I.e., if not generic. */ | |
26 | ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown); | |
27 | #endif /* not TARGET_ */ | |
28 | result_mach_type = M_Z80STRICT; | |
29 | } | |
30 | ||
31 | ||
32 | /* Update result_mach_type. */ | |
33 | static bfd_boolean | |
34 | ${LDEMUL_RECOGNIZED_FILE} (lang_input_statement_type *entry) | |
35 | { | |
36 | unsigned long mach_type; | |
37 | ||
38 | mach_type = bfd_get_mach (entry->the_bfd); | |
39 | switch (mach_type) | |
40 | { | |
41 | case bfd_mach_z80strict: | |
42 | result_mach_type |= M_Z80STRICT; | |
43 | break; | |
44 | case bfd_mach_z80: | |
45 | result_mach_type |= M_Z80; | |
46 | break; | |
47 | case bfd_mach_z80full: | |
48 | result_mach_type |= M_Z80FULL; | |
49 | break; | |
50 | case bfd_mach_r800: | |
51 | result_mach_type |= M_R800; | |
52 | break; | |
53 | default: | |
54 | result_mach_type |= M_Z80ANY; | |
55 | } | |
56 | return FALSE; | |
57 | } | |
58 | ||
59 | /* Set the machine type of the output file based on result_mach_type. */ | |
60 | static void | |
61 | gldz80_after_open (void) | |
62 | { | |
63 | unsigned long mach_type; | |
64 | ||
65 | switch (result_mach_type) | |
66 | { | |
67 | case M_Z80STRICT: | |
68 | mach_type = bfd_mach_z80strict; | |
69 | break; | |
70 | case M_Z80: | |
71 | mach_type = bfd_mach_z80; | |
72 | break; | |
73 | case M_Z80FULL: | |
74 | mach_type = bfd_mach_z80full; | |
75 | break; | |
76 | case M_R800: | |
77 | mach_type = bfd_mach_r800; | |
78 | break; | |
79 | default: | |
80 | mach_type = 0; | |
81 | } | |
82 | bfd_set_arch_mach (output_bfd, bfd_arch_z80, mach_type); | |
83 | } | |
84 | /* --- \end{z80.em} */ | |
85 | EOF |