1 | /*****************************************************************************/ |
2 | /* */ |
3 | /* target.c */ |
4 | /* */ |
5 | /* Target specification */ |
6 | /* */ |
7 | /* */ |
8 | /* */ |
9 | /* (C) 2000-2015, Ullrich von Bassewitz */ |
10 | /* Roemerstrasse 52 */ |
11 | /* D-70794 Filderstadt */ |
12 | /* EMail: uz@cc65.org */ |
13 | /* */ |
14 | /* */ |
15 | /* This software is provided 'as-is', without any expressed or implied */ |
16 | /* warranty. In no event will the authors be held liable for any damages */ |
17 | /* arising from the use of this software. */ |
18 | /* */ |
19 | /* Permission is granted to anyone to use this software for any purpose, */ |
20 | /* including commercial applications, and to alter it and redistribute it */ |
21 | /* freely, subject to the following restrictions: */ |
22 | /* */ |
23 | /* 1. The origin of this software must not be misrepresented; you must not */ |
24 | /* claim that you wrote the original software. If you use this software */ |
25 | /* in a product, an acknowledgment in the product documentation would be */ |
26 | /* appreciated but is not required. */ |
27 | /* 2. Altered source versions must be plainly marked as such, and must not */ |
28 | /* be misrepresented as being the original software. */ |
29 | /* 3. This notice may not be removed or altered from any source */ |
30 | /* distribution. */ |
31 | /* */ |
32 | /*****************************************************************************/ |
33 | |
34 | |
35 | |
36 | #include <stdlib.h> |
37 | #include <string.h> |
38 | |
39 | /* common */ |
40 | #include "chartype.h" |
41 | #include "check.h" |
42 | #include "target.h" |
43 | |
44 | |
45 | |
46 | /*****************************************************************************/ |
47 | /* Data */ |
48 | /*****************************************************************************/ |
49 | |
50 | |
51 | |
52 | /* Translation table with direct (no) translation */ |
53 | static const unsigned char CTNone[256] = { |
54 | 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
55 | 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, |
56 | 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, |
57 | 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
58 | 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, |
59 | 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, |
60 | 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, |
61 | 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, |
62 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, |
63 | 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, |
64 | 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, |
65 | 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, |
66 | 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, |
67 | 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, |
68 | 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, |
69 | 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, |
70 | }; |
71 | |
72 | /* Translation table ISO-8859-1 -> AtASCII */ |
73 | static const unsigned char CTAtari[256] = { |
74 | 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0xFD,0x08,0x7F,0x9B,0x0B,0x7D,0x0D,0x0E,0x0F, |
75 | 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, |
76 | 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, |
77 | 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
78 | 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, |
79 | 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, |
80 | 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, |
81 | 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, |
82 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, |
83 | 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, |
84 | 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, |
85 | 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, |
86 | 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, |
87 | 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, |
88 | 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, |
89 | 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, |
90 | }; |
91 | |
92 | /* Translation table ISO-8859-1 -> OSASCII */ |
93 | static const unsigned char CTOSI[256] = { |
94 | 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, |
95 | 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, |
96 | 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, |
97 | 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
98 | 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, |
99 | 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, |
100 | 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, |
101 | 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7D,0x7C,0x7F,0x7E, |
102 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, |
103 | 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, |
104 | 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, |
105 | 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, |
106 | 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, |
107 | 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, |
108 | 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, |
109 | 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, |
110 | }; |
111 | |
112 | /* Translation table ISO-8859-1 -> PetSCII */ |
113 | static const unsigned char CTPET[256] = { |
114 | 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x14,0x09,0x0D,0x11,0x93,0x0A,0x0E,0x0F, |
115 | 0x10,0x0B,0x12,0x13,0x08,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, |
116 | 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, |
117 | 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, |
118 | 0x40,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, |
119 | 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0x5B,0xBF,0x5D,0x5E,0xA4, |
120 | 0xAD,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, |
121 | 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0xB3,0xDD,0xAB,0xB1,0xDF, |
122 | 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, |
123 | 0x90,0x91,0x92,0x0C,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, |
124 | 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, |
125 | 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, |
126 | 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, |
127 | 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, |
128 | 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, |
129 | 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, |
130 | }; |
131 | |
132 | |
133 | |
134 | /* One entry in the target map */ |
135 | typedef struct TargetEntry TargetEntry; |
136 | struct TargetEntry { |
137 | char Name[13]; /* Target name */ |
138 | target_t Id; /* Target id */ |
139 | }; |
140 | |
141 | /* Table that maps target names to ids. Sorted alphabetically for bsearch. |
142 | ** Allows multiple entries for one target id (target name aliases). |
143 | */ |
144 | static const TargetEntry TargetMap[] = { |
145 | { "apple2" , TGT_APPLE2 }, |
146 | { "apple2enh" , TGT_APPLE2ENH }, |
147 | { "atari" , TGT_ATARI }, |
148 | { "atari2600" , TGT_ATARI2600 }, |
149 | { "atari5200" , TGT_ATARI5200 }, |
150 | { "atarixl" , TGT_ATARIXL }, |
151 | { "atmos" , TGT_ATMOS }, |
152 | { "bbc" , TGT_BBC }, |
153 | { "c128" , TGT_C128 }, |
154 | { "c16" , TGT_C16 }, |
155 | { "c64" , TGT_C64 }, |
156 | { "c65" , TGT_C65 }, |
157 | { "cbm510" , TGT_CBM510 }, |
158 | { "cbm610" , TGT_CBM610 }, |
159 | { "creativision" , TGT_CREATIVISION }, |
160 | { "gamate" , TGT_GAMATE }, |
161 | { "geos" , TGT_GEOS_CBM }, |
162 | { "geos-apple" , TGT_GEOS_APPLE }, |
163 | { "geos-cbm" , TGT_GEOS_CBM }, |
164 | { "lunix" , TGT_LUNIX }, |
165 | { "lynx" , TGT_LYNX }, |
166 | { "module" , TGT_MODULE }, |
167 | { "nes" , TGT_NES }, |
168 | { "none" , TGT_NONE }, |
169 | { "osic1p" , TGT_OSIC1P }, |
170 | { "pce" , TGT_PCENGINE }, |
171 | { "pet" , TGT_PET }, |
172 | { "plus4" , TGT_PLUS4 }, |
173 | { "sim6502" , TGT_SIM6502 }, |
174 | { "sim65c02" , TGT_SIM65C02 }, |
175 | { "supervision" , TGT_SUPERVISION }, |
176 | { "telestrat" , TGT_TELESTRAT }, |
177 | { "vic20" , TGT_VIC20 }, |
178 | }; |
179 | #define MAP_ENTRY_COUNT (sizeof (TargetMap) / sizeof (TargetMap[0])) |
180 | |
181 | |
182 | /* Table with target properties by target id */ |
183 | static const TargetProperties PropertyTable[TGT_COUNT] = { |
184 | { "none" , CPU_6502, BINFMT_BINARY, CTNone }, |
185 | { "module" , CPU_6502, BINFMT_O65, CTNone }, |
186 | { "atari" , CPU_6502, BINFMT_BINARY, CTAtari }, |
187 | { "atari2600" , CPU_6502, BINFMT_BINARY, CTNone }, |
188 | { "atari5200" , CPU_6502, BINFMT_BINARY, CTAtari }, |
189 | { "atarixl" , CPU_6502, BINFMT_BINARY, CTAtari }, |
190 | { "vic20" , CPU_6502, BINFMT_BINARY, CTPET }, |
191 | { "c16" , CPU_6502, BINFMT_BINARY, CTPET }, |
192 | { "c64" , CPU_6502, BINFMT_BINARY, CTPET }, |
193 | { "c128" , CPU_6502, BINFMT_BINARY, CTPET }, |
194 | { "plus4" , CPU_6502, BINFMT_BINARY, CTPET }, |
195 | { "cbm510" , CPU_6502, BINFMT_BINARY, CTPET }, |
196 | { "cbm610" , CPU_6502, BINFMT_BINARY, CTPET }, |
197 | { "osic1p" , CPU_6502, BINFMT_BINARY, CTOSI }, |
198 | { "pet" , CPU_6502, BINFMT_BINARY, CTPET }, |
199 | { "bbc" , CPU_6502, BINFMT_BINARY, CTNone }, |
200 | { "apple2" , CPU_6502, BINFMT_BINARY, CTNone }, |
201 | { "apple2enh" , CPU_65C02, BINFMT_BINARY, CTNone }, |
202 | { "geos-cbm" , CPU_6502, BINFMT_BINARY, CTNone }, |
203 | { "creativision" , CPU_6502, BINFMT_BINARY, CTNone }, |
204 | { "geos-apple" , CPU_65C02, BINFMT_BINARY, CTNone }, |
205 | { "lunix" , CPU_6502, BINFMT_O65, CTNone }, |
206 | { "atmos" , CPU_6502, BINFMT_BINARY, CTNone }, |
207 | { "telestrat" , CPU_6502, BINFMT_BINARY, CTNone }, |
208 | { "nes" , CPU_6502, BINFMT_BINARY, CTNone }, |
209 | { "supervision" , CPU_65SC02, BINFMT_BINARY, CTNone }, |
210 | { "lynx" , CPU_65SC02, BINFMT_BINARY, CTNone }, |
211 | { "sim6502" , CPU_6502, BINFMT_BINARY, CTNone }, |
212 | { "sim65c02" , CPU_65C02, BINFMT_BINARY, CTNone }, |
213 | { "pce" , CPU_HUC6280, BINFMT_BINARY, CTNone }, |
214 | { "gamate" , CPU_6502, BINFMT_BINARY, CTNone }, |
215 | { "c65" , CPU_4510, BINFMT_BINARY, CTPET }, |
216 | }; |
217 | |
218 | /* Target system */ |
219 | target_t Target = TGT_NONE; |
220 | |
221 | |
222 | |
223 | /*****************************************************************************/ |
224 | /* Code */ |
225 | /*****************************************************************************/ |
226 | |
227 | |
228 | |
229 | static int Compare (const void* Key, const void* Entry) |
230 | /* Compare function for bsearch */ |
231 | { |
232 | return strcmp ((const char*) Key, ((const TargetEntry*)Entry)->Name); |
233 | } |
234 | |
235 | |
236 | |
237 | target_t FindTarget (const char* Name) |
238 | /* Find a target by name and return the target id. TGT_UNKNOWN is returned if |
239 | ** the given name is no valid target. |
240 | */ |
241 | { |
242 | /* Search for the name in the map */ |
243 | const TargetEntry* T; |
244 | T = bsearch (Name, TargetMap, MAP_ENTRY_COUNT, sizeof (TargetMap[0]), Compare); |
245 | |
246 | /* Return the target id */ |
247 | return (T == 0)? TGT_UNKNOWN : T->Id; |
248 | } |
249 | |
250 | |
251 | |
252 | const TargetProperties* GetTargetProperties (target_t Target) |
253 | /* Return the properties for a target */ |
254 | { |
255 | /* Must have a valid target id */ |
256 | PRECONDITION (Target >= 0 && Target < TGT_COUNT); |
257 | |
258 | /* Return the array entry */ |
259 | return &PropertyTable[Target]; |
260 | } |
261 | |
262 | |
263 | |
264 | const char* GetTargetName (target_t Target) |
265 | /* Return the name of a target */ |
266 | { |
267 | /* Return the array entry */ |
268 | return GetTargetProperties (Target)->Name; |
269 | } |
270 | |