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

Subversion Repositories ncore

[/] [ncore/] [web_uploads/] [SIM.C] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
//STEFAN, Istvan
2
//Little endian???
3
//published under GPL
4
//Version of the core
5
 
6
#include 
7
#include 
8
int version=3;
9
//Instruction's names
10
#define MAXCMD 16
11
char *cmds[MAXCMD+1]={"coA","coB","add","sub","mvA","mvB","shl","shr"
12
                ,"and","orr","xor","jmp","Fmv","mvD","Dmv","mvP",""};
13
char *cmds2[MAXCMD+1]={"mvA","coA","mvB","coB","csB","shl","shr","and"
14
                ,"orr","xor","add","sub","cal","ret","Imv","jmp",""};
15
char *cmds3[MAXCMD+1]={"mvA","coA","mvB","coB","csB","shl","shr","and"
16
                ,"orr","xor","add","sub","int","ire","Imv","jmp",""};
17
//Register's names
18
#define MAXREG 16
19
char *regs[MAXREG+1]={"r0","r1","r2","r3","r4","r5","r6","r7"
20
                ,"r8","r9","r10","r11","r12","r13","r14","r15",""};
21
 
22
//Table of the registres
23
unsigned regtab[16];
24
unsigned IP,DP,SP;//The Instruction Pointer, data, stack
25
unsigned A,B;//The two hidden registers
26
unsigned irq=0;//Interrupt
27
 
28
int htu(char * name){
29
    printf("nCore simulator by STEFAN, Istvan\n");
30
    printf("%s program\n",name);
31
    return -1;
32
}
33
 
34
int freshreg(){
35
    int i;
36
    for(i=0;i<16;i++)
37
        mvprintw(3+i%4,(i/4)*10,"Reg%d:%d",i,regtab[i]);
38
    mvprintw(7,0,"IP:%d A:%d B:%d DP:%d SP:%d",IP,A,B,DP,SP);
39
    return 0;
40
}
41
 
42
int freshdata(int DP,int datal,unsigned *data){
43
    int i;
44
    for(i=DP;i<((DP+16>datal)?datal:DP+16);i++)
45
        mvprintw(9+i/4,(i%4)*14,"Dat[%d]:%d",i,data[i]);
46
    return 0;
47
}
48
 
49
int freshtext(int IP,int textl,unsigned char* text){
50
    int i,j=((IP+18>textl)?textl:IP+18);
51
//    for(i=IP;i
52
    for(i=0;i<(j-IP);i++)
53
        switch(version){
54
        case 1:
55
            mvprintw(15+i%6,(i/6)*20,"Tex[IP+%d]:%s %d",
56
                            i,cmds[text[i+IP]>>4],text[i+IP]&15);
57
        case 2:
58
            mvprintw(15+i%6,(i/6)*20,"Tex[IP+%d]:%s %d",
59
                            i,cmds2[text[i+IP]>>4],text[i+IP]&15);
60
        case 3:
61
            mvprintw(15+i%6,(i/6)*20,"Tex[IP+%d]:%s %d",
62
                            i,cmds3[text[i+IP]>>4],text[i+IP]&15);
63
        }
64
    return 0;
65
}
66
#undef debug
67
#define debug
68
int runInst(unsigned char inst){
69
int par=inst&15;
70
/*char *cmds[MAXCMD+1]={"coA","coB","add","sub","mvA","mvB","shl","shr"
71
                ,"and","orr","xor","jmp","Fmv","mvD","Dmv","mvP",""};
72
*/
73
#ifdef debug
74
    mvprintw(1,0,"par=%d",par);
75
#endif
76
switch(version){
77
    case 3:
78
        switch(inst>>4){
79
            case 0:A=regtab[par];//mvA
80
                break;
81
            case 1:A=par;//coA
82
                break;
83
            case 2:B=regtab[par];//mvB
84
                break;
85
            case 3:B=par;//coB
86
                break;
87
            case 4:B=(B<<4)+par;//csB
88
                break;
89
            case 5:regtab[par]=A<
90
                break;
91
            case 6:regtab[par]=A>>B;//shr
92
                break;
93
            case 7:regtab[par]=A&B;//and
94
                break;
95
            case 8:regtab[par]=A|B;//orr
96
                break;
97
            case 9:regtab[par]=A^B;//xor
98
                break;
99
            case 10:regtab[par]=A+B;//add
100
                break;
101
            case 11:regtab[par]=A-B;//sub
102
                break;
103
            case 12:irq=1;
104
                    IP=16;//int
105
                break;
106
            case 13:irq=0;//ire
107
                    IP=regtab[12];
108
                break;
109
            case 14:regtab[par]=IP;//Imv
110
                break;
111
            case 15:if(A&1)
112
                        IP=regtab[par];//jmp
113
                break;
114
        }
115
    }
116
    return 0;
117
}
118
 
119
#undef debug
120
#define debug
121
int main(int par,char **pars){
122
    FILE *f;
123
    unsigned char *text;//.text section
124
    unsigned *data,*stack;//.data,.stack sections
125
    unsigned long textl, datal,stackl;//Long of the sections
126
    unsigned long i=0,j=0,k=0,add_init=0,add=0;//32 bit variables
127
    if(par!=2)
128
        return htu(pars[0]);
129
 
130
    if(!(f=fopen(pars[1],"ro"))){
131
        printf("Error opening the file %s\nQuitting\n",pars[1]);
132
        return -1;
133
        }
134
//Init the hidden regs
135
    A=0;
136
    B=0;
137
    irq=0;
138
//Read the version of the used instruction set
139
    //Little endian reading
140
    j=fgetc(f);
141
    j+=fgetc(f)*(1<<8);
142
    j+=fgetc(f)*(1<<16);
143
    j+=fgetc(f)*(1<<24);
144
    version=j;
145
#ifdef debug
146
//    mvprintw(0,0,"Address of the __main function:%ld\n",j);
147
    printf("Version of the instruction set:%ld\n",j);
148
#endif
149
 
150
    //Little endian reading
151
    j=fgetc(f);
152
    j+=fgetc(f)*(1<<8);
153
    j+=fgetc(f)*(1<<16);
154
    j+=fgetc(f)*(1<<24);
155
#ifdef debug
156
//    mvprintw(0,0,"Address of the __main function:%ld\n",j);
157
    printf("Address of the __main function:%ld\n",j);
158
#endif
159
    IP=j;//Address of the main function
160
    DP=0;//Data pointer
161
 
162
    j=fgetc(f);
163
    j+=fgetc(f)*(1<<8);
164
    j+=fgetc(f)*(1<<16);
165
    j+=fgetc(f)*(1<<24);
166
#ifdef debug
167
    printf("Length of the stack:%d\n",j);
168
#endif
169
    stackl=(unsigned)j;
170
    stack=(unsigned*)calloc(stackl,sizeof(unsigned));
171
    SP=DP+stackl;
172
#ifdef debug
173
    printf("Pointer of the stack:%d\n",SP);
174
#endif
175
 
176
    j=fgetc(f);
177
    j+=fgetc(f)*(1<<8);
178
    j+=fgetc(f)*(1<<16);
179
    j+=fgetc(f)*(1<<24);
180
#ifdef debug
181
    printf("Length of the first section(.data):%ld\n",j);
182
#endif
183
    datal=j;
184
    data=(unsigned*)calloc(datal,sizeof(unsigned));
185
    for(i=0;i
186
        j=fgetc(f);
187
        j+=fgetc(f)*(1<<8);
188
        j+=fgetc(f)*(1<<16);
189
        j+=fgetc(f)*(1<<24);
190
        data[i]=j;
191
#ifdef debug
192
        printf("Readed data:%d\n",j);
193
#endif
194
        }
195
 
196
    j=fgetc(f);
197
    j+=fgetc(f)*(1<<8);
198
    j+=fgetc(f)*(1<<16);
199
    j+=fgetc(f)*(1<<24);
200
#ifdef debug
201
    printf("Length of the second section(.text):%ld\n",j);
202
#endif
203
    textl=j;
204
    text=(unsigned char*)calloc(textl,sizeof(unsigned char));
205
    i=0;
206
    if(i>=0)
207
    while((i
208
//    for(i=0;i
209
        j=fgetc(f);
210
        text[i]=j;
211
        i++;
212
#ifdef debug
213
        printf("Readed data:%d;%s:%s\n",j,cmds2[j>>4],cmds2[text[i-1]>>4]);
214
#endif
215
        }
216
 
217
#ifdef debug
218
    getchar();
219
#endif
220
    //Init the ncurses env
221
    initscr();
222
    cbreak();
223
    noecho();
224
 
225
do{
226
    clear();
227
    runInst(text[IP]);
228
    freshreg();
229
    freshdata(regtab[14],datal,data);
230
//    freshtext(add,textl,text);
231
    freshtext(IP,textl,text);
232
    IP++;
233
    }while((getch()=='r')&&(IP
234
 
235
//    freshtext(regtab[15],textl);
236
 
237
//    getch();
238
 
239
    //Close the ncurses env
240
    endwin();
241
    return 0;
242
}

powered by: WebSVN 2.1.0

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