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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [ASID/] [1664.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mrdmkg
#include "cpu_1664.h"
2
#include <stdio.h>
3
 
4
#define scrive (P)scrive_stdout
5
 
6
int main(int argc, char **argv)
7
{
8
 
9
 if (argc>1)
10
 {
11
  char fix_imaje_model[]="1664.imaje";
12
  char fix_jornal_cadena[]="1664.jornal";
13
  nM memoria_cuantia=0;
14
  struct lista *lista_enflue;
15
  struct cpu_1664 *cpu = cpu_1664_nova(1024*1024*2);
16
  char *cadena_fix_esflue=fix_imaje_model;
17
  char *cadena_fix_enflue;
18
  nN contador_ante=0;
19
  nN a=1;
20
  nN i;
21
  nN bool_debug=0;
22
  nN bool_parolos=0;
23
  nN bool_core=0;
24
  cpu->opera_lista[cpu_1664_opera_imita]=cpu_1664_opera__imita;
25
  cpu->imita_argc=argc;
26
  cpu->imita_argv=argv;
27
  FILE *fix_esflue;
28
  FILE *fix_enflue;
29
  n1 *fix_enflue_datos;
30
  n8 fix_enflue_datos_cuantia;
31
  nN filo_cuantia=3;
32
 
33
  while(a<argc)
34
  {
35
 
36
   switch(argv[a][0])
37
   {
38
    default:
39
     a++;
40
     break;
41
 
42
    case '+': //parametre arg imita
43
     a++;
44
     break;
45
 
46
    case '-':
47
 
48
     switch(argv[a][1])
49
     {
50
      case 'v':
51
       a++;
52
       bool_parolos=1;
53
       break;
54
 
55
      case 'f':
56
       a++;
57
       lista_enflue=lista_nova__ccadena(".inclui ");
58
       lista_ajunta__ccadena(lista_enflue, argv[a]);
59
       cpu_1664_asm_ajunta__cadena(cpu, lista_enflue->datos, lista_enflue->contador);
60
       lista_libri(lista_enflue);
61
       if(bool_parolos) cadena__f(scrive, "[0x%.*x] %s\n",sizeof(cpu_1664_sinia_t)*2, (n8)(cpu->lista_imaje_asm->contador-contador_ante), argv[a]);
62
       contador_ante=cpu->lista_imaje_asm->contador;
63
       a++;
64
       break;
65
 
66
      case 'I':
67
       a++;
68
       lista_ajunta__P(cpu->lista_inclui_curso, lista_nova__ccadena(argv[a++]));
69
       break;
70
 
71
      case 'm':
72
       a++;
73
       memoria_cuantia=nN__desimal_cadena((n1 *)argv[a], nN_cuantia__ccadena(argv[a]));
74
       lista_crese(cpu->lista_imaje, memoria_cuantia);
75
       a++;
76
       break;
77
 
78
      case 'd':
79
       bool_debug=1;
80
       bool_core=1;
81
       a++;
82
       break;
83
 
84
      case 'B':
85
       a++;
86
       cadena_fix_enflue=argv[a];
87
       fix_enflue=fopen(cadena_fix_enflue, "r");
88
       fseek(fix_enflue, 0, SEEK_END);
89
       fix_enflue_datos_cuantia=ftell(fix_enflue);
90
       rewind(fix_enflue);
91
       fix_enflue_datos=(n1*)memoria_nova(fix_enflue_datos_cuantia);
92
       fread(fix_enflue_datos, 1, fix_enflue_datos_cuantia, fix_enflue);
93
       if(bool_parolos) cadena__f(scrive, "imaje [0x%x] << %s [0x%x]",(n8)cpu->lista_imaje->contador, cadena_fix_enflue, fix_enflue_datos_cuantia); fflush(0);
94
       cpu_1664_imaje_ajunta__datos(cpu, fix_enflue_datos, fix_enflue_datos_cuantia);
95
       if(bool_parolos) cadena__f(scrive,"\n");
96
       memoria_libri(fix_enflue_datos);
97
       fclose(fix_enflue);
98
       a++;
99
       break;
100
 
101
      case 'b':
102
       a++;
103
       cadena_fix_esflue=argv[a];
104
       if(bool_parolos) cadena__f(scrive, "imaje > %s",cadena_fix_esflue); fflush(0);
105
       fix_esflue=fopen(cadena_fix_esflue, "w");
106
       cadena__f(scrive, " [0x%x]\n", (n8)cpu->lista_imaje_asm->contador);
107
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
108
       fclose(fix_esflue);
109
       a++;
110
       break;
111
 
112
      case 'e':
113
       bool_core=1;
114
       a++;
115
       break;
116
 
117
      case 'L':
118
       a++;
119
       filo_cuantia=nN__desimal_cadena((n1 *)argv[a], nN_cuantia__ccadena(argv[a]));
120
       a++;
121
       break;
122
     }
123
     break;
124
 
125
   }
126
  }
127
  if(cpu->asm_eror!=0)
128
  {
129
   cadena__f(scrive,"aborte: eror asm\n");
130
   return 1;
131
  }
132
 
133
  if(!bool_core) _exit(0);
134
 
135
  cpu_1664_imaje_ajunta__lista(cpu, cpu->lista_imaje_asm);
136
 
137
  if(!bool_debug)
138
  {
139
   cpu_1664__pasi(cpu, (n8)-1);
140
  }
141
 
142
  struct lista *lista_jornal_opera=lista_nova(0);
143
  struct lista *lista_jornal_desloca=lista_nova(0);
144
  struct lista *lista_jornal_mapa=lista_nova(0);
145
 
146
  cpu_1664_sinia_t *sinia_ante;
147
  cpu_1664_sinia_t sinia_ante_usor[1<<cpu_1664_bitio_r];
148
  cpu_1664_sinia_t sinia_ante_vantaje[1<<cpu_1664_bitio_r];
149
  cpu_1664_opera_t parola;
150
  cpu_1664_sinia_t sIP_egali=(cpu_1664_sinia_t)-1;
151
 
152
  nN pasi_cuantia=1;
153
 
154
  for(i=0;i<1<<cpu_1664_bitio_r;i++)
155
  {
156
   sinia_ante_usor[i]=0;
157
   sinia_ante_vantaje[i]=0;
158
  }
159
  n1 bool_sicle_fini=0;
160
  n1 bool_pausa=0;
161
  n1 bool_bp=0;
162
  n1 bool_depende;
163
  n1 bool_eseta;
164
 
165
  while(bool_sicle_fini==0)
166
  {
167
   bool_eseta=0;//cpu->sinia[cpu_1664_sinia_IP]==0;
168
   bool_pausa=(cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP], (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0)==(cpu_1664_opera_t)(-1));
169
 
170
   n1 opera_depende=(cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP], (1<<cpu_1664_umm_usor_mapa_permete_esecuta), 1, 0)>>5)&0x07;
171
 
172
   bool_depende=opera_depende==7||cpu->depende[opera_depende]!=0;
173
   bool_bp=bool_depende&&((cpu_1664_opera_t)(cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP], (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0))&0xff1f)==(cpu_1664_opera_t)(cpu_1664_opera_rev|(cpu_1664_opera_rev_bp<<8));
174
 
175
   if(cpu->vantaje==1)
176
   {
177
    sinia_ante=sinia_ante_vantaje;
178
   }
179
   else
180
   {
181
    sinia_ante=sinia_ante_usor;
182
   }
183
 
184
   if ((bool_eseta&&(cpu->contador_sicle!=0))||bool_sicle_fini||bool_pausa||bool_bp)
185
   {
186
    pasi_cuantia=1;
187
   }
188
 
189
   if ((sIP_egali!=(cpu_1664_sinia_t)-1)&&(cpu->sinia[cpu_1664_sinia_IP]==sIP_egali))
190
   {
191
    sIP_egali=(cpu_1664_sinia_t)-1;
192
    pasi_cuantia=1;
193
   }
194
 
195
   if(pasi_cuantia<=1)
196
   {
197
    //consola_leje_carater();
198
   fflush(stdout);cadena_ANSI__atribuida(scrive,40);
199
   fflush(stdout);cadena_ANSI_limpa(scrive);
200
   fflush(stdout);cadena_ANSI_cursor_orijin(scrive);
201
   nN j;
202
   nN s;
203
   for(s=0; s<(1<<(cpu_1664_bitio_r-2));s++)
204
   {
205
 
206
    for(j=0;j<(1<<2);j++)
207
    {
208
     nN indise=(s<<2)+j;
209
 
210
     if(indise==cpu_1664_sinia_IP)
211
     {
212
      fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,32);
213
     }
214
     else if(sinia_ante[indise]!=cpu->sinia[indise])
215
     {
216
      fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,36);
217
     }
218
     else
219
     {
220
      fflush(stdout);cadena_ANSI__3atribuida(scrive,2,40,37);
221
     }
222
     sinia_ante[indise]=cpu->sinia[indise];
223
     cadena__f(scrive, "%.*x ",sizeof(cpu_1664_sinia_t)*2,(n8)cpu->sinia[indise]);
224
    }
225
    scrive_stdout("\n",1);
226
   }
227
   fflush(stdout);cadena_ANSI__atribuida(scrive,11);
228
   j=-1;
229
   parola=cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP]+(2*(j+1)), (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0);
230
   cadena__f(scrive, "sicle %.*x usor %.*x limite %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->contador_sicle,sizeof(cpu_1664_sinia_t)*2,cpu->contador_sicle_usor,sizeof(cpu_1664_sinia_t)*2,(n8)cpu->contador_sicle_usor_limite);
231
   fflush(stdout);cadena_ANSI__2atribuida(scrive,1,36);
232
 
233
   if(cpu->depende[cpu_1664_depende_bitio_depende_influe]!=0)
234
   {
235
    cadena__f(scrive, "(esflue) ");
236
   }
237
   else
238
   {
239
    cadena__f(scrive, "(inoria) ");
240
   }
241
 
242
   cadena__f(scrive, "depende : ");
243
   cadena__f(scrive, "%c",('0')&0xff*(cpu->depende[0]!=0));
244
   cadena__f(scrive, "%c",('1')&0xff*(cpu->depende[1]!=0));
245
   cadena__f(scrive, "%c",('2')&0xff*(cpu->depende[2]!=0));
246
   cadena__f(scrive, "%c",('3')&0xff*(cpu->depende[3]!=0));
247
   cadena__f(scrive, "%c",('4')&0xff*(cpu->depende[4]!=0));
248
   cadena__f(scrive, "%c",('5')&0xff*(cpu->depende[5]!=0));
249
   cadena__f(scrive, "%c",('6')&0xff*(cpu->depende[6]!=0));
250
   cadena__f(scrive, "\n");
251
 
252
   fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,37);
253
   fflush(stdout);cadena_ANSI__cursor_desende(scrive,filo_cuantia-1);
254
   for(j=0;j<filo_cuantia;j++)
255
   {
256
    fflush(stdout);cadena_ANSI__cursor_sinistra(scrive,100);
257
    cpu_1664_sinia_t mapa=0;
258
    cpu_1664_sinia_t desloca=0;
259
    cpu_1664_opera_t parola=0;
260
    {
261
     //*** x86
262
     //mapa=((cpu_1664_sinia_t *)(lista_jornal_mapa->datos))[(lista_jornal_mapa->contador/sizeof(cpu_1664_sinia_t))-j-1];
263
     desloca=((cpu_1664_sinia_t *)(lista_jornal_desloca->datos))[(lista_jornal_desloca->contador/sizeof(cpu_1664_sinia_t))-j-1];
264
     parola=((cpu_1664_opera_t *)(lista_jornal_opera->datos))[(lista_jornal_opera->contador/sizeof(cpu_1664_opera_t))-j-1];
265
    }
266
    cadena__f(scrive, "%.*x : ",4,(n8)mapa);
267
    cadena__f(scrive, "%.*x %.*x ",sizeof(cpu_1664_sinia_t)*2,(n8)desloca,4,(n8)parola);
268
 
269
    struct lista *lista_dev=cpu_1664_dev_dev(cpu, cpu->sinia[cpu_1664_sinia_IP], parola);
270
 
271
    struct lista *_lista_dev_dev_depende=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[0];
272
    struct lista *_lista_dev_dev_opera=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[1];
273
 
274
    struct lista *_lista_dev_parametre=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[0];
275
    printf("%s ",_lista_dev_dev_depende->datos);
276
    printf("%s ",_lista_dev_dev_opera->datos);
277
    printf("%s ",_lista_dev_parametre->datos);
278
    fflush(stdout);cadena_ANSI__cursor_asende(scrive, 1);
279
   }
280
    fflush(stdout);cadena_ANSI__cursor_desende(scrive,filo_cuantia+1); fflush(stdout);cadena_ANSI__cursor_sinistra(scrive,100);
281
 
282
   for(j=0;j<filo_cuantia;j++)
283
   {
284
 
285
    if(j==0)
286
    {
287
     fflush(stdout);cadena_ANSI__3atribuida(scrive,40,1,36);
288
    }
289
    else
290
    {
291
     fflush(stdout);cadena_ANSI__3atribuida(scrive,2,40,37);
292
    }
293
    parola=cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP]+(2*(j+0-0)), (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0);
294
    cadena__f(scrive, "%.*x : ",4,cpu->umm_memoria[0]*!cpu->vantaje);
295
    cadena__f(scrive, "%.*x %.*x ",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]+(2*(j+0-0)),4,parola);
296
 
297
    struct lista *lista_dev=cpu_1664_dev_dev(cpu, cpu->sinia[cpu_1664_sinia_IP], parola);
298
 
299
    struct lista *_lista_dev_dev_depende=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[0];
300
    struct lista *_lista_dev_dev_opera=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[1];
301
 
302
    struct lista *_lista_dev_parametre=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[0];
303
    struct lista *_lista_dev_informa=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[1];
304
    printf("%s ",_lista_dev_dev_depende->datos);
305
    printf("%s ",_lista_dev_dev_opera->datos);
306
    printf("%s ",_lista_dev_parametre->datos);
307
    if(j==0)
308
    {
309
     if(pasi_cuantia<=1)printf("; %s",_lista_dev_informa->datos);
310
    }
311
    if(pasi_cuantia<=1)printf("\n");
312
    cpu_1664_dev_dev_libri(lista_dev);
313
   }
314
   }
315
   #define limite_jornal 1000000
316
   if((lista_jornal_opera->contador/sizeof(cpu_1664_opera_t))<limite_jornal)
317
   {
318
    lista_ajunta__cpu_1664_parola_t(lista_jornal_opera, cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP], (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0));
319
    lista_ajunta__cpu_1664_sinia_t(lista_jornal_desloca, cpu->sinia[cpu_1664_sinia_IP]);
320
    lista_ajunta__cpu_1664_sinia_t(lista_jornal_mapa, cpu->umm_memoria[0]*!cpu->vantaje);
321
   }
322
   if (--pasi_cuantia>0)
323
   {
324
    cpu_1664__pasi(cpu, 1);
325
    continue;
326
   }
327
   else
328
   {
329
    pasi_cuantia=1;
330
   }
331
   n1 c=consola_leje_carater();
332
   switch (c)
333
   {
334
    case 'n':
335
    default:
336
     cpu_1664__pasi(cpu, 1);
337
     break;
338
 
339
    case 'm':
340
     sIP_egali=cpu->sinia[cpu_1664_sinia_IP]+sizeof(cpu_1664_opera_t);
341
     cpu_1664__pasi(cpu, 1);
342
     pasi_cuantia=-1;
343
     break;
344
 
345
    case 'N':
346
     cpu->sinia[cpu_1664_sinia_IP]+=sizeof(cpu_1664_opera_t);
347
     break;
348
 
349
    case 'c':
350
     cpu_1664__pasi(cpu, 1);
351
     pasi_cuantia=-1;
352
     break;
353
 
354
    case 'q':
355
     bool_sicle_fini=1;
356
     fflush(stdout);cadena_ANSI__atribuida(scrive,0);
357
     break;
358
 
359
    case ':':
360
     fflush(stdout);cadena_ANSI__3atribuida(scrive,40,1,36);
361
     cadena__f(scrive, "comanda : ");fflush(0);
362
 
363
     switch(consola_leje_carater())
364
     {
365
      case 'd':
366
       cadena__f(scrive, "imaje > %s",cadena_fix_esflue); fflush(0);
367
       fix_esflue=fopen(cadena_fix_esflue, "w");
368
       cadena__f(scrive, " [0x%x]\n", cpu->lista_imaje_asm->contador);
369
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
370
       fclose(fix_esflue);
371
       consola_leje_carater(); //pausa
372
       break;
373
 
374
      case 'j':
375
       cadena__f(scrive, "jornal > %s",fix_jornal_cadena); fflush(0);
376
       fix_esflue=fopen(fix_jornal_cadena, "w");
377
       cadena__f(scrive, " [0x%x]\n", cpu->lista_imaje_asm->contador);
378
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
379
       fclose(fix_esflue);
380
       consola_leje_carater(); //pausa
381
       break;
382
     }
383
 
384
     break;
385
   }
386
 
387
  }
388
  cadena__f(scrive, "> [%.*x] %.*x\n",6,cpu->sinia[cpu_1664_sinia_IP],sizeof(cpu_1664_opera_t)*2,cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_IP], (1<<cpu_1664_umm_usor_mapa_permete_esecuta), sizeof(cpu_1664_opera_t), 0));
389
 
390
  lista_libri(lista_jornal_opera);
391
  lista_libri(lista_jornal_desloca);
392
  lista_libri(lista_jornal_mapa);
393
  cpu_1664_libri(cpu);
394
  return 0;
395
 }
396
 else
397
 {
398
  cadena__f(scrive, " <-v> parolas\n <-d> desdefetador\n <-e> imita\n <-I inclui_curso>\n <-f fonte.1664>\n <-B binario_enflue>\n <-b binario_esflue>\n <-m memoria_cuantia>\n <-L filo_cuantia>\n");
399
  return 0;
400
 }
401
 
402
}

powered by: WebSVN 2.1.0

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