ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/gencpu.c
Revision: 1.1.1.1 (vendor branch)
Committed: 1999-10-03T14:16:26Z (24 years, 8 months ago) by cebix
Content type: text/plain
Branch: cebix
CVS Tags: release-0_7-2, start
Changes since 1.1: +0 -0 lines
Log Message:
Imported sources

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * UAE - The Un*x Amiga Emulator
3     *
4     * MC68000 emulation generator
5     *
6     * This is a fairly stupid program that generates a lot of case labels that
7     * can be #included in a switch statement.
8     * As an alternative, it can generate functions that handle specific
9     * MC68000 instructions, plus a prototype header file and a function pointer
10     * array to look up the function for an opcode.
11     * Error checking is bad, an illegal table68k file will cause the program to
12     * call abort().
13     * The generated code is sometimes sub-optimal, an optimizing compiler should
14     * take care of this.
15     *
16     * Copyright 1995, 1996 Bernd Schmidt
17     */
18    
19     #include <ctype.h>
20     #include <stdio.h>
21     #include <stdlib.h>
22     #include <string.h>
23    
24     #include "sysdeps.h"
25     #include "readcpu.h"
26    
27     #define BOOL_TYPE "int"
28    
29     static FILE *headerfile;
30     static FILE *stblfile;
31    
32     static int using_prefetch;
33     static int using_exception_3;
34     static int cpu_level;
35    
36     /* For the current opcode, the next lower level that will have different code.
37     * Initialized to -1 for each opcode. If it remains unchanged, indicates we
38     * are done with that opcode. */
39     static int next_cpu_level;
40    
41     static int *opcode_map;
42     static int *opcode_next_clev;
43     static int *opcode_last_postfix;
44     static unsigned long *counts;
45    
46     static void read_counts (void)
47     {
48     FILE *file;
49     unsigned long opcode, count, total;
50     char name[20];
51     int nr = 0;
52     memset (counts, 0, 65536 * sizeof *counts);
53    
54     file = fopen ("frequent.68k", "r");
55     if (file) {
56     fscanf (file, "Total: %lu\n", &total);
57     while (fscanf (file, "%lx: %lu %s\n", &opcode, &count, name) == 3) {
58     opcode_next_clev[nr] = 3;
59     opcode_last_postfix[nr] = -1;
60     opcode_map[nr++] = opcode;
61     counts[opcode] = count;
62     }
63     fclose (file);
64     }
65     if (nr == nr_cpuop_funcs)
66     return;
67     for (opcode = 0; opcode < 0x10000; opcode++) {
68     if (table68k[opcode].handler == -1 && table68k[opcode].mnemo != i_ILLG
69     && counts[opcode] == 0)
70     {
71     opcode_next_clev[nr] = 3;
72     opcode_last_postfix[nr] = -1;
73     opcode_map[nr++] = opcode;
74     counts[opcode] = count;
75     }
76     }
77     if (nr != nr_cpuop_funcs)
78     abort ();
79     }
80    
81     static char endlabelstr[80];
82     static int endlabelno = 0;
83     static int need_endlabel;
84    
85     static int n_braces = 0;
86     static int m68k_pc_offset = 0;
87     static int insn_n_cycles;
88    
89     static void start_brace (void)
90     {
91     n_braces++;
92     printf ("{");
93     }
94    
95     static void close_brace (void)
96     {
97     assert (n_braces > 0);
98     n_braces--;
99     printf ("}");
100     }
101    
102     static void finish_braces (void)
103     {
104     while (n_braces > 0)
105     close_brace ();
106     }
107    
108     static void pop_braces (int to)
109     {
110     while (n_braces > to)
111     close_brace ();
112     }
113    
114     static int bit_size (int size)
115     {
116     switch (size) {
117     case sz_byte: return 8;
118     case sz_word: return 16;
119     case sz_long: return 32;
120     default: abort ();
121     }
122     return 0;
123     }
124    
125     static const char *bit_mask (int size)
126     {
127     switch (size) {
128     case sz_byte: return "0xff";
129     case sz_word: return "0xffff";
130     case sz_long: return "0xffffffff";
131     default: abort ();
132     }
133     return 0;
134     }
135    
136     static const char *gen_nextilong (void)
137     {
138     static char buffer[80];
139     int r = m68k_pc_offset;
140     m68k_pc_offset += 4;
141    
142     insn_n_cycles += 4;
143    
144     if (using_prefetch)
145     sprintf (buffer, "get_ilong_prefetch(%d)", r);
146     else
147     sprintf (buffer, "get_ilong(%d)", r);
148     return buffer;
149     }
150    
151     static const char *gen_nextiword (void)
152     {
153     static char buffer[80];
154     int r = m68k_pc_offset;
155     m68k_pc_offset += 2;
156    
157     insn_n_cycles += 2;
158    
159     if (using_prefetch)
160     sprintf (buffer, "get_iword_prefetch(%d)", r);
161     else
162     sprintf (buffer, "get_iword(%d)", r);
163     return buffer;
164     }
165    
166     static const char *gen_nextibyte (void)
167     {
168     static char buffer[80];
169     int r = m68k_pc_offset;
170     m68k_pc_offset += 2;
171    
172     insn_n_cycles += 2;
173    
174     if (using_prefetch)
175     sprintf (buffer, "get_ibyte_prefetch(%d)", r);
176     else
177     sprintf (buffer, "get_ibyte(%d)", r);
178     return buffer;
179     }
180    
181     static void fill_prefetch_0 (void)
182     {
183     if (using_prefetch)
184     printf ("fill_prefetch_0 ();\n");
185     }
186    
187     static void fill_prefetch_2 (void)
188     {
189     if (using_prefetch)
190     printf ("fill_prefetch_2 ();\n");
191     }
192    
193     static void swap_opcode (void)
194     {
195     printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
196     printf ("\topcode = ((opcode << 8) & 0xFF00) | ((opcode >> 8) & 0xFF);\n");
197     printf ("#endif\n");
198     }
199    
200     static void sync_m68k_pc (void)
201     {
202     if (m68k_pc_offset == 0)
203     return;
204     printf ("m68k_incpc(%d);\n", m68k_pc_offset);
205     switch (m68k_pc_offset) {
206     case 0:
207     /*fprintf (stderr, "refilling prefetch at 0\n"); */
208     break;
209     case 2:
210     fill_prefetch_2 ();
211     break;
212     default:
213     fill_prefetch_0 ();
214     break;
215     }
216     m68k_pc_offset = 0;
217     }
218    
219     /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
220     * the calling routine handles Apdi and Aipi modes. */
221     static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem)
222     {
223     start_brace ();
224     switch (mode) {
225     case Dreg:
226     if (movem)
227     abort ();
228     if (getv == 1)
229     switch (size) {
230     case sz_byte:
231     #ifdef AMIGA
232     /* sam: I don't know why gcc.2.7.2.1 produces a code worse */
233     /* if it is not done like that: */
234     printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg);
235     #else
236     printf ("\tuae_s8 %s = m68k_dreg(regs, %s);\n", name, reg);
237     #endif
238     break;
239     case sz_word:
240     #ifdef AMIGA
241     printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg);
242     #else
243     printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg);
244     #endif
245     break;
246     case sz_long:
247     printf ("\tuae_s32 %s = m68k_dreg(regs, %s);\n", name, reg);
248     break;
249     default:
250     abort ();
251     }
252     return;
253     case Areg:
254     if (movem)
255     abort ();
256     if (getv == 1)
257     switch (size) {
258     case sz_word:
259     printf ("\tuae_s16 %s = m68k_areg(regs, %s);\n", name, reg);
260     break;
261     case sz_long:
262     printf ("\tuae_s32 %s = m68k_areg(regs, %s);\n", name, reg);
263     break;
264     default:
265     abort ();
266     }
267     return;
268     case Aind:
269     printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
270     break;
271     case Aipi:
272     printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
273     break;
274     case Apdi:
275     switch (size) {
276     case sz_byte:
277     if (movem)
278     printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
279     else
280     printf ("\tuaecptr %sa = m68k_areg(regs, %s) - areg_byteinc[%s];\n", name, reg, reg);
281     break;
282     case sz_word:
283     printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 2);
284     break;
285     case sz_long:
286     printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 4);
287     break;
288     default:
289     abort ();
290     }
291     break;
292     case Ad16:
293     printf ("\tuaecptr %sa = m68k_areg(regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword ());
294     break;
295     case Ad8r:
296     if (cpu_level > 1) {
297     if (next_cpu_level < 1)
298     next_cpu_level = 1;
299     sync_m68k_pc ();
300     start_brace ();
301     printf ("\tuaecptr %sa = get_disp_ea_020(m68k_areg(regs, %s), next_iword());\n", name, reg);
302     } else
303     printf ("\tuaecptr %sa = get_disp_ea_000(m68k_areg(regs, %s), %s);\n", name, reg, gen_nextiword ());
304    
305     break;
306     case PC16:
307     printf ("\tuaecptr %sa = m68k_getpc () + %d;\n", name, m68k_pc_offset);
308     printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
309     break;
310     case PC8r:
311     if (cpu_level > 1) {
312     if (next_cpu_level < 1)
313     next_cpu_level = 1;
314     sync_m68k_pc ();
315     start_brace ();
316     printf ("\tuaecptr tmppc = m68k_getpc();\n");
317     printf ("\tuaecptr %sa = get_disp_ea_020(tmppc, next_iword());\n", name);
318     } else {
319     printf ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset);
320     printf ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword ());
321     }
322    
323     break;
324     case absw:
325     printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword ());
326     break;
327     case absl:
328     printf ("\tuaecptr %sa = %s;\n", name, gen_nextilong ());
329     break;
330     case imm:
331     if (getv != 1)
332     abort ();
333     switch (size) {
334     case sz_byte:
335     printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
336     break;
337     case sz_word:
338     printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
339     break;
340     case sz_long:
341     printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
342     break;
343     default:
344     abort ();
345     }
346     return;
347     case imm0:
348     if (getv != 1)
349     abort ();
350     printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte ());
351     return;
352     case imm1:
353     if (getv != 1)
354     abort ();
355     printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword ());
356     return;
357     case imm2:
358     if (getv != 1)
359     abort ();
360     printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong ());
361     return;
362     case immi:
363     if (getv != 1)
364     abort ();
365     printf ("\tuae_u32 %s = %s;\n", name, reg);
366     return;
367     default:
368     abort ();
369     }
370    
371     /* We get here for all non-reg non-immediate addressing modes to
372     * actually fetch the value. */
373    
374     if (using_exception_3 && getv != 0 && size != sz_byte) {
375     printf ("\tif ((%sa & 1) != 0) {\n", name);
376     printf ("\t\tlast_fault_for_exception_3 = %sa;\n", name);
377     printf ("\t\tlast_op_for_exception_3 = opcode;\n");
378     printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + %d;\n", m68k_pc_offset);
379     printf ("\t\tException(3, 0);\n");
380     printf ("\t\tgoto %s;\n", endlabelstr);
381     printf ("\t}\n");
382     need_endlabel = 1;
383     start_brace ();
384     }
385    
386     if (getv == 1) {
387     switch (size) {
388     case sz_byte: insn_n_cycles += 2; break;
389     case sz_word: insn_n_cycles += 2; break;
390     case sz_long: insn_n_cycles += 4; break;
391     default: abort ();
392     }
393     start_brace ();
394     switch (size) {
395     case sz_byte: printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name); break;
396     case sz_word: printf ("\tuae_s16 %s = get_word(%sa);\n", name, name); break;
397     case sz_long: printf ("\tuae_s32 %s = get_long(%sa);\n", name, name); break;
398     default: abort ();
399     }
400     }
401    
402     /* We now might have to fix up the register for pre-dec or post-inc
403     * addressing modes. */
404     if (!movem)
405     switch (mode) {
406     case Aipi:
407     switch (size) {
408     case sz_byte:
409     printf ("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg);
410     break;
411     case sz_word:
412     printf ("\tm68k_areg(regs, %s) += 2;\n", reg);
413     break;
414     case sz_long:
415     printf ("\tm68k_areg(regs, %s) += 4;\n", reg);
416     break;
417     default:
418     abort ();
419     }
420     break;
421     case Apdi:
422     printf ("\tm68k_areg (regs, %s) = %sa;\n", reg, name);
423     break;
424     default:
425     break;
426     }
427     }
428    
429     static void genastore (char *from, amodes mode, char *reg, wordsizes size, char *to)
430     {
431     switch (mode) {
432     case Dreg:
433     switch (size) {
434     case sz_byte:
435     printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xff) | ((%s) & 0xff);\n", reg, reg, from);
436     break;
437     case sz_word:
438     printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from);
439     break;
440     case sz_long:
441     printf ("\tm68k_dreg(regs, %s) = (%s);\n", reg, from);
442     break;
443     default:
444     abort ();
445     }
446     break;
447     case Areg:
448     switch (size) {
449     case sz_word:
450     fprintf (stderr, "Foo\n");
451     printf ("\tm68k_areg(regs, %s) = (uae_s32)(uae_s16)(%s);\n", reg, from);
452     break;
453     case sz_long:
454     printf ("\tm68k_areg(regs, %s) = (%s);\n", reg, from);
455     break;
456     default:
457     abort ();
458     }
459     break;
460     case Aind:
461     case Aipi:
462     case Apdi:
463     case Ad16:
464     case Ad8r:
465     case absw:
466     case absl:
467     case PC16:
468     case PC8r:
469     if (using_prefetch)
470     sync_m68k_pc ();
471     switch (size) {
472     case sz_byte:
473     insn_n_cycles += 2;
474     printf ("\tput_byte(%sa,%s);\n", to, from);
475     break;
476     case sz_word:
477     insn_n_cycles += 2;
478     if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
479     abort ();
480     printf ("\tput_word(%sa,%s);\n", to, from);
481     break;
482     case sz_long:
483     insn_n_cycles += 4;
484     if (cpu_level < 2 && (mode == PC16 || mode == PC8r))
485     abort ();
486     printf ("\tput_long(%sa,%s);\n", to, from);
487     break;
488     default:
489     abort ();
490     }
491     break;
492     case imm:
493     case imm0:
494     case imm1:
495     case imm2:
496     case immi:
497     abort ();
498     break;
499     default:
500     abort ();
501     }
502     }
503    
504     static void genmovemel (uae_u16 opcode)
505     {
506     char getcode[100];
507     int size = table68k[opcode].size == sz_long ? 4 : 2;
508    
509     if (table68k[opcode].size == sz_long) {
510     strcpy (getcode, "get_long(srca)");
511     } else {
512     strcpy (getcode, "(uae_s32)(uae_s16)get_word(srca)");
513     }
514    
515     printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
516     printf ("\tunsigned int dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
517     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
518     start_brace ();
519     printf ("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n",
520     getcode, size);
521     printf ("\twhile (amask) { m68k_areg(regs, movem_index1[amask]) = %s; srca += %d; amask = movem_next[amask]; }\n",
522     getcode, size);
523    
524     if (table68k[opcode].dmode == Aipi)
525     printf ("\tm68k_areg(regs, dstreg) = srca;\n");
526     }
527    
528     static void genmovemle (uae_u16 opcode)
529     {
530     char putcode[100];
531     int size = table68k[opcode].size == sz_long ? 4 : 2;
532     if (table68k[opcode].size == sz_long) {
533     strcpy (putcode, "put_long(srca,");
534     } else {
535     strcpy (putcode, "put_word(srca,");
536     }
537    
538     printf ("\tuae_u16 mask = %s;\n", gen_nextiword ());
539     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
540     if (using_prefetch)
541     sync_m68k_pc ();
542    
543     start_brace ();
544     if (table68k[opcode].dmode == Apdi) {
545     printf ("\tuae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n");
546     printf ("\twhile (amask) { srca -= %d; %s m68k_areg(regs, movem_index2[amask])); amask = movem_next[amask]; }\n",
547     size, putcode);
548     printf ("\twhile (dmask) { srca -= %d; %s m68k_dreg(regs, movem_index2[dmask])); dmask = movem_next[dmask]; }\n",
549     size, putcode);
550     printf ("\tm68k_areg(regs, dstreg) = srca;\n");
551     } else {
552     printf ("\tuae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
553     printf ("\twhile (dmask) { %s m68k_dreg(regs, movem_index1[dmask])); srca += %d; dmask = movem_next[dmask]; }\n",
554     putcode, size);
555     printf ("\twhile (amask) { %s m68k_areg(regs, movem_index1[amask])); srca += %d; amask = movem_next[amask]; }\n",
556     putcode, size);
557     }
558     }
559    
560     static void duplicate_carry (void)
561     {
562     printf ("\tCOPY_CARRY;\n");
563     }
564    
565     typedef enum {
566     flag_logical_noclobber, flag_logical, flag_add, flag_sub, flag_cmp, flag_addx, flag_subx, flag_zn,
567     flag_av, flag_sv
568     } flagtypes;
569    
570     static void genflags_normal (flagtypes type, wordsizes size, char *value, char *src, char *dst)
571     {
572     char vstr[100], sstr[100], dstr[100];
573     char usstr[100], udstr[100];
574     char unsstr[100], undstr[100];
575    
576     switch (size) {
577     case sz_byte:
578     strcpy (vstr, "((uae_s8)(");
579     strcpy (usstr, "((uae_u8)(");
580     break;
581     case sz_word:
582     strcpy (vstr, "((uae_s16)(");
583     strcpy (usstr, "((uae_u16)(");
584     break;
585     case sz_long:
586     strcpy (vstr, "((uae_s32)(");
587     strcpy (usstr, "((uae_u32)(");
588     break;
589     default:
590     abort ();
591     }
592     strcpy (unsstr, usstr);
593    
594     strcpy (sstr, vstr);
595     strcpy (dstr, vstr);
596     strcat (vstr, value);
597     strcat (vstr, "))");
598     strcat (dstr, dst);
599     strcat (dstr, "))");
600     strcat (sstr, src);
601     strcat (sstr, "))");
602    
603     strcpy (udstr, usstr);
604     strcat (udstr, dst);
605     strcat (udstr, "))");
606     strcat (usstr, src);
607     strcat (usstr, "))");
608    
609     strcpy (undstr, unsstr);
610     strcat (unsstr, "-");
611     strcat (undstr, "~");
612     strcat (undstr, dst);
613     strcat (undstr, "))");
614     strcat (unsstr, src);
615     strcat (unsstr, "))");
616    
617     switch (type) {
618     case flag_logical_noclobber:
619     case flag_logical:
620     case flag_zn:
621     case flag_av:
622     case flag_sv:
623     case flag_addx:
624     case flag_subx:
625     break;
626    
627     case flag_add:
628     start_brace ();
629     printf ("uae_u32 %s = %s + %s;\n", value, dstr, sstr);
630     break;
631     case flag_sub:
632     case flag_cmp:
633     start_brace ();
634     printf ("uae_u32 %s = %s - %s;\n", value, dstr, sstr);
635     break;
636     }
637    
638     switch (type) {
639     case flag_logical_noclobber:
640     case flag_logical:
641     case flag_zn:
642     break;
643    
644     case flag_add:
645     case flag_sub:
646     case flag_addx:
647     case flag_subx:
648     case flag_cmp:
649     case flag_av:
650     case flag_sv:
651     start_brace ();
652     printf ("\t" BOOL_TYPE " flgs = %s < 0;\n", sstr);
653     printf ("\t" BOOL_TYPE " flgo = %s < 0;\n", dstr);
654     printf ("\t" BOOL_TYPE " flgn = %s < 0;\n", vstr);
655     break;
656     }
657    
658     switch (type) {
659     case flag_logical:
660     printf ("\tCLEAR_CZNV;\n");
661     printf ("\tSET_ZFLG (%s == 0);\n", vstr);
662     printf ("\tSET_NFLG (%s < 0);\n", vstr);
663     break;
664     case flag_logical_noclobber:
665     printf ("\tSET_ZFLG (%s == 0);\n", vstr);
666     printf ("\tSET_NFLG (%s < 0);\n", vstr);
667     break;
668     case flag_av:
669     printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n");
670     break;
671     case flag_sv:
672     printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n");
673     break;
674     case flag_zn:
675     printf ("\tSET_ZFLG (GET_ZFLG & (%s == 0));\n", vstr);
676     printf ("\tSET_NFLG (%s < 0);\n", vstr);
677     break;
678     case flag_add:
679     printf ("\tSET_ZFLG (%s == 0);\n", vstr);
680     printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n");
681     printf ("\tSET_CFLG (%s < %s);\n", undstr, usstr);
682     duplicate_carry ();
683     printf ("\tSET_NFLG (flgn != 0);\n");
684     break;
685     case flag_sub:
686     printf ("\tSET_ZFLG (%s == 0);\n", vstr);
687     printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n");
688     printf ("\tSET_CFLG (%s > %s);\n", usstr, udstr);
689     duplicate_carry ();
690     printf ("\tSET_NFLG (flgn != 0);\n");
691     break;
692     case flag_addx:
693     printf ("\tSET_VFLG ((flgs ^ flgn) & (flgo ^ flgn));\n"); /* minterm SON: 0x42 */
694     printf ("\tSET_CFLG (flgs ^ ((flgs ^ flgo) & (flgo ^ flgn)));\n"); /* minterm SON: 0xD4 */
695     duplicate_carry ();
696     break;
697     case flag_subx:
698     printf ("\tSET_VFLG ((flgs ^ flgo) & (flgo ^ flgn));\n"); /* minterm SON: 0x24 */
699     printf ("\tSET_CFLG (flgs ^ ((flgs ^ flgn) & (flgo ^ flgn)));\n"); /* minterm SON: 0xB2 */
700     duplicate_carry ();
701     break;
702     case flag_cmp:
703     printf ("\tSET_ZFLG (%s == 0);\n", vstr);
704     printf ("\tSET_VFLG ((flgs != flgo) && (flgn != flgo));\n");
705     printf ("\tSET_CFLG (%s > %s);\n", usstr, udstr);
706     printf ("\tSET_NFLG (flgn != 0);\n");
707     break;
708     }
709     }
710    
711     static void genflags (flagtypes type, wordsizes size, char *value, char *src, char *dst)
712     {
713     #ifdef X86_ASSEMBLY
714     switch (type) {
715     case flag_add:
716     case flag_sub:
717     start_brace ();
718     printf ("\tuae_u32 %s;\n", value);
719     break;
720    
721     default:
722     break;
723     }
724    
725     /* At least some of those casts are fairly important! */
726     switch (type) {
727     case flag_logical_noclobber:
728     printf ("\t{uae_u32 oldcznv = regflags.cznv & ~0xC0;\n");
729     if (strcmp (value, "0") == 0) {
730     printf ("\tregflags.cznv = olcznv | 64;\n");
731     } else {
732     switch (size) {
733     case sz_byte: printf ("\tx86_flag_testb ((uae_s8)(%s));\n", value); break;
734     case sz_word: printf ("\tx86_flag_testw ((uae_s16)(%s));\n", value); break;
735     case sz_long: printf ("\tx86_flag_testl ((uae_s32)(%s));\n", value); break;
736     }
737     printf ("\tregflags.cznv |= oldcznv;\n");
738     }
739     printf ("\t}\n");
740     return;
741     case flag_logical:
742     if (strcmp (value, "0") == 0) {
743     printf ("\tregflags.cznv = 64;\n");
744     } else {
745     switch (size) {
746     case sz_byte: printf ("\tx86_flag_testb ((uae_s8)(%s));\n", value); break;
747     case sz_word: printf ("\tx86_flag_testw ((uae_s16)(%s));\n", value); break;
748     case sz_long: printf ("\tx86_flag_testl ((uae_s32)(%s));\n", value); break;
749     }
750     }
751     return;
752    
753     case flag_add:
754     switch (size) {
755     case sz_byte: printf ("\tx86_flag_addb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
756     case sz_word: printf ("\tx86_flag_addw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
757     case sz_long: printf ("\tx86_flag_addl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
758     }
759     return;
760    
761     case flag_sub:
762     switch (size) {
763     case sz_byte: printf ("\tx86_flag_subb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
764     case sz_word: printf ("\tx86_flag_subw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
765     case sz_long: printf ("\tx86_flag_subl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
766     }
767     return;
768    
769     case flag_cmp:
770     switch (size) {
771     case sz_byte: printf ("\tx86_flag_cmpb ((uae_s8)(%s), (uae_s8)(%s));\n", src, dst); break;
772     case sz_word: printf ("\tx86_flag_cmpw ((uae_s16)(%s), (uae_s16)(%s));\n", src, dst); break;
773     case sz_long: printf ("\tx86_flag_cmpl ((uae_s32)(%s), (uae_s32)(%s));\n", src, dst); break;
774     }
775     return;
776    
777     default:
778     break;
779     }
780     #elif defined(M68K_FLAG_OPT)
781     /* sam: here I'm cloning what X86_ASSEMBLY does */
782     #define EXT(size) (size==sz_byte?"b":(size==sz_word?"w":"l"))
783     #define CAST(size) (size==sz_byte?"uae_s8":(size==sz_word?"uae_s16":"uae_s32"))
784     switch (type) {
785     case flag_add:
786     case flag_sub:
787     start_brace ();
788     printf ("\tuae_u32 %s;\n", value);
789     break;
790    
791     default:
792     break;
793     }
794    
795     switch (type) {
796     case flag_logical:
797     if (strcmp (value, "0") == 0) {
798     printf ("\t*(uae_u16 *)&regflags = 4;\n"); /* Z = 1 */
799     } else {
800     printf ("\tm68k_flag_tst (%s, (%s)(%s));\n",
801     EXT (size), CAST (size), value);
802     }
803     return;
804    
805     case flag_add:
806     printf ("\t{uae_u16 ccr;\n");
807     printf ("\tm68k_flag_add (%s, (%s)%s, (%s)(%s), (%s)(%s));\n",
808     EXT (size), CAST (size), value, CAST (size), src, CAST (size), dst);
809     printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
810     return;
811    
812     case flag_sub:
813     printf ("\t{uae_u16 ccr;\n");
814     printf ("\tm68k_flag_sub (%s, (%s)%s, (%s)(%s), (%s)(%s));\n",
815     EXT (size), CAST (size), value, CAST (size), src, CAST (size), dst);
816     printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
817     return;
818    
819     case flag_cmp:
820     printf ("\tm68k_flag_cmp (%s, (%s)(%s), (%s)(%s));\n",
821     EXT (size), CAST (size), src, CAST (size), dst);
822     return;
823    
824     default:
825     break;
826     }
827     #elif defined(ACORN_FLAG_OPT) && defined(__GNUC_MINOR__)
828     /*
829     * This is new. Might be quite buggy.
830     */
831     switch (type) {
832     case flag_av:
833     case flag_sv:
834     case flag_zn:
835     case flag_addx:
836     case flag_subx:
837     break;
838    
839     case flag_logical:
840     if (strcmp (value, "0") == 0) {
841     /* v=c=n=0 z=1 */
842     printf ("\t*(ULONG*)&regflags = 0x40000000;\n");
843     return;
844     } else {
845     start_brace ();
846     switch (size) {
847     case sz_byte:
848     printf ("\tUBYTE ccr;\n");
849     printf ("\tULONG shift;\n");
850     printf ("\t__asm__(\"mov %%2,%%1,lsl#24\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
851     "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value);
852     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
853     return;
854     case sz_word:
855     printf ("\tUBYTE ccr;\n");
856     printf ("\tULONG shift;\n");
857     printf ("\t__asm__(\"mov %%2,%%1,lsl#16\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
858     "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value);
859     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
860     return;
861     case sz_long:
862     printf ("\tUBYTE ccr;\n");
863     printf ("\t__asm__(\"tst %%1,%%1\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
864     "\t: \"=r\" (ccr) : \"r\" ((LONG)%s) : \"cc\" );\n", value);
865     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
866     return;
867     }
868     }
869     break;
870     case flag_add:
871     if (strcmp (dst, "0") == 0) {
872     printf ("/* Error! Hier muss Peter noch was machen !!! (ADD-Flags) */");
873     } else {
874     start_brace ();
875     switch (size) {
876     case sz_byte:
877     printf ("\tULONG ccr, shift, %s;\n", value);
878     printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tadds %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
879     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
880     printf ("\t*(ULONG*)&regflags = ccr;\n");
881     return;
882     case sz_word:
883     printf ("\tULONG ccr, shift, %s;\n", value);
884     printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tadds %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
885     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
886     printf ("\t*(ULONG*)&regflags = ccr;\n");
887     return;
888     case sz_long:
889     printf ("\tULONG ccr, %s;\n", value);
890     printf ("\t__asm__(\"adds %%0,%%3,%%2\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
891     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
892     printf ("\t*(ULONG*)&regflags = ccr;\n");
893     return;
894     }
895     }
896     break;
897     case flag_sub:
898     if (strcmp (dst, "0") == 0) {
899     printf ("/* Error! Hier muss Peter noch was machen !!! (SUB-Flags) */");
900     } else {
901     start_brace ();
902     switch (size) {
903     case sz_byte:
904     printf ("\tULONG ccr, shift, %s;\n", value);
905     printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tsubs %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
906     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
907     printf ("\t*(ULONG*)&regflags = ccr;\n");
908     return;
909     case sz_word:
910     printf ("\tULONG ccr, shift, %s;\n", value);
911     printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tsubs %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
912     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
913     printf ("\t*(ULONG*)&regflags = ccr;\n");
914     return;
915     case sz_long:
916     printf ("\tULONG ccr, %s;\n", value);
917     printf ("\t__asm__(\"subs %%0,%%3,%%2\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
918     "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
919     printf ("\t*(ULONG*)&regflags = ccr;\n");
920     return;
921     }
922     }
923     break;
924     case flag_cmp:
925     if (strcmp (dst, "0") == 0) {
926     printf ("/*Error! Hier muss Peter noch was machen !!! (CMP-Flags)*/");
927     } else {
928     start_brace ();
929     switch (size) {
930     case sz_byte:
931     printf ("\tULONG shift, ccr;\n");
932     printf ("\t__asm__(\"mov %%3,%%2,lsl#24\n\tcmp %%3,%%1,lsl#24\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
933     "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", src, dst);
934     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
935     return;
936     case sz_word:
937     printf ("\tULONG shift, ccr;\n");
938     printf ("\t__asm__(\"mov %%3,%%2,lsl#16\n\tcmp %%3,%%1,lsl#16\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
939     "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", src, dst);
940     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
941     return;
942     case sz_long:
943     printf ("\tULONG ccr;\n");
944     printf ("\t__asm__(\"cmp %%2,%%1\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
945     "\t: \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", src, dst);
946     printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
947     /*printf ("\tprintf (\"%%08x %%08x %%08x\\n\", %s, %s, *((ULONG*)&regflags));\n", src, dst); */
948     return;
949     }
950     }
951     break;
952     }
953     #endif
954     genflags_normal (type, size, value, src, dst);
955     }
956    
957     static void force_range_for_rox (const char *var, wordsizes size)
958     {
959     /* Could do a modulo operation here... which one is faster? */
960     switch (size) {
961     case sz_long:
962     printf ("\tif (%s >= 33) %s -= 33;\n", var, var);
963     break;
964     case sz_word:
965     printf ("\tif (%s >= 34) %s -= 34;\n", var, var);
966     printf ("\tif (%s >= 17) %s -= 17;\n", var, var);
967     break;
968     case sz_byte:
969     printf ("\tif (%s >= 36) %s -= 36;\n", var, var);
970     printf ("\tif (%s >= 18) %s -= 18;\n", var, var);
971     printf ("\tif (%s >= 9) %s -= 9;\n", var, var);
972     break;
973     }
974     }
975    
976     static const char *cmask (wordsizes size)
977     {
978     switch (size) {
979     case sz_byte: return "0x80";
980     case sz_word: return "0x8000";
981     case sz_long: return "0x80000000";
982     default: abort ();
983     }
984     }
985    
986     static int source_is_imm1_8 (struct instr *i)
987     {
988     return i->stype == 3;
989     }
990    
991     static void gen_opcode (unsigned long int opcode)
992     {
993     struct instr *curi = table68k + opcode;
994     insn_n_cycles = 2;
995    
996     start_brace ();
997     #if 0
998     printf ("uae_u8 *m68k_pc = regs.pc_p;\n");
999     #endif
1000     m68k_pc_offset = 2;
1001     switch (curi->plev) {
1002     case 0: /* not privileged */
1003     break;
1004     case 1: /* unprivileged only on 68000 */
1005     if (cpu_level == 0)
1006     break;
1007     if (next_cpu_level < 0)
1008     next_cpu_level = 0;
1009    
1010     /* fall through */
1011     case 2: /* priviledged */
1012     printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1013     need_endlabel = 1;
1014     start_brace ();
1015     break;
1016     case 3: /* privileged if size == word */
1017     if (curi->size == sz_byte)
1018     break;
1019     printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1020     need_endlabel = 1;
1021     start_brace ();
1022     break;
1023     }
1024     switch (curi->mnemo) {
1025     case i_OR:
1026     case i_AND:
1027     case i_EOR:
1028     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1029     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1030     printf ("\tsrc %c= dst;\n", curi->mnemo == i_OR ? '|' : curi->mnemo == i_AND ? '&' : '^');
1031     genflags (flag_logical, curi->size, "src", "", "");
1032     genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1033     break;
1034     case i_ORSR:
1035     case i_EORSR:
1036     printf ("\tMakeSR();\n");
1037     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1038     if (curi->size == sz_byte) {
1039     printf ("\tsrc &= 0xFF;\n");
1040     }
1041     printf ("\tregs.sr %c= src;\n", curi->mnemo == i_EORSR ? '^' : '|');
1042     printf ("\tMakeFromSR();\n");
1043     break;
1044     case i_ANDSR:
1045     printf ("\tMakeSR();\n");
1046     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1047     if (curi->size == sz_byte) {
1048     printf ("\tsrc |= 0xFF00;\n");
1049     }
1050     printf ("\tregs.sr &= src;\n");
1051     printf ("\tMakeFromSR();\n");
1052     break;
1053     case i_SUB:
1054     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1055     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1056     start_brace ();
1057     genflags (flag_sub, curi->size, "newv", "src", "dst");
1058     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1059     break;
1060     case i_SUBA:
1061     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1062     genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1063     start_brace ();
1064     printf ("\tuae_u32 newv = dst - src;\n");
1065     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1066     break;
1067     case i_SUBX:
1068     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1069     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1070     start_brace ();
1071     printf ("\tuae_u32 newv = dst - src - (GET_XFLG ? 1 : 0);\n");
1072     genflags (flag_subx, curi->size, "newv", "src", "dst");
1073     genflags (flag_zn, curi->size, "newv", "", "");
1074     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1075     break;
1076     case i_SBCD:
1077     /* Let's hope this works... */
1078     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1079     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1080     start_brace ();
1081     printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
1082     printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n");
1083     printf ("\tuae_u16 newv;\n");
1084     printf ("\tint cflg;\n");
1085     printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
1086     printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
1087     printf ("\tSET_CFLG (cflg = (newv_hi & 0x1F0) > 0x90);\n");
1088     duplicate_carry ();
1089     printf ("\tif (cflg) newv -= 0x60;\n");
1090     genflags (flag_zn, curi->size, "newv", "", "");
1091     genflags (flag_sv, curi->size, "newv", "src", "dst");
1092     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1093     break;
1094     case i_ADD:
1095     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1096     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1097     start_brace ();
1098     genflags (flag_add, curi->size, "newv", "src", "dst");
1099     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1100     break;
1101     case i_ADDA:
1102     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1103     genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1104     start_brace ();
1105     printf ("\tuae_u32 newv = dst + src;\n");
1106     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1107     break;
1108     case i_ADDX:
1109     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1110     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1111     start_brace ();
1112     printf ("\tuae_u32 newv = dst + src + (GET_XFLG ? 1 : 0);\n");
1113     genflags (flag_addx, curi->size, "newv", "src", "dst");
1114     genflags (flag_zn, curi->size, "newv", "", "");
1115     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1116     break;
1117     case i_ABCD:
1118     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1119     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1120     start_brace ();
1121     printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (GET_XFLG ? 1 : 0);\n");
1122     printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n");
1123     printf ("\tuae_u16 newv;\n");
1124     printf ("\tint cflg;\n");
1125     printf ("\tif (newv_lo > 9) { newv_lo +=6; }\n");
1126     printf ("\tnewv = newv_hi + newv_lo;");
1127     printf ("\tSET_CFLG (cflg = (newv & 0x1F0) > 0x90);\n");
1128     duplicate_carry ();
1129     printf ("\tif (cflg) newv += 0x60;\n");
1130     genflags (flag_zn, curi->size, "newv", "", "");
1131     genflags (flag_sv, curi->size, "newv", "src", "dst");
1132     genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
1133     break;
1134     case i_NEG:
1135     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1136     start_brace ();
1137     genflags (flag_sub, curi->size, "dst", "src", "0");
1138     genastore ("dst", curi->smode, "srcreg", curi->size, "src");
1139     break;
1140     case i_NEGX:
1141     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1142     start_brace ();
1143     printf ("\tuae_u32 newv = 0 - src - (GET_XFLG ? 1 : 0);\n");
1144     genflags (flag_subx, curi->size, "newv", "src", "0");
1145     genflags (flag_zn, curi->size, "newv", "", "");
1146     genastore ("newv", curi->smode, "srcreg", curi->size, "src");
1147     break;
1148     case i_NBCD:
1149     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1150     start_brace ();
1151     printf ("\tuae_u16 newv_lo = - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
1152     printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n");
1153     printf ("\tuae_u16 newv;\n");
1154     printf ("\tint cflg;\n");
1155     printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
1156     printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
1157     printf ("\tSET_CFLG (cflg = (newv_hi & 0x1F0) > 0x90);\n");
1158     duplicate_carry();
1159     printf ("\tif (cflg) newv -= 0x60;\n");
1160     genflags (flag_zn, curi->size, "newv", "", "");
1161     genastore ("newv", curi->smode, "srcreg", curi->size, "src");
1162     break;
1163     case i_CLR:
1164     genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1165     genflags (flag_logical, curi->size, "0", "", "");
1166     genastore ("0", curi->smode, "srcreg", curi->size, "src");
1167     break;
1168     case i_NOT:
1169     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1170     start_brace ();
1171     printf ("\tuae_u32 dst = ~src;\n");
1172     genflags (flag_logical, curi->size, "dst", "", "");
1173     genastore ("dst", curi->smode, "srcreg", curi->size, "src");
1174     break;
1175     case i_TST:
1176     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1177     genflags (flag_logical, curi->size, "src", "", "");
1178     break;
1179     case i_BTST:
1180     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1181     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1182     if (curi->size == sz_byte)
1183     printf ("\tsrc &= 7;\n");
1184     else
1185     printf ("\tsrc &= 31;\n");
1186     printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1187     break;
1188     case i_BCHG:
1189     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1190     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1191     if (curi->size == sz_byte)
1192     printf ("\tsrc &= 7;\n");
1193     else
1194     printf ("\tsrc &= 31;\n");
1195     printf ("\tdst ^= (1 << src);\n");
1196     printf ("\tSET_ZFLG ((dst & (1 << src)) >> src);\n");
1197     genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1198     break;
1199     case i_BCLR:
1200     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1201     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1202     if (curi->size == sz_byte)
1203     printf ("\tsrc &= 7;\n");
1204     else
1205     printf ("\tsrc &= 31;\n");
1206     printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1207     printf ("\tdst &= ~(1 << src);\n");
1208     genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1209     break;
1210     case i_BSET:
1211     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1212     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1213     if (curi->size == sz_byte)
1214     printf ("\tsrc &= 7;\n");
1215     else
1216     printf ("\tsrc &= 31;\n");
1217     printf ("\tSET_ZFLG (1 ^ ((dst >> src) & 1));\n");
1218     printf ("\tdst |= (1 << src);\n");
1219     genastore ("dst", curi->dmode, "dstreg", curi->size, "dst");
1220     break;
1221     case i_CMPM:
1222     case i_CMP:
1223     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1224     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1225     start_brace ();
1226     genflags (flag_cmp, curi->size, "newv", "src", "dst");
1227     break;
1228     case i_CMPA:
1229     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1230     genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1231     start_brace ();
1232     genflags (flag_cmp, sz_long, "newv", "src", "dst");
1233     break;
1234     /* The next two are coded a little unconventional, but they are doing
1235     * weird things... */
1236     case i_MVPRM:
1237     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1238    
1239     printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1240     if (curi->size == sz_word) {
1241     printf ("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n");
1242     } else {
1243     printf ("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n");
1244     printf ("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n");
1245     }
1246     break;
1247     case i_MVPMR:
1248     printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ());
1249     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1250     if (curi->size == sz_word) {
1251     printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n");
1252     } else {
1253     printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n");
1254     printf (" + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n");
1255     }
1256     genastore ("val", curi->dmode, "dstreg", curi->size, "dst");
1257     break;
1258     case i_MOVE:
1259     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1260     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1261     genflags (flag_logical, curi->size, "src", "", "");
1262     genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1263     break;
1264     case i_MOVEA:
1265     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1266     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1267     if (curi->size == sz_word) {
1268     printf ("\tuae_u32 val = (uae_s32)(uae_s16)src;\n");
1269     } else {
1270     printf ("\tuae_u32 val = src;\n");
1271     }
1272     genastore ("val", curi->dmode, "dstreg", sz_long, "dst");
1273     break;
1274     case i_MVSR2:
1275     genamode (curi->smode, "srcreg", sz_word, "src", 2, 0);
1276     printf ("\tMakeSR();\n");
1277     if (curi->size == sz_byte)
1278     genastore ("regs.sr & 0xff", curi->smode, "srcreg", sz_word, "src");
1279     else
1280     genastore ("regs.sr", curi->smode, "srcreg", sz_word, "src");
1281     break;
1282     case i_MV2SR:
1283     genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1284     if (curi->size == sz_byte)
1285     printf ("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n");
1286     else {
1287     printf ("\tregs.sr = src;\n");
1288     }
1289     printf ("\tMakeFromSR();\n");
1290     break;
1291     case i_SWAP:
1292     genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1293     start_brace ();
1294     printf ("\tuae_u32 dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n");
1295     genflags (flag_logical, sz_long, "dst", "", "");
1296     genastore ("dst", curi->smode, "srcreg", sz_long, "src");
1297     break;
1298     case i_EXG:
1299     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1300     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1301     genastore ("dst", curi->smode, "srcreg", curi->size, "src");
1302     genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
1303     break;
1304     case i_EXT:
1305     genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1306     start_brace ();
1307     switch (curi->size) {
1308     case sz_byte: printf ("\tuae_u32 dst = (uae_s32)(uae_s8)src;\n"); break;
1309     case sz_word: printf ("\tuae_u16 dst = (uae_s16)(uae_s8)src;\n"); break;
1310     case sz_long: printf ("\tuae_u32 dst = (uae_s32)(uae_s16)src;\n"); break;
1311     default: abort ();
1312     }
1313     genflags (flag_logical,
1314     curi->size == sz_word ? sz_word : sz_long, "dst", "", "");
1315     genastore ("dst", curi->smode, "srcreg",
1316     curi->size == sz_word ? sz_word : sz_long, "src");
1317     break;
1318     case i_MVMEL:
1319     genmovemel (opcode);
1320     break;
1321     case i_MVMLE:
1322     genmovemle (opcode);
1323     break;
1324     case i_TRAP:
1325     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1326     sync_m68k_pc ();
1327     printf ("\tException(src+32,0);\n");
1328     m68k_pc_offset = 0;
1329     break;
1330     case i_MVR2USP:
1331     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1332     printf ("\tregs.usp = src;\n");
1333     break;
1334     case i_MVUSP2R:
1335     genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1336     genastore ("regs.usp", curi->smode, "srcreg", curi->size, "src");
1337     break;
1338     case i_RESET:
1339     break;
1340     case i_NOP:
1341     break;
1342     case i_STOP:
1343     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1344     printf ("\tregs.sr = src;\n");
1345     printf ("\tMakeFromSR();\n");
1346     printf ("\tm68k_setstopped(1);\n");
1347     break;
1348     case i_RTE:
1349     if (cpu_level == 0) {
1350     genamode (Aipi, "7", sz_word, "sr", 1, 0);
1351     genamode (Aipi, "7", sz_long, "pc", 1, 0);
1352     printf ("\tregs.sr = sr; m68k_setpc_rte(pc);\n");
1353     fill_prefetch_0 ();
1354     printf ("\tMakeFromSR();\n");
1355     } else {
1356     int old_brace_level = n_braces;
1357     if (next_cpu_level < 0)
1358     next_cpu_level = 0;
1359     printf ("\tuae_u16 newsr; uae_u32 newpc; for (;;) {\n");
1360     genamode (Aipi, "7", sz_word, "sr", 1, 0);
1361     genamode (Aipi, "7", sz_long, "pc", 1, 0);
1362     genamode (Aipi, "7", sz_word, "format", 1, 0);
1363     printf ("\tnewsr = sr; newpc = pc;\n");
1364     printf ("\tif ((format & 0xF000) == 0x0000) { break; }\n");
1365     printf ("\telse if ((format & 0xF000) == 0x1000) { ; }\n");
1366     printf ("\telse if ((format & 0xF000) == 0x2000) { m68k_areg(regs, 7) += 4; break; }\n");
1367     printf ("\telse if ((format & 0xF000) == 0x8000) { m68k_areg(regs, 7) += 50; break; }\n");
1368     printf ("\telse if ((format & 0xF000) == 0x9000) { m68k_areg(regs, 7) += 12; break; }\n");
1369     printf ("\telse if ((format & 0xF000) == 0xa000) { m68k_areg(regs, 7) += 24; break; }\n");
1370     printf ("\telse if ((format & 0xF000) == 0xb000) { m68k_areg(regs, 7) += 84; break; }\n");
1371     printf ("\telse { Exception(14,0); goto %s; }\n", endlabelstr);
1372     printf ("\tregs.sr = newsr; MakeFromSR();\n}\n");
1373     pop_braces (old_brace_level);
1374     printf ("\tregs.sr = newsr; MakeFromSR();\n");
1375     printf ("\tm68k_setpc_rte(newpc);\n");
1376     fill_prefetch_0 ();
1377     need_endlabel = 1;
1378     }
1379     /* PC is set and prefetch filled. */
1380     m68k_pc_offset = 0;
1381     break;
1382     case i_RTD:
1383     printf ("\tcompiler_flush_jsr_stack();\n");
1384     genamode (Aipi, "7", sz_long, "pc", 1, 0);
1385     genamode (curi->smode, "srcreg", curi->size, "offs", 1, 0);
1386     printf ("\tm68k_areg(regs, 7) += offs;\n");
1387     printf ("\tm68k_setpc_rte(pc);\n");
1388     fill_prefetch_0 ();
1389     /* PC is set and prefetch filled. */
1390     m68k_pc_offset = 0;
1391     break;
1392     case i_LINK:
1393     genamode (Apdi, "7", sz_long, "old", 2, 0);
1394     genamode (curi->smode, "srcreg", sz_long, "src", 1, 0);
1395     genastore ("src", Apdi, "7", sz_long, "old");
1396     genastore ("m68k_areg(regs, 7)", curi->smode, "srcreg", sz_long, "src");
1397     genamode (curi->dmode, "dstreg", curi->size, "offs", 1, 0);
1398     printf ("\tm68k_areg(regs, 7) += offs;\n");
1399     break;
1400     case i_UNLK:
1401     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1402     printf ("\tm68k_areg(regs, 7) = src;\n");
1403     genamode (Aipi, "7", sz_long, "old", 1, 0);
1404     genastore ("old", curi->smode, "srcreg", curi->size, "src");
1405     break;
1406     case i_RTS:
1407     printf ("\tm68k_do_rts();\n");
1408     fill_prefetch_0 ();
1409     m68k_pc_offset = 0;
1410     break;
1411     case i_TRAPV:
1412     sync_m68k_pc ();
1413     printf ("\tif (GET_VFLG) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
1414     need_endlabel = 1;
1415     break;
1416     case i_RTR:
1417     printf ("\tcompiler_flush_jsr_stack();\n");
1418     printf ("\tMakeSR();\n");
1419     genamode (Aipi, "7", sz_word, "sr", 1, 0);
1420     genamode (Aipi, "7", sz_long, "pc", 1, 0);
1421     printf ("\tregs.sr &= 0xFF00; sr &= 0xFF;\n");
1422     printf ("\tregs.sr |= sr; m68k_setpc(pc);\n");
1423     fill_prefetch_0 ();
1424     printf ("\tMakeFromSR();\n");
1425     m68k_pc_offset = 0;
1426     break;
1427     case i_JSR:
1428     genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1429     printf ("\tm68k_do_jsr(m68k_getpc() + %d, srca);\n", m68k_pc_offset);
1430     fill_prefetch_0 ();
1431     m68k_pc_offset = 0;
1432     break;
1433     case i_JMP:
1434     genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1435     printf ("\tm68k_setpc(srca);\n");
1436     fill_prefetch_0 ();
1437     m68k_pc_offset = 0;
1438     break;
1439     case i_BSR:
1440     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1441     printf ("\tuae_s32 s = (uae_s32)src + 2;\n");
1442     if (using_exception_3) {
1443     printf ("\tif (src & 1) {\n");
1444     printf ("\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1445     printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + s;\n");
1446     printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1447     printf ("\t}\n");
1448     need_endlabel = 1;
1449     }
1450     printf ("\tm68k_do_bsr(m68k_getpc() + %d, s);\n", m68k_pc_offset);
1451     fill_prefetch_0 ();
1452     m68k_pc_offset = 0;
1453     break;
1454     case i_Bcc:
1455     if (curi->size == sz_long) {
1456     if (cpu_level < 2) {
1457     printf ("\tm68k_incpc(2);\n");
1458     printf ("\tif (!cctrue(%d)) goto %s;\n", curi->cc, endlabelstr);
1459     printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1460     printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 1;\n");
1461     printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1462     need_endlabel = 1;
1463     } else {
1464     if (next_cpu_level < 1)
1465     next_cpu_level = 1;
1466     }
1467     }
1468     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1469     printf ("\tif (!cctrue(%d)) goto didnt_jump;\n", curi->cc);
1470     if (using_exception_3) {
1471     printf ("\tif (src & 1) {\n");
1472     printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1473     printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)src;\n");
1474     printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1475     printf ("\t}\n");
1476     need_endlabel = 1;
1477     }
1478     #ifdef USE_COMPILER
1479     printf ("\tm68k_setpc_bcc(m68k_getpc() + 2 + (uae_s32)src);\n");
1480     #else
1481     printf ("\tm68k_incpc ((uae_s32)src + 2);\n");
1482     #endif
1483     fill_prefetch_0 ();
1484     printf ("\tgoto %s;\n", endlabelstr);
1485     printf ("didnt_jump:;\n");
1486     need_endlabel = 1;
1487     break;
1488     case i_LEA:
1489     genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1490     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1491     genastore ("srca", curi->dmode, "dstreg", curi->size, "dst");
1492     break;
1493     case i_PEA:
1494     genamode (curi->smode, "srcreg", curi->size, "src", 0, 0);
1495     genamode (Apdi, "7", sz_long, "dst", 2, 0);
1496     genastore ("srca", Apdi, "7", sz_long, "dst");
1497     break;
1498     case i_DBcc:
1499     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1500     genamode (curi->dmode, "dstreg", curi->size, "offs", 1, 0);
1501    
1502     printf ("\tif (!cctrue(%d)) {\n", curi->cc);
1503     genastore ("(src-1)", curi->smode, "srcreg", curi->size, "src");
1504    
1505     printf ("\t\tif (src) {\n");
1506     if (using_exception_3) {
1507     printf ("\t\t\tif (offs & 1) {\n");
1508     printf ("\t\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
1509     printf ("\t\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)offs + 2;\n");
1510     printf ("\t\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
1511     printf ("\t\t}\n");
1512     need_endlabel = 1;
1513     }
1514     #ifdef USE_COMPILER
1515     printf ("\t\t\tm68k_setpc_bcc(m68k_getpc() + (uae_s32)offs + 2);\n");
1516     #else
1517     printf ("\t\t\tm68k_incpc((uae_s32)offs + 2);\n");
1518     #endif
1519     fill_prefetch_0 ();
1520     printf ("\t\tgoto %s;\n", endlabelstr);
1521     printf ("\t\t}\n");
1522     printf ("\t}\n");
1523     need_endlabel = 1;
1524     break;
1525     case i_Scc:
1526     genamode (curi->smode, "srcreg", curi->size, "src", 2, 0);
1527     start_brace ();
1528     printf ("\tint val = cctrue(%d) ? 0xff : 0;\n", curi->cc);
1529     genastore ("val", curi->smode, "srcreg", curi->size, "src");
1530     break;
1531     case i_DIVU:
1532     printf ("\tuaecptr oldpc = m68k_getpc();\n");
1533     genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1534     genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1535     printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
1536     printf ("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
1537     printf ("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
1538     /* The N flag appears to be set each time there is an overflow.
1539     * Weird. */
1540     printf ("\tif (newv > 0xffff) { SET_VFLG (1); SET_NFLG (1); SET_CFLG (0); } else\n\t{\n");
1541     genflags (flag_logical, sz_word, "newv", "", "");
1542     printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1543     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1544     printf ("\t}\n");
1545     printf ("\t}\n");
1546     insn_n_cycles += 68;
1547     need_endlabel = 1;
1548     break;
1549     case i_DIVS:
1550     printf ("\tuaecptr oldpc = m68k_getpc();\n");
1551     genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1552     genamode (curi->dmode, "dstreg", sz_long, "dst", 1, 0);
1553     printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
1554     printf ("\tuae_s32 newv = (uae_s32)dst / (uae_s32)(uae_s16)src;\n");
1555     printf ("\tuae_u16 rem = (uae_s32)dst %% (uae_s32)(uae_s16)src;\n");
1556     printf ("\tif ((newv & 0xffff8000) != 0 && (newv & 0xffff8000) != 0xffff8000) { SET_VFLG (1); SET_NFLG (1); SET_CFLG (0); } else\n\t{\n");
1557     printf ("\tif (((uae_s16)rem < 0) != ((uae_s32)dst < 0)) rem = -rem;\n");
1558     genflags (flag_logical, sz_word, "newv", "", "");
1559     printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
1560     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1561     printf ("\t}\n");
1562     printf ("\t}\n");
1563     insn_n_cycles += 72;
1564     need_endlabel = 1;
1565     break;
1566     case i_MULU:
1567     genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1568     genamode (curi->dmode, "dstreg", sz_word, "dst", 1, 0);
1569     start_brace ();
1570     printf ("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n");
1571     genflags (flag_logical, sz_long, "newv", "", "");
1572     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1573     insn_n_cycles += 32;
1574     break;
1575     case i_MULS:
1576     genamode (curi->smode, "srcreg", sz_word, "src", 1, 0);
1577     genamode (curi->dmode, "dstreg", sz_word, "dst", 1, 0);
1578     start_brace ();
1579     printf ("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n");
1580     genflags (flag_logical, sz_long, "newv", "", "");
1581     genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
1582     insn_n_cycles += 32;
1583     break;
1584     case i_CHK:
1585     printf ("\tuaecptr oldpc = m68k_getpc();\n");
1586     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
1587     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
1588     printf ("\tif ((uae_s32)dst < 0) { SET_NFLG (1); Exception(6,oldpc); goto %s; }\n", endlabelstr);
1589     printf ("\telse if (dst > src) { SET_NFLG (0); Exception(6,oldpc); goto %s; }\n", endlabelstr);
1590     need_endlabel = 1;
1591     break;
1592    
1593     case i_CHK2:
1594     printf ("\tuaecptr oldpc = m68k_getpc();\n");
1595     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
1596     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
1597     printf ("\t{uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n");
1598     switch (curi->size) {
1599     case sz_byte:
1600     printf ("\tlower=(uae_s32)(uae_s8)get_byte(dsta); upper = (uae_s32)(uae_s8)get_byte(dsta+1);\n");
1601     printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s8)reg;\n");
1602     break;
1603     case sz_word:
1604     printf ("\tlower=(uae_s32)(uae_s16)get_word(dsta); upper = (uae_s32)(uae_s16)get_word(dsta+2);\n");
1605     printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s16)reg;\n");
1606     break;
1607     case sz_long:
1608     printf ("\tlower=get_long(dsta); upper = get_long(dsta+4);\n");
1609     break;
1610     default:
1611     abort ();
1612     }
1613     printf ("\tSET_ZFLG (upper == reg || lower == reg);\n");
1614     printf ("\tSET_CFLG (lower <= upper ? reg < lower || reg > upper : reg > upper || reg < lower);\n");
1615     printf ("\tif ((extra & 0x800) && GET_CFLG) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
1616     need_endlabel = 1;
1617     break;
1618    
1619     case i_ASR:
1620     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1621     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1622     start_brace ();
1623     switch (curi->size) {
1624     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1625     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1626     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1627     default: abort ();
1628     }
1629     printf ("\tuae_u32 sign = (%s & val) >> %d;\n", cmask (curi->size), bit_size (curi->size) - 1);
1630     printf ("\tcnt &= 63;\n");
1631     printf ("\tCLEAR_CZNV;\n");
1632     printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1633     printf ("\t\tval = %s & (uae_u32)-sign;\n", bit_mask (curi->size));
1634     printf ("\t\tSET_CFLG (sign);\n");
1635     duplicate_carry ();
1636     if (source_is_imm1_8 (curi))
1637     printf ("\t} else {\n");
1638     else
1639     printf ("\t} else if (cnt > 0) {\n");
1640     printf ("\t\tval >>= cnt - 1;\n");
1641     printf ("\t\tSET_CFLG (val & 1);\n");
1642     duplicate_carry ();
1643     printf ("\t\tval >>= 1;\n");
1644     printf ("\t\tval |= (%s << (%d - cnt)) & (uae_u32)-sign;\n",
1645     bit_mask (curi->size),
1646     bit_size (curi->size));
1647     printf ("\t\tval &= %s;\n", bit_mask (curi->size));
1648     printf ("\t}\n");
1649     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1650     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1651     break;
1652     case i_ASL:
1653     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1654     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1655     start_brace ();
1656     switch (curi->size) {
1657     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1658     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1659     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1660     default: abort ();
1661     }
1662     printf ("\tcnt &= 63;\n");
1663     printf ("\tCLEAR_CZNV;\n");
1664     printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1665     printf ("\t\tSET_VFLG (val != 0);\n");
1666     printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
1667     bit_size (curi->size));
1668     duplicate_carry ();
1669     printf ("\t\tval = 0;\n");
1670     if (source_is_imm1_8 (curi))
1671     printf ("\t} else {\n");
1672     else
1673     printf ("\t} else if (cnt > 0) {\n");
1674     printf ("\t\tuae_u32 mask = (%s << (%d - cnt)) & %s;\n",
1675     bit_mask (curi->size),
1676     bit_size (curi->size) - 1,
1677     bit_mask (curi->size));
1678     printf ("\t\tSET_VFLG ((val & mask) != mask && (val & mask) != 0);\n");
1679     printf ("\t\tval <<= cnt - 1;\n");
1680     printf ("\t\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1681     duplicate_carry ();
1682     printf ("\t\tval <<= 1;\n");
1683     printf ("\t\tval &= %s;\n", bit_mask (curi->size));
1684     printf ("\t}\n");
1685     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1686     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1687     break;
1688     case i_LSR:
1689     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1690     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1691     start_brace ();
1692     switch (curi->size) {
1693     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1694     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1695     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1696     default: abort ();
1697     }
1698     printf ("\tcnt &= 63;\n");
1699     printf ("\tCLEAR_CZNV;\n");
1700     printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1701     printf ("\t\tSET_CFLG ((cnt == %d) & (val >> %d));\n",
1702     bit_size (curi->size), bit_size (curi->size) - 1);
1703     duplicate_carry ();
1704     printf ("\t\tval = 0;\n");
1705     if (source_is_imm1_8 (curi))
1706     printf ("\t} else {\n");
1707     else
1708     printf ("\t} else if (cnt > 0) {\n");
1709     printf ("\t\tval >>= cnt - 1;\n");
1710     printf ("\t\tSET_CFLG (val & 1);\n");
1711     duplicate_carry ();
1712     printf ("\t\tval >>= 1;\n");
1713     printf ("\t}\n");
1714     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1715     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1716     break;
1717     case i_LSL:
1718     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1719     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1720     start_brace ();
1721     switch (curi->size) {
1722     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1723     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1724     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1725     default: abort ();
1726     }
1727     printf ("\tcnt &= 63;\n");
1728     printf ("\tCLEAR_CZNV;\n");
1729     printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
1730     printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
1731     bit_size (curi->size));
1732     duplicate_carry ();
1733     printf ("\t\tval = 0;\n");
1734     if (source_is_imm1_8 (curi))
1735     printf ("\t} else {\n");
1736     else
1737     printf ("\t} else if (cnt > 0) {\n");
1738     printf ("\t\tval <<= (cnt - 1);\n");
1739     printf ("\t\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1740     duplicate_carry ();
1741     printf ("\t\tval <<= 1;\n");
1742     printf ("\tval &= %s;\n", bit_mask (curi->size));
1743     printf ("\t}\n");
1744     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1745     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1746     break;
1747     case i_ROL:
1748     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1749     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1750     start_brace ();
1751     switch (curi->size) {
1752     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1753     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1754     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1755     default: abort ();
1756     }
1757     printf ("\tcnt &= 63;\n");
1758     printf ("\tCLEAR_CZNV;\n");
1759     if (source_is_imm1_8 (curi))
1760     printf ("{");
1761     else
1762     printf ("\tif (cnt > 0) {\n");
1763     printf ("\tuae_u32 loval;\n");
1764     printf ("\tcnt &= %d;\n", bit_size (curi->size) - 1);
1765     printf ("\tloval = val >> (%d - cnt);\n", bit_size (curi->size));
1766     printf ("\tval <<= cnt;\n");
1767     printf ("\tval |= loval;\n");
1768     printf ("\tval &= %s;\n", bit_mask (curi->size));
1769     printf ("\tSET_CFLG (val & 1);\n");
1770     printf ("}\n");
1771     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1772     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1773     break;
1774     case i_ROR:
1775     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1776     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1777     start_brace ();
1778     switch (curi->size) {
1779     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1780     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1781     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1782     default: abort ();
1783     }
1784     printf ("\tcnt &= 63;\n");
1785     printf ("\tCLEAR_CZNV;\n");
1786     if (source_is_imm1_8 (curi))
1787     printf ("{");
1788     else
1789     printf ("\tif (cnt > 0) {");
1790     printf ("\tuae_u32 hival;\n");
1791     printf ("\tcnt &= %d;\n", bit_size (curi->size) - 1);
1792     printf ("\thival = val << (%d - cnt);\n", bit_size (curi->size));
1793     printf ("\tval >>= cnt;\n");
1794     printf ("\tval |= hival;\n");
1795     printf ("\tval &= %s;\n", bit_mask (curi->size));
1796     printf ("\tSET_CFLG ((val & %s) >> %d);\n", cmask (curi->size), bit_size (curi->size) - 1);
1797     printf ("\t}\n");
1798     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1799     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1800     break;
1801     case i_ROXL:
1802     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1803     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1804     start_brace ();
1805     switch (curi->size) {
1806     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1807     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1808     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1809     default: abort ();
1810     }
1811     printf ("\tcnt &= 63;\n");
1812     printf ("\tCLEAR_CZNV;\n");
1813     if (! source_is_imm1_8 (curi))
1814     force_range_for_rox ("cnt", curi->size);
1815     if (source_is_imm1_8 (curi))
1816     printf ("{");
1817     else
1818     printf ("\tif (cnt > 0) {\n");
1819     printf ("\tcnt--;\n");
1820     printf ("\t{\n\tuae_u32 carry;\n");
1821     printf ("\tuae_u32 loval = val >> (%d - cnt);\n", bit_size (curi->size) - 1);
1822     printf ("\tcarry = loval & 1;\n");
1823     printf ("\tval = (((val << 1) | GET_XFLG) << cnt) | (loval >> 1);\n");
1824     printf ("\tSET_XFLG (carry);\n");
1825     printf ("\tval &= %s;\n", bit_mask (curi->size));
1826     printf ("\t} }\n");
1827     printf ("\tSET_CFLG (GET_XFLG);\n");
1828     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1829     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1830     break;
1831     case i_ROXR:
1832     genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
1833     genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
1834     start_brace ();
1835     switch (curi->size) {
1836     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1837     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1838     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1839     default: abort ();
1840     }
1841     printf ("\tcnt &= 63;\n");
1842     printf ("\tCLEAR_CZNV;\n");
1843     if (! source_is_imm1_8 (curi))
1844     force_range_for_rox ("cnt", curi->size);
1845     if (source_is_imm1_8 (curi))
1846     printf ("{");
1847     else
1848     printf ("\tif (cnt > 0) {\n");
1849     printf ("\tcnt--;\n");
1850     printf ("\t{\n\tuae_u32 carry;\n");
1851     printf ("\tuae_u32 hival = (val << 1) | GET_XFLG;\n");
1852     printf ("\thival <<= (%d - cnt);\n", bit_size (curi->size) - 1);
1853     printf ("\tval >>= cnt;\n");
1854     printf ("\tcarry = val & 1;\n");
1855     printf ("\tval >>= 1;\n");
1856     printf ("\tval |= hival;\n");
1857     printf ("\tSET_XFLG (carry);\n");
1858     printf ("\tval &= %s;\n", bit_mask (curi->size));
1859     printf ("\t} }\n");
1860     printf ("\tSET_CFLG (GET_XFLG);\n");
1861     genflags (flag_logical_noclobber, curi->size, "val", "", "");
1862     genastore ("val", curi->dmode, "dstreg", curi->size, "data");
1863     break;
1864     case i_ASRW:
1865     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1866     start_brace ();
1867     switch (curi->size) {
1868     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1869     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1870     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1871     default: abort ();
1872     }
1873     printf ("\tuae_u32 sign = %s & val;\n", cmask (curi->size));
1874     printf ("\tuae_u32 cflg = val & 1;\n");
1875     printf ("\tval = (val >> 1) | sign;\n");
1876     genflags (flag_logical, curi->size, "val", "", "");
1877     printf ("\tSET_CFLG (cflg);\n");
1878     duplicate_carry ();
1879     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1880     break;
1881     case i_ASLW:
1882     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1883     start_brace ();
1884     switch (curi->size) {
1885     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1886     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1887     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1888     default: abort ();
1889     }
1890     printf ("\tuae_u32 sign = %s & val;\n", cmask (curi->size));
1891     printf ("\tuae_u32 sign2;\n");
1892     printf ("\tval <<= 1;\n");
1893     genflags (flag_logical, curi->size, "val", "", "");
1894     printf ("\tsign2 = %s & val;\n", cmask (curi->size));
1895     printf ("\tSET_CFLG (sign != 0);\n");
1896     duplicate_carry ();
1897    
1898     printf ("\tSET_VFLG (GET_VFLG | (sign2 != sign));\n");
1899     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1900     break;
1901     case i_LSRW:
1902     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1903     start_brace ();
1904     switch (curi->size) {
1905     case sz_byte: printf ("\tuae_u32 val = (uae_u8)data;\n"); break;
1906     case sz_word: printf ("\tuae_u32 val = (uae_u16)data;\n"); break;
1907     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1908     default: abort ();
1909     }
1910     printf ("\tuae_u32 carry = val & 1;\n");
1911     printf ("\tval >>= 1;\n");
1912     genflags (flag_logical, curi->size, "val", "", "");
1913     printf ("SET_CFLG (carry);\n");
1914     duplicate_carry ();
1915     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1916     break;
1917     case i_LSLW:
1918     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1919     start_brace ();
1920     switch (curi->size) {
1921     case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1922     case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1923     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1924     default: abort ();
1925     }
1926     printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1927     printf ("\tval <<= 1;\n");
1928     genflags (flag_logical, curi->size, "val", "", "");
1929     printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1930     duplicate_carry ();
1931     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1932     break;
1933     case i_ROLW:
1934     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1935     start_brace ();
1936     switch (curi->size) {
1937     case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1938     case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1939     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1940     default: abort ();
1941     }
1942     printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1943     printf ("\tval <<= 1;\n");
1944     printf ("\tif (carry) val |= 1;\n");
1945     genflags (flag_logical, curi->size, "val", "", "");
1946     printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1947     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1948     break;
1949     case i_RORW:
1950     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1951     start_brace ();
1952     switch (curi->size) {
1953     case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1954     case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1955     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1956     default: abort ();
1957     }
1958     printf ("\tuae_u32 carry = val & 1;\n");
1959     printf ("\tval >>= 1;\n");
1960     printf ("\tif (carry) val |= %s;\n", cmask (curi->size));
1961     genflags (flag_logical, curi->size, "val", "", "");
1962     printf ("SET_CFLG (carry);\n");
1963     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1964     break;
1965     case i_ROXLW:
1966     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1967     start_brace ();
1968     switch (curi->size) {
1969     case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1970     case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1971     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1972     default: abort ();
1973     }
1974     printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
1975     printf ("\tval <<= 1;\n");
1976     printf ("\tif (GET_XFLG) val |= 1;\n");
1977     genflags (flag_logical, curi->size, "val", "", "");
1978     printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
1979     duplicate_carry ();
1980     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1981     break;
1982     case i_ROXRW:
1983     genamode (curi->smode, "srcreg", curi->size, "data", 1, 0);
1984     start_brace ();
1985     switch (curi->size) {
1986     case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
1987     case sz_word: printf ("\tuae_u16 val = data;\n"); break;
1988     case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1989     default: abort ();
1990     }
1991     printf ("\tuae_u32 carry = val & 1;\n");
1992     printf ("\tval >>= 1;\n");
1993     printf ("\tif (GET_XFLG) val |= %s;\n", cmask (curi->size));
1994     genflags (flag_logical, curi->size, "val", "", "");
1995     printf ("SET_CFLG (carry);\n");
1996     duplicate_carry ();
1997     genastore ("val", curi->smode, "srcreg", curi->size, "data");
1998     break;
1999     case i_MOVEC2:
2000     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
2001     start_brace ();
2002     printf ("\tint regno = (src >> 12) & 15;\n");
2003     printf ("\tuae_u32 *regp = regs.regs + regno;\n");
2004     printf ("\tm68k_movec2(src & 0xFFF, regp);\n");
2005     break;
2006     case i_MOVE2C:
2007     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
2008     start_brace ();
2009     printf ("\tint regno = (src >> 12) & 15;\n");
2010     printf ("\tuae_u32 *regp = regs.regs + regno;\n");
2011     printf ("\tm68k_move2c(src & 0xFFF, regp);\n");
2012     break;
2013     case i_CAS:
2014     {
2015     int old_brace_level;
2016     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
2017     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
2018     start_brace ();
2019     printf ("\tint ru = (src >> 6) & 7;\n");
2020     printf ("\tint rc = src & 7;\n");
2021     genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, rc)", "dst");
2022     printf ("\tif (GET_ZFLG)");
2023     old_brace_level = n_braces;
2024     start_brace ();
2025     genastore ("(m68k_dreg(regs, ru))", curi->dmode, "dstreg", curi->size, "dst");
2026     pop_braces (old_brace_level);
2027     printf ("else");
2028     start_brace ();
2029     printf ("m68k_dreg(regs, rc) = dst;\n");
2030     pop_braces (old_brace_level);
2031     }
2032     break;
2033     case i_CAS2:
2034     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2035     printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 15];\n");
2036     printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 15];\n");
2037     if (curi->size == sz_word) {
2038     int old_brace_level = n_braces;
2039     printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n");
2040     genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
2041     printf ("\tif (GET_ZFLG) {\n");
2042     genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
2043     printf ("\tif (GET_ZFLG) {\n");
2044     printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
2045     printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
2046     printf ("\t}}\n");
2047     pop_braces (old_brace_level);
2048     printf ("\tif (! GET_ZFLG) {\n");
2049     printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n");
2050     printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n");
2051     printf ("\t}\n");
2052     } else {
2053     int old_brace_level = n_braces;
2054     printf ("\tuae_u32 dst1 = get_long(rn1), dst2 = get_long(rn2);\n");
2055     genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
2056     printf ("\tif (GET_ZFLG) {\n");
2057     genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
2058     printf ("\tif (GET_ZFLG) {\n");
2059     printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
2060     printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
2061     printf ("\t}}\n");
2062     pop_braces (old_brace_level);
2063     printf ("\tif (! GET_ZFLG) {\n");
2064     printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n");
2065     printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n");
2066     printf ("\t}\n");
2067     }
2068     break;
2069     case i_MOVES: /* ignore DFC and SFC because we have no MMU */
2070     {
2071     int old_brace_level;
2072     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2073     printf ("\tif (extra & 0x800)\n");
2074     old_brace_level = n_braces;
2075     start_brace ();
2076     printf ("\tuae_u32 src = regs.regs[(extra >> 12) & 15];\n");
2077     genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0);
2078     genastore ("src", curi->dmode, "dstreg", curi->size, "dst");
2079     pop_braces (old_brace_level);
2080     printf ("else");
2081     start_brace ();
2082     genamode (curi->dmode, "dstreg", curi->size, "src", 1, 0);
2083     printf ("\tif (extra & 0x8000) {\n");
2084     switch (curi->size) {
2085     case sz_byte: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s8)src;\n"); break;
2086     case sz_word: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s16)src;\n"); break;
2087     case sz_long: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = src;\n"); break;
2088     default: abort ();
2089     }
2090     printf ("\t} else {\n");
2091     genastore ("src", Dreg, "(extra >> 12) & 7", curi->size, "");
2092     printf ("\t}\n");
2093     pop_braces (old_brace_level);
2094     }
2095     break;
2096     case i_BKPT: /* only needed for hardware emulators */
2097     sync_m68k_pc ();
2098     printf ("\top_illg(opcode);\n");
2099     break;
2100     case i_CALLM: /* not present in 68030 */
2101     sync_m68k_pc ();
2102     printf ("\top_illg(opcode);\n");
2103     break;
2104     case i_RTM: /* not present in 68030 */
2105     sync_m68k_pc ();
2106     printf ("\top_illg(opcode);\n");
2107     break;
2108     case i_TRAPcc:
2109     if (curi->smode != am_unknown && curi->smode != am_illg)
2110     genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
2111     printf ("\tif (cctrue(%d)) { Exception(7,m68k_getpc()); goto %s; }\n", curi->cc, endlabelstr);
2112     need_endlabel = 1;
2113     break;
2114     case i_DIVL:
2115     sync_m68k_pc ();
2116     start_brace ();
2117     printf ("\tuaecptr oldpc = m68k_getpc();\n");
2118     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2119     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
2120     sync_m68k_pc ();
2121     printf ("\tm68k_divl(opcode, dst, extra, oldpc);\n");
2122     break;
2123     case i_MULL:
2124     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2125     genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
2126     sync_m68k_pc ();
2127     printf ("\tm68k_mull(opcode, dst, extra);\n");
2128     break;
2129     case i_BFTST:
2130     case i_BFEXTU:
2131     case i_BFCHG:
2132     case i_BFEXTS:
2133     case i_BFCLR:
2134     case i_BFFFO:
2135     case i_BFSET:
2136     case i_BFINS:
2137     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2138     genamode (curi->dmode, "dstreg", sz_long, "dst", 2, 0);
2139     start_brace ();
2140     printf ("\tuae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n");
2141     printf ("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n");
2142     if (curi->dmode == Dreg) {
2143     printf ("\tuae_u32 tmp = m68k_dreg(regs, dstreg) << (offset & 0x1f);\n");
2144     } else {
2145     printf ("\tuae_u32 tmp,bf0,bf1;\n");
2146     printf ("\tdsta += (offset >> 3) | (offset & 0x80000000 ? ~0x1fffffff : 0);\n");
2147     printf ("\tbf0 = get_long(dsta);bf1 = get_byte(dsta+4) & 0xff;\n");
2148     printf ("\ttmp = (bf0 << (offset & 7)) | (bf1 >> (8 - (offset & 7)));\n");
2149     }
2150     printf ("\ttmp >>= (32 - width);\n");
2151     printf ("\tSET_NFLG (tmp & (1 << (width-1)) ? 1 : 0);\n");
2152     printf ("\tSET_ZFLG (tmp == 0); SET_VFLG (0); SET_CFLG (0);\n");
2153     switch (curi->mnemo) {
2154     case i_BFTST:
2155     break;
2156     case i_BFEXTU:
2157     printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
2158     break;
2159     case i_BFCHG:
2160     printf ("\ttmp = ~tmp;\n");
2161     break;
2162     case i_BFEXTS:
2163     printf ("\tif (GET_NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n");
2164     printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
2165     break;
2166     case i_BFCLR:
2167     printf ("\ttmp = 0;\n");
2168     break;
2169     case i_BFFFO:
2170     printf ("\t{ uae_u32 mask = 1 << (width-1);\n");
2171     printf ("\twhile (mask) { if (tmp & mask) break; mask >>= 1; offset++; }}\n");
2172     printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = offset;\n");
2173     break;
2174     case i_BFSET:
2175     printf ("\ttmp = 0xffffffff;\n");
2176     break;
2177     case i_BFINS:
2178     printf ("\ttmp = m68k_dreg(regs, (extra >> 12) & 7);\n");
2179     break;
2180     default:
2181     break;
2182     }
2183     if (curi->mnemo == i_BFCHG
2184     || curi->mnemo == i_BFCLR
2185     || curi->mnemo == i_BFSET
2186     || curi->mnemo == i_BFINS)
2187     {
2188     printf ("\ttmp <<= (32 - width);\n");
2189     if (curi->dmode == Dreg) {
2190     printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & ((offset & 0x1f) == 0 ? 0 :\n");
2191     printf ("\t\t(0xffffffff << (32 - (offset & 0x1f))))) |\n");
2192     printf ("\t\t(tmp >> (offset & 0x1f)) |\n");
2193     printf ("\t\t(((offset & 0x1f) + width) >= 32 ? 0 :\n");
2194     printf (" (m68k_dreg(regs, dstreg) & ((uae_u32)0xffffffff >> ((offset & 0x1f) + width))));\n");
2195     } else {
2196     printf ("\tbf0 = (bf0 & (0xff000000 << (8 - (offset & 7)))) |\n");
2197     printf ("\t\t(tmp >> (offset & 7)) |\n");
2198     printf ("\t\t(((offset & 7) + width) >= 32 ? 0 :\n");
2199     printf ("\t\t (bf0 & ((uae_u32)0xffffffff >> ((offset & 7) + width))));\n");
2200     printf ("\tput_long(dsta,bf0 );\n");
2201     printf ("\tif (((offset & 7) + width) > 32) {\n");
2202     printf ("\t\tbf1 = (bf1 & (0xff >> (width - 32 + (offset & 7)))) |\n");
2203     printf ("\t\t\t(tmp << (8 - (offset & 7)));\n");
2204     printf ("\t\tput_byte(dsta+4,bf1);\n");
2205     printf ("\t}\n");
2206     }
2207     }
2208     break;
2209     case i_PACK:
2210     if (curi->smode == Dreg) {
2211     printf ("\tuae_u16 val = m68k_dreg(regs, srcreg) + %s;\n", gen_nextiword ());
2212     printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n");
2213     } else {
2214     printf ("\tuae_u16 val;\n");
2215     printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2216     printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
2217     printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2218     printf ("\tval = (val | ((uae_u16)get_byte(m68k_areg(regs, srcreg)) << 8)) + %s;\n", gen_nextiword ());
2219     printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2220     printf ("\tput_byte(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n");
2221     }
2222     break;
2223     case i_UNPK:
2224     if (curi->smode == Dreg) {
2225     printf ("\tuae_u16 val = m68k_dreg(regs, srcreg);\n");
2226     printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
2227     printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n");
2228     } else {
2229     printf ("\tuae_u16 val;\n");
2230     printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
2231     printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
2232     printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword ());
2233     printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2234     printf ("\tput_byte(m68k_areg(regs, dstreg),val);\n");
2235     printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
2236     printf ("\tput_byte(m68k_areg(regs, dstreg),val >> 8);\n");
2237     }
2238     break;
2239     case i_TAS:
2240     genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
2241     genflags (flag_logical, curi->size, "src", "", "");
2242     printf ("\tsrc |= 0x80;\n");
2243     genastore ("src", curi->smode, "srcreg", curi->size, "src");
2244     break;
2245     case i_FPP:
2246     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2247     sync_m68k_pc ();
2248     swap_opcode ();
2249     printf ("\tfpp_opp(opcode,extra);\n");
2250     break;
2251     case i_FDBcc:
2252     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2253     sync_m68k_pc ();
2254     swap_opcode ();
2255     printf ("\tfdbcc_opp(opcode,extra);\n");
2256     break;
2257     case i_FScc:
2258     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2259     sync_m68k_pc ();
2260     swap_opcode ();
2261     printf ("\tfscc_opp(opcode,extra);\n");
2262     break;
2263     case i_FTRAPcc:
2264     sync_m68k_pc ();
2265     start_brace ();
2266     printf ("\tuaecptr oldpc = m68k_getpc();\n");
2267     if (curi->smode != am_unknown && curi->smode != am_illg)
2268     genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
2269     sync_m68k_pc ();
2270     swap_opcode ();
2271     printf ("\tftrapcc_opp(opcode,oldpc);\n");
2272     break;
2273     case i_FBcc:
2274     sync_m68k_pc ();
2275     start_brace ();
2276     printf ("\tuaecptr pc = m68k_getpc();\n");
2277     genamode (curi->dmode, "srcreg", curi->size, "extra", 1, 0);
2278     sync_m68k_pc ();
2279     swap_opcode ();
2280     printf ("\tfbcc_opp(opcode,pc,extra);\n");
2281     break;
2282     case i_FSAVE:
2283     sync_m68k_pc ();
2284     swap_opcode ();
2285     printf ("\tfsave_opp(opcode);\n");
2286     break;
2287     case i_FRESTORE:
2288     sync_m68k_pc ();
2289     swap_opcode ();
2290     printf ("\tfrestore_opp(opcode);\n");
2291     break;
2292     case i_MMUOP:
2293     genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
2294     sync_m68k_pc ();
2295     swap_opcode ();
2296     printf ("\tmmu_op(opcode,extra);\n");
2297     break;
2298     default:
2299     abort ();
2300     break;
2301     }
2302     finish_braces ();
2303     sync_m68k_pc ();
2304     }
2305    
2306     static void generate_includes (FILE * f)
2307     {
2308     fprintf (f, "#include \"sysdeps.h\"\n");
2309     fprintf (f, "#include \"m68k.h\"\n");
2310     fprintf (f, "#include \"memory.h\"\n");
2311     fprintf (f, "#include \"readcpu.h\"\n");
2312     fprintf (f, "#include \"newcpu.h\"\n");
2313     fprintf (f, "#include \"compiler.h\"\n");
2314     fprintf (f, "#include \"cputbl.h\"\n");
2315     }
2316    
2317     static int postfix;
2318    
2319     static void generate_one_opcode (int rp)
2320     {
2321     int i;
2322     uae_u16 smsk, dmsk;
2323     long int opcode = opcode_map[rp];
2324    
2325     if (table68k[opcode].mnemo == i_ILLG
2326     || table68k[opcode].clev > cpu_level)
2327     return;
2328    
2329     for (i = 0; lookuptab[i].name[0]; i++) {
2330     if (table68k[opcode].mnemo == lookuptab[i].mnemo)
2331     break;
2332     }
2333    
2334     if (table68k[opcode].handler != -1)
2335     return;
2336    
2337     if (opcode_next_clev[rp] != cpu_level) {
2338     fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, opcode_last_postfix[rp],
2339     opcode, lookuptab[i].name);
2340     return;
2341     }
2342     fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, postfix, opcode, lookuptab[i].name);
2343     fprintf (headerfile, "extern cpuop_func op_%lx_%d;\n", opcode, postfix);
2344     printf ("unsigned long REGPARAM2 op_%lx_%d(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, lookuptab[i].name);
2345    
2346     switch (table68k[opcode].stype) {
2347     case 0: smsk = 7; break;
2348     case 1: smsk = 255; break;
2349     case 2: smsk = 15; break;
2350     case 3: smsk = 7; break;
2351     case 4: smsk = 7; break;
2352     case 5: smsk = 63; break;
2353     default: abort ();
2354     }
2355     dmsk = 7;
2356    
2357     next_cpu_level = -1;
2358     if (table68k[opcode].suse
2359     && table68k[opcode].smode != imm && table68k[opcode].smode != imm0
2360     && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2
2361     && table68k[opcode].smode != absw && table68k[opcode].smode != absl
2362     && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16)
2363     {
2364     if (table68k[opcode].spos == -1) {
2365     if (((int) table68k[opcode].sreg) >= 128)
2366     printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].sreg);
2367     else
2368     printf ("\tuae_u32 srcreg = %d;\n", (int) table68k[opcode].sreg);
2369     } else {
2370     char source[100];
2371     int pos = table68k[opcode].spos;
2372    
2373     #if 0
2374     /* Check that we can do the little endian optimization safely. */
2375     if (pos < 8 && (smsk >> (8 - pos)) != 0)
2376     abort ();
2377     #endif
2378     printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
2379    
2380     if (pos < 8 && (smsk >> (8 - pos)) != 0)
2381     sprintf (source, "(((opcode >> %d) | (opcode << %d)) & %d)",
2382     pos ^ 8, 8 - pos, dmsk);
2383     else if (pos != 8)
2384     sprintf (source, "((opcode >> %d) & %d)", pos ^ 8, smsk);
2385     else
2386     sprintf (source, "(opcode & %d)", smsk);
2387    
2388     if (table68k[opcode].stype == 3)
2389     printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
2390     else if (table68k[opcode].stype == 1)
2391     printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
2392     else
2393     printf ("\tuae_u32 srcreg = %s;\n", source);
2394    
2395     printf ("#else\n");
2396    
2397     if (pos)
2398     sprintf (source, "((opcode >> %d) & %d)", pos, smsk);
2399     else
2400     sprintf (source, "(opcode & %d)", smsk);
2401    
2402     if (table68k[opcode].stype == 3)
2403     printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
2404     else if (table68k[opcode].stype == 1)
2405     printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
2406     else
2407     printf ("\tuae_u32 srcreg = %s;\n", source);
2408    
2409     printf ("#endif\n");
2410     }
2411     }
2412     if (table68k[opcode].duse
2413     /* Yes, the dmode can be imm, in case of LINK or DBcc */
2414     && table68k[opcode].dmode != imm && table68k[opcode].dmode != imm0
2415     && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2
2416     && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl)
2417     {
2418     if (table68k[opcode].dpos == -1) {
2419     if (((int) table68k[opcode].dreg) >= 128)
2420     printf ("\tuae_u32 dstreg = (uae_s32)(uae_s8)%d;\n", (int) table68k[opcode].dreg);
2421     else
2422     printf ("\tuae_u32 dstreg = %d;\n", (int) table68k[opcode].dreg);
2423     } else {
2424     int pos = table68k[opcode].dpos;
2425     #if 0
2426     /* Check that we can do the little endian optimization safely. */
2427     if (pos < 8 && (dmsk >> (8 - pos)) != 0)
2428     abort ();
2429     #endif
2430     printf ("#ifdef HAVE_GET_WORD_UNSWAPPED\n");
2431    
2432     if (pos < 8 && (dmsk >> (8 - pos)) != 0)
2433     printf ("\tuae_u32 dstreg = ((opcode >> %d) | (opcode << %d)) & %d;\n",
2434     pos ^ 8, 8 - pos, dmsk);
2435     else if (pos != 8)
2436     printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
2437     pos ^ 8, dmsk);
2438     else
2439     printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
2440    
2441     printf ("#else\n");
2442    
2443     if (pos)
2444     printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
2445     pos, dmsk);
2446     else
2447     printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
2448    
2449     printf ("#endif\n");
2450     }
2451     }
2452     need_endlabel = 0;
2453     endlabelno++;
2454     sprintf (endlabelstr, "endlabel%d", endlabelno);
2455     gen_opcode (opcode);
2456     if (need_endlabel)
2457     printf ("%s: ;\n", endlabelstr);
2458     printf ("return %d;\n", insn_n_cycles);
2459     printf ("}\n");
2460     opcode_next_clev[rp] = next_cpu_level;
2461     opcode_last_postfix[rp] = postfix;
2462     }
2463    
2464     static void generate_func (void)
2465     {
2466     int i, j, rp;
2467    
2468     using_prefetch = 0;
2469     using_exception_3 = 0;
2470     for (i = 0; i < 5; i++) {
2471     cpu_level = 3 - i;
2472     if (i == 4) {
2473     cpu_level = 0;
2474     using_prefetch = 1;
2475     using_exception_3 = 1;
2476     for (rp = 0; rp < nr_cpuop_funcs; rp++)
2477     opcode_next_clev[rp] = 0;
2478     }
2479     postfix = i;
2480     fprintf (stblfile, "struct cputbl op_smalltbl_%d[] = {\n", postfix);
2481    
2482     /* sam: this is for people with low memory (eg. me :)) */
2483     printf ("\n"
2484     "#if !defined(PART_1) && !defined(PART_2) && "
2485     "!defined(PART_3) && !defined(PART_4) && "
2486     "!defined(PART_5) && !defined(PART_6) && "
2487     "!defined(PART_7) && !defined(PART_8)"
2488     "\n"
2489     "#define PART_1 1\n"
2490     "#define PART_2 1\n"
2491     "#define PART_3 1\n"
2492     "#define PART_4 1\n"
2493     "#define PART_5 1\n"
2494     "#define PART_6 1\n"
2495     "#define PART_7 1\n"
2496     "#define PART_8 1\n"
2497     "#endif\n\n");
2498    
2499     rp = 0;
2500     for(j=1;j<=8;++j) {
2501     int k = (j*nr_cpuop_funcs)/8;
2502     printf ("#ifdef PART_%d\n",j);
2503     for (; rp < k; rp++)
2504     generate_one_opcode (rp);
2505     printf ("#endif\n\n");
2506     }
2507    
2508     fprintf (stblfile, "{ 0, 0, 0 }};\n");
2509     }
2510    
2511     }
2512    
2513     int main (int argc, char **argv)
2514     {
2515     read_table68k ();
2516     do_merges ();
2517    
2518     opcode_map = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2519     opcode_last_postfix = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2520     opcode_next_clev = (int *) malloc (sizeof (int) * nr_cpuop_funcs);
2521     counts = (unsigned long *) malloc (65536 * sizeof (unsigned long));
2522     read_counts ();
2523    
2524     /* It would be a lot nicer to put all in one file (we'd also get rid of
2525     * cputbl.h that way), but cpuopti can't cope. That could be fixed, but
2526     * I don't dare to touch the 68k version. */
2527    
2528     headerfile = fopen ("cputbl.h", "wb");
2529     stblfile = fopen ("cpustbl.cpp", "wb");
2530     freopen ("cpuemu.cpp", "wb", stdout);
2531    
2532     generate_includes (stdout);
2533     generate_includes (stblfile);
2534    
2535     generate_func ();
2536    
2537     free (table68k);
2538     return 0;
2539     }