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

Subversion Repositories 1664

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

powered by: WebSVN 2.1.0

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