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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_umm.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
 
3
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)
4
{
5
 cpu_1664_sinia_t valua_leje[1]={0};
6
 cpu_1664_sinia_t valua_scrive[1]={valua};
7
 cpu_1664_sinia_t *mapa;
8
 cpu_1664_sinia_t desloca_real;
9
 n1 permete_leje=(cpu->vantaje!=0);
10
 n1 permete_scrive=(cpu->vantaje!=0);
11
 n1 permete_esecuta=(cpu->vantaje!=0);
12
 n1 esije_leje=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_leje))!=0);
13
 n1 esije_scrive=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_scrive))!=0);
14
 n1 esije_esecuta=((permete_esije&(1<<cpu_1664_umm_usor_mapa_permete_esecuta))!=0);
15
 
16
 if(cpu->vantaje!=0)
17
 {
18
  desloca_real=desloca_esije;
19
 
20
  if((desloca_esije&cpu_1664_umm_desloca)==cpu_1664_umm_desloca)
21
  {
22
   if (esije_scrive!=0)
23
   {
24
    cpu->umm_memoria[desloca_esije&cpu_1664_umm_desloca_masca]=valua;
25
    return 0;
26
   }
27
   else
28
   {
29
    return cpu->umm_memoria[desloca_esije&cpu_1664_umm_desloca_masca];
30
   }
31
  }
32
 }
33
 else
34
 {
35
  mapa=(cpu_1664_sinia_t *)(cpu->lista_imaje->datos+cpu->umm_memoria[cpu_1664_umm_desloca_usor_mapa]);
36
 
37
  if((cpu->umm_memoria[cpu_1664_umm_desloca_usor_mapa]+sizeof(cpu_1664_sinia_t)*3)>=cpu->lista_imaje->capasia)
38
  {
39
   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]);
40
   cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
41
   return 0;
42
  }
43
 
44
  while(*mapa!=0)
45
  {
46
   n1 permete=mapa[cpu_1664_umm_usor_mapa_cuantia]&0x07;
47
   cpu_1664_sinia_t mapa_cuantia=(mapa[cpu_1664_umm_usor_mapa_cuantia]>>3)<<3;
48
 
49
   if((desloca_esije>=mapa[cpu_1664_umm_usor_mapa_desloca_usor])&&(desloca_esije<(mapa[cpu_1664_umm_usor_mapa_desloca_usor]+mapa_cuantia)))
50
   {
51
    desloca_real=desloca_esije-mapa[cpu_1664_umm_usor_mapa_desloca_usor]+mapa[cpu_1664_umm_usor_mapa_desloca_real];
52
 
53
    if((permete&permete_esije)!=permete_esije)
54
    {
55
     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]);
56
     cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
57
     return 0;
58
    }
59
 
60
    permete_leje=((permete&(1<<cpu_1664_umm_usor_mapa_permete_leje))!=0);
61
    permete_scrive=((permete&(1<<cpu_1664_umm_usor_mapa_permete_scrive))!=0);
62
    permete_esecuta=((permete&(1<<cpu_1664_umm_usor_mapa_permete_esecuta))!=0);
63
    break;
64
   }
65
 
66
   mapa+=3;
67
  }
68
 
69
  if(*mapa==0)
70
  {
71
   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]);
72
   cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
73
   return 0;
74
  }
75
 }
76
 
77
 if((nN)(desloca_real+cuantia)>=cpu->lista_imaje->capasia) // *__ : (nN <- cpu_1664_sinia_t) >= nN
78
 {
79
  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]);
80
  cpu_1664_eseta(cpu, cpu_1664_eseta_umm_limite);
81
  return 0;
82
 }
83
 else
84
 {
85
  nN i;
86
 
87
  if(esije_leje)
88
  {
89
 
90
   if(permete_leje)
91
   {
92
 
93
    for(i=0;i<cuantia;i++)
94
    {
95
     ((n1 *)(valua_leje))[i]=((n1 *)(cpu->lista_imaje->datos+desloca_real))[i];
96
    }
97
    return valua_leje[0];
98
   }
99
   else
100
   {
101
    cadena__f((P)scrive_stdout, "\neseta asede leje no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
102
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_leje);
103
    return 0;
104
   }
105
  }
106
  if(esije_esecuta)
107
  {
108
 
109
   if(permete_esecuta)
110
   {
111
    for(i=0;i<cuantia;i++)
112
    {
113
     ((n1 *)(valua_leje))[i]=((n1 *)(cpu->lista_imaje->datos+desloca_real))[i];
114
    }
115
 
116
    return valua_leje[0];
117
   }
118
   else
119
   {
120
    cadena__f((P)scrive_stdout, "\neseta asede esecuta no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
121
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_esecuta);
122
    return 0;
123
   }
124
  }
125
  if(esije_scrive)
126
  {
127
 
128
   if(permete_scrive)
129
   {
130
    for(i=0;i<cuantia;i++)
131
    {
132
     ((n1 *)(cpu->lista_imaje->datos+desloca_real))[i]=((n1 *)(valua_scrive))[i];
133
    }
134
 
135
    return 0;
136
   }
137
   else
138
   {
139
    cadena__f((P)scrive_stdout, "\neseta asede escrive no permete @ %.*x\n",sizeof(cpu_1664_sinia_t)*2,cpu->sinia[cpu_1664_sinia_IP]);
140
    cpu_1664_eseta(cpu, cpu_1664_eseta_umm_scrive);
141
    return 0;
142
   }
143
  }
144
 }
145
 
146
 cadena__f((P)scrive_stdout, "\n**-\n"); return 0;
147
}

powered by: WebSVN 2.1.0

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