1 |
2 |
mrdmkg |
#include "cpu_1664.h"
|
2 |
|
|
|
3 |
|
|
void cpu_1664_asm_asm_opera__lista_2(struct cpu_1664 *cpu, struct lista *lista_parametre)
|
4 |
|
|
{
|
5 |
|
|
cpu_1664_opera_t parola;
|
6 |
|
|
n1 depende;
|
7 |
|
|
n1 opera_sifri,opera_desifri;
|
8 |
|
|
nN opera_parametre_indise;
|
9 |
|
|
n1 parametre;
|
10 |
|
|
cpu->avisa__no_definida=0;
|
11 |
|
|
|
12 |
|
|
opera_desifri=cpu_1664_asm_n1_opera_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[0]);
|
13 |
|
|
|
14 |
|
|
if (opera_desifri!=0xff)
|
15 |
|
|
{
|
16 |
|
|
depende=0x07;
|
17 |
|
|
opera_parametre_indise=1;
|
18 |
|
|
}
|
19 |
|
|
else if((lista_parametre->contador/sizeof(P))>1)
|
20 |
|
|
{
|
21 |
|
|
depende=cpu_1664_asm_n8_valua__lista(cpu,((struct lista **)(lista_parametre->datos))[0]);
|
22 |
|
|
opera_desifri=cpu_1664_asm_n1_opera_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[1]);
|
23 |
|
|
opera_parametre_indise=2;
|
24 |
|
|
}
|
25 |
|
|
|
26 |
|
|
if(opera_desifri!=0xff)
|
27 |
|
|
{
|
28 |
|
|
opera_sifri=cpu->opera_ajusta_asm[opera_desifri];
|
29 |
|
|
|
30 |
|
|
if(opera_sifri==0)
|
31 |
|
|
{
|
32 |
|
|
n1 opera_ajusta=cpu_1664_asm_n8_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[(lista_parametre->contador/sizeof(P))-2]);
|
33 |
|
|
|
34 |
|
|
if((opera_ajusta<0x10)||(opera_ajusta>0x1f))
|
35 |
|
|
{
|
36 |
|
|
cadena__f((P)scrive_stdout, "eror opera ajusta %x 0x00..0x10\n",opera_ajusta);
|
37 |
|
|
cpu->asm_eror=1;
|
38 |
|
|
}
|
39 |
|
|
else
|
40 |
|
|
{
|
41 |
|
|
opera_ajusta-=0x10;
|
42 |
|
|
}
|
43 |
|
|
n1 opera_sustitua=cpu_1664_asm_n1_opera_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[(lista_parametre->contador/sizeof(P))-1]);
|
44 |
|
|
|
45 |
|
|
if (opera_sustitua==0xff)
|
46 |
|
|
{
|
47 |
|
|
opera_sustitua=cpu_1664_asm_n8_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[(lista_parametre->contador/sizeof(P))-1]);
|
48 |
|
|
}
|
49 |
|
|
parola=opera_sifri+(opera_ajusta<<(cpu_1664_bitio_opera))+(opera_sustitua<<(cpu_1664_bitio_opera+cpu_1664_bitio_co));
|
50 |
|
|
}
|
51 |
|
|
else
|
52 |
|
|
{
|
53 |
|
|
|
54 |
|
|
lista_ajunta__cpu_1664_sinia_t(cpu->lista_dev_asm_desloca, cpu->lista_imaje_asm->contador); //*__ ? + imaje->contador
|
55 |
|
|
lista_ajunta__P(cpu->lista_dev_asm_cadena, lista_2_nova__lista_2(lista_parametre));
|
56 |
|
|
|
57 |
|
|
parametre=(((n1 (**)(struct cpu_1664 *, struct lista *))(cpu->lista_asm_opera_parametre_funsiona->datos))[opera_desifri](cpu, lista_parametre));
|
58 |
|
|
parola=(opera_sifri|(depende<<cpu_1664_bitio_opera))|(parametre<<8);
|
59 |
|
|
}
|
60 |
|
|
if(cpu->avisa__no_definida!=0)
|
61 |
|
|
{
|
62 |
|
|
struct cpu_1664_asm_taxe *taxe=(struct cpu_1664_asm_taxe *)memoria_nova(sizeof(struct cpu_1664_asm_taxe));
|
63 |
|
|
taxe->parola=parola;
|
64 |
|
|
taxe->asm_opera_parametre_funsiona=((n1 (**)(struct cpu_1664 *, struct lista *))(cpu->lista_asm_opera_parametre_funsiona->datos))[opera_desifri];
|
65 |
|
|
taxe->desloca=cpu->lista_imaje_asm->contador;
|
66 |
|
|
taxe->lista=lista_2_nova__lista_2(lista_parametre);
|
67 |
|
|
lista_ajunta__P(cpu->lista_taxe, (P)taxe);
|
68 |
|
|
}
|
69 |
|
|
|
70 |
|
|
lista_ajunta__cpu_1664_asm_parola_t(cpu->lista_imaje_asm, parola);
|
71 |
|
|
}
|
72 |
|
|
else
|
73 |
|
|
{
|
74 |
|
|
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);
|
75 |
|
|
cpu_1664_asm_sinia_t valua;
|
76 |
|
|
|
77 |
|
|
if((lista_parametre->contador/sizeof(P))>1)
|
78 |
|
|
{
|
79 |
|
|
valua=cpu_1664_asm_n8_valua__lista(cpu, ((struct lista **)(lista_parametre->datos))[1]);
|
80 |
|
|
}
|
81 |
|
|
else
|
82 |
|
|
{
|
83 |
|
|
valua=cpu->lista_imaje_asm->contador;
|
84 |
|
|
}
|
85 |
|
|
|
86 |
|
|
cpu_1664_asm_defina_valua(cpu, sinia, valua);
|
87 |
|
|
|
88 |
|
|
//eror opera_sifri
|
89 |
|
|
//cadena__f((P)scrive_stdout, "\neror opera_sifri\n");
|
90 |
|
|
//cpu->asm_eror=1;
|
91 |
|
|
}
|
92 |
|
|
}
|