diff --git a/ediv/CHANGE_LOG.txt b/ediv/CHANGE_LOG.txt index 6f890aa..12e341c 100644 --- a/ediv/CHANGE_LOG.txt +++ b/ediv/CHANGE_LOG.txt @@ -1,3 +1,10 @@ +26/5/2003 +--------- + * Ya están comprobados todos los nuevos opcodes de string, parece ke + rulan bien :) Encontré un bug en el opcode optimizado caraidcpa, + ya está arreglado. (Er_Makina) + * Añadido el opcode extasp (optimización de ext + asp). (Er_Makina) + 25/5/2003 --------- * Añadido soporte para datos STRING. Aún quedan por comprobar algunos diff --git a/ediv/src/ediv/compiler.c b/ediv/src/ediv/compiler.c index fd7c72a..3202712 100644 --- a/ediv/src/ediv/compiler.c +++ b/ediv/src/ediv/compiler.c @@ -833,6 +833,9 @@ void gen(int param, int op, int pa) } else if (code[15].op==lfun) { code[15].op=mem[imem-2]=lfunasp; optimizado=1; + } else if (code[15].op==lext) { + code[15].op=mem[imem-2]=lextasp; + optimizado=1; } break; case laid: if (code[15].op==lcar) { diff --git a/ediv/src/ediv/compiler.h b/ediv/src/ediv/compiler.h index 2435f1b..61adc26 100644 --- a/ediv/src/ediv/compiler.h +++ b/ediv/src/ediv/compiler.h @@ -111,7 +111,7 @@ int case_sensitive; #define lrng 22 /* rango Realiza una comparación de rango */ #define ljmp 23 /* offset Salta a una dirección de mem[] */ #define ljpf 24 /* offset Salta si un valor es falso a una dirección */ -#define lfun 25 /* código Llamada a un proceso interno, ej. signal() */ +#define lfun 25 /* código Llamada a un proceso interno, ej. signal() (obsoleto, ver lext) */ #define lcal 26 /* offset Crea un nuevo proceso en el programa */ #define lret 27 /* Auto-eliminación del proceso */ #define lasp 28 /* Desecha un valor apilado */ @@ -148,24 +148,24 @@ int case_sensitive; #define ldbg 59 /* Invoca al debugger */ /* Instrucciones añadidas para la optimización (DIV 2.0) */ -#define lcar2 60 -#define lcar3 61 -#define lcar4 62 -#define lasiasp 63 -#define lcaraid 64 -#define lcarptr 65 -#define laidptr 66 -#define lcaraidptr 67 -#define lcaraidcpa 68 -#define laddptr 69 -#define lfunasp 70 -#define lcaradd 71 -#define lcaraddptr 72 -#define lcarmul 73 -#define lcarmuladd 74 -#define lcarasiasp 75 -#define lcarsub 76 -#define lcardiv 77 +#define lcar2 60 /* car + car */ +#define lcar3 61 /* car + car + car */ +#define lcar4 62 /* car + car + car + car */ +#define lasiasp 63 /* asi + asp */ +#define lcaraid 64 /* car + aid */ +#define lcarptr 65 /* car + ptr */ +#define laidptr 66 /* aid + ptr */ +#define lcaraidptr 67 /* car + aid + ptr */ +#define lcaraidcpa 68 /* car + aid + cpa */ +#define laddptr 69 /* add + ptr */ +#define lfunasp 70 /* fun + asp (obsoleto, ver lextasp) */ +#define lcaradd 71 /* car + add */ +#define lcaraddptr 72 /* car + add + ptr */ +#define lcarmul 73 /* car + mul */ +#define lcarmuladd 74 /* car + mul + add */ +#define lcarasiasp 75 /* car + asi + asp */ +#define lcarsub 76 /* car + sub */ +#define lcardiv 77 /* car + div */ /* Instrucciones añadidas para el manejo de caracteres */ #define lptrchr 78 /* Pointer, saca (index, offset) y mete [offset+byte index] */ @@ -224,6 +224,9 @@ int case_sensitive; /* Miscelánea */ #define lnul 126 /* Comprueba que un puntero no sea NULL */ +/* Instrucciones añadidas en eDIV */ +#define lextasp 127 /* Combinación de ext y asp, sustituye a funasp */ + struct { /* Peephole, "mirilla" para el optimizador */ int dir; /* Dirección */ diff --git a/ediv/src/ediv/listados.c b/ediv/src/ediv/listados.c index f579013..f5d7c38 100644 --- a/ediv/src/ediv/listados.c +++ b/ediv/src/ediv/listados.c @@ -354,6 +354,10 @@ void listado_ensamblador (void) case lstrmei: fprintf(sta,"%5u\tstrmei",i); break; case lstrmai: fprintf(sta,"%5u\tstrmai",i); break; case lcpastr: fprintf(sta,"%5u\tcpastr",i); break; + + case lnul: fprintf(sta,"%5u\tnul",i); break; + + case lextasp: fprintf(sta,"%5u\textasp %u",i,mem[i+1]); i++; break; default: fprintf(sta,"***"); break; } fprintf(sta,"\n"); i++; } diff --git a/ediv/src/stub/inte.c b/ediv/src/stub/inte.c index ce16092..d20cdc6 100644 --- a/ediv/src/stub/inte.c +++ b/ediv/src/stub/inte.c @@ -523,7 +523,10 @@ int proceso( int num, int padre ) break; case lcaraidcpa://68 mem[mem[imem++]+procs_s[num_proc].id]=pila[reserved("param_offset",procs_s[num_proc].id)++]; - sp--; + //sp--; + cpas++; + if(cpas==reserved("parameters",procs_s[num_proc].id)) + sp-=cpas; break; case laddptr://69 pila[sp-1]=mem[pila[sp-1]+pila[sp]]; @@ -1009,6 +1012,17 @@ int proceso( int num, int padre ) } #endif*/ break; + + /* OPCODES NUEVOS DE EDIV */ + + case lextasp: + externa=extfuncs[mem[imem]]; + // corresponder con FUNCTION_PARAMS + //temp = externa(pila,&sp,mem,varindex,&procs_s,Call_Entrypoint); + fp.num_params=extparms[mem[imem++]]; + externa(&fp); + break; + } #ifdef DBG diff --git a/ediv/src/stub/inte.h b/ediv/src/stub/inte.h index 307e13c..f4e9bf5 100644 --- a/ediv/src/stub/inte.h +++ b/ediv/src/stub/inte.h @@ -63,7 +63,7 @@ #define lrng 22 // rango Realiza una comparación de rango #define ljmp 23 // offset Salta a una dirección de mem[] #define ljpf 24 // offset Salta si un valor es falso a una dirección -#define lfun 25 // código Llamada a un proceso interno, ej. signal() +#define lfun 25 /* código Llamada a un proceso interno, ej. signal() (obsoleto, ver lext) */ #define lcal 26 // offset Crea un nuevo proceso en el programa #define lret 27 // Auto-eliminación del proceso #define lasp 28 // Desecha un valor apilado @@ -101,24 +101,24 @@ // Instrucciones añadidas para la optimización (DIV 2.0) -#define lcar2 60 -#define lcar3 61 -#define lcar4 62 -#define lasiasp 63 -#define lcaraid 64 -#define lcarptr 65 -#define laidptr 66 -#define lcaraidptr 67 -#define lcaraidcpa 68 -#define laddptr 69 -#define lfunasp 70 -#define lcaradd 71 -#define lcaraddptr 72 -#define lcarmul 73 -#define lcarmuladd 74 -#define lcarasiasp 75 -#define lcarsub 76 -#define lcardiv 77 +#define lcar2 60 /* car + car */ +#define lcar3 61 /* car + car + car */ +#define lcar4 62 /* car + car + car + car */ +#define lasiasp 63 /* asi + asp */ +#define lcaraid 64 /* car + aid */ +#define lcarptr 65 /* car + ptr */ +#define laidptr 66 /* aid + ptr */ +#define lcaraidptr 67 /* car + aid + ptr */ +#define lcaraidcpa 68 /* car + aid + cpa */ +#define laddptr 69 /* add + ptr */ +#define lfunasp 70 /* fun + asp (obsoleto, ver lextasp) */ +#define lcaradd 71 /* car + add */ +#define lcaraddptr 72 /* car + add + ptr */ +#define lcarmul 73 /* car + mul */ +#define lcarmuladd 74 /* car + mul + add */ +#define lcarasiasp 75 /* car + asi + asp */ +#define lcarsub 76 /* car + sub */ +#define lcardiv 77 /* car + div */ // Instrucciones añadidas para el manejo de caracteres @@ -177,10 +177,11 @@ #define lslawor 124 // Shl-asignación #define lcpawor 125 // Saca offset, lee parámetro [offset] y bp++ -// Miscelánea - +/* Miscelánea */ #define lnul 126 // Comprueba que un puntero no sea NULL +/* Instrucciones añadidas en eDIV */ +#define lextasp 127 /* ext + asp, sustituye a funasp */ //----------------------------------------------------------------------------- diff --git a/ediv/src/stub/modulos.c b/ediv/src/stub/modulos.c index 4a2ed2d..3021025 100644 --- a/ediv/src/stub/modulos.c +++ b/ediv/src/stub/modulos.c @@ -99,7 +99,7 @@ void dll_func() // ke original, no? XD -#else // si estamos en Linux + #else // si estamos en Linux directorio=opendir("so"); if(!directorio) { @@ -119,7 +119,7 @@ void dll_func() // ke original, no? XD fichero_dll=readdir(directorio); if(fichero_dll==0) break; - if(fichero_dll->d_type==DT_REG) { + if(fichero_dll->d_type==DT_REG) { printf("Librería encontrada: so/%s\n",fichero_dll->d_name); strcpy(fichdll,"so/"); strcat(fichdll,fichero_dll->d_name); @@ -173,7 +173,7 @@ int leedll(struct _finddata_t fichero_dll) // Carga la DLL dll_n++; -funciones++; + funciones++; hDLL[dll_n]=LoadDLL(fichdll); diff --git a/ediv/src/visual c/ediv_ws.suo b/ediv/src/visual c/ediv_ws.suo index 59b7400..13271bc 100644 Binary files a/ediv/src/visual c/ediv_ws.suo and b/ediv/src/visual c/ediv_ws.suo differ