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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_imita.c] - Rev 2

Compare with Previous | Blame | View Log

#include "cpu_1664.h"
#include <stdio.h>
 
#define filo_cuantia 10
#define scrive (P)scrive_stdout
 
int main(int argc, char **argv)
{
 
 if (argc>1)
 {
  char fix_imaje_model[]="1664.imaje";
  char fix_jornal_cadena[]="1664.jornal";
  nM memoria_cuantia=0;
  struct lista *lista_enflue;
  struct cpu_1664 *cpu = cpu_1664_nova(1024*1024*2);
  char *cadena_fix_esflue=fix_imaje_model;
  char *cadena_fix_enflue;
  nN contador_ante=0;
  nN a=1;
  nN i;
  nN bool_debug=0;
  nN bool_parolos=0;
  nN bool_core=0;
  cpu->opera_lista[cpu_1664_opera_imita]=cpu_1664_opera__imita;
  cpu->imita_argc=argc;
  cpu->imita_argv=argv;
  FILE *fix_esflue;
  FILE *fix_enflue;
  n1 *fix_enflue_datos;
  n8 fix_enflue_datos_cuantia;
 
  while(a<argc)
  {
 
   switch(argv[a][0])
   {
    default:
     a++;
     break;
 
    case '+': //parametre arg imita
     a++; 
     break;
 
    case '-':
 
     switch(argv[a][1])
     {
      case 'v':
       a++;
       bool_parolos=1;
       break;
 
      case 'f':
       a++;
       lista_enflue=lista_nova__ccadena(".inclui ");
       lista_ajunta__ccadena(lista_enflue, argv[a]);
       cpu_1664_asm_ajunta__cadena(cpu, lista_enflue->datos, lista_enflue->contador);
       lista_libri(lista_enflue);
       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]);
       contador_ante=cpu->lista_imaje_asm->contador;     
       a++;
       break;
 
      case 'I':
       a++;
       lista_ajunta__P(cpu->lista_inclui_curso, lista_nova__ccadena(argv[a++]));
       break;
 
      case 'm':
       a++;
       memoria_cuantia=nN__desimal_cadena((n1 *)argv[a], nN_cuantia__ccadena(argv[a]));
       lista_crese(cpu->lista_imaje, memoria_cuantia);
       a++;
       break;
 
      case 'd':
       bool_debug=1;
       bool_core=1;
       a++;
       break;
 
      case 'B':
       a++;
       cadena_fix_enflue=argv[a];
       fix_enflue=fopen(cadena_fix_enflue, "r");
       fseek(fix_enflue, 0, SEEK_END);
       fix_enflue_datos_cuantia=ftell(fix_enflue);
       rewind(fix_enflue);
       fix_enflue_datos=(n1*)memoria_nova(fix_enflue_datos_cuantia);
       fread(fix_enflue_datos, 1, fix_enflue_datos_cuantia, fix_enflue);
       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);
       cpu_1664_imaje_ajunta__datos(cpu, fix_enflue_datos, fix_enflue_datos_cuantia);
       if(bool_parolos) cadena__f(scrive,"\n");
       memoria_libri(fix_enflue_datos);
       fclose(fix_enflue);
       a++;
       break;
 
      case 'b':
       a++;
       cadena_fix_esflue=argv[a];
       if(bool_parolos) cadena__f(scrive, "imaje > %s",cadena_fix_esflue); fflush(0);
       fix_esflue=fopen(cadena_fix_esflue, "w");
       cadena__f(scrive, " [0x%x]\n", (n8)cpu->lista_imaje_asm->contador);
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
       fclose(fix_esflue);
       a++;
       break;
 
      case 'e':
       bool_core=1;
       a++;
       break;
     }
     break;
 
   }
  }
  if(cpu->asm_eror!=0)
  {
   cadena__f(scrive,"aborte: eror asm\n");
   return 1;
  }
 
  if(!bool_core) _exit(0);
 
  cpu_1664_imaje_ajunta__lista(cpu, cpu->lista_imaje_asm);
 
  if(!bool_debug)
  {
   cpu_1664__pasi(cpu, (n8)-1);
  }
 
  struct lista *lista_jornal_opera=lista_nova(0);
  struct lista *lista_jornal_desloca=lista_nova(0);
  struct lista *lista_jornal_mapa=lista_nova(0);
 
  cpu_1664_sinia_t *sinia_ante;
  cpu_1664_sinia_t sinia_ante_usor[1<<cpu_1664_bitio_r];
  cpu_1664_sinia_t sinia_ante_vantaje[1<<cpu_1664_bitio_r];
  cpu_1664_opera_t parola;
  cpu_1664_sinia_t sIP_egali=(cpu_1664_sinia_t)-1;
 
  nN pasi_cuantia=1;
 
  for(i=0;i<1<<cpu_1664_bitio_r;i++)
  {
   sinia_ante_usor[i]=0;
   sinia_ante_vantaje[i]=0;
  }
  n1 bool_sicle_fini=0;
  n1 bool_pausa=0;
  n1 bool_bp=0;
  n1 bool_depende;
  n1 bool_eseta;
 
  while(bool_sicle_fini==0)
  {
   bool_eseta=0;//cpu->sinia[cpu_1664_sinia_IP]==0;
   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));
 
   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;
 
   bool_depende=opera_depende==7||cpu->depende[opera_depende]!=0;
   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));
 
   if(cpu->vantaje==1)
   {
    sinia_ante=sinia_ante_vantaje;
   }
   else
   {
    sinia_ante=sinia_ante_usor;
   }
 
   if ((bool_eseta&&(cpu->contador_sicle!=0))||bool_sicle_fini||bool_pausa||bool_bp)
   {
    pasi_cuantia=1;
   }
 
   if ((sIP_egali!=(cpu_1664_sinia_t)-1)&&(cpu->sinia[cpu_1664_sinia_IP]==sIP_egali))
   {
    sIP_egali=(cpu_1664_sinia_t)-1;
    pasi_cuantia=1;
   }
 
   if(pasi_cuantia<=1)
   {
    //consola_leje_carater();
   fflush(stdout);cadena_ANSI__atribuida(scrive,40);
   fflush(stdout);cadena_ANSI_limpa(scrive);
   fflush(stdout);cadena_ANSI_cursor_orijin(scrive);
   nN j;
   nN s;
   for(s=0; s<(1<<(cpu_1664_bitio_r-2));s++)
   {
 
    for(j=0;j<(1<<2);j++)
    {
     nN indise=(s<<2)+j;
 
     if(indise==cpu_1664_sinia_IP)
     {
      fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,32);
     }
     else if(sinia_ante[indise]!=cpu->sinia[indise])
     {
      fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,36);
     }
     else
     {
      fflush(stdout);cadena_ANSI__3atribuida(scrive,2,40,37);
     }
     sinia_ante[indise]=cpu->sinia[indise];
     cadena__f(scrive, "%.*x ",sizeof(cpu_1664_sinia_t)*2,(n8)cpu->sinia[indise]);
    }
    scrive_stdout("\n",1);
   }
   fflush(stdout);cadena_ANSI__atribuida(scrive,11);
   j=-1;
   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);
   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);
   fflush(stdout);cadena_ANSI__2atribuida(scrive,1,36);
 
   if(cpu->depende[cpu_1664_depende_bitio_depende_influe]!=0)
   {
    cadena__f(scrive, "(esflue) "); 
   }
   else
   {
    cadena__f(scrive, "(inoria) "); 
   }
 
   cadena__f(scrive, "depende : ");
   cadena__f(scrive, "%c",('0')&0xff*(cpu->depende[0]!=0));
   cadena__f(scrive, "%c",('1')&0xff*(cpu->depende[1]!=0));
   cadena__f(scrive, "%c",('2')&0xff*(cpu->depende[2]!=0));
   cadena__f(scrive, "%c",('3')&0xff*(cpu->depende[3]!=0));
   cadena__f(scrive, "%c",('4')&0xff*(cpu->depende[4]!=0));
   cadena__f(scrive, "%c",('5')&0xff*(cpu->depende[5]!=0));
   cadena__f(scrive, "%c",('6')&0xff*(cpu->depende[6]!=0));
   cadena__f(scrive, "\n");
 
   fflush(stdout);cadena_ANSI__3atribuida(scrive,1,40,37);
   fflush(stdout);cadena_ANSI__cursor_desende(scrive,filo_cuantia-1);
   for(j=0;j<filo_cuantia;j++)
   {
    fflush(stdout);cadena_ANSI__cursor_sinistra(scrive,100);
    cpu_1664_sinia_t mapa=0;
    cpu_1664_sinia_t desloca=0;
    cpu_1664_opera_t parola=0;
    {
     //mapa=((cpu_1664_sinia_t *)(lista_jornal_mapa->datos))[(lista_jornal_mapa->contador/sizeof(cpu_1664_sinia_t))-j-1];
     desloca=((cpu_1664_sinia_t *)(lista_jornal_desloca->datos))[(lista_jornal_desloca->contador/sizeof(cpu_1664_sinia_t))-j-1];
     parola=((cpu_1664_opera_t *)(lista_jornal_opera->datos))[(lista_jornal_opera->contador/sizeof(cpu_1664_opera_t))-j-1];
    }
    cadena__f(scrive, "%.*x : ",4,mapa);
    cadena__f(scrive, "%.*x %.*x ",sizeof(cpu_1664_sinia_t)*2,desloca,4,parola);
 
    struct lista *lista_dev=cpu_1664_dev_dev(cpu, cpu->sinia[cpu_1664_sinia_IP], parola);
 
    struct lista *_lista_dev_dev_depende=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[0];
    struct lista *_lista_dev_dev_opera=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[1];
 
    struct lista *_lista_dev_parametre=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[0];
    printf("%s ",_lista_dev_dev_depende->datos);
    printf("%s ",_lista_dev_dev_opera->datos);
    printf("%s ",_lista_dev_parametre->datos);
    fflush(stdout);cadena_ANSI__cursor_asende(scrive, 1);
   }
    fflush(stdout);cadena_ANSI__cursor_desende(scrive,filo_cuantia+1); fflush(stdout);cadena_ANSI__cursor_sinistra(scrive,100);
 
   for(j=0;j<filo_cuantia;j++)
   {
 
    if(j==0)
    {
     fflush(stdout);cadena_ANSI__3atribuida(scrive,40,1,36);
    }
    else
    {
     fflush(stdout);cadena_ANSI__3atribuida(scrive,2,40,37);
    }
    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);
    cadena__f(scrive, "%.*x : ",4,cpu->umm_memoria[0]*!cpu->vantaje);
    cadena__f(scrive, "%.*x %.*x ",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]+(2*(j+0-0)),4,parola);
 
    struct lista *lista_dev=cpu_1664_dev_dev(cpu, cpu->sinia[cpu_1664_sinia_IP], parola);
 
    struct lista *_lista_dev_dev_depende=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[0];
    struct lista *_lista_dev_dev_opera=((struct lista **)(((struct lista **)(lista_dev->datos))[1]->datos))[1];
 
    struct lista *_lista_dev_parametre=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[0];
    struct lista *_lista_dev_informa=((struct lista **)(((struct lista **)(lista_dev->datos))[2]->datos))[1];
    printf("%s ",_lista_dev_dev_depende->datos);
    printf("%s ",_lista_dev_dev_opera->datos);
    printf("%s ",_lista_dev_parametre->datos);
    if(j==0)
    {
     if(pasi_cuantia<=1)printf("; %s",_lista_dev_informa->datos);
    }
    if(pasi_cuantia<=1)printf("\n");
    cpu_1664_dev_dev_libri(lista_dev);
   }
   }
   #define limite_jornal 1000000
   if((lista_jornal_opera->contador/sizeof(cpu_1664_opera_t))<limite_jornal)
   {
    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));
    lista_ajunta__cpu_1664_sinia_t(lista_jornal_desloca, cpu->sinia[cpu_1664_sinia_IP]);
    lista_ajunta__cpu_1664_sinia_t(lista_jornal_mapa, cpu->umm_memoria[0]*!cpu->vantaje);
   }
   if (--pasi_cuantia>0)
   {
    cpu_1664__pasi(cpu, 1);
    continue;
   }
   else
   {
    pasi_cuantia=1;
   }
   n1 c=consola_leje_carater();
   switch (c)
   {
    case 'n':
    default:
     cpu_1664__pasi(cpu, 1);
     break;
 
    case 'm':
     sIP_egali=cpu->sinia[cpu_1664_sinia_IP]+sizeof(cpu_1664_opera_t);
     cpu_1664__pasi(cpu, 1);
     pasi_cuantia=-1;
     break;
 
    case 'N':
     cpu->sinia[cpu_1664_sinia_IP]+=sizeof(cpu_1664_opera_t);
     break;
 
    case 'c':
     cpu_1664__pasi(cpu, 1);
     pasi_cuantia=-1;
     break;
 
    case 'q':
     bool_sicle_fini=1;
     fflush(stdout);cadena_ANSI__atribuida(scrive,0);
     break;
 
    case ':':
     fflush(stdout);cadena_ANSI__3atribuida(scrive,40,1,36);
     cadena__f(scrive, "comanda : ");fflush(0);
 
     switch(consola_leje_carater())
     {
      case 'd':
       cadena__f(scrive, "imaje > %s",cadena_fix_esflue); fflush(0);
       fix_esflue=fopen(cadena_fix_esflue, "w");
       cadena__f(scrive, " [0x%x]\n", cpu->lista_imaje_asm->contador);
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
       fclose(fix_esflue);
       consola_leje_carater(); //pausa
       break;
 
      case 'j':
       cadena__f(scrive, "jornal > %s",fix_jornal_cadena); fflush(0);
       fix_esflue=fopen(fix_jornal_cadena, "w");
       cadena__f(scrive, " [0x%x]\n", cpu->lista_imaje_asm->contador);
       fwrite(cpu->lista_imaje_asm->datos, 1, cpu->lista_imaje_asm->contador, fix_esflue);
       fclose(fix_esflue);
       consola_leje_carater(); //pausa
       break;
     }
 
     break;
   }
 
  }
  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));
 
  lista_libri(lista_jornal_opera);
  lista_libri(lista_jornal_desloca);
  lista_libri(lista_jornal_mapa);
  cpu_1664_libri(cpu);
  return 0;
 }
 else
 {
  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");
  return 0;
 }
 
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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