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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_asm_asm_model__lista.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_asm_asm_model__lista(struct cpu_1664 *cpu, struct lista *model, struct lista *lista_parametre, nN indise_desloca)
4
{
5
 const n1 sinia_braso_clui[] = {cpu_1664_asm_table_clui};
6
 nN indise_limite=lista_parametre->contador/sizeof(P);
7
 
8
 if(model!=0)
9
 {
10
  struct lista *lista;
11
  struct lista *lista_inisial=lista_nova(256);
12
  struct lista *lista_redise=lista_nova(256);
13
 
14
 
15
  lista=lista_inisial;
16
 
17
  nN k;
18
  n8 valua;
19
  nN indise;
20
 
21
  nN j=0;
22
  while(j<model->contador)
23
  {
24
 
25
   switch(model->datos[j])
26
   {
27
    default:
28
     lista_ajunta__dato(lista, model->datos[j++]);
29
     break;
30
 
31
    case '\\':
32
     j++;
33
     if(model->datos[j-2]!='\\')
34
     {
35
      lista_ajunta__dato(lista, model->datos[j++]);
36
     }
37
     break;
38
 
39
 
40
    case cpu_1664_asm_sinia_model_opera:
41
     j++;
42
 
43
     switch(model->datos[j])
44
     {
45
      default:
46
       lista_ajunta__dato(lista, cpu_1664_asm_sinia_model_opera);
47
       lista_ajunta__dato(lista, model->datos[j++]);
48
       break;
49
 
50
      case '@': //asm_desloca
51
       lista_ajunta__ccadena(lista, "0x");
52
       lista_ajunta_asciiexadesimal__n8(lista, cpu->lista_imaje_asm->contador);
53
       j++;
54
       break;
55
 
56
      case 'c': //parametre contador
57
       lista_ajunta__ccadena(lista, "0x");
58
       lista_ajunta_asciiexadesimal__n8(lista, indise_limite-1);
59
       j++;
60
       break;
61
 
62
      case '0':
63
      case '1':
64
      case '2':
65
      case '3':
66
      case '4':
67
      case '5':
68
      case '6':
69
      case '7':
70
      case '8':
71
      case '9':
72
       indise=indise_desloca+(model->datos[j]&0x0f);
73
       if(indise<indise_limite) { lista_ajunta__datos(lista, ((struct lista **)(lista_parametre->datos))[indise]->datos,((struct lista **)(lista_parametre->datos))[indise]->contador); }
74
       j++;
75
       break;
76
 
77
      case '{': //parametre sustitua
78
       k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
79
       indise=indise_desloca+cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
80
       if(indise<indise_limite) { lista_ajunta__datos(lista, ((struct lista **)(lista_parametre->datos))[indise]->datos,((struct lista **)(lista_parametre->datos))[indise]->contador); }
81
       j+=k;
82
       break;
83
     }
84
     break;
85
   }
86
  }
87
  j=1;
88
  model=lista_inisial;
89
  lista=lista_redise;
90
  while(j<model->contador-1)
91
  {
92
 
93
   switch(model->datos[j])
94
   {
95
    default:
96
     lista_ajunta__dato(lista, model->datos[j++]);
97
     break;
98
 
99
    case cpu_1664_asm_sinia_model_opera:
100
     j++;
101
 
102
     if(model->datos[j-2]!='\\')
103
     {
104
 
105
      switch(model->datos[j])
106
      {
107
       default:  //parametre sustitua
108
        indise=indise_desloca+(model->datos[j]&0x0f);
109
        if(indise<indise_limite) { lista_ajunta__datos(lista, ((struct lista **)(lista_parametre->datos))[indise]->datos,((struct lista **)(lista_parametre->datos))[indise]->contador); }
110
        j++;
111
        break;
112
 
113
       case '-': //comenta si evalua no zero
114
        j++;
115
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
116
        valua=cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
117
        if(valua!=0) { lista_ajunta__dato(lista, cpu_1664_asm_sinia_comenta); }
118
        j+=k;
119
        break;
120
 
121
       case '+': //comenta si evalua zero
122
        j++;
123
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
124
        valua=cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
125
        if(valua==0) { lista_ajunta__dato(lista, cpu_1664_asm_sinia_comenta); }
126
        j+=k;
127
        break;
128
 
129
       case '>': //avansa 1 si evalua no zero
130
        j++;
131
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
132
        valua=cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
133
        j+=k+(valua!=0);
134
        break;
135
 
136
       case '.':
137
        j++;
138
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
139
        valua=cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
140
        if(valua!=0)
141
        {
142
         j=model->contador;
143
        }
144
        else
145
        {
146
         j+=k;
147
        }
148
        break;
149
 
150
       case '!':
151
        j++;
152
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
153
        valua=cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
154
        j+=k;
155
        while(model->datos[j]!='"') { j++; }
156
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
157
 
158
        if(valua!=0)
159
        {
160
         cpu->asm_eror=1;
161
         cadena__f((P)scrive_stdout,"%*s\n", k-2, model->datos+j+1);
162
         j=model->contador;
163
        }
164
        else
165
        {
166
         j+=k;
167
        }
168
        break;
169
 
170
       case 'I': //informa
171
        j++;
172
        while(model->datos[j]!='"') { j++; }
173
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
174
        cadena__f((P)scrive_stdout,"%*s\n", k-2, model->datos+j+1);
175
        j+=k;
176
        break;
177
 
178
       case '{': //parametre sustitua
179
        k=nN_cuantia_brasetida__cadena(model->datos+j, model->datos[j], sinia_braso_clui[model->datos[j]]);
180
        indise=indise_desloca+cpu_1664_asm_n8_valua__cadena(cpu, model->datos+j, k);
181
        if(indise<indise_limite) { lista_ajunta__datos(lista, ((struct lista **)(lista_parametre->datos))[indise]->datos,((struct lista **)(lista_parametre->datos))[indise]->contador); }
182
        j+=k;
183
        break;
184
      }
185
     }
186
     break;
187
   }
188
  }
189
 
190
  cpu_1664_asm_ajunta__cadena(cpu, lista->datos, lista->contador);
191
  lista_libri(lista_inisial);
192
  lista_libri(lista_redise);
193
 }
194
 
195
}

powered by: WebSVN 2.1.0

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