annotate trans.c @ 1990:57ae42c3ab45

Fix 68k test harness target, add cycle count to output and add a cycle limit
author Michael Pavone <pavone@retrodev.com>
date Fri, 12 Jun 2020 23:54:22 -0700
parents 0c1491818f4b
children 7d4df6b74263
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 440
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 440
diff changeset
2 Copyright 2013 Michael Pavone
567
8e395210f50f Refactor gen_x86 to use an interface more like gen_arm and to remove the need for the caller to decide whether an 8-bit or 32-bit displacement is needed in the rdisp functions. Update m68k_to_x86 to use the new version of the gen_x86 functions and do some minor refactoring there in the process
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
3 This file is part of BlastEm.
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 440
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 440
diff changeset
5 */
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "68kinst.h"
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
7 #ifdef NEW_CORE
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
8 #include "m68k.h"
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
9 #else
569
9b7fcf748be0 Rename x86_68k_options and m68k_to_x86.h to m68k_options and m68k_core.h respectively
Michael Pavone <pavone@retrodev.com>
parents: 567
diff changeset
10 #include "m68k_core.h"
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
11 #endif
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #include "mem.h"
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #include <stdio.h>
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 #include <stdlib.h>
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
15 #include <string.h>
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
16
836
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
17 int headless = 1;
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
18 void render_errorbox(char * title, char * buf)
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
19 {
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
20 }
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
21
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
22 void render_infobox(char * title, char * buf)
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
23 {
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
24 }
124a58fdcf3a Get trans program compiling again
Michael Pavone <pavone@retrodev.com>
parents: 709
diff changeset
25
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
26 #ifndef NEW_CORE
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
27 m68k_context * sync_components(m68k_context * context, uint32_t address)
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
28 {
1990
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
29 if (context->current_cycle >= context->target_cycle) {
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
30 puts("hit cycle limit");
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
31 exit(0);
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
32 }
1304
5b90d7669eee Fix exit trace mode edge case. Call do_sync if trace mode bit is changed in eori sr
Michael Pavone <pavone@retrodev.com>
parents: 1303
diff changeset
33 if (context->status & M68K_STATUS_TRACE || context->trace_pending) {
1303
208803173ebc Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents: 1082
diff changeset
34 context->target_cycle = context->current_cycle;
208803173ebc Implemented M68K trace mode. Some edge cases/SR update paths still need work
Michael Pavone <pavone@retrodev.com>
parents: 1082
diff changeset
35 }
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
36 return context;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
37 }
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
38 #endif
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39
1082
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
40 m68k_context *reset_handler(m68k_context *context)
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
41 {
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
42 m68k_print_regs(context);
1990
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
43 printf("cycles: %d\n", context->current_cycle);
1082
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
44 exit(0);
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
45 //unreachable
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
46 return context;
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
47 }
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
48
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 int main(int argc, char ** argv)
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 {
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 long filesize;
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 unsigned short *filebuf;
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 char disbuf[1024];
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 unsigned short * cur;
569
9b7fcf748be0 Rename x86_68k_options and m68k_to_x86.h to m68k_options and m68k_core.h respectively
Michael Pavone <pavone@retrodev.com>
parents: 567
diff changeset
55 m68k_options opts;
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 FILE * f = fopen(argv[1], "rb");
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 fseek(f, 0, SEEK_END);
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 filesize = ftell(f);
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 fseek(f, 0, SEEK_SET);
572
0f32f52fc98e Make some small changes in trans so that it is more likely to produce the same output as mustrans when given misbehaving programs. Add lea to testcases.txt. Improve the output of comparetest.py so that known issues can easily be separated from new ones.
Michael Pavone <pavone@retrodev.com>
parents: 570
diff changeset
60 filebuf = malloc(0x400000);
0f32f52fc98e Make some small changes in trans so that it is more likely to produce the same output as mustrans when given misbehaving programs. Add lea to testcases.txt. Improve the output of comparetest.py so that known issues can easily be separated from new ones.
Michael Pavone <pavone@retrodev.com>
parents: 570
diff changeset
61 memset(filebuf, 0, 0x400000);
0f32f52fc98e Make some small changes in trans so that it is more likely to produce the same output as mustrans when given misbehaving programs. Add lea to testcases.txt. Improve the output of comparetest.py so that known issues can easily be separated from new ones.
Michael Pavone <pavone@retrodev.com>
parents: 570
diff changeset
62 fread(filebuf, 2, filesize/2 > 0x200000 ? 0x200000 : filesize/2, f);
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 fclose(f);
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur)
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 {
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 *cur = (*cur >> 8) | (*cur << 8);
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 }
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
68 memmap_chunk memmap[2];
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
69 memset(memmap, 0, sizeof(memmap_chunk)*2);
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
70 memmap[0].end = 0x400000;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
71 memmap[0].mask = 0xFFFFFF;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
72 memmap[0].flags = MMAP_READ;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
73 memmap[0].buffer = filebuf;
567
8e395210f50f Refactor gen_x86 to use an interface more like gen_arm and to remove the need for the caller to decide whether an 8-bit or 32-bit displacement is needed in the rdisp functions. Update m68k_to_x86 to use the new version of the gen_x86 functions and do some minor refactoring there in the process
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
74
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
75 memmap[1].start = 0xE00000;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
76 memmap[1].end = 0x1000000;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
77 memmap[1].mask = 0xFFFF;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
78 memmap[1].flags = MMAP_READ | MMAP_WRITE | MMAP_CODE;
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
79 memmap[1].buffer = malloc(64 * 1024);
572
0f32f52fc98e Make some small changes in trans so that it is more likely to produce the same output as mustrans when given misbehaving programs. Add lea to testcases.txt. Improve the output of comparetest.py so that known issues can easily be separated from new ones.
Michael Pavone <pavone@retrodev.com>
parents: 570
diff changeset
80 memset(memmap[1].buffer, 0, 64 * 1024);
709
3f065c20423c Fix trans so it compiles again
Michael Pavone <pavone@retrodev.com>
parents: 572
diff changeset
81 init_m68k_opts(&opts, memmap, 2, 1);
1082
2ec5e6eaf81d Add support for specifying a reset handler in the M68K core. Adjust memory map initialization to handle extra field. Improved handling of out of bounds execution.
Michael Pavone <pavone@retrodev.com>
parents: 836
diff changeset
82 m68k_context * context = init_68k_context(&opts, reset_handler);
709
3f065c20423c Fix trans so it compiles again
Michael Pavone <pavone@retrodev.com>
parents: 572
diff changeset
83 context->mem_pointers[0] = memmap[0].buffer;
3f065c20423c Fix trans so it compiles again
Michael Pavone <pavone@retrodev.com>
parents: 572
diff changeset
84 context->mem_pointers[1] = memmap[1].buffer;
1990
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
85 context->current_cycle = 40;
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
86 #ifndef NEW_CORE
1990
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
87 context->target_cycle = context->sync_cycle = 8000;
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
88 #endif
709
3f065c20423c Fix trans so it compiles again
Michael Pavone <pavone@retrodev.com>
parents: 572
diff changeset
89 m68k_reset(context);
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
90 #ifdef NEW_CORE
1990
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
91 m68k_execute(context, 8000);
57ae42c3ab45 Fix 68k test harness target, add cycle count to output and add a cycle limit
Michael Pavone <pavone@retrodev.com>
parents: 1838
diff changeset
92 puts("hit cycle limit");
1838
0c1491818f4b WIP new 68K core using CPU DSL
Michael Pavone <pavone@retrodev.com>
parents: 1304
diff changeset
93 #endif
18
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 return 0;
3e7bfde7606e M68K to x86 translation works for a limited subset of instructions and addressing modes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 }
440
306986209cba Fix 68K test harness
Mike Pavone <pavone@retrodev.com>
parents: 212
diff changeset
96