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

Subversion Repositories lwrisc

[/] [lwrisc/] [trunk/] [CTOOL/] [hexdasm.c] - Blame information for rev 11

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 mcupro
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "ClaiRISC" project,                *
6
 *    The folder in CVS is named as "lwrisc"                      *
7
 *    Downloaded from:                                            *
8
 *    http://www.opencores.org/pdownloads.cgi/list/lwrisc         *
9
 *                                                                *
10
 *    If you encountered any problem, please contact me via       *
11
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
12
 *                                                                *
13
 ******************************************************************/
14
 
15
 
16 7 mcupro
#include "stdlib.h"
17
#include "stdio.h"
18
#include "string.h"
19
 
20
int func1(int in)
21
{
22
const int table[]={1,2,4,8,16,32,64,128,256,512,1024,2048};
23
int i =0;
24
if (in>=2048)return -1;
25
for(;;i++)
26
if ((in>table[i])&&(in<table[i+1])){
27
return i+1;
28
}
29
}
30
 
31
 
32
int getbit(unsigned int data,unsigned int index)
33
{
34
    unsigned int temp=1<<index ;
35
    if(data&temp)
36
    return 1 ;
37
    else
38
    return 0 ;
39
}
40
 
41
char temp[100];
42
char*ins12tostr(unsigned int ins)
43
{
44
    unsigned int i ;
45
    for(i=0;i<100;++i)temp[i]=0 ;
46
    for(i=0;i<=11;++i)
47
    temp[i]=getbit(ins,11-i)+'0' ;
48
    return temp ;
49
}
50
/*static volatile       unsigned char   WB_ADDR         @ 0x01;
51
//static volatile       unsigned char   PCL             @ 0x02;
52
static volatile       unsigned char     STATUS          @ 0x03;
53
static                unsigned char     FSR             @ 0x04;
54
static volatile       unsigned char     WB_DATA         @ 0x05;
55
static volatile       unsigned char     WB_CTL          @ 0x06;*/
56
static char reg_name[30];
57
char*find_reg(unsigned int t)
58
{
59
    //puts(&ins[7]);
60
    if(t==0)
61
    {
62
        //  printf("t=%d",t);
63
        strcpy(reg_name,"WB_ADDR");
64
        return reg_name ;
65
    }
66
    //    if(reg_no==0)strcpy(reg_name,"WB_CTL");
67
    else if(t==1)
68
    {
69
        strcpy(reg_name,"TMR");
70
        return reg_name ;
71
    }
72
    //    else if(reg_no==1)strcpy(reg_name,"WB_ADDR");
73
    else if(t==2)
74
    {
75
        strcpy(reg_name,"PCL");
76
        return reg_name ;
77
    }
78
    else if(t-3==0)
79
    {
80
        strcpy(reg_name,"STATUS");
81
        return reg_name ;
82
    }
83
    else if(t==0+4)
84
    {
85
        strcpy(reg_name,"FSR");
86
        return reg_name ;
87
    }
88
    else if(t==5+0)
89
    {
90
        strcpy(reg_name,"WB_DATA");
91
        return reg_name ;
92
    }
93
    //else if(reg_no==5)strcpy(reg_name,"WB_WR_DATA");
94
    else if(t==6+0)
95
    {
96
        strcpy(reg_name,"WB_CTL");
97
        return reg_name ;
98
    }
99
    //else if(reg_no==6)strcpy(reg_name,"WB_RD_DATA");
100
    else if(t==0+1+6)
101
    {
102
        strcpy(reg_name,"PORTC");
103
        return reg_name ;
104
    }
105
    return NULL ;
106
}
107
 
108
char hex[]=
109
{
110
    "0123456789abcdef"
111
}
112
;
113
char*p,__hex[20]=
114
{
115
 
116
}
117
;
118
unsigned char*bs2hs(char*bs)
119
{
120
    unsigned int t=0,i=0 ;
121
    for(i=0;;++i)
122
    {
123
        if(bs[i]==0)break ;
124
        t=t*2+bs[i]-'0' ;
125
    }
126
    //printf("now t==%d",t);
127
    p=find_reg(t);
128
    //if (t>=8) goto else
129
    if(p!=NULL)
130
    strcpy(__hex,p);
131
    else
132
    {
133
        __hex[0]='0' ;
134
        __hex[1]='x' ;
135
        __hex[2]=hex[t/16];
136
        __hex[3]=hex[t%16];
137
        __hex[4]=0 ;
138
    }
139
    return __hex ;
140
}
141
 
142
char _temp[100];
143
//get file reg adderss from instruction!
144
char*gen_ins_fa(char*ins)
145
{//gen_ins_in(
146
    strcpy(_temp,ins);
147
    return bs2hs(&_temp[7]);
148
}
149
 
150
//get bit data from instruction!
151
unsigned int gen_ins_bd(char*ins)
152
{
153
//1111_1111_1111
154
    unsigned int t=0 ;
155
    if(ins[5+1]=='1')t+=1 ;
156
    if(ins[4+1]=='1')t+=2 ;
157
    if(ins[3+1]=='1')t+=4 ;
158
    return t ;
159
}
160
 
161
//get goto(and call) address data from instruction!
162
unsigned int gen_ins_goto(char*ins)
163
{
164
//000_111111001
165
    unsigned int t=0 ;
166
    if(ins[11-0]=='1')t+=1;
167
    if(ins[11-1]=='1')t+=2 ;
168
    if(ins[11-2]=='1')t+=4;
169
    if(ins[11-3]=='1')t+=8 ;
170
    if(ins[11-4]=='1')t+=16;//1<<4 ;
171
    if(ins[11-5]=='1')t+=32;//1<<5 ;
172
    if(ins[11-6]=='1')t+=64;//1<<6 ;
173
    if(ins[11-7]=='1')t+=128;//1<<7 ;
174
    if(ins[11-8]=='1')t+=256;//1<<8 ;
175
    return t ;
176
}
177
 
178
//get instant data from instruction!
179
unsigned int gen_ins_in(char*ins)
180
{
181
    unsigned int t=0 ;
182
    if(ins[11-0]=='1')t+=1;
183
    if(ins[11-1]=='1')t+=2 ;
184
    if(ins[11-2]=='1')t+=4;//1<<3 ;
185
    if(ins[11-3]=='1')t+=8;//1<<4 ;
186
    if(ins[11-4]=='1')t+=16;//1<<4 ;
187
    if(ins[11-5]=='1')t+=32;//1<<5 ;
188
    if(ins[11-6]=='1')t+=64;//1<<6 ;
189
    if(ins[11-7]=='1')t+=128;//1<<7 ;
190
    // if(ins[11-8]=='1')t+=1<<8 ;
191
    return t ;
192
}
193
 
194
 
195
unsigned int inscmp(char*src,char*dst)
196
{
197
    unsigned int i ;
198
    for(i=0;i<=9;i++)
199
    {
200
        if(src[i]=='X')continue ;
201
        else if(src[i]!=dst[i])return 0 ;
202
    }
203
    return 1 ;
204
}
205
 
206
 
207
unsigned int str2u12(char*str)
208
{
209
    unsigned int ret=0 ;
210
    unsigned int i ;
211
    for(i=0;i<=11;++i)
212
    {
213
        if(str[i]==0)return ret ;
214
        ret=ret*10+str[i]-'0' ;
215
    }
216
    return ret ;
217
}
218
/*
219
unsigned int getfno(char *ins,unsigned char start,
220
unsigned char len)
221
{
222
unsigned int data = str2u12(ins);
223
    unsigned int tmp1=0xffff<<len ;
224
    unsigned int tmp2=data>>start ;
225
    unsigned int ret ;
226
    tmp1=~tmp1 ;
227
    ret=tmp1&tmp2 ;
228
    ret=ret&0xffff ;
229
    return ret ;
230
 
231
unsigned int i,ret=0;
232
for(i=11-start;i<len;++i)
233
ret=ret+(ins[i]-'0')*2;
234
return ret;
235
}*/
236
/*
237
void test_main(void)
238
{
239
    printf("%d",getno(str2u12("0xff"),0,1));
240
    getchar();
241
}*/
242
 
243
 
244
 
245
char tmp_str[100]=
246
{
247
 
248
}
249
;
250
void init_temp_str(void)
251
{
252
    int i ;
253
    for(i=0;i<100;++i)
254
    tmp_str[i]=0 ;
255
}
256
 
257
char*op_ins_NOP(char*ins)
258
{
259
    init_temp_str();
260
    sprintf(tmp_str,"NOP");
261
    add_ins("NOP");
262
    //ok
263
    return tmp_str ;
264
 
265
}
266
char*op_ins_MOVWF(char*ins)
267
{
268
    init_temp_str();
269
    sprintf(tmp_str,"MOVWF %s",gen_ins_fa(ins));
270
    add_ins("MOVWF");
271
    //ok
272
    return tmp_str ;
273
}
274
char*op_ins_CLRW(char*ins)
275
{
276
    init_temp_str();
277
    sprintf(tmp_str,"CLRW");
278
    add_ins("CLRW");
279
    return tmp_str ;
280
}
281
char*op_ins_CLRF(char*ins)
282
{
283
    init_temp_str();
284
    sprintf(tmp_str,"CLRF %s",gen_ins_fa(ins));
285
    add_ins("CLRF");
286
    return tmp_str ;
287
}
288
char*op_ins_SUBWFW(char*ins)
289
{
290
    init_temp_str();
291
    sprintf(tmp_str,"SUBWFW %s",gen_ins_fa(ins));
292
    add_ins("SUBWFW");
293
    return tmp_str ;
294
}
295
char*op_ins_SUBWFF(char*ins)
296
{
297
    init_temp_str();
298
    sprintf(tmp_str,"SUBWFF %s",gen_ins_fa(ins));
299
    add_ins("WUBWFF");
300
    return tmp_str ;
301
}
302
char*op_ins_DECFW(char*ins)
303
{
304
    init_temp_str();
305
    sprintf(tmp_str,"DECFW %s",gen_ins_fa(ins));
306
    add_ins("DECFW");
307
    return tmp_str ;
308
}
309
char*op_ins_DECFF(char*ins)
310
{
311
    init_temp_str();
312
    sprintf(tmp_str,"DECFF %s",gen_ins_fa(ins));
313
    add_ins("DECFF");
314
    return tmp_str ;
315
}
316
char*op_ins_IORWFW(char*ins)
317
{
318
    init_temp_str();
319
    sprintf(tmp_str,"IORWFW %s",gen_ins_fa(ins));
320
    add_ins("IORWFW");
321
    return tmp_str ;
322
}
323
char*op_ins_IORWFF(char*ins)
324
{
325
    init_temp_str();
326
    sprintf(tmp_str,"IORWFF %s",gen_ins_fa(ins));
327
    add_ins("IORWFF");
328
    return tmp_str ;
329
}
330
char*op_ins_ANDWFW(char*ins)
331
{
332
    init_temp_str();
333
    sprintf(tmp_str,"ANDWFW %s",gen_ins_fa(ins));
334
    add_ins("ANDWFW");
335
    return tmp_str ;
336
}
337
char*op_ins_ANDWFF(char*ins)
338
{
339
    init_temp_str();
340
    add_ins("ANDWFF");
341
    sprintf(tmp_str,"ANDWFF %s",gen_ins_fa(ins));
342
    return tmp_str ;
343
}
344
char*op_ins_XORWFW(char*ins)
345
{
346
    init_temp_str();
347
    add_ins("XORWFW");
348
    sprintf(tmp_str,"XORWFW %s",gen_ins_fa(ins));
349
    return tmp_str ;
350
}
351
char*op_ins_XORWFF(char*ins)
352
{
353
    init_temp_str();
354
    add_ins("XORWFF");
355
    sprintf(tmp_str,"XORWFF %s",gen_ins_fa(ins));
356
    return tmp_str ;
357
}
358
char*op_ins_ADDWFW(char*ins)
359
{
360
    init_temp_str();
361
    add_ins("ADDWFW");
362
    sprintf(tmp_str,"ADDWFW %s",gen_ins_fa(ins));
363
    return tmp_str ;
364
}
365
char*op_ins_ADDWFF(char*ins)
366
{
367
    init_temp_str();
368
    add_ins("ADDWFF");
369
    sprintf(tmp_str,"ADDWFF %s",gen_ins_fa(ins));
370
    return tmp_str ;
371
}
372
char*op_ins_MOVFW(char*ins)
373
{
374
    init_temp_str();
375
    add_ins("MOVFW");
376
    sprintf(tmp_str,"MOVFW %s",gen_ins_fa(ins));
377
    return tmp_str ;
378
 
379
 
380
}
381
char*op_ins_MOVFF(char*ins)
382
{
383
    init_temp_str();
384
    add_ins("MOVFF");
385
    sprintf(tmp_str,"MOVFF %s",gen_ins_fa(ins));
386
    return tmp_str ;
387
}
388
char*op_ins_COMFW(char*ins)
389
{
390
    init_temp_str();
391
    add_ins("COMFW");
392
    sprintf(tmp_str,"COMFW %s",gen_ins_fa(ins));
393
    return tmp_str ;
394
}
395
char*op_ins_COMFF(char*ins)
396
{
397
    init_temp_str();
398
    add_ins("COMFF");
399
    sprintf(tmp_str,"COMFF %s",gen_ins_fa(ins));
400
    return tmp_str ;
401
}
402
char*op_ins_INCFW(char*ins)
403
{
404
    init_temp_str();
405
    add_ins("INCFW");
406
    sprintf(tmp_str,"INCFW %s",gen_ins_fa(ins));
407
    return tmp_str ;
408
}
409
char*op_ins_INCFF(char*ins)
410
{
411
    init_temp_str();
412
    add_ins("INCFF");
413
    sprintf(tmp_str,"INCFF %s",gen_ins_fa(ins));
414
    return tmp_str ;
415
}
416
char*op_ins_DECFSZW(char*ins)
417
{
418
    init_temp_str();
419
    add_ins("DECFSZW");
420
    sprintf(tmp_str,"DECFSZW %s",gen_ins_fa(ins));
421
    return tmp_str ;
422
}
423
char*op_ins_DECFSZF(char*ins)
424
{
425
    init_temp_str();
426
    add_ins("DECFSZF");
427
    sprintf(tmp_str,"DECFSZF %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
428
    return tmp_str ;
429
}
430
char*op_ins_RRFW(char*ins)
431
{
432
    init_temp_str();
433
    add_ins("RRFW");
434
    sprintf(tmp_str,"RRFW %s",gen_ins_fa(ins));
435
    return tmp_str ;
436
}
437
char*op_ins_RRFF(char*ins)
438
{
439
    init_temp_str();
440
    add_ins("RRFF");
441
    sprintf(tmp_str,"RRFF%s",gen_ins_fa(ins));
442
    return tmp_str ;
443
}
444
char*op_ins_RLFW(char*ins)
445
{
446
    init_temp_str();
447
    add_ins("RRFW");
448
    sprintf(tmp_str,"RLFW %s",gen_ins_fa(ins));
449
    return tmp_str ;
450
}
451
char*op_ins_RLFF(char*ins)
452
{
453
    init_temp_str();
454
    add_ins("RLFF");
455
    sprintf(tmp_str,"RLFF %s",gen_ins_fa(ins));
456
    return tmp_str ;
457
}
458
char*op_ins_SWAPFW(char*ins)
459
{
460
    init_temp_str();
461
    add_ins("SWAPFW");
462
    sprintf(tmp_str,"SWAPFW %s",gen_ins_fa(ins));
463
    return tmp_str ;
464
}
465
char*op_ins_SWAPFF(char*ins)
466
{
467
    init_temp_str();
468
    add_ins("SWAPFF");
469
    sprintf(tmp_str,"SWAPFF %s",gen_ins_fa(ins));
470
    return tmp_str ;
471
}
472
char*op_ins_INCFSZW(char*ins)
473
{
474
    init_temp_str();
475
    add_ins("INCFZW");
476
    sprintf(tmp_str,"INCFSZW %s",gen_ins_fa(ins));
477
    return tmp_str ;
478
}
479
char*op_ins_INCFSZF(char*ins)
480
{
481
    init_temp_str();
482
    add_ins("INCFSZF");
483
    sprintf(tmp_str,"INCFSZF %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
484
    return tmp_str ;
485
}
486
char*op_ins_BCF(char*ins)
487
{
488
    init_temp_str();
489
    add_ins("BCF");
490
    sprintf(tmp_str,"BCF %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
491
    return tmp_str ;
492
}
493
char*op_ins_BSF(char*ins)
494
{
495
    init_temp_str();
496
    add_ins("BSF");
497
    sprintf(tmp_str,"BSF %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
498
    return tmp_str ;
499
}
500
char*op_ins_BTFSC(char*ins)
501
{
502
    init_temp_str();
503
    add_ins("BTFSC");
504
    sprintf(tmp_str,"BTFSC %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
505
    return tmp_str ;
506
}
507
char*op_ins_BTFSS(char*ins)
508
{
509
    init_temp_str();
510
    add_ins("BTFSS");
511
    sprintf(tmp_str,"BTFSS %s  [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
512
    return tmp_str ;
513
}
514
char*op_ins_RETLW(char*ins)
515
{
516
    init_temp_str();
517
    add_ins("RETLW");
518
    sprintf(tmp_str,"RETLW %d",gen_ins_in(ins));
519
    return tmp_str ;
520
}
521
char*op_ins_CALL(char*ins)
522
{
523
    init_temp_str();
524
    add_ins("CALL");
525
    sprintf(tmp_str,"CALL %d",gen_ins_goto(ins));
526
    return tmp_str ;
527
}
528
char*op_ins_GOTO(char*ins)
529
{
530
    init_temp_str();
531
    add_ins("GOTO");
532
    sprintf(tmp_str,"GOTO %d",gen_ins_goto(ins));
533
    return tmp_str ;
534
}
535
char*op_ins_MOVLW(char*ins)
536
{
537
    init_temp_str();
538
    add_ins("MOVLW");
539
    sprintf(tmp_str,"MOVLW %d",gen_ins_in(ins));
540
    return tmp_str ;
541
}
542
char*op_ins_IORLW(char*ins)
543
{
544
    init_temp_str();
545
    add_ins("IORLW");
546
    sprintf(tmp_str,"IORLW %d",gen_ins_in(ins));
547
    return tmp_str ;
548
}
549
char*op_ins_ANDLW(char*ins)
550
{
551
    init_temp_str();
552
    add_ins("ANDLW");
553
    sprintf(tmp_str,"ANDLW %d",gen_ins_in(ins));
554
    return tmp_str ;
555
}
556
char*op_ins_XORLW(char*ins)
557
{
558
    init_temp_str();
559
    add_ins("XORLW");
560
    sprintf(tmp_str,"XORLW %d",gen_ins_in(ins));
561
    return tmp_str ;
562
}
563
 
564
 
565
char*branch_ins(char*ins)
566
{
567
    if(inscmp("000000000000",ins)==1)
568
    return op_ins_NOP(ins);
569
    // char * op_ins_NOP (char *ins){}
570
    else if(inscmp("0000001XXXXX",ins)==1)
571
    return op_ins_MOVWF(ins);
572
    // char * op_ins_MOVWF (char *ins){}
573
    else if(inscmp("000001000000",ins)==1)
574
    return op_ins_CLRW(ins);
575
    // char * op_ins_CLRW (char *ins){}
576
    else if(inscmp("0000011XXXXX",ins)==1)
577
    return op_ins_CLRF(ins);
578
    // char * op_ins_CLRF (char *ins){}
579
    else if(inscmp("0000100XXXXX",ins)==1)
580
    return op_ins_SUBWFW(ins);
581
    // char * op_ins_SUBWFW (char *ins){}
582
    else if(inscmp("0000101XXXXX",ins)==1)
583
    return op_ins_SUBWFF(ins);
584
    // char * op_ins_SUBWFF (char *ins){}
585
    else if(inscmp("0000110XXXXX",ins)==1)
586
    return op_ins_DECFW(ins);
587
    // char * op_ins_DECFW (char *ins){}
588
    else if(inscmp("0000111XXXXX",ins)==1)
589
    return op_ins_DECFF(ins);
590
    // char *op_ins_DECFF  (char *ins){}
591
    else if(inscmp("0001000XXXXX",ins)==1)
592
    return op_ins_IORWFW(ins);
593
    // char * op_ins_IORWFW (char *ins){}
594
    else if(inscmp("0001001XXXXX",ins)==1)
595
    return op_ins_IORWFF(ins);
596
    // char * op_ins_IORWFF (char *ins){}
597
    else if(inscmp("0001010XXXXX",ins)==1)
598
    return op_ins_ANDWFW(ins);
599
    // char * op_ins_ANDWFW (char *ins){}
600
    else if(inscmp("0001011XXXXX",ins)==1)
601
    return op_ins_ANDWFF(ins);
602
    // char *  op_ins_ANDWFF(char *ins){}
603
    else if(inscmp("0001100XXXXX",ins)==1)
604
    return op_ins_XORWFW(ins);
605
    // char * op_ins_XORWFW (char *ins){}
606
    else if(inscmp("0001101XXXXX",ins)==1)
607
    return op_ins_XORWFF(ins);
608
    // char *  op_ins_XORWFF(char *ins){}
609
    else if(inscmp("0001110XXXXX",ins)==1)
610
    return op_ins_ADDWFW(ins);
611
    // char *   op_ins_ADDWFW(char *ins){}
612
    else if(inscmp("0001111XXXXX",ins)==1)
613
    return op_ins_ADDWFF(ins);
614
    // char *  op_ins_ADDWFF(char *ins){}
615
    else if(inscmp("0010000XXXXX",ins)==1)
616
    return op_ins_MOVFW(ins);
617
    // char * op_ins_MOVFW (char *ins){}
618
    else if(inscmp("0010001XXXXX",ins)==1)
619
    return op_ins_MOVFF(ins);
620
    // char *  op_ins_MOVFF(char *ins){}
621
    else if(inscmp("0010010XXXXX",ins)==1)
622
    return op_ins_COMFW(ins);
623
    // char * op_ins_COMFW (char *ins){}
624
    else if(inscmp("0010011XXXXX",ins)==1)
625
    return op_ins_COMFF(ins);
626
    // char *  op_ins_COMFF(char *ins){}
627
    else if(inscmp("0010100XXXXX",ins)==1)
628
    return op_ins_INCFW(ins);
629
    // char *  op_ins_INCFW(char *ins){}
630
    else if(inscmp("0010101XXXXX",ins)==1)
631
    return op_ins_INCFF(ins);
632
    // char *  op_ins_INCFF(char *ins){}
633
    else if(inscmp("0010110XXXXX",ins)==1)
634
    return op_ins_DECFSZW(ins);
635
    // char *op_ins_DECFSZW  (char *ins){}
636
    else if(inscmp("0010111XXXXX",ins)==1)
637
    return op_ins_DECFSZF(ins);
638
    // char *  op_ins_DECFSZF(char *ins){}
639
    else if(inscmp("0011000XXXXX",ins)==1)
640
    return op_ins_RRFW(ins);
641
    // char * op_ins_RRFW (char *ins){}
642
    else if(inscmp("0011001XXXXX",ins)==1)
643
    return op_ins_RRFF(ins);
644
    // char * op_ins_RRFF (char *ins){}
645
    else if(inscmp("0011010XXXXX",ins)==1)
646
    return op_ins_RLFW(ins);
647
    // char *  op_ins_RLFW(char *ins){}
648
    else if(inscmp("0011011XXXXX",ins)==1)
649
    return op_ins_RLFF(ins);
650
    // char *  op_ins_RLFF(char *ins){}
651
    else if(inscmp("0011100XXXXX",ins)==1)
652
    return op_ins_SWAPFW(ins);
653
    // char * op_ins_SWAPFW (char *ins){}
654
    else if(inscmp("0011101XXXXX",ins)==1)
655
    return op_ins_SWAPFF(ins);
656
    // char *  op_ins_SWAPFF(char *ins){}
657
    else if(inscmp("0011110XXXXX",ins)==1)
658
    return op_ins_INCFSZW(ins);
659
    // char *op_ins_INCFSZW  (char *ins){}
660
    else if(inscmp("0011111XXXXX",ins)==1)
661
    return op_ins_INCFSZF(ins);
662
    // char * op_ins_INCFSZF (char *ins){}
663
    else if(inscmp("0100XXXXXXXX",ins)==1)
664
    return op_ins_BCF(ins);
665
    // char * op_ins_BCF (char *ins){}
666
    else if(inscmp("0101XXXXXXXX",ins)==1)
667
    return op_ins_BSF(ins);
668
    // char *  op_ins_BSF(char *ins){}
669
    else if(inscmp("0110XXXXXXXX",ins)==1)
670
    return op_ins_BTFSC(ins);
671
    // char *  op_ins_BTFSC(char *ins){}
672
    else if(inscmp("0111XXXXXXXX",ins)==1)
673
    return op_ins_BTFSS(ins);
674
    // char * op_ins_BTFSS (char *ins){}
675
    else if(inscmp("1000XXXXXXXX",ins)==1)
676
    return op_ins_RETLW(ins);
677
    // char *  op_ins_RETLW(char *ins){}
678
    else if(inscmp("1001XXXXXXXX",ins)==1)
679
    return op_ins_CALL(ins);
680
    // char * op_ins_CALL (char *ins){}
681
    else if(inscmp("101XXXXXXXXX",ins)==1)
682
    return op_ins_GOTO(ins);
683
    // char *  op_ins_GOTO( (char *ins){}
684
    else if(inscmp("1100XXXXXXXX",ins)==1)
685
    return op_ins_MOVLW(ins);
686
    // char * op_ins_MOVLW (char *ins){}
687
    else if(inscmp("1101XXXXXXXX",ins)==1)
688
    return op_ins_IORLW(ins);
689
    // char *  op_ins_IORLW(char *ins){}
690
    else if(inscmp("1110XXXXXXXX",ins)==1)
691
    return op_ins_ANDLW(ins);
692
    // char * op_ins_ANDLW (char *ins){}
693
    else if(inscmp("1111XXXXXXXX",ins)==1)
694
    return op_ins_XORLW(ins);
695
    // char *  op_ins_XORLW(char *ins){}
696
    return NULL ;
697
}
698
 
699
/*  Input and Output file streams. */
700
FILE*fpi ;
701
 
702
/*  Well.. Let's read stuff in completely before outputting.. Programs */
703
/*  should be pretty small.. */
704
/*  */
705
#define MAX_MEMORY_SIZE 1024
706
struct
707
{
708
int nAddress ;
709
     int byData ;
710
    char ins[30];
711
    char dasm[30];
712
}
713
 
714
 
715
Memory[MAX_MEMORY_SIZE];
716
 
717
char szLine[80];
718
unsigned int start_address,address,ndata_bytes,ndata_words ;
719
unsigned int data ;
720
unsigned int nMemoryCount ;
721
char mif_fn[20]=
722
{
723
 
724
}
725
;
726
char fin[20]=
727
{
728
 
729
}
730
;
731
 
732
char ins_tsted[100][10];
733
int index=0;
734
void init1(void){
735
int i,j;
736
    for(i=0;i<100;++i)
737
    for(j=0;j<10;++j)
738
    ins_tsted[i][j]=0;
739
    index=0;
740
}
741
 
742
void add_ins(char *ins){
743
int i;
744
for(i=0;i<=index;++i)
745
if (strcmp(ins_tsted[i],ins)==0) return ;
746
++index;
747
//printf("add string >%s<\n",ins);getchar();
748
strcpy(ins_tsted[index],ins);
749
}
750
 
751
int main(int argc,char*argv[])
752
{
753
 
754
 
755
    int i ;
756
       int addr_wdt,wd_no;
757
    int max=0;
758
   init1();
759
 
760
    if(argc==2)strcpy(fin,argv[1]);
761
    else
762
    {
763
   //     printf("\nThe Synthetic PIC --- Intel HEX File to Altera memory file");
764
   //     printf("\nUsage: hex2mif <infile>");
765
  //      printf("\n");
766
        getchar();
767
        return 0 ;
768
        printf("Input Hex file name:");
769
        scanf("%s",fin);
770
        printf("Input Mif file name:");
771
        scanf("%s",mif_fn);
772
    }
773
 
774
 
775
 
776
    /*  Open input HEX file */
777
    fpi=fopen(argv[1],"r");
778
    if(!fpi)
779
    {
780
        printf("\nCan't open input file %s.\n",argv[1]);
781
        return 1 ;
782
    }
783
 
784
    /*  Read in the HEX file */
785
    /*  */
786
    /*  !! Note, that things are a little strange for us, because the PIC is */
787
    /*     a 12-bit instruction, addresses are 16-bit, and the hex format is */
788
    /*     8-bit oriented!! */
789
    /*  */
790
    nMemoryCount=0 ;
791
    while(!feof(fpi))
792
    {
793
        /*  Get one Intel HEX line */
794
        fgets(szLine,80,fpi);
795
        if(strlen(szLine)>=10)
796
        {
797
            /*  This is the PIC, with its 12-bit "words".  We're interested in these */
798
            /*  words and not the bytes.  Read 4 hex digits at a time for each */
799
            /*  address. */
800
            /*  */
801
            sscanf(&szLine[1],"%2x%4x",&ndata_bytes,&start_address);
802
            if(start_address>=0&&start_address<=20000&&ndata_bytes>0)
803
            {
804
                /*  Suck up data bytes starting at 9th byte. */
805
                i=9 ;
806
 
807
                /*  Words.. not bytes.. */
808
                ndata_words=ndata_bytes/2 ;
809
                start_address=start_address/2 ;
810
 
811
                /*  Spit out all the data that is supposed to be on this line. */
812
                for(address=start_address;address<start_address+ndata_words;address++)
813
                {
814
                    /*  Scan out 4 hex digits for a word.  This will be one address. */
815
                    sscanf(&szLine[i],"%04x",&data);
816
 
817
                    /*  Need to swap bytes... */
818
                    data=((data>>8)&0x00ff)|((data<<8)&0xff00);
819
                    i+=4 ;
820
 
821
                    /*  Store in our memory buffer */
822
                    Memory[nMemoryCount].nAddress=address ;
823
                    Memory[nMemoryCount].byData=data ;
824
                    nMemoryCount++;
825
                }
826
            }
827
        }
828
    }
829
    fclose(fpi);
830
 
831
    /*
832
            for(i=0;;++i)
833
            {
834
                mif_fn[i]=fin[i];
835
                if(mif_fn[i]=='.')
836
                {
837
                    mif_fn[i+1]='m' ;
838
                    mif_fn[i+2]='i' ;
839
                    mif_fn[3+i]='f' ;
840
                    mif_fn[4+i]=0 ;
841
                    break ;
842
                }
843
            }
844
                                  */
845
 
846
    strcpy(mif_fn,"init_file.mif");
847
 
848
    fpi=fopen(mif_fn,"w");
849
    if(NULL==fpi)return ;
850
    /*  Now output the Verilog $readmemh format! */
851
    /*  */
852
 
853
    /*  Now output the Verilog $readmemh format! */
854
    /*  */
855
    fprintf(fpi,"WIDTH=12;\nDEPTH=2048;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
856
    printf("WIDTH=8;\nDEPTH=256;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
857
    printf("Email:McuPro@163.com\n");
858
 
859
    for(i=0;i<nMemoryCount;i++)
860
    {
861
      //  printf("%X : %X;\n",Memory[i].nAddress,Memory[i].byData);
862
        fprintf(fpi,"%4X : %4X;\n",Memory[i].nAddress,Memory[i].byData);
863
    }
864
 
865
    fprintf(fpi,"\END;\n");
866
    printf("\END;\n");
867
    close(fpi);
868
    /*output simulate verilog code */
869
    /*
870
            for(i=0;;++i)
871
            {
872
                mif_fn[i]=fin[i];
873
                if(mif_fn[i]=='.')
874
                {
875
                    mif_fn[i+1]='v' ;
876
                    mif_fn[i+2]=0 ;
877
                    break ;
878
                }
879
            }
880
                            */
881
 
882
    strcpy(mif_fn,"sim_rom.v");
883
 
884
    fpi=fopen(mif_fn,"w");
885
    if(NULL==fpi)return ;
886
    fprintf(fpi,"//This file was created by a tool wrietten with C.\n");
887
    fprintf(fpi,"module sim_rom (\n");
888
    fprintf(fpi,"    address,\n");
889
    fprintf(fpi,"    clock,\n");
890
    fprintf(fpi,"    q);\n");
891
    fprintf(fpi,"    input    [10:0]  address;\n");
892
    fprintf(fpi,"    input      clock;\n");
893
    fprintf(fpi,"    output    [11:0]  q;\n");
894
    fprintf(fpi,"    \n");
895
    fprintf(fpi,"reg [10:0]    address_latched;\n");
896
    fprintf(fpi,"// Instantiate the memory array itself.\n");
897
    fprintf(fpi,"reg [11:0]    mem[0:2048-1];\n");
898
    fprintf(fpi,"initial begin \n");
899
    for(i=0;i<nMemoryCount;i++)
900
    {
901
    //    printf("mem[%05d] = s;\n",Memory[i].nAddress,Memory[i].ins);
902
        fprintf(fpi,"mem[%04d] = 12'b%s;\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
903
        }
904
    fprintf(fpi,"end\n");
905
    fprintf(fpi,"// Latch address\n");
906
    fprintf(fpi,"always @(posedge clock)\n");
907
    fprintf(fpi,"   address_latched <= address;\n");
908
    fprintf(fpi,"   \n");
909
    fprintf(fpi,"// READ\n");
910
    fprintf(fpi,"assign q = mem[address_latched];\n");
911
    fprintf(fpi,"\n");
912
    fprintf(fpi,"endmodule\n");
913
    fprintf(fpi,"\n");
914
    fprintf(fpi,"/*\n");
915
        for(i=0;i<nMemoryCount;i++)
916
    {
917
    //    printf("%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
918
        //     sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
919
        fprintf(fpi,"%04d: %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
920
        // fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
921
    }
922
    fprintf(fpi,"*/\n/*\ncovered instructions:\n");
923
 
924
    for(i=0;i<=index;++i)
925
    {
926
        fprintf(fpi,"%s\n",ins_tsted[i]);
927
    }
928
        fprintf(fpi,"*/\n");
929
    close(fpi);
930
 
931
 
932
    strcpy(mif_fn,"tested_instructions.txt");
933
     fpi=fopen(mif_fn,"w");
934
        for(i=0;i<=index;++i)
935
    {
936
        fprintf(fpi,"%s\n",ins_tsted[i]);
937
    }
938
            close(fpi);
939
 
940
    fpi=fopen(mif_fn,"w");
941
 
942
 
943
 
944
    strcpy(mif_fn,"Dasm.txt");
945
 
946
    fpi=fopen(mif_fn,"w");
947
    for(i=0;i<nMemoryCount;i++)
948
    {
949
    //   fprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
950
        //     sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
951
        fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
952
        // fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
953
    }
954
    close(fpi);
955
    //   getchar();
956
 
957
 
958
    strcpy(mif_fn,"alt_mem_set.h");
959
 
960
    fpi=fopen(mif_fn,"w");
961
    for(i=0;i<nMemoryCount;i++)
962
    {
963
    if ((Memory[i].nAddress==2047)&&(Memory[i-1].nAddress!=2046))continue;
964
    if ((Memory[i].nAddress==1023)&&(Memory[i-1].nAddress!=1022))continue;
965
    if (Memory[i].nAddress>max) max=Memory[i].nAddress;
966
    //   Memory[i].nAddressfprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
967
        //     sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
968
        //fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
969
        // fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
970
       // fprintf(fpi,"mem[%d] = %d;\n",
971
    }
972
    addr_wdt = func1(max);
973
      fprintf(fpi,"`define     ALT_MEM_WIDTHAD   %d\n",addr_wdt);
974
      fprintf(fpi,"`define     ALT_MEM_NUMWORDS  %d\n",1<<addr_wdt);
975
        fprintf(fpi,"`define      MIF_NAME  %s\n\n","init_file.mif");
976
 
977
    close(fpi);
978
    //   getchar();
979
}
980
 

powered by: WebSVN 2.1.0

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