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

Subversion Repositories 1664

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

Compare with Previous | Blame | View Log

#include "cpu_1664.h"
 
cpu_1664_sinia_t cpu_1664_umm(struct cpu_1664 *cpu, cpu_1664_sinia_t desloca_esije, n1 permete_esije, n1 cuantia, cpu_1664_sinia_t valua)
{
 cpu_1664_sinia_t valua_leje[1]={0};
 cpu_1664_sinia_t valua_scrive[1]={valua};
 cpu_1664_sinia_t *mapa;
 cpu_1664_sinia_t desloca_real;
 n1 permete_leje=(cpu->vantaje!=0);
 n1 permete_scrive=(cpu->vantaje!=0);
 n1 permete_esecuta=(cpu->vantaje!=0);
 n1 esije_leje=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_leje))!=0);
 n1 esije_scrive=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_scrive))!=0);
 n1 esije_esecuta=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_esecuta))!=0);
 
 if(cpu->vantaje!=0)
 {
  desloca_real=desloca_esije;
 
  if((desloca_esije&cpu_1664_umm_desloca)==cpu_1664_umm_desloca)
  {
   if (esije_scrive!=0)
   {
    cpu->umm_memoria[desloca_esije&cpu_1664_umm_desloca_masca]=valua;
    return 0;
   }
   else 
   { 
    return cpu->umm_memoria[desloca_esije&cpu_1664_umm_desloca_masca]; 
   }
  }
 }
 else
 {
  mapa=(cpu_1664_sinia_t *)(cpu->lista_imaje->datos+cpu->umm_memoria[cpu_1664_umm_desloca_usor_mapa]);
 
  if((cpu->umm_memoria[cpu_1664_umm_desloca_usor_mapa]+sizeof(cpu_1664_sinia_t)*3)>=cpu->lista_imaje->capasia)
  {
   cadena__f((P)scrive_stdout, "\neseta usor : memoria asede sin mapa usor [%.*x] %.*x -> IP %x\n",sizeof(cpu_1664_sinia_t)*2,(n8)desloca_esije,sizeof(cpu_1664_sinia_t)*2,mapa,(n8)cpu->sinia[cpu_1664_sinia_IP]);
   cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
   return 0;
  }
 
  while(*mapa!=0)
  {
   n1 permete=mapa[cpu_1664_umm_usor_mapa_cuantia]&0x07;
   cpu_1664_sinia_t mapa_cuantia=(mapa[cpu_1664_umm_usor_mapa_cuantia]>>3)<<3;
 
   if((desloca_esije>=mapa[cpu_1664_umm_usor_mapa_desloca_usor])&&(desloca_esije<(mapa[cpu_1664_umm_usor_mapa_desloca_usor]+mapa_cuantia)))
   {
    desloca_real=desloca_esije-mapa[cpu_1664_umm_usor_mapa_desloca_usor]+mapa[cpu_1664_umm_usor_mapa_desloca_real];
 
    if((permete&permete_esije)!=permete_esije)
    {
     cadena__f((P)scrive_stdout, "\neseta asede esije [%.*x] no permete [%.*x] desloca real [%.*x] IP %.*x\n",sizeof(cpu_1664_sinia_t)*2,(n8)permete_esije,sizeof(cpu_1664_sinia_t)*2,(n8)permete,sizeof(cpu_1664_sinia_t)*2,(n8)desloca_real,sizeof(cpu_1664_sinia_t)*2,(n8)cpu->sinia[cpu_1664_sinia_IP]);
     cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
     return 0;
    }
 
    permete_leje=((permete&(1<<cpu_1664_umm_usor_mapa_permete_leje))!=0);
    permete_scrive=((permete&(1<<cpu_1664_umm_usor_mapa_permete_scrive))!=0);
    permete_esecuta=((permete&(1<<cpu_1664_umm_usor_mapa_permete_esecuta))!=0);
    break;
   }
 
   mapa+=3;
  }
 
  if(*mapa==0)
  {
   cadena__f((P)scrive_stdout, "\neseta usor : memoria asede sin mapa usor desloca [%.*x] -> IP %.*x\n",sizeof(cpu_1664_sinia_t)*2,(n8)desloca_esije,sizeof(cpu_1664_sinia_t)*2,(n8)cpu->sinia[cpu_1664_sinia_IP]);
   cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
   return 0;
  }
 }
 
 if((nN)(desloca_real+cuantia)>=cpu->lista_imaje->capasia) // *__ : (nN <- cpu_1664_sinia_t) >= nN
 {
  cadena__f((P)scrive_stdout, "\neseta : memoria asede : desloca [%.*x] suprapasa capasia (%x) -> IP %.*x\n",sizeof(cpu_1664_sinia_t)*2,(n8)(desloca_real+cuantia),(n8)cpu->lista_imaje->capasia,sizeof(cpu_1664_sinia_t)*2,(n8)cpu->sinia[cpu_1664_sinia_IP]);
  cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
  return 0;
 }
 else
 {
  nN i;
 
  if(esije_leje)
  {
 
   if(permete_leje)
   {
 
    for(i=0;i<cuantia;i++)
    {
     ((n1 *)(valua_leje))[i]=((n1 *)(cpu->lista_imaje->datos+desloca_real))[i];
    }
    return valua_leje[0];
   }
   else
   {
    cadena__f((P)scrive_stdout, "\neseta asede leje no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_leje);
    return 0;
   }
  }
  if(esije_esecuta)
  {
 
   if(permete_esecuta)
   {
    for(i=0;i<cuantia;i++)
    {
     ((n1 *)(valua_leje))[i]=((n1 *)(cpu->lista_imaje->datos+desloca_real))[i];
    }
 
    return valua_leje[0];
   }
   else
   {
    cadena__f((P)scrive_stdout, "\neseta asede esecuta no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_esecuta);
    return 0;
   }
  }
  if(esije_scrive)
  {
 
   if(permete_scrive)
   {
    for(i=0;i<cuantia;i++)
    {
     ((n1 *)(cpu->lista_imaje->datos+desloca_real))[i]=((n1 *)(valua_scrive))[i];
    }
 
    return 0;
   }
   else
   {
    cadena__f((P)scrive_stdout, "\neseta asede escrive no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_scrive);
    return 0;
   }
  }
 }
 
 cadena__f((P)scrive_stdout, "\n**-\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.