1 /*
2 * E-UAE - The portable Amiga Emulator
3 *
4 * Generate pixel output code.
5 *
6 * (c) 2006 Richard Drummond
7 */
8 
9 #include "sysconfig.h"
10 #include "sysdeps.h"
11 
12 #include <stdlib.h>
13 #include <stdarg.h>
14 #include <stdio.h>
15 
16 /* Output for big-endian target if true, little-endian is false. */
17 int do_bigendian;
18 
19 typedef int DEPTH_T;
20 
21 #define DEPTH_8BPP 0
22 #define DEPTH_16BPP 1
23 #define DEPTH_32BPP 2
24 #define DEPTH_MAX DEPTH_32BPP
25 
get_depth_str(DEPTH_T bpp)26 static const char *get_depth_str (DEPTH_T bpp)
27 {
28 	if (bpp == DEPTH_8BPP)
29 		return "8";
30 	else if (bpp == DEPTH_16BPP)
31 		return "16";
32 	else
33 		return "32";
34 }
35 
get_depth_type_str(DEPTH_T bpp)36 static const char *get_depth_type_str (DEPTH_T bpp)
37 {
38 	if (bpp == DEPTH_8BPP)
39 		return "uae_u8";
40 	else if (bpp == DEPTH_16BPP)
41 		return "uae_u16";
42 	else
43 		return "uae_u32";
44 }
45 
46 typedef int HMODE_T;
47 
48 #define HMODE_NORMAL 0
49 #define HMODE_DOUBLE 1
50 #define HMODE_DOUBLE2X 2
51 #define HMODE_HALVE1 3
52 #define HMODE_HALVE1F 4
53 #define HMODE_HALVE2 5
54 #define HMODE_HALVE2F 6
55 #define HMODE_MAX HMODE_HALVE2F
56 
get_hmode_str(HMODE_T hmode)57 static const char *get_hmode_str (HMODE_T hmode)
58 {
59 	if (hmode == HMODE_DOUBLE)
60 		return "_stretch1";
61 	else if (hmode == HMODE_DOUBLE2X)
62 		return "_stretch2";
63 	else if (hmode == HMODE_HALVE1)
64 		return "_shrink1";
65 	else if (hmode == HMODE_HALVE1F)
66 		return "_shrink1f";
67 	else if (hmode == HMODE_HALVE2)
68 		return "_shrink2";
69 	else if (hmode == HMODE_HALVE2F)
70 		return "_shrink2f";
71 	else
72 		return "";
73 }
74 
75 
76 typedef enum
77 {
78 	CMODE_NORMAL,
79 	CMODE_DUALPF,
80 	CMODE_EXTRAHB,
81 	CMODE_HAM
82 } CMODE_T;
83 #define CMODE_MAX CMODE_HAM
84 
85 
86 static FILE *outfile;
87 static unsigned int outfile_indent = 0;
88 
set_outfile(FILE * f)89 static void set_outfile (FILE *f)
90 {
91 	outfile = f;
92 }
93 
set_indent(int indent)94 static int set_indent (int indent)
95 {
96 	int old_indent = outfile_indent;
97 	outfile_indent = indent;
98 	return old_indent;
99 }
100 
outindent(void)101 static void outindent(void)
102 {
103 	unsigned int i;
104 	for (i = 0; i < outfile_indent; i++)
105 		fputc(' ', outfile);
106 }
107 
outf(const char * s,...)108 static void outf(const char *s, ...)
109 {
110 	va_list ap;
111 	va_start(ap, s);
112 	vfprintf(outfile, s, ap);
113 }
114 
outln(const char * s)115 static void outln (const char *s)
116 {
117 	outindent();
118 	fprintf (outfile, "%s\n", s);
119 }
120 
outlnf(const char * s,...)121 static void outlnf (const char *s, ...)
122 {
123 	va_list ap;
124 	outindent();
125 	va_start (ap, s);
126 	vfprintf (outfile, s, ap);
127 	fputc ('\n', outfile);
128 }
129 
out_linetoscr_decl(DEPTH_T bpp,HMODE_T hmode,int aga,int spr,int genlock)130 static void out_linetoscr_decl (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, int genlock)
131 {
132 #ifdef FSUAE
133 	outlnf ("static int NOINLINE __attribute__((__unused__)) linetoscr_%s%s%s%s%s(int spix, int dpix, int dpix_end)",
134 #else
135 	outlnf ("static int NOINLINE linetoscr_%s%s%s%s%s(int spix, int dpix, int dpix_end)",
136 #endif
137 		get_depth_str (bpp),
138 		get_hmode_str (hmode), aga ? "_aga" : "", spr > 0 ? "_spr" : (spr < 0 ? "_spronly" : ""), genlock ? "_genlock" : "");
139 }
140 
out_linetoscr_do_srcpix(DEPTH_T bpp,HMODE_T hmode,int aga,CMODE_T cmode,int spr)141 static void out_linetoscr_do_srcpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr)
142 {
143 	if (spr < 0) {
144 		outln (     "    sprpix_val = 0;");
145 	} else {
146 		if (aga && cmode != CMODE_DUALPF) {
147 			if (spr)
148 				outln (     "    sprpix_val = pixdata.apixels[spix];");
149 			outln ( 	"    spix_val = pixdata.apixels[spix] ^ xor_val;");
150 		} else if (cmode != CMODE_HAM) {
151 			outln ( 	"    spix_val = pixdata.apixels[spix];");
152 			if (spr)
153 				outln (     "    sprpix_val = spix_val;");
154 		}
155 	}
156 }
157 
out_linetoscr_do_dstpix(DEPTH_T bpp,HMODE_T hmode,int aga,CMODE_T cmode,int spr)158 static void out_linetoscr_do_dstpix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr)
159 {
160 	if (spr < 0)
161 		return;
162 	if (aga && cmode == CMODE_HAM) {
163 		outln (	    "    spix_val = ham_linebuf[spix];");
164 		outln (	    "    dpix_val = CONVERT_RGB (spix_val);");
165 	} else if (cmode == CMODE_HAM) {
166 		outln (		"    spix_val = ham_linebuf[spix];");
167 		outln ( "    dpix_val = xcolors[spix_val];");
168 		if (spr)
169 			outln ( "    sprpix_val = pixdata.apixels[spix];");
170 	} else if (aga && cmode == CMODE_DUALPF) {
171 		outln (     "    {");
172 		outln (		"        uae_u8 val = lookup[spix_val];");
173 		outln (		"        if (lookup_no[spix_val])");
174 		outln (		"            val += dblpfofs[bpldualpf2of];");
175 		outln (		"        val ^= xor_val;");
176 		outln (		"        dpix_val = colors_for_drawing.acolors[val];");
177 		outln (		"    }");
178 	} else if (cmode == CMODE_DUALPF) {
179 		outln (		"    dpix_val = colors_for_drawing.acolors[lookup[spix_val]];");
180 	} else if (aga && cmode == CMODE_EXTRAHB) {
181 		outln (		"    if (spix_val >= 32 && spix_val < 64) {");
182 		outln (		"        unsigned int c = (colors_for_drawing.color_regs_aga[spix_val - 32] >> 1) & 0x7F7F7F;");
183 		outln (		"        dpix_val = CONVERT_RGB (c);");
184 		outln (		"    } else");
185 		outln (		"        dpix_val = colors_for_drawing.acolors[spix_val];");
186 	} else if (cmode == CMODE_EXTRAHB) {
187 		outln (		"    if (spix_val <= 31)");
188 		outln (		"        dpix_val = colors_for_drawing.acolors[spix_val];");
189 		outln (		"    else");
190 		outln (		"        dpix_val = xcolors[(colors_for_drawing.color_regs_ecs[spix_val - 32] >> 1) & 0x777];");
191 	} else
192 		outln (		"    dpix_val = colors_for_drawing.acolors[spix_val];");
193 }
194 
out_linetoscr_do_incspix(DEPTH_T bpp,HMODE_T hmode,int aga,CMODE_T cmode,int spr)195 static void out_linetoscr_do_incspix (DEPTH_T bpp, HMODE_T hmode, int aga, CMODE_T cmode, int spr)
196 {
197 	if (spr < 0) {
198 		outln("    spix++;");
199 		return;
200 	}
201 	if (hmode == HMODE_HALVE1F) {
202 		outln (         "    {");
203 		outln (         "    uae_u32 tmp_val;");
204 		outln (		"    spix++;");
205 		outln (		"    tmp_val = dpix_val;");
206 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
207 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
208 		outlnf (	"    dpix_val = merge_2pixel%d (dpix_val, tmp_val);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32);
209 		outln (		"    spix++;");
210 		outln (         "    }");
211 	} else if (hmode == HMODE_HALVE2F) {
212 		outln (         "    {");
213 		outln (         "    uae_u32 tmp_val, tmp_val2, tmp_val3;");
214 		outln (		"    spix++;");
215 		outln (		"    tmp_val = dpix_val;");
216 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
217 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
218 		outln (		"    spix++;");
219 		outln (		"    tmp_val2 = dpix_val;");
220 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
221 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
222 		outln (		"    spix++;");
223 		outln (		"    tmp_val3 = dpix_val;");
224 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
225 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
226 		outlnf (        "    tmp_val = merge_2pixel%d (tmp_val, tmp_val2);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32);
227 		outlnf (        "    tmp_val2 = merge_2pixel%d (tmp_val3, dpix_val);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32);
228 		outlnf (	"    dpix_val = merge_2pixel%d (tmp_val, tmp_val2);", bpp == 0 ? 8 : bpp == 1 ? 16 : 32);
229 		outln (		"    spix++;");
230 		outln (         "    }");
231 	} else if (hmode == HMODE_HALVE1) {
232 		outln (		"    spix += 2;");
233 	} else if (hmode == HMODE_HALVE2) {
234 		outln (		"    spix += 4;");
235 	} else {
236 		outln (		"    spix++;");
237 	}
238 }
239 
put_dpixsprgenlock(int offset,int genlock)240 static void put_dpixsprgenlock(int offset, int genlock)
241 {
242 	if (!genlock)
243 		return;
244 	if (offset)
245 		outlnf("            genlock_buf[dpix + %d] = get_genlock_transparency(sprcol);", offset);
246 	else
247 		outlnf("            genlock_buf[dpix] = get_genlock_transparency(sprcol);");
248 }
249 
put_dpixgenlock(int offset,CMODE_T cmode,int aga,int genlock,const char * var2)250 static void put_dpixgenlock(int offset, CMODE_T cmode, int aga, int genlock, const char *var2)
251 {
252 	if (!genlock)
253 		return;
254 	outindent();
255 	if (offset)
256 		outf("    genlock_buf[dpix + %d] = get_genlock_transparency(", offset);
257 	else
258 		outf("    genlock_buf[dpix] = get_genlock_transparency(");
259 
260 	if (genlock) {
261 		if (cmode == CMODE_EXTRAHB) {
262 			outf("%s", var2 ? var2 : "spix_val & 31");
263 		}
264 		else if (cmode == CMODE_DUALPF) {
265 			outf("%s", var2 ? var2 : "lookup[spix_val]");
266 		}
267 		else if (cmode == CMODE_HAM) {
268 			if (aga) {
269 				outf("%s", var2 ? var2 : "(spix_val >> 2) & 63");
270 			}
271 			else {
272 				outf("%s", var2 ? var2 : "spix_val & 15");
273 			}
274 		}
275 		else {
276 			outf("%s", var2 ? var2 : "spix_val");
277 		}
278 	}
279 	outf(");\n");
280 }
281 
put_dpix(const char * var)282 static void put_dpix (const char *var)
283 {
284 	outlnf("    buf[dpix++] = %s;", var);
285 }
286 
out_sprite(DEPTH_T bpp,HMODE_T hmode,CMODE_T cmode,int aga,int cnt,int spr,int genlock)287 static void out_sprite (DEPTH_T bpp, HMODE_T hmode, CMODE_T cmode, int aga, int cnt, int spr, int genlock)
288 {
289 	if (aga) {
290 		if (cnt == 1) {
291 			outlnf ( "    if (spritepixels[dpix].data) {");
292 			outlnf ( "        sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
293 			outlnf("        if (sprcol) {");
294 			outlnf ( "            out_val = colors_for_drawing.acolors[sprcol];");
295 			put_dpixsprgenlock(0, genlock);
296 			outlnf("        }");
297 			outlnf("    }");
298 			put_dpix("out_val");
299 		} else if (cnt == 2) {
300 			outlnf ( "    {");
301 			outlnf ( "    uae_u32 out_val1 = out_val;");
302 			outlnf ( "    uae_u32 out_val2 = out_val;");
303 			outlnf("    if (spritepixels[dpix + 0].data) {");
304 			outlnf ( "        sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
305 			outlnf ( "        if (sprcol) {");
306 			outlnf ( "            out_val1 = colors_for_drawing.acolors[sprcol];");
307 			put_dpixsprgenlock(0, genlock);
308 			outlnf("        }");
309 			outlnf("    }");
310 			outlnf ( "    if (spritepixels[dpix + 1].data) {");
311 			outlnf ( "        sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
312 			outlnf ( "        if (sprcol) {");
313 			outlnf ( "            out_val2 = colors_for_drawing.acolors[sprcol];");
314 			put_dpixsprgenlock(1, genlock);
315 			outlnf("        }");
316 			outlnf("    }");
317 			put_dpix("out_val1");
318 			put_dpix("out_val2");
319 			outlnf ( "    }");
320 		} else if (cnt == 4) {
321 			outlnf ( "    {");
322 			outlnf ( "    uae_u32 out_val1 = out_val;");
323 			outlnf ( "    uae_u32 out_val2 = out_val;");
324 			outlnf ( "    uae_u32 out_val3 = out_val;");
325 			outlnf ( "    uae_u32 out_val4 = out_val;");
326 			outlnf("    if (spritepixels[dpix + 0].data) {");
327 			outlnf ( "        sprcol = render_sprites (dpix + 0, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
328 			outlnf ( "        if (sprcol) {");
329 			outlnf ( "            out_val1 = colors_for_drawing.acolors[sprcol];");
330 			put_dpixsprgenlock(0, genlock);
331 			outlnf("        }");
332 			outlnf("    }");
333 			outlnf ( "    if (spritepixels[dpix + 1].data) {");
334 			outlnf ( "        sprcol = render_sprites (dpix + 1, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
335 			outlnf ( "        if (sprcol) {");
336 			outlnf ( "            out_val2 = colors_for_drawing.acolors[sprcol];");
337 			put_dpixsprgenlock(1, genlock);
338 			outlnf("        }");
339 			outlnf("    }");
340 			outlnf ( "    if (spritepixels[dpix + 2].data) {");
341 			outlnf ( "        sprcol = render_sprites (dpix + 2, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
342 			outlnf ( "        if (sprcol) {");
343 			outlnf ( "            out_val3 = colors_for_drawing.acolors[sprcol];");
344 			put_dpixsprgenlock(2, genlock);
345 			outlnf("        }");
346 			outlnf("    }");
347 			outlnf ( "    if (spritepixels[dpix + 3].data) {");
348 			outlnf ( "        sprcol = render_sprites (dpix + 3, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
349 			outlnf ( "        if (sprcol) {");
350 			outlnf ( "            out_val4 = colors_for_drawing.acolors[sprcol];");
351 			put_dpixsprgenlock(3, genlock);
352 			outlnf("        }");
353 			outlnf("    }");
354 			put_dpix("out_val1");
355 			put_dpix("out_val2");
356 			put_dpix("out_val3");
357 			put_dpix("out_val4");
358 			outlnf ( "    }");
359 		}
360 	} else {
361 		outlnf ( "    if (spritepixels[dpix].data) {");
362 		outlnf ( "        sprcol = render_sprites (dpix, %d, sprpix_val, %d);", cmode == CMODE_DUALPF ? 1 : 0, aga);
363 		put_dpixsprgenlock(0, genlock);
364 		outlnf("        if (sprcol) {");
365 		outlnf ( "            uae_u32 spcol = colors_for_drawing.acolors[sprcol];");
366 		outlnf ( "            out_val = spcol;");
367 		outlnf ( "        }");
368 		outlnf ( "    }");
369 		while (cnt-- > 0)
370 			put_dpix("out_val");
371 	}
372 }
373 
374 
out_linetoscr_mode(DEPTH_T bpp,HMODE_T hmode,int aga,int spr,CMODE_T cmode,int genlock)375 static void out_linetoscr_mode (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, CMODE_T cmode, int genlock)
376 {
377 	int old_indent = set_indent (8);
378 
379 	if (aga && cmode == CMODE_DUALPF) {
380 		outln (        "int *lookup    = bpldualpfpri ? dblpf_ind2_aga : dblpf_ind1_aga;");
381 		outln (        "int *lookup_no = bpldualpfpri ? dblpf_2nd2     : dblpf_2nd1;");
382 	} else if (cmode == CMODE_DUALPF)
383 		outln (        "int *lookup = bpldualpfpri ? dblpf_ind2 : dblpf_ind1;");
384 
385 	if (bpp == DEPTH_16BPP && hmode != HMODE_DOUBLE && hmode != HMODE_DOUBLE2X && spr == 0) {
386 		outln (		"int rem;");
387 		outln (		"if (((uintptr_t)&buf[dpix]) & 2) {");
388 		outln (		"    uae_u32 spix_val;");
389 		outln (		"    uae_u32 dpix_val;");
390 
391 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
392 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
393 		out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
394 
395 		put_dpix("dpix_val");
396 		outln (		"}");
397 		outln (		"if (dpix >= dpix_end)");
398 		outln (		"    return spix;");
399 		outln (		"rem = (((uintptr_t)&buf[dpix_end]) & 2);");
400 		outln (		"if (rem)");
401 		outln (		"    dpix_end--;");
402 	}
403 
404 	outln (		"while (dpix < dpix_end) {");
405 	if (spr)
406 		outln (		"    uae_u32 sprpix_val;");
407 	if (spr >= 0) {
408 		outln (		"    uae_u32 spix_val;");
409 		outln (		"    uae_u32 dpix_val;");
410 	}
411 	outln (		"    uae_u32 out_val;");
412 	outln (		"");
413 
414 	out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
415 	out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
416 	out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
417 
418 	if (spr >= 0)
419 		outln (		"    out_val = dpix_val;");
420 	else
421 		outln (		"    out_val = colors_for_drawing.acolors[0];");
422 
423 	if (hmode == HMODE_DOUBLE) {
424 		put_dpixgenlock(0, cmode, aga, genlock, NULL);
425 		put_dpixgenlock(1, cmode, aga, genlock, NULL);
426 	} else if (hmode == HMODE_DOUBLE2X) {
427 		put_dpixgenlock(0, cmode, aga, genlock, NULL);
428 		put_dpixgenlock(1, cmode, aga, genlock, NULL);
429 		put_dpixgenlock(2, cmode, aga, genlock, NULL);
430 		put_dpixgenlock(3, cmode, aga, genlock, NULL);
431 	} else {
432 		put_dpixgenlock(0, cmode, aga, genlock, NULL);
433 	}
434 
435 	if (hmode != HMODE_DOUBLE && hmode != HMODE_DOUBLE2X && bpp == DEPTH_16BPP && spr == 0) {
436 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
437 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
438 		out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
439 
440 		if (do_bigendian)
441 			outln (	"    out_val = (out_val << 16) | (dpix_val & 0xFFFF);");
442 		else
443 			outln (	"    out_val = (out_val & 0xFFFF) | (dpix_val << 16);");
444 	}
445 
446 	if (hmode == HMODE_DOUBLE) {
447 		if (bpp == DEPTH_8BPP) {
448 			outln (	"    *((uae_u16 *)&buf[dpix]) = (uae_u16) out_val;");
449 			outln (	"    dpix += 2;");
450 		} else if (bpp == DEPTH_16BPP) {
451 			if (spr) {
452 				out_sprite(bpp, hmode, cmode, aga, 2, spr, genlock);
453 			} else {
454 				outln (	"    *((uae_u32 *)&buf[dpix]) = out_val;");
455 				outln (	"    dpix += 2;");
456 			}
457 		} else {
458 			if (spr) {
459 				out_sprite(bpp, hmode, cmode, aga, 2, spr, genlock);
460 			} else {
461 				put_dpix("out_val");
462 				put_dpix("out_val");
463 			}
464 		}
465 	} else if (hmode == HMODE_DOUBLE2X) {
466 		if (bpp == DEPTH_8BPP) {
467 			outln (	"    *((uae_u32 *)&buf[dpix]) = (uae_u32) out_val;");
468 			outln (	"    dpix += 4;");
469 		} else if (bpp == DEPTH_16BPP) {
470 			if (spr) {
471 				out_sprite(bpp, hmode, cmode, aga, 4, spr, genlock);
472 			} else {
473 				outln (	"    *((uae_u32 *)&buf[dpix]) = out_val;");
474 				outln (	"    dpix += 2;");
475 				outln (	"    *((uae_u32 *)&buf[dpix]) = out_val;");
476 				outln (	"    dpix += 2;");
477 			}
478 		} else {
479 			if (spr) {
480 				out_sprite(bpp, hmode, cmode, aga, 4, spr, genlock);
481 			} else {
482 				put_dpix("out_val");
483 				put_dpix("out_val");
484 				put_dpix("out_val");
485 				put_dpix("out_val");
486 			}
487 		}
488 	} else {
489 		if (bpp == DEPTH_16BPP) {
490 			if (spr) {
491 				out_sprite(bpp, hmode, cmode, aga, 1, spr, genlock);
492 			} else {
493 				outln (	"    *((uae_u32 *)&buf[dpix]) = out_val;");
494 				outln (	"    dpix += 2;");
495 			}
496 		} else {
497 			if (spr) {
498 				out_sprite(bpp, hmode, cmode, aga, 1, spr, genlock);
499 			} else {
500 				put_dpix("out_val");
501 			}
502 		}
503 	}
504 
505 	outln (		"}");
506 
507 
508 	if (bpp == DEPTH_16BPP && hmode != HMODE_DOUBLE && hmode != HMODE_DOUBLE2X && spr == 0) {
509 		outln (		"if (rem) {");
510 		outln (		"    uae_u32 spix_val;");
511 		outln (		"    uae_u32 dpix_val;");
512 
513 		out_linetoscr_do_srcpix (bpp, hmode, aga, cmode, spr);
514 		out_linetoscr_do_dstpix (bpp, hmode, aga, cmode, spr);
515 		out_linetoscr_do_incspix (bpp, hmode, aga, cmode, spr);
516 
517 		put_dpix("dpix_val");
518 		outln (		"}");
519 	}
520 
521 	set_indent (old_indent);
522 
523 	return;
524 }
525 
out_linetoscr(DEPTH_T bpp,HMODE_T hmode,int aga,int spr,int genlock)526 static void out_linetoscr (DEPTH_T bpp, HMODE_T hmode, int aga, int spr, int genlock)
527 {
528 	if (aga)
529 		outln  ("#ifdef AGA");
530 
531 	out_linetoscr_decl (bpp, hmode, aga, spr, genlock);
532 	outln  (	"{");
533 
534 	outlnf (	"    %s *buf = (%s *) xlinebuffer;", get_depth_type_str (bpp), get_depth_type_str (bpp));
535 	if (genlock)
536 		outlnf("    uae_u8 *genlock_buf = xlinebuffer_genlock;");
537 	if (spr)
538 		outln ( "    uae_u8 sprcol;");
539 	if (aga && spr >= 0)
540 		outln (	"    uae_u8 xor_val = bplxor;");
541 	outln  (	"");
542 
543 	if (spr >= 0) {
544 		outln  (	"    if (bplham) {");
545 		out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_HAM, genlock);
546 		outln  (	"    } else if (bpldualpf) {");
547 		out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_DUALPF, genlock);
548 		outln  (	"    } else if (bplehb) {");
549 		out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_EXTRAHB, genlock);
550 		outln  (	"    } else {");
551 		out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
552 	} else {
553 		outln  (	"    if (1) {");
554 		out_linetoscr_mode(bpp, hmode, aga, spr, CMODE_NORMAL, genlock);
555 	}
556 
557 	outln  (	"    }\n");
558 	outln  (	"    return spix;");
559 	outln  (	"}");
560 
561 	if (aga)
562 		outln (	"#endif");
563 	outln  (	"");
564 }
565 
main(int argc,char * argv[])566 int main (int argc, char *argv[])
567 {
568 	DEPTH_T bpp;
569 	int aga, spr;
570 	HMODE_T hmode;
571 
572 	do_bigendian = 0;
573 
574 	for (int i = 1; i < argc; i++) {
575 		if (argv[i][0] != '-')
576 			continue;
577 		if (argv[i][1] == 'b' && argv[i][2] == '\0')
578 			do_bigendian = 1;
579 	}
580 
581 	set_outfile (stdout);
582 
583 	outln ("/*");
584 	outln (" * UAE - The portable Amiga emulator.");
585 	outln (" *");
586 	outln (" * This file was generated by genlinetoscr. Don't edit.");
587 	outln (" */");
588 	outln ("");
589 
590 	for (bpp = DEPTH_16BPP; bpp <= DEPTH_MAX; bpp++) {
591 		for (aga = 0; aga <= 1 ; aga++) {
592 			if (aga && bpp == DEPTH_8BPP)
593 				continue;
594 			for (spr = -1; spr <= 1; spr++) {
595 				if (!aga && spr < 0)
596 					continue;
597 				for (hmode = HMODE_NORMAL; hmode <= HMODE_MAX; hmode++) {
598 					out_linetoscr(bpp, hmode, aga, spr, 0);
599 					if (spr >= 0)
600 						out_linetoscr(bpp, hmode, aga, spr, 1);
601 				}
602 			}
603 		}
604 	}
605 	return 0;
606 }
607