filename | src/test/testsh4x86.c |
changeset | 374:8f80a795513e |
prev | 369:4b4223e7d720 |
next | 385:766eca01ef4d |
author | nkeynes |
date | Tue Sep 11 02:14:46 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Cache the pointer to the last FR bank (speeds fp ops up by about 10%) Implement experimental fix for FLOAT/FTRC Make read/write sr functions non-static (share with translator) Much more translator WIP |
view | annotate | diff | log | raw |
1 /**
2 * $Id: testsh4x86.c,v 1.4 2007-09-11 02:14:46 nkeynes Exp $
3 *
4 * Test cases for the SH4 => x86 translator core. Takes as
5 * input a binary SH4 object (and VMA), generates the
6 * corresponding x86 code, and outputs the disassembly.
7 *
8 * Copyright (c) 2005 Nathan Keynes.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 */
21 #include <stdio.h>
22 #include <stdarg.h>
23 #include <getopt.h>
24 #include <sys/stat.h>
25 #include "x86dasm/x86dasm.h"
26 #include "sh4/sh4trans.h"
27 #include "sh4/sh4core.h"
29 #define MAX_INS_SIZE 32
31 char *option_list = "s:o:d:h";
32 struct option longopts[1] = { { NULL, 0, 0, 0 } };
34 char *input_file = NULL;
35 char *diff_file = NULL;
36 char *output_file = NULL;
37 uint32_t start_addr = 0x8C010000;
38 uint32_t sh4_cpu_period = 5;
39 FILE *in;
41 char *inbuf;
43 struct x86_symbol local_symbols[] = {
44 { "_sh4_read_byte", sh4_read_byte },
45 { "_sh4_read_word", sh4_read_word },
46 { "_sh4_read_long", sh4_read_long },
47 { "_sh4_write_byte", sh4_write_byte },
48 { "_sh4_write_word", sh4_write_word },
49 { "_sh4_write_long", sh4_write_long }
50 };
52 int32_t sh4_read_byte( uint32_t addr )
53 {
54 return *(uint8_t *)(inbuf+(addr-start_addr));
55 }
56 int32_t sh4_read_word( uint32_t addr )
57 {
58 return *(uint16_t *)(inbuf+(addr-start_addr));
59 }
60 int32_t sh4_read_long( uint32_t addr )
61 {
62 return *(uint32_t *)(inbuf+(addr-start_addr));
63 }
64 // Stubs
65 gboolean sh4_execute_instruction( ) { }
66 void sh4_accept_interrupt() {}
67 void sh4_set_breakpoint( uint32_t pc, int type ) { }
68 gboolean sh4_clear_breakpoint( uint32_t pc, int type ) { }
69 int sh4_get_breakpoint( uint32_t pc ) { }
70 void event_execute() {}
71 void TMU_run_slice( uint32_t nanos ) {}
72 void SCIF_run_slice( uint32_t nanos ) {}
73 void sh4_write_byte( uint32_t addr, uint32_t val ) {}
74 void sh4_write_word( uint32_t addr, uint32_t val ) {}
75 void sh4_write_long( uint32_t addr, uint32_t val ) {}
76 void sh4_flush_store_queue( uint32_t addr ) {}
77 void sh4_write_sr( uint32_t val ) { }
78 uint32_t sh4_read_sr( void ) { }
79 gboolean sh4_raise_exception( int exc ) {}
81 void usage()
82 {
83 fprintf( stderr, "Usage: testsh4x86 [options] <input bin file>\n");
84 fprintf( stderr, "Options:\n");
85 fprintf( stderr, " -d <filename> Diff results against contents of file\n" );
86 fprintf( stderr, " -h Display this help message\n" );
87 fprintf( stderr, " -o <filename> Output disassembly to file [stdout]\n" );
88 fprintf( stderr, " -s <addr> Specify start address of binary [8C010000]\n" );
89 }
91 void emit( void *ptr, int level, const gchar *source, const char *msg, ... )
92 {
93 va_list ap;
94 va_start( ap, msg );
95 vfprintf( stderr, msg, ap );
96 fprintf( stderr, "\n" );
97 va_end(ap);
98 }
101 struct sh4_registers sh4r;
104 int main( int argc, char *argv[] )
105 {
106 struct stat st;
107 int opt;
108 while( (opt = getopt_long( argc, argv, option_list, longopts, NULL )) != -1 ) {
109 switch( opt ) {
110 case 'd':
111 diff_file = optarg;
112 break;
113 case 'o':
114 output_file = optarg;
115 break;
116 case 's':
117 start_addr = strtoul(optarg, NULL, 0);
118 break;
119 case 'h':
120 usage();
121 exit(0);
122 }
123 }
124 if( optind < argc ) {
125 input_file = argv[optind++];
126 } else {
127 usage();
128 exit(1);
129 }
131 in = fopen( input_file, "ro" );
132 if( in == NULL ) {
133 perror( "Unable to open input file" );
134 exit(2);
135 }
136 fstat( fileno(in), &st );
137 inbuf = malloc( st.st_size );
138 fread( inbuf, st.st_size, 1, in );
140 xlat_cache_init();
141 uint32_t pc;
142 uint8_t *buf = sh4_translate_basic_block( start_addr );
143 uint32_t buflen = xlat_get_block_size(buf);
144 x86_disasm_init( buf, 0x8c010000, buflen );
145 x86_set_symtab( local_symbols, 6 );
146 for( pc = 0x8c010000; pc < 0x8c010000 + buflen; ) {
147 char buf[256];
148 char op[256];
149 uint32_t pc2 = x86_disasm_instruction( pc, buf, sizeof(buf), op );
150 fprintf( stdout, "%08X: %-20s %s\n", pc, op, buf );
151 pc = pc2;
152 }
153 }
.