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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_opera__rev.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
void cpu_1664_opera__rev(struct cpu_1664 *cpu, n1 bait)
4
{
5
 cpu->opera_sicle=cpu_1664_sicle_opera_rev;
6
 cpu_1664_sinia_t sinia_0;
7
 nN i;
8
 cpu_1664_sinia_t desloca;
9
 
10
 switch(bait)
11
 {
12
 
13
  case cpu_1664_opera_rev_reveni:
14
   cpu->sinia[cpu_1664_sinia_IP]=cpu->sinia[cpu_1664_sinia_reveni];
15
   break;
16
 
17
  case cpu_1664_opera_rev_eseta: //interompe /reveni
18
   if(cpu->vantaje==1)
19
   {
20
    cpu_1664_vantaje(cpu, 0);
21
    cpu->sinia[cpu_1664_sinia_IP]=cpu->sinia_vantaje[cpu_1664_sinia_reveni_eseta];
22
   }
23
   else
24
   {
25
    cpu_1664_eseta(cpu, cpu_1664_eseta_usor);
26
   }
27
   break;
28
 
29
  case cpu_1664_opera_rev_ajusta_protejeda:
30
   if(cpu->vantaje==1)
31
   {
32
    cpu->opera_ajusta_protejeda=1;
33
   }
34
   break;
35
 
36
  case cpu_1664_opera_rev_ajusta_permete:
37
   if(cpu->vantaje==1)
38
   {
39
    cpu->opera_ajusta_protejeda=0;
40
   }
41
   break;
42
 
43
  case cpu_1664_opera_rev_depende_influe:
44
   cpu->depende[cpu_1664_depende_bitio_depende_influe]=1;
45
   break;
46
 
47
  case cpu_1664_opera_rev_depende_inoria:
48
   cpu->depende[cpu_1664_depende_bitio_depende_influe]=0;
49
   break;
50
 
51
  case cpu_1664_opera_rev_sicle_intercambia:
52
   if(cpu->vantaje==1)
53
   {
54
    sinia_0=cpu->sinia[0];
55
    cpu->sinia[0]=cpu->contador_sicle;
56
    cpu->contador_sicle=sinia_0;
57
   }
58
   break;
59
 
60
  case cpu_1664_opera_rev_sicle_usor_limite_intercambia:
61
   if(cpu->vantaje==1)
62
   {
63
    sinia_0=cpu->sinia[0];
64
    cpu->sinia[0]=cpu->contador_sicle_usor_limite;
65
    cpu->contador_sicle_usor_limite=sinia_0;
66
   }
67
   else
68
   {
69
    cpu->sinia[0]=cpu->contador_sicle_usor_limite;
70
   }
71
   break;
72
 
73
  case cpu_1664_opera_rev_sicle_usor_intercambia:
74
   if(cpu->vantaje==1)
75
   {
76
    sinia_0=cpu->sinia[0];
77
    cpu->sinia[0]=cpu->contador_sicle_usor;
78
    cpu->contador_sicle_usor=sinia_0;
79
   }
80
   else
81
   {
82
    cpu->sinia[0]=cpu->contador_sicle_usor;
83
   }
84
   break;
85
 
86
  case cpu_1664_opera_rev_state_usor_restora:
87
   cpu->opera_sicle=16+64;
88
 
89
   if(cpu->vantaje==1)
90
   {
91
    desloca=cpu->sinia[0];
92
 
93
    for(i=0;i<(1<<cpu_1664_bitio_r);i++, desloca+=sizeof(cpu_1664_sinia_t))
94
    {
95
     cpu->sinia_usor[i]=cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_leje), sizeof(cpu_1664_sinia_t), 0);
96
    }
97
 
98
    for(i=0x10;i<=0x1f;i++, desloca++)
99
    {
100
     cpu->opera_ajusta_usor[i]=cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_leje), 1, 0);
101
    }
102
 
103
    sinia_0=cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_leje), 4, 0);
104
    for(i=0; i<32; i++)
105
    {
106
     cpu->depende_usor[i]|=(sinia_0&1);
107
     sinia_0>>=1;
108
    }
109
 
110
    desloca+=4;
111
    cpu->contador_sicle_usor=cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_leje), sizeof(cpu_1664_sinia_t), 0);
112
 
113
    desloca+=sizeof(cpu_1664_sinia_t);
114
    cpu->contador_sicle_usor_limite=cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_leje), sizeof(cpu_1664_sinia_t), 0);
115
   }
116
   break;
117
 
118
  case cpu_1664_opera_rev_state_usor_reteni:
119
   cpu->opera_sicle=16+64;
120
 
121
   if(cpu->vantaje==1)
122
   {
123
    desloca=cpu->sinia[0];
124
 
125
    for(i=0;i<(1<<cpu_1664_bitio_r);i++, desloca+=sizeof(cpu_1664_sinia_t))
126
    {
127
     cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_scrive), sizeof(cpu_1664_sinia_t), cpu->sinia_usor[i]);
128
    }
129
 
130
    for(i=0x10;i<=0x1f;i++, desloca++)
131
    {
132
     cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_scrive), 1, cpu->opera_ajusta_usor[i]);
133
    }
134
 
135
    for(sinia_0=0,i=0; i<32; i++)
136
    {
137
     sinia_0|=cpu->depende_usor[i]!=0;
138
     sinia_0<<=1;
139
    }
140
 
141
    cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_scrive), 4, sinia_0);
142
    desloca+=4;
143
 
144
    cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_scrive), sizeof(cpu_1664_sinia_t), cpu->contador_sicle_usor);
145
 
146
    desloca+=sizeof(cpu_1664_sinia_t);
147
    cpu_1664_umm(cpu, desloca, (1<<cpu_1664_umm_usor_mapa_permete_scrive), sizeof(cpu_1664_sinia_t), cpu->contador_sicle_usor_limite);
148
   }
149
   break;
150
 
151
  case cpu_1664_opera_rev_bp:
152
   if(cpu->vantaje==1)
153
   {
154
    cpu_1664_eseta(cpu, cpu_1664_eseta_bp_vantaje);
155
   }
156
   else
157
   {
158
    cpu_1664_eseta(cpu, cpu_1664_eseta_bp_usor);
159
   }
160
   break;
161
 
162
  case cpu_1664_opera_rev_entra:
163
   cpu->opera_sicle=8+32;
164
   cpu->sinia[cpu_1664_sinia_pila]-=32*sizeof(cpu_1664_sinia_t);
165
 
166
   for(i=0; i<32; i++)
167
   {
168
    cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_pila]+i*sizeof(cpu_1664_sinia_t), (1<<cpu_1664_umm_usor_mapa_permete_scrive), sizeof(cpu_1664_sinia_t), cpu->sinia[cpu_1664_sinia_RETENI_0+i]);
169
   }
170
   break;
171
 
172
  case cpu_1664_opera_rev_departi:
173
   cpu->opera_sicle=8+32;
174
 
175
   for(i=0; i<32; i++)
176
   {
177
    cpu->sinia[cpu_1664_sinia_RETENI_0+i]=cpu_1664_umm(cpu, cpu->sinia[cpu_1664_sinia_pila]+i*sizeof(cpu_1664_sinia_t), (1<<cpu_1664_umm_usor_mapa_permete_leje), sizeof(cpu_1664_sinia_t), 0);
178
   }
179
 
180
   cpu->sinia[cpu_1664_sinia_pila]+=32*sizeof(cpu_1664_sinia_t);
181
   break;
182
 
183
  case cpu_1664_opera_rev_ajusta_reinisia:
184
 
185
   if(cpu->vantaje==1||cpu->opera_ajusta_protejeda==0)
186
   {
187
 
188
    for(i=16;i<32;i++)
189
    {
190
     cpu->opera_ajusta[i]=i;
191
    }
192
   }
193
   break;
194
 
195
  default:
196
   cpu_1664_eseta(cpu, cpu_1664_eseta_opera_nonlegal);
197
   break;
198
 }
199
}

powered by: WebSVN 2.1.0

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