OpenCores
URL https://opencores.org/ocsvn/copyblaze/copyblaze/trunk

Subversion Repositories copyblaze

[/] [copyblaze/] [trunk/] [copyblaze/] [sw/] [tools/] [asm/] [pBlazASM/] [pBlazDIS/] [pBlazDIS.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ameziti
/*
2
 *  Copyright © 2003..2010 : Henk van Kampen <henk@mediatronix.com>
3
 *
4
 *      This file is part of pBlazDIS.
5
 *
6
 *  pBlazMRG is free software: you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation, either version 3 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  pBlazDIS is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with pBlazDIS.  If not, see <http://www.gnu.org/licenses/>.
18
 */
19
 
20
#include <stdio.h>
21
#include <stdlib.h>
22
#include <string.h>
23
#include <stdint.h>
24
#include <unistd.h>
25
#include <time.h>
26
 
27
#include "pbTypes.h"
28
#include "pbLibgen.h"
29
 
30
#ifdef TCC
31
#include "getopt.h"
32
#endif
33
 
34
#define MEMSIZE 4096
35
 
36
uint32_t Code[ MEMSIZE ] ;
37
 
38
static void usage( char * text ) {
39
        printf( "\n%s - %s\n", text, "Picoblaze Disassembler utility V1.0" ) ;
40
        printf( "\nUSAGE:\n" ) ;
41
        printf( "   pBlazDIS [-6] [-v] <MEM inputfile> <PSM outputfile>\n" ) ;
42
}
43
 
44
bool loadMEM( const char * strMEMfile ) {
45
        int i, j, addr ;
46
        uint32_t code ;
47
        char line[ 256 ], *p ;
48
        FILE * infile = NULL ;
49
 
50
        infile = fopen( strMEMfile, "r" ) ;
51
        if ( infile == NULL ) {
52
                fprintf( stderr, "? Unable to open MEM file '%s'", strMEMfile ) ;
53
                return false ;
54
        }
55
 
56
        for ( i = 0 ; i < MEMSIZE ; i++ )
57
                Code[ i ] = 0 ;
58
 
59
        for ( addr = -1 ; addr < MEMSIZE + 128 && fgets( line, sizeof( line ), infile ) != NULL; ) {
60
                if ( ( p = strchr( line, '@' ) ) != NULL ) {
61
                        if ( sscanf( ++p, "%X", &addr ) != 1 ) {
62
                                fprintf( stderr, "? Error in address in MEM file '%s'", strMEMfile ) ;
63
                                return false ;
64
                        }
65
                } else {
66
                        if ( addr == -1 ) {
67
                                fprintf( stderr, "? Missing address in MEM file '%s', assuming 0", strMEMfile ) ;
68
                                addr = 0 ;
69
                                // return false ;
70
                        }
71
                        sscanf( line, "%X", &code ) ;
72
                        Code[ addr ] = code ;
73
                        addr += 1 ;
74
                }
75
        }
76
 
77
        fclose( infile ) ;
78
        return true ;
79
}
80
 
81
static uint32_t DestReg( const int code ) {
82
        return ( code >> 8 ) & 0xF ;
83
}
84
 
85
static uint32_t SrcReg( const int code ) {
86
        return ( code >> 4 ) & 0xF ;
87
}
88
 
89
static uint32_t Constant( const int code ) {
90
        return code & 0xFF ;
91
}
92
 
93
static uint32_t Address10( const int code ) {
94
        return code & 0x3FF ;
95
}
96
 
97
static uint32_t Address12( const int code ) {
98
        return code & 0xFFF ;
99
}
100
 
101
static const char * Condition( const int code ) {
102
        const char * Conditions[ 4 ] = { "Z", "NZ", "C", "NC" } ;
103
        return  Conditions[ ( code >> 10 ) & 0x3 ] ;
104
}
105
 
106
static bool writePSM3( const char * strPSMfile ) {
107
        FILE * outfile = NULL ;
108
        int pc = 0 ;
109
        uint32_t c = 0 ;
110
        enum {
111
                stIDLE, stCODE, stDATA
112
        } state = stIDLE ;
113
 
114
        outfile = fopen( strPSMfile, "w" ) ;
115
        if ( outfile == NULL ) {
116
                fprintf( stderr, "? Unable to open output file '%s'", strPSMfile ) ;
117
                return false ;
118
        }
119
        for ( pc = 0 ; pc < 1024 ; ) {
120
                c = Code[ pc ] & 0x3FFFF ;
121
                switch ( state ) {
122
                case stIDLE :
123
                        if ( c != 0 ) {
124
                                switch ( pc ) {
125
                                case 0x380 :
126
                                    fprintf( outfile, "\n\t.SCR\t0x%.3X\n", pc ) ;
127
                                        state = stDATA ;
128
                                        break ;
129
                                default :
130
                                    fprintf( outfile, "\n\t.ORG\t0x%.3X\n", pc ) ;
131
                                        state = stCODE ;
132
                                }
133
                        } else
134
                                pc += 1 ;
135
                        break ;
136
                case stCODE :
137
                        if ( c != 0 ) {
138
                                switch ( c ) {
139
                                case 0x00000 ... 0x00FFF :
140
                                        fprintf( outfile, "\tMOVE\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
141
                                        break ;
142
                                case 0x01000 ... 0x01FFF :
143
                                        fprintf( outfile, "\tMOVE\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
144
                                        break ;
145
 
146
                                case 0x0A000 ... 0x0AFFF :
147
                                        fprintf( outfile, "\tAND \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
148
                                        break ;
149
                                case 0x0B000 ... 0x0BFFF :
150
                                        fprintf( outfile, "\tAND \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
151
                                        break ;
152
 
153
                                case 0x0C000 ... 0x0CFFF :
154
                                        fprintf( outfile, "\tOR  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
155
                                        break ;
156
                                case 0x0D000 ... 0x0DFFF :
157
                                        fprintf( outfile, "\tOR  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
158
                                        break ;
159
 
160
                                case 0x0E000 ... 0x0EFFF :
161
                                        fprintf( outfile, "\tXOR \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
162
                                        break ;
163
                                case 0x0F000 ... 0x0FFFF :
164
                                        fprintf( outfile, "\tXOR \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
165
                                        break ;
166
 
167
                                case 0x12000 ... 0x12FFF :
168
                                        fprintf( outfile, "\tTEST\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
169
                                        break ;
170
                                case 0x13000 ... 0x13FFF :
171
                                        fprintf( outfile, "\tTEST\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
172
                                        break ;
173
 
174
                                case 0x18000 ... 0x18FFF :
175
                                        fprintf( outfile, "\tADD \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
176
                                        break ;
177
                                case 0x19000 ... 0x19FFF :
178
                                        fprintf( outfile, "\tADD \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
179
                                        break ;
180
 
181
                                case 0x1A000 ... 0x1AFFF :
182
                                        fprintf( outfile, "\tADDC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
183
                                        break ;
184
                                case 0x1B000 ... 0x1BFFF :
185
                                        fprintf( outfile, "\tADDC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
186
                                        break ;
187
 
188
                                case 0x1C000 ... 0x1CFFF :
189
                                        fprintf( outfile, "\tSUB \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
190
                                        break ;
191
                                case 0x1D000 ... 0x1DFFF :
192
                                        fprintf( outfile, "\tSUB \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
193
                                        break ;
194
 
195
                                case 0x1E000 ... 0x1EFFF :
196
                                        fprintf( outfile, "\tSUBC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
197
                                        break ;
198
                                case 0x1F000 ... 0x1FFFF :
199
                                        fprintf( outfile, "\tSUBC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
200
                                        break ;
201
 
202
                                case 0x14000 ... 0x14FFF :
203
                                        fprintf( outfile, "\tCOMP\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
204
                                        break ;
205
                                case 0x15000 ... 0x15FFF :
206
                                        fprintf( outfile, "\tCOMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
207
                                        break ;
208
 
209
                                case 0x20000 ... 0x20FFF :
210
                                        switch ( c & 0xF ) {
211
                                        case 0x2 :
212
                                                fprintf( outfile, "\tRL  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
213
                                                break ;
214
                                        case 0x6 :
215
                                                fprintf( outfile, "\tSL0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
216
                                                break ;
217
                                        case 0x7 :
218
                                                fprintf( outfile, "\tSL1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
219
                                                break ;
220
                                        case 0x0 :
221
                                                fprintf( outfile, "\tSLA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
222
                                                break ;
223
                                        case 0x4 :
224
                                                fprintf( outfile, "\tSLX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
225
                                                break ;
226
 
227
                                        case 0xC :
228
                                                fprintf( outfile, "\tRR  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
229
                                                break ;
230
                                        case 0xE :
231
                                                fprintf( outfile, "\tSR0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
232
                                                break ;
233
                                        case 0xF :
234
                                                fprintf( outfile, "\tSR1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
235
                                                break ;
236
                                        case 0x8 :
237
                                                fprintf( outfile, "\tSRA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
238
                                                break ;
239
                                        case 0xA :
240
                                                fprintf( outfile, "\tSRX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
241
                                                break ;
242
 
243
                                        default :
244
                                                fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
245
                                        }
246
                                        break ;
247
 
248
                                case 0x34000 ... 0x34FFF :
249
                                        fprintf( outfile, "\tJUMP\t0x%.3X\t; 0x%.5X\n", Address10( c ), c ) ;
250
                                        break ;
251
                                case 0x35000 ... 0x35FFF :
252
                                        fprintf( outfile, "\tJUMP\t%s, 0x%.3X\t; 0x%.5X\n", Condition( c ), Address10( c ), c ) ;
253
                                        break ;
254
 
255
                                case 0x30000 ... 0x30FFF :
256
                                        fprintf( outfile, "\tCALL\t0x%.3X\t; 0x%.5X\n", Address10( c ), c ) ;
257
                                        break ;
258
                                case 0x31000 ... 0x31FFF :
259
                                        fprintf( outfile, "\tCALL\t%s, 0x%.3X\t; 0x%.5X\n", Condition( c ), Address10( c ), c ) ;
260
                                        break ;
261
 
262
                                case 0x2A000 ... 0x2AFFF :
263
                                        fprintf( outfile, "\tRET\t \t; 0x%.5X\n", c ) ;
264
                                        break ;
265
                                case 0x2B000 ... 0x2BFFF :
266
                                        fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", Condition( c ), c ) ;
267
                                        break ;
268
 
269
                                case 0x2E000 ... 0x2EFFF :
270
                                        fprintf( outfile, "\tST  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
271
                                        break ;
272
                                case 0x2F000 ... 0x2FFFF :
273
                                        fprintf( outfile, "\tST  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
274
                                        break ;
275
 
276
                                case 0x06000 ... 0x06FFF :
277
                                        fprintf( outfile, "\tLD  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
278
                                        break ;
279
                                case 0x07000 ... 0x07FFF :
280
                                        fprintf( outfile, "\tLD  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
281
                                        break ;
282
 
283
                                case 0x2C000 ... 0x2CFFF :
284
                                        fprintf( outfile, "\tOUT \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
285
                                        break ;
286
                                case 0x2D000 ... 0x2DFFF :
287
                                        fprintf( outfile, "\tOUT \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
288
                                        break ;
289
 
290
                                case 0x04000 ... 0x04FFF :
291
                                        fprintf( outfile, "\tIN  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
292
                                        break ;
293
                                case 0x05000 ... 0x05FFF :
294
                                        fprintf( outfile, "\tIN  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
295
                                        break ;
296
 
297
                                case 0x3C000 :
298
                                        fprintf( outfile, "\tDINT\t \t; 0x%.5X\n", c ) ;
299
                                        break ;
300
                                case 0x3C001 :
301
                                        fprintf( outfile, "\tEINT\t \t; 0x%.5X\n", c ) ;
302
                                        break ;
303
                                case 0x38000 :
304
                                        fprintf( outfile, "\tRETI\tDISABLE\t; 0x%.5X\n", c ) ;
305
                                        break ;
306
                                case 0x38001 :
307
                                        fprintf( outfile, "\tRETI\tENABLE\t; 0x%.5X\n", c ) ;
308
                                        break ;
309
 
310
                                default :
311
                                        fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
312
                                }
313
                                pc += 1 ;
314
                        } else
315
                                state = stIDLE ;
316
                        break ;
317
                case stDATA :
318
                        if ( c != 0 ) {
319
                                fprintf( outfile, "\t.BYT\t0x%.2X, 0x%.2X\t; 0x%.5X\n", c & 0xFF, ( c >> 8 ) & 0xFF, c ) ;
320
                                pc += 1 ;
321
                        } else
322
                                state = stIDLE ;
323
                        break ;
324
                }
325
        }
326
        fclose( outfile ) ;
327
        return true ;
328
}
329
 
330
static bool writePSM6( const char * strPSMfile ) {
331
        FILE * outfile = NULL ;
332
        int pc = 0 ;
333
        uint32_t c = 0 ;
334
        enum {
335
                stIDLE, stCODE, stDATA
336
        } state = stIDLE ;
337
 
338
        outfile = fopen( strPSMfile, "w" ) ;
339
        if ( outfile == NULL ) {
340
                fprintf( stderr, "? Unable to open output file '%s'", strPSMfile ) ;
341
                return false ;
342
        }
343
        for ( pc = 0 ; pc < MEMSIZE ; ) {
344
                c = Code[ pc ] & 0x3FFFF ;
345
                switch ( state ) {
346
                case stIDLE :
347
                        if ( c != 0 ) {
348
                                switch ( pc ) {
349
                                case 0x380 :
350
                                    fprintf( outfile, "\n\t.SCR\t0x%.3X\n", pc ) ;
351
                                        state = stDATA ;
352
                                        break ;
353
                                default :
354
                                    fprintf( outfile, "\n\t.ORG\t0x%.3X\n", pc ) ;
355
                                        state = stCODE ;
356
                                }
357
                        } else
358
                                pc += 1 ;
359
                        break ;
360
                case stCODE :
361
                        if ( c != 0 ) {
362
                                switch ( c ) {
363
                                case 0x00000 ... 0x00FFF :
364
                                        fprintf( outfile, "\tMOVE\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
365
                                        break ;
366
                                case 0x01000 ... 0x01FFF :
367
                                        fprintf( outfile, "\tMOVE\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
368
                                        break ;
369
                                case 0x16000 ... 0x16FFF :
370
                                        fprintf( outfile, "\tSTAR\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
371
                                        break ;
372
 
373
                                case 0x02000 ... 0x02FFF :
374
                                        fprintf( outfile, "\tAND \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
375
                                        break ;
376
                                case 0x03000 ... 0x03FFF :
377
                                        fprintf( outfile, "\tAND \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
378
                                        break ;
379
 
380
                                case 0x04000 ... 0x04FFF :
381
                                        fprintf( outfile, "\tOR  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
382
                                        break ;
383
                                case 0x05000 ... 0x05FFF :
384
                                        fprintf( outfile, "\tOR  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
385
                                        break ;
386
 
387
                                case 0x06000 ... 0x06FFF :
388
                                        fprintf( outfile, "\tXOR \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
389
                                        break ;
390
                                case 0x07000 ... 0x07FFF :
391
                                        fprintf( outfile, "\tXOR \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
392
                                        break ;
393
 
394
                                case 0x0C000 ... 0x0CFFF :
395
                                        fprintf( outfile, "\tTEST\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
396
                                        break ;
397
                                case 0x0D000 ... 0x0DFFF :
398
                                        fprintf( outfile, "\tTEST\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
399
                                        break ;
400
                                case 0x0E000 ... 0x0EFFF :
401
                                        fprintf( outfile, "\tTSTC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
402
                                        break ;
403
                                case 0x0F000 ... 0x0FFFF :
404
                                        fprintf( outfile, "\tTSTC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
405
                                        break ;
406
 
407
                                case 0x10000 ... 0x10FFF :
408
                                        fprintf( outfile, "\tADD \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
409
                                        break ;
410
                                case 0x11000 ... 0x11FFF :
411
                                        fprintf( outfile, "\tADD \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
412
                                        break ;
413
 
414
                                case 0x12000 ... 0x12FFF :
415
                                        fprintf( outfile, "\tADDC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
416
                                        break ;
417
                                case 0x13000 ... 0x13FFF :
418
                                        fprintf( outfile, "\tADDC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
419
                                        break ;
420
 
421
                                case 0x18000 ... 0x18FFF :
422
                                        fprintf( outfile, "\tSUB \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
423
                                        break ;
424
                                case 0x19000 ... 0x19FFF :
425
                                        fprintf( outfile, "\tSUB \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
426
                                        break ;
427
 
428
                                case 0x1A000 ... 0x1AFFF :
429
                                        fprintf( outfile, "\tSUBC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
430
                                        break ;
431
                                case 0x1B000 ... 0x1BFFF :
432
                                        fprintf( outfile, "\tSUBC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
433
                                        break ;
434
 
435
                                case 0x1C000 ... 0x1CFFF :
436
                                        fprintf( outfile, "\tCOMP\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
437
                                        break ;
438
                                case 0x1D000 ... 0x1DFFF :
439
                                        fprintf( outfile, "\tCOMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
440
                                        break ;
441
                                case 0x1E000 ... 0x1EFFF :
442
                                        fprintf( outfile, "\tCMPC\ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
443
                                        break ;
444
                                case 0x1F000 ... 0x1FFFF :
445
                                        fprintf( outfile, "\tCMPC\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
446
                                        break ;
447
 
448
                                case 0x14000 ... 0x14FFF :
449
                                        if ( c & 0xF0 ) {
450
                                                fprintf( outfile, "\tCORE\ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
451
                                        } else
452
                                                switch ( c & 0xF ) {
453
                                                case 0x2 :
454
                                                        fprintf( outfile, "\tRL  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
455
                                                        break ;
456
                                                case 0x6 :
457
                                                        fprintf( outfile, "\tSL0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
458
                                                        break ;
459
                                                case 0x7 :
460
                                                        fprintf( outfile, "\tSL1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
461
                                                        break ;
462
                                                case 0x0 :
463
                                                        fprintf( outfile, "\tSLA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
464
                                                        break ;
465
                                                case 0x4 :
466
                                                        fprintf( outfile, "\tSLX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
467
                                                        break ;
468
 
469
                                                case 0xC :
470
                                                        fprintf( outfile, "\tRR  \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
471
                                                        break ;
472
                                                case 0xE :
473
                                                        fprintf( outfile, "\tSR0 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
474
                                                        break ;
475
                                                case 0xF :
476
                                                        fprintf( outfile, "\tSR1 \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
477
                                                        break ;
478
                                                case 0x8 :
479
                                                        fprintf( outfile, "\tSRA \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
480
                                                        break ;
481
                                                case 0xA :
482
                                                        fprintf( outfile, "\tSRX \ts%X   \t; 0x%.5X\n", DestReg( c ), c ) ;
483
                                                        break ;
484
 
485
                                                default :
486
                                                        fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
487
                                                }
488
                                        break ;
489
 
490
                                case 0x22000 ... 0x22FFF :
491
                                        fprintf( outfile, "\tJUMP\t0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
492
                                        break ;
493
                                case 0x32000 ... 0x32FFF :
494
                                        fprintf( outfile, "\tJUMP\tZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
495
                                        break ;
496
                                case 0x36000 ... 0x36FFF :
497
                                        fprintf( outfile, "\tJUMP\tNZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
498
                                        break ;
499
                                case 0x3A000 ... 0x3AFFF :
500
                                        fprintf( outfile, "\tJUMP\tC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
501
                                        break ;
502
                                case 0x3E000 ... 0x3EFFF :
503
                                        fprintf( outfile, "\tJUMP\tNC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
504
                                        break ;
505
                                case 0x26000 ... 0x26FFF :
506
                                        fprintf( outfile, "\tJUMP\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
507
                                        break ;
508
 
509
                                case 0x20000 ... 0x20FFF :
510
                                        fprintf( outfile, "\tCALL\t0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
511
                                        break ;
512
                                case 0x30000 ... 0x30FFF :
513
                                        fprintf( outfile, "\tCALL\tZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
514
                                        break ;
515
                                case 0x34000 ... 0x34FFF :
516
                                        fprintf( outfile, "\tCALL\tNZ, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
517
                                        break ;
518
                                case 0x38000 ... 0x38FFF :
519
                                        fprintf( outfile, "\tCALL\tC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
520
                                        break ;
521
                                case 0x3C000 ... 0x3CFFF :
522
                                        fprintf( outfile, "\tCALL\tNC, 0x%.3X\t; 0x%.5X\n", Address12( c ), c ) ;
523
                                        break ;
524
                                case 0x24000 ... 0x24FFF :
525
                                        fprintf( outfile, "\tCALL\ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
526
                                        break ;
527
 
528
                                case 0x25000 ... 0x25FFF :
529
                                        fprintf( outfile, "\tRET\t \t; 0x%.5X\n", c ) ;
530
                                        break ;
531
                                case 0x31000 ... 0x31FFF :
532
                                        fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "Z", c ) ;
533
                                        break ;
534
                                case 0x35000 ... 0x35FFF :
535
                                        fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "NZ", c ) ;
536
                                        break ;
537
                                case 0x39000 ... 0x39FFF :
538
                                        fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "C", c ) ;
539
                                        break ;
540
                                case 0x3D000 ... 0x3DFFF :
541
                                        fprintf( outfile, "\tRET\t%s \t; 0x%.5X\n", "NC", c ) ;
542
                                        break ;
543
                                case 0x21000 ... 0x21FFF :
544
                                        fprintf( outfile, "\tRET \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
545
                                        break ;
546
 
547
 
548
                                case 0x2E000 ... 0x2EFFF :
549
                                        fprintf( outfile, "\tST  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
550
                                        break ;
551
                                case 0x2F000 ... 0x2FFFF :
552
                                        fprintf( outfile, "\tST  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
553
                                        break ;
554
 
555
                                case 0x0A000 ... 0x0AFFF :
556
                                        fprintf( outfile, "\tLD  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
557
                                        break ;
558
                                case 0x0B000 ... 0x0BFFF :
559
                                        fprintf( outfile, "\tLD  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
560
                                        break ;
561
 
562
                                case 0x2C000 ... 0x2CFFF :
563
                                        fprintf( outfile, "\tOUT \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
564
                                        break ;
565
                                case 0x2D000 ... 0x2DFFF :
566
                                        fprintf( outfile, "\tOUT \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
567
                                        break ;
568
                                case 0x2B000 ... 0x2BFFF :
569
                                        fprintf( outfile, "\tOUTK\t0x%.2X, 0x%X\t; 0x%.5X\n", ( c >> 4 ) & 0xFF, c & 0xF, c ) ;
570
                                        break ;
571
 
572
                                case 0x08000 ... 0x08FFF :
573
                                        fprintf( outfile, "\tIN  \ts%X, s%X\t; 0x%.5X\n", DestReg( c ), SrcReg( c ), c ) ;
574
                                        break ;
575
                                case 0x09000 ... 0x09FFF :
576
                                        fprintf( outfile, "\tIN  \ts%X, 0x%.2X\t; 0x%.5X\n", DestReg( c ), Constant( c ), c ) ;
577
                                        break ;
578
 
579
                                case 0x28000 :
580
                                        fprintf( outfile, "\tDINT\t \t; 0x%.5X\n", c ) ;
581
                                        break ;
582
                                case 0x28001 :
583
                                        fprintf( outfile, "\tEINT\t \t; 0x%.5X\n", c ) ;
584
                                        break ;
585
                                case 0x29000 :
586
                                        fprintf( outfile, "\tRETI\tDISABLE\t; 0x%.5X\n", c ) ;
587
                                        break ;
588
                                case 0x29001 :
589
                                        fprintf( outfile, "\tRETI\tENABLE\t; 0x%.5X\n", c ) ;
590
                                        break ;
591
 
592
                                case 0x37000 :
593
                                        fprintf( outfile, "\tBANK\tA\t; 0x%.5X\n", c ) ;
594
                                        break ;
595
                                case 0x37001 :
596
                                        fprintf( outfile, "\tBANK\tB\t; 0x%.5X\n", c ) ;
597
                                        break ;
598
 
599
                                default :
600
                                        fprintf( outfile, "\tINST\t0x%.5X\t; 0x%.5X\n", c, c ) ;
601
                                }
602
                                pc += 1 ;
603
                        } else
604
                                state = stIDLE ;
605
                        break ;
606
                case stDATA :
607
                        if ( c != 0 ) {
608
                                fprintf( outfile, "\t.BYT\t0x%.2X, 0x%.2X\t; 0x%.5X\n", c & 0xFF, ( c >> 8 ) & 0xFF, c ) ;
609
                                pc += 1 ;
610
                        } else
611
                                state = stIDLE ;
612
                        break ;
613
                }
614
        }
615
        fclose( outfile ) ;
616
        return true ;
617
}
618
 
619
int main( int argc, char *argv[] ) {
620
        char mem_filename[ 256 ] = { '\0' } ;
621
        char psm_filename[ 256 ] = { '\0' } ;
622
 
623
        bool bOptErr = false ;
624
        bool bKCPSM6 = false ;
625
        bool bVerbose = false ;
626
 
627
        extern char * optarg ;
628
        extern int optind, optopt, opterr ;
629
        int optch ;
630
 
631
        opterr = -1 ;
632
        while ( ( optch = getopt( argc, argv, "hv6" ) ) != -1 ) {
633
                switch ( optch ) {
634
                case 'h' :
635
                        bOptErr = true ;
636
                        break ;
637
                case '6' :
638
                        bKCPSM6 = true ;
639
                        break ;
640
                case 'v' :
641
                        bVerbose = true ;
642
                        break ;
643
                default :
644
                        fprintf( stderr, "? unknown option: -%c\n", optopt ) ;
645
                        bOptErr = true ;
646
                        break ;
647
                }
648
        }
649
 
650
        if ( bOptErr ) {
651
                usage( basename( argv[ 0 ] ) ) ;
652
                exit( -1 ) ;
653
        }
654
 
655
        // source filename
656
        if ( argv[ optind ] == NULL ) {
657
                fprintf( stderr, "? source file missing\n" ) ;
658
                usage( basename( argv[ 0 ] ) ) ;
659
                exit( -1 ) ;
660
        }
661
        strcpy( mem_filename, argv[ optind++ ] ) ;
662
        if ( strrchr( mem_filename, '.' ) == NULL )
663
                strcat( mem_filename, ".mem" ) ;
664
        if ( bVerbose )
665
                printf( "! MEM file: %s\n", mem_filename ) ;
666
 
667
        // output filename
668
        if ( argv[ optind ] == NULL ) {
669
                strcpy( psm_filename, filename( mem_filename ) ) ;
670
        } else {
671
                strcpy( psm_filename, argv[ optind++ ] ) ;
672
        }
673
        if ( strrchr( psm_filename, '.' ) == NULL )
674
                strcat( psm_filename, ".psm" ) ;
675
        if ( bVerbose )
676
                printf( "! output file: %s\n", psm_filename ) ;
677
 
678
        if ( loadMEM( mem_filename ) ) {
679
                if ( bKCPSM6 )
680
                        writePSM6( psm_filename ) ;
681
                else
682
                        writePSM3( psm_filename ) ;
683
                exit( 0 ) ;
684
        } else
685
                exit( -2 ) ;
686
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.