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