Example #1
0
void aplicar_colorizar (int tiempo, int cant_iteraciones, const char *nomb_impl, const char *nomb_arch_entrada, float alpha) {
	IplImage *src = 0;
	IplImage *dst = 0;
	CvSize dst_size;

	// Cargo la imagen
	if( (src = cvLoadImage (nomb_arch_entrada, CV_LOAD_IMAGE_COLOR)) == 0 )
		exit(EXIT_FAILURE);

	dst_size.width = src->width;
	dst_size.height = src->height;


	// Creo una IplImage para cada salida esperada
	if( (dst = cvCreateImage (dst_size, IPL_DEPTH_8U, 3) ) == 0 )
		exit(EXIT_FAILURE);

	typedef void (colorizar_fn_t) (unsigned char*, unsigned char*, int, int, int, int, float);

	colorizar_fn_t *proceso;

	if (strcmp(nomb_impl, "c") == 0) {
		proceso = colorizar_c;
	} else {
		proceso = colorizar_asm;
	}

	if (tiempo) {
		unsigned long long int start, end;

		MEDIR_TIEMPO_START(start);

		for(int i=0; i<cant_iteraciones; i++) {
			proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, dst->widthStep, alpha);
		}

		MEDIR_TIEMPO_STOP(end);

		imprimir_tiempos_ejecucion(start, end, cant_iteraciones);
	} else {
		proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, dst->widthStep, alpha);
	}

	copiar_bordes_color((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep);

	// Guardo imagen y libero las imagenes
	char nomb_arch_salida[256];

	memset(nomb_arch_salida, 0, 256);

	sprintf(nomb_arch_salida, "%s.colorizar.alpha-%3.2f.%s.bmp", nomb_arch_entrada, alpha, nomb_impl);

	cvSaveImage(nomb_arch_salida, dst, NULL);

	cvReleaseImage(&src);
	cvReleaseImage(&dst);
}
Example #2
0
IplImage * aplicar_filtro_juego(IplImage *src, void *param) {
    IplImage *srcPrev;

        void** p = (void**)param;
        IplImage **prev = (IplImage**)(p[0]);
        int tolerancia = (int)(p[1]);

        srcPrev = cvCloneImage(*prev);

    IplImage *out;
    if(maxY==0)
        maxY=src->height-radioBola;

    if(maxX==0)
        maxX=src->width-radioBola;

    IplImage *ss;
    ss=srcPrev;
    if(!back)
        back=cvLoadImage("images/image3.jpg",CV_LOAD_IMAGE_COLOR);
    if(!car)
        car=cvLoadImage("images/cosito.jpg",CV_LOAD_IMAGE_COLOR);
    if(!ball)
        ball=cvLoadImage("images/ball.png",CV_LOAD_IMAGE_COLOR);

    out = cvCloneImage( back );

    typedef int (buscarPos_fn_t) (unsigned char*, unsigned char*,int, int, int);
    buscarPos_fn_t *proceso;
    proceso = buscarPos_c;

    int pos=proceso((unsigned char*)src->imageData,(unsigned char*)ss->imageData,src->height, src->width, src->widthStep);
    pos=src->width-pos;
    if(pos<=CAR_RADIO+BORDE)
        pos=CAR_RADIO+BORDE;
    if(pos>=ANCHO-CAR_RADIO-BORDE)
        pos=ANCHO-CAR_RADIO-BORDE;

    typedef void (hacerAuto_fn_t) (unsigned char*, unsigned char*,int,int, int, int, int);
    hacerAuto_fn_t *proceso2;
    proceso2 = hacerAuto_c;
    proceso2((unsigned char*)car->imageData,(unsigned char*)out->imageData,pos,src->height, src->width, src->widthStep, car->widthStep);

    int posX=prox_ball_x();
    int posY=prox_ball_y(pos);

    typedef void (hacerPelota_fn_t) (unsigned char*, unsigned char*,int,int,int, int, int, int);
    hacerPelota_fn_t *proceso3;
    proceso3 = hacerPelota_c;
    proceso3((unsigned char*)ball->imageData,(unsigned char*)out->imageData,posX,posY,src->height, src->width, src->widthStep, ball->widthStep);

    cvReleaseImage(&ss);
    cvReleaseImage(&car);
    cvReleaseImage(&back);
    return out;

}
Example #3
0
int main()
{
    int opc;
    int matriz[][3] = {{1,2,3},{4,5,6}};
    system("pause");
    opc = menuMat();
    while(proceso(opc, matriz) )     // Chequeo lo que devuelve proceso.
    {
        opc = menuMat();
    }
    return 0;
}
Example #4
0
int main()
{
	int pid;
	int status;
	int shmidG, shmidSEM;
	int args[3];
	int i;
	void *thread_result;
	// Declarar memoria compartida
	shmidG=shmget(0x1234,sizeof(g),0666|IPC_CREAT);
	shmidSEM=shmget(0x1235, sizeof(mySem),0666|IPC_CREAT);
	if(shmidG==-1 || shmidSEM==-1)
	{
		perror("Error en la memoria compartida\n");
		exit(1);
	}
	
	g=shmat(shmidG,NULL,0);
	mySem=shmat(shmidSEM,NULL,0);

	if(g==NULL || mySem==NULL)
	{
		perror("Error en el shmat\n");
		exit(2);
	}

	*g=0;
	initsem(mySem, 1);
	srand(getpid());
	for(i=0;i<3;i++)
	{
		// Crea un nuevo proceso hijo que ejecuta la función proceso()
		pid=fork();
		if(pid==0)
			proceso(i);
	}
	for(i=0;i<3;i++)
		pid = wait(&status);
	// Eliminar la memoria compartida
	shmdt(g);
	shmdt(mySem);
}
Example #5
0
File: inte.c Project: vroman/edivc
int interprete()
{
	
	int _status=reservedptr("status");
	
	// PROVISIONAL. Se tendra que cambiar para k soporte frame(int) y prioritys
	if ( num_proc_orden > 0 )
	{
		for ( proceso_actual = 0 ; proceso_actual < num_proc_orden ; proceso_actual++ )
		{
			if(procs_s[proc_orden[proceso_actual]].tipo==0 || mem[procs_s[proc_orden[proceso_actual]].id+_status]==2)
				proceso( proc_orden[ proceso_actual ], -1 ) ;
		}

		/* El texto "en el aire" no se muestra nunca */
		memb[nullstring[0]*4]=0;
        memb[nullstring[1]*4]=0;
        memb[nullstring[2]*4]=0;
        memb[nullstring[3]*4]=0;

		Call_Entrypoint(EDIV_frame);

		for ( proceso_actual = 0 ; proceso_actual < num_proc_orden ; proceso_actual++ )
		{
			//printf("Proceso %d - Estado: %d\n",procs_s[proc_orden[proceso_actual]].id,mem[procs_s[proc_orden[proceso_actual]].id+_status]);
			if(mem[procs_s[proc_orden[proceso_actual]].id+_status]==1) {
				mem[procs_s[proc_orden[proceso_actual]].id+_status]=0;
				lista_quita(proceso_actual);
				proceso_actual--;
			}
		}
		
	}
	else {
		stub_quit(0) ;
	}
	
	
	return 1 ;
}
Example #6
0
int main()
{
    int pid;
    int status;
    int shmid;
    int args[3];
    int i;
    void *thread_result;

    key = 1234;
    msgflg = IPC_CREAT|0666;

    if((msgqid = msgget(key, msgflg)) < 0)
    {
        perror("msgget failed");
        exit(1);
    }

    mensaje.mtype = 1;
    strcpy(mensaje.mtext, "OK");

    if(msgsnd(msgqid, &mensaje, MSG_SIZE, IPC_NOWAIT) < 0)
    {
        perror("msgsnd failed");
        exit(1);
    }

    srand(getpid());
    for(i=0; i<3; i++)
    {
        // Crea un nuevo proceso hijo que ejecuta la función proceso()
        pid=fork();
        if(pid==0)
            proceso(i);
    }
    for(i=0; i<3; i++)
        pid = wait(&status);
    // Eliminar la memoria compartida
}
Example #7
0
int main (int argc,char **argv) {

	time_t temps;
	struct tm t;

	temps = time(NULL);
	localtime_r(&temps, &t);

	int i = 0;
	char dir_actual[MAXLONG];
	acabados = 0;		

	bmount(DISK_NAME);
	signal(SIGCHLD,reaper);
//	printf("Llistam contingut abans de començar: \n");
//	mi_ls2();

//	printf("Esperant 2 segons abans de començar... \n");
//	sleep(2);

//	cleanup();
		
	sprintf(dir_actual, "simul_%d%d%d", t.tm_hour, t.tm_min, t.tm_sec);
	for (i = 0;i<PROCESOS; i++) {
//		if(fork() == 0) {
			proceso(dir_actual, i);
//			exit(0);
//		}
		sleep(1);		
	}	
//	while (acabados<PROCESOS)
//			pause();

	printf("Llistam contingut després d'haver acabat: \n");
	mi_ls2();
	
	bumount(DISK_NAME);
}
Example #8
0
int main()
{
  int pid;
  int status;
  int shmid, shmidgwait, shmidgsig;
  int args[3];
  int i;
	printf("inicio\n");
	fflush(stdout);
  // definir la memoria compartida
  shmid=shmget(0x1234,sizeof(sem),0666|IPC_CREAT);
	shmidgwait=shmget(0x1250,sizeof(gwait),0666|IPC_CREAT);
	shmidgsig=shmget(0x1275,sizeof(gsig),0666|IPC_CREAT);

	printf("pase el shmget \n");
	fflush(stdout);
  if(shmid==-1 || shmidgwait==-1 || shmidgsig==-1)
  {
    perror("Error en la memoria compartida\n");
    exit(1);
  }

	// Declarar el semaforo en memoria compartida
  sem = shmat(shmid,NULL,0);
	// declarar las exchanges
	gwait = shmat(shmidgwait,NULL,0);
	gsig =shmat(shmidgsig,NULL,0);

  if(sem == NULL || gwait == NULL || gsig == NULL)
  {
    perror("Error en el shmat\n");
    exit(2);
  }

	// inciializa el semaforo y los xchnges
  initsem(sem, WAYS);
  *gwait = 0;
  *gsig = 0;
	printf("iniciamos nuestro semanforo, gwait=%d, gsig=%d\n", *gwait, *gsig);
	fflush(stdout);
  srand(getpid()); // random seed con el pid del padre

  for(i=0;i<3;i++)
  {
    // Crea un nuevo proceso hijo que ejecuta la función proceso()
    pid=fork();
    if(pid==0){
			printf("\n entramos a proceso: %d", i);
			fflush(stdout);
			proceso(i, pid);
		}

  }

  for(i=0;i<3;i++)
    pid = wait(&status);

  // Eliminar la memoria compartida
	shmdt(sem);
	shmdt(gwait);
	shmdt(gsig);
}
Example #9
0
int main() {
    proceso().principal();
    return 0;
}
Example #10
0
int main (int argc,char **argv) {

	if (argc == 2) {

		signal(SIGCHLD,reaper);
	
		mount(argv[1]);
		
		struct inodo in;
		if (leer_inodo(&in, 0) < 0) {
			printf("ERROR (simulacion.c -> mi_stat(/)): Error al leer el estado\n");
		}
		
		struct superbloque SB;
		if (bread(0, (char *)&SB) < 0) {
			printf("ERROR (simulacion.c -> error al leer el superbloque)\n");
		}
		
		if (in.t_bytes > 0) {
			vaciar();
			initSB(SB.n_bloques, argv[1]);
			initMB(SB.n_bloques);
			initAI(SB.n_bloques);
		}
			
			
		int i;
		for (i = 0; i < N_PROCESOS; i++) {
		
			int hilo = fork();
			if (hilo == 0) {
			
				if (proceso(i) < 0) {
					printf("ERROR (simulacion.c): Error al crear el proceso %d.\n", i);
					return (-1);
				}
				exit(0);
			}
			else if (hilo < 0) {
				i--;
				printf("Llamamos al reaper, hilo = %d\n", hilo);
				reaper();
			}
			
			sleep(1);		
		}
	
		while (acabados < N_PROCESOS) {
			pause();
		}
			
		unmount(argv[1]);
	
	}
	else {
		printf("ERROR (simulacion.c): Error, parámetros != de 2 (%d).\n", argc);
		return (-1);
	}
	
	return (0);
}
Example #11
0
void aplicar_decode   (const char *implementacion,
                       const char *archivo_entrada,
                       bool verbose)
{
    const int long_texto=10000;
    unsigned char mensaje_salida[long_texto];

    IplImage *src = 0;
	IplImage *dst = 0;

	// Cargo la imagen
	if( (src = cvLoadImage (archivo_entrada, CV_LOAD_IMAGE_COLOR)) == 0 )
		exit(EXIT_FAILURE);

	// Creo una IplImage para cada salida esperada
	if( (dst = cvCreateImage (cvGetSize (src), IPL_DEPTH_8U, 1) ) == 0 )
		exit(EXIT_FAILURE);

	typedef void (decode_t) (unsigned char*, unsigned char*, int, int, int);

	decode_t *proceso;

	if (strcmp(implementacion, "c") == 0) {
		proceso = decode_c;
	} else {
		proceso = decode_asm;
	}

    FILE* f = fopen(DECODE_TIEMPOS, "a");
    int iteraciones = 1;
    long int total = 0;

    for (int r = 0; r <= 99; r++){

    int tiempo = 0;
    int start = 0;
    int stop = 0;

    MEDIR_TIEMPO_START(start);

    proceso((unsigned char*)src->imageData, (unsigned char*)mensaje_salida, long_texto, src->width, src->height);

    MEDIR_TIEMPO_STOP(stop);

    tiempo = stop - start;
    total = total + tiempo;

    fprintf(f, "%d %d %ld\n", iteraciones, tiempo, total);

    iteraciones ++;

    }
	FILE* g = fopen(DECODE_TOTALES, "a");
	fprintf(g,"%ld\n", total);
    fclose(g);
    
    fclose(f);
   	promedio = promedio + (total / global);

	// Guardo imagen y libero las imagenes
    char filename[255];

    sprintf(filename,"%s.mensaje.%s.txt",archivo_entrada,implementacion);
    FILE* decoded_txt = fopen(filename,"w");
    mensaje_salida[long_texto-1]='\0';
    fprintf(decoded_txt,"%s",mensaje_salida);
    fclose(decoded_txt);
//	printf ( "  Salida en          : %s\n", filename);
	cvReleaseImage(&src);
	cvReleaseImage(&dst);
}
Example #12
0
void aplicar_filtro_color (const char *implementacion,
                           const char *archivo_entrada,
                           bool verbose, bool frames,
                           const char *carpeta_frames,
                           int rc, int gc, int bc,
                           int threshold) {
    static size_t bufsize = 1024;
    char namebuff[bufsize + 1];

    const char *filename = basename(archivo_entrada);
    CvCapture *srcVid = abrir_video(archivo_entrada);
	CvSize dst_size;

    dst_size.width = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_WIDTH);
    dst_size.height = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FRAME_HEIGHT);
	double fps = cvGetCaptureProperty(srcVid,CV_CAP_PROP_FPS);
    int nchannels = 3;

    typedef struct CvVideoWriter CvVideoWriter;
    CvVideoWriter* dstVid = NULL;

    if (!frames) {
        snprintf(namebuff, bufsize, "%s.fcolor.avi", archivo_entrada);
        dstVid = abrir_writer(namebuff, fps, dst_size);
    }
    /* Armo la imagen destino. */
	IplImage *dst = NULL;
    dst = cvCreateImage (dst_size, IPL_DEPTH_8U, nchannels);
    if (dst == NULL) {
        fprintf(stderr, "Error armando la imagen destino\n");
        exit(EXIT_FAILURE);
    }

    if (verbose) {
        cvNamedWindow("procesanding", CV_WINDOW_AUTOSIZE);
    }
    unsigned int framenum = 0;

    FILE* f = fopen(COLOR_TIEMPOS, "a");
    int iteraciones = 1;
    long int total = 0;

    while(1) {
        /* Capturo un frame */
        IplImage *frame = cvQueryFrame(srcVid);

        framenum ++;

        if (frame == NULL) {
            break;
        }

        /* Aplico el filtro */
        typedef void (fcolor_fn_t) (unsigned char*, unsigned char*,
                                    unsigned char, unsigned char,
                                    unsigned char, int, int, int);

        fcolor_fn_t *proceso;

        if (strcmp(implementacion, "c") == 0) {
            proceso = color_filter_c;
        } else {
            proceso = color_filter_asm;
        }

	int stop = 0;

	int start = 0;

	int tiempo = 0;

	MEDIR_TIEMPO_START(start);

        proceso((unsigned char *) frame->imageData,
                (unsigned char *)  dst->imageData, rc, gc, bc, threshold,
                frame->height, frame->width);

	MEDIR_TIEMPO_STOP(stop);

	tiempo = stop - start;

	total = tiempo + total;

	fprintf(f, "%d %d %ld\n", iteraciones, tiempo, total);

	iteraciones ++;

        if (frames) {
            /* Escribo el frame */
            snprintf(namebuff, bufsize, "%s/%s.fcolor.%d.bmp",
                                    carpeta_frames, filename, framenum);
            cvSaveImage(namebuff, dst, NULL);
        } else {
            cvWriteFrame(dstVid, dst);
        }
        if (verbose) {
            cvShowImage("procesanding", dst);
            cvWaitKey(1);
        }
    }
	FILE* g = fopen(COLOR_TOTALES, "a");
	fprintf(g,"%ld\n", total);
    fclose(g);
    
	promedio = promedio + (total / global);
    
    fclose(f);

    if (verbose) {
        cvDestroyWindow("procesanding");
    }

    cvReleaseImage(&dst);
    if (!frames) {
        cvReleaseVideoWriter(&dstVid);
    }
    cvReleaseCapture(&srcVid);
}
Example #13
0
File: inte.c Project: vroman/edivc
int proceso( int num, int padre )
{
	int v1 ;
	int retcode = 0;
	int no_devuelve = 0 ;
	int (*externa)(struct _fun_params*);
	int temp,oo;
	unsigned int utemp;
	int cpas=0;
	#ifdef DBG
		int actual_lin;
	#endif
	int _status=reservedptr("status");
	int _param_offset;

	num_proc = num ;
	imem = procs_s[num_proc].imem ;
	
	//printf("num_proc: %d\n",num);

	
	while( retcode == 0 )
	{
	
		//printf("imem: %i\tnum_proc: %i\tsp: %i\tpila[sp]: %i \n" , imem , num_proc , sp , pila[sp]) ;
		
		switch ( mem[ imem++ ] )
		{
		case lnop://0
			break;
		case lcar://1
			pila[++sp]=mem[imem++] ;
			break;
		case lasi://2
			mem[ pila[sp-1] ] = pila[sp--] ;
			//printf("Cargado %i en %i\n" , pila[sp+1], pila[sp] ) ;
			break ;
		case lori://3
			pila[sp-1]|=pila[sp];
			sp--;
			break;
		case lxor://4
			pila[sp-1]^=pila[sp];
			sp--;
			break;
		case land://5
			pila[sp-1]&=pila[sp];
			sp--;
			break;
		case ligu://6
			pila[sp-1] = ( pila[sp-1] == pila[sp] ) ;
			sp--;
			break;
		case ldis://7
			pila[sp-1] = ( pila[sp-1] != pila[sp] ) ;
			sp--;
			break;
		case lmay://8
			pila[sp-1] = ( pila[sp-1] > pila[sp] ) ;
			sp--;
			break;
		case lmen://9
			pila[sp-1] = ( pila[sp-1] < pila[sp] ) ;
			sp--;
			break;
		case lmei://10
			pila[sp-1] = ( pila[sp-1] <= pila[sp] ) ;
			sp--;
			break;
		case lmai://11
			pila[sp-1] = ( pila[sp-1] >= pila[sp] ) ;
			sp--;
			break;
		case ladd://12
			pila[sp-1] += pila[sp] ;
			sp--;
			break;
		case lsub://13
			pila[sp-1] -= pila[sp] ;
			sp--;
			break;
		case lmul://14
			pila[sp-1] *= pila[sp] ;
			sp--;
			break;
		case ldiv://15
			if(pila[sp]==0) error(145); // división entre cero
			pila[sp-1] /= pila[sp] ;
			sp--;
			break;
		case lmod://16
			if(pila[sp]==0) error(145); // división entre cero
			pila[sp-1] %= pila[sp] ;
			sp--;
			break;
		case lneg://17
			pila[sp] = -pila[sp] ;
			break ;
		case lptr://18
			pila[sp] = mem[ pila[sp] ] ;
			break ;
		case lnot://19
			pila[sp]^=-1; 
			break ;
		case laid://20
			pila[sp]+= procs_s[num_proc].id ;
			break ;
		case lcid://21
			pila[++sp] = procs_s[num_proc].id ;
			break ;
		case lrng://22 POR HACER (debug)
			imem++;
			break ;
		case ljmp://23
			imem = mem[ imem ] ;
			//printf("Nueva posicion: %i\n", imem ) ;
			break ;
		case ljpf://24 
			if (!(pila[sp]&1))
				imem = mem[ imem ] ;
			else
				imem++;
			sp--; 
			break ;
		case lfun://25 NO USADO
			break ;
		case lcal://26
			devolver++ ;
			v1 = busca_proc_libre() ;
			procs_s[v1].imem = mem[imem++] ;
			temp = proceso_actual ;
			proceso_actual = lista_mete(v1) ;
			procs_s[num_proc].imem = imem ;			
			proceso(v1,num_proc) ;
			proceso_actual = temp ;
			num_proc = num ;
			imem = procs_s[num_proc].imem ;
			break ;
		case lret://27
			lista_quita(proceso_actual);
			//printf("Ret: %i\n" , num_proc) ;
			retcode = 1 ;
			break ;
		case lasp://28
			sp--;
			break;
		case lfrm://29
			procs_s[num_proc].imem = imem ;
			reserved("type_scan",procs_s[num_proc].id)=0;		/* resetea get_id() */
			reserved("id_scan",procs_s[num_proc].id)=0;
			if ( first_loaded )
			{
				Call_Entrypoint(EDIV_first_load);
				first_loaded = 0 ;
			}
			//printf("Frame en: %i\n" , imem ) ;
			retcode = 1 ;
			break ;
		case lcbp://30
			reserved("parameters",procs_s[num_proc].id)=mem[imem++];
			reserved("param_offset",procs_s[num_proc].id)=sp-reserved("parameters",procs_s[num_proc].id)+1;
			/**/procs_s[num_proc].num_params = mem[ imem-1 ] ;
			break;
		case lcpa://31
			mem[pila[sp]]=pila[reserved("param_offset",procs_s[num_proc].id)++];
			sp--;
			cpas++;
			if(cpas==reserved("parameters",procs_s[num_proc].id))
				sp-=cpas;
			break;
		case ltyp://32
			if ( procs_s[num_proc].tipo != 0 ) {
				critical_error(3); // redefinición del tipo de proceso
			}
			procs_s[num_proc].id = (mem[2] + ( num_proc * iloc_len ))|1;
			if(procs_s[num_proc].id>imem_max-iloc_len)
				critical_error(8);	// demasiados procesos en ejecución
			memcpy(&mem[procs_s[num_proc].id],&mem[iloc],iloc_pub_len<<2);
			reserved("process_id",procs_s[num_proc].id)=procs_s[num_proc].id;
			if(padre!=-1) {
				int bigbro;
				if(bigbro=local("son",procs_s[padre].id)) {
					local("smallbro",bigbro)=procs_s[num_proc].id;
					local("bigbro",procs_s[num_proc].id)=bigbro;
				}
				local("son",procs_s[padre].id)=procs_s[num_proc].id;
				local("father",procs_s[num_proc].id)=procs_s[padre].id;
			}
			else {
				local("father",procs_s[num_proc].id)=0;
			}
			procs_s[num_proc].tipo = mem[ imem++ ] ;
			reserved("process_type",procs_s[num_proc].id) = procs_s[num_proc].tipo ;
			mem[procs_s[num_proc].id+_status] = 2;
			inicio_privadas=mem[6];
			break ;
		case lpri://33 POR HACER?
			memcpy(&mem[procs_s[num_proc].id+inicio_privadas],&mem[imem+1],(mem[imem]-imem-1)<<2);
			inicio_privadas+=(mem[imem]-imem-1); imem=mem[imem];
			break ;
		case lcse://34
			if ( pila[sp-1] == pila[sp] ) 
				imem++; 
			else 
				imem=mem[imem];
			sp--;
			break ;
		case lcsr://35
			if ( pila[sp-2] >= pila[sp-1] && pila[sp-2] <= pila[sp] )
				imem++ ;
			else 
				imem = mem[imem]; 
			sp-=2; 
			break ;
		case lshr://36
			pila[sp-1] >>= pila[sp] ; 
			sp-- ;
			break ;
		case lshl://37
			pila[sp-1] <<= pila[sp] ; 
			sp-- ;
			break ;
		case lipt://38
			pila[sp] = ++mem[ pila[sp] ] ;
			break ;
		case lpti://39 COMPORTAMIENTO EXTRAÑO SI SE PONE EN UNA LINEA
			mem[ pila[sp] ]++;
			pila[sp] = mem[ pila[sp] ]-1 ;
			break ;
		case ldpt://40
			pila[sp] = --mem[ pila[sp] ] ;
			break ;
		case lptd://41 COMPORTAMIENTO EXTRAÑO SI SE PONE EN UNA LINEA
			mem[ pila[sp] ]--;
			pila[sp] = mem[ pila[sp] ]+1 ;
			break ;
		case lada://42
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] += pila[sp] ;
			sp--;
			break;
		case lsua://43
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] -= pila[sp] ;
			sp--;
			break;
		case lmua://44
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] *= pila[sp] ;
			sp--;
			break;
		case ldia://45
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] /= pila[sp] ;
			sp--;
			break;
		case lmoa://46
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] %= pila[sp] ;
			sp--;
			break;
		case lana://47
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] &= pila[sp] ;
			sp--;
			break;
		case lora://48
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] |= pila[sp] ;
			sp--;
			break;
		case lxoa://49
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] ^= pila[sp] ;
			sp--;
			break;
		case lsra://50
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] >>= pila[sp] ;
			sp--;
			break;
		case lsla://51
			pila[ sp-1 ] = mem[ pila[ sp-1 ] ] <<= pila[sp] ;
			sp--;
			break;
		case lpar://52 POR HACER?
			//imem++;
			inicio_privadas+=mem[imem++];
			break;
		case lrtf://53
			lista_quita(num_proc) ;
			no_devuelve = 1 ;
			//printf("Return: %i\n" , num_proc) ;
			retcode = 1 ;
			break ;
		case lclo://54 POR HACER
			break ;
		case lfrf://55 POR HACER
			sp--;
			break ;
		case limp://56
			carga_dll((char*)&mem[mem[imem++]]);
			break ;
		case lext://57
			externa=extfuncs[mem[imem]];
			// corresponder con FUNCTION_PARAMS
			//temp = externa(pila,&sp,mem,varindex,&procs_s,Call_Entrypoint);
			fp.num_params=extparms[mem[imem++]];
			temp = externa(&fp) ;
			pila[++sp]= temp ;
			break ;
		case ldbg://58
			#ifdef DBG
				Call_Entrypoint(EDIV_debug,imem,nombre_program,lin,0);
			#endif
			break ;

		/* OPCODES OPTIMIZADOS */

		case lcar2://60
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			break;
		case lcar3://61
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			break;
		case lcar4://62
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			pila[++sp]=mem[imem++];
			break;
		case lasiasp://63
			mem[pila[sp-1]]=pila[sp];
			sp-=2;
			break;
		case lcaraid://64
			pila[++sp]=mem[imem++]+procs_s[num_proc].id;
			break;
		case lcarptr://65
			pila[++sp]=mem[mem[imem++]];
			break;
		case laidptr://66
			pila[sp]=mem[pila[sp]+procs_s[num_proc].id];
			break;
		case lcaraidptr://67
			pila[++sp]=mem[mem[imem++]+procs_s[num_proc].id];
			break;
		case lcaraidcpa://68
			mem[mem[imem++]+procs_s[num_proc].id]=pila[reserved("param_offset",procs_s[num_proc].id)++];
			//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]];
			sp--;
			break;
		case lfunasp://70 NO USADO
			break;
		case lcaradd://71
			pila[sp]+=mem[imem++];
			break;
		case lcaraddptr://72
			pila[sp]=mem[pila[sp]+mem[imem++]];
			break;
		case lcarmul://73
			pila[sp]*=mem[imem++];
			break;
		case lcarmuladd://74
			pila[sp-1]+=pila[sp]*mem[imem++];
			sp--;
			break;
		case lcarasiasp://75
			mem[pila[sp]]=mem[imem++];
			sp--;
			break;
		case lcarsub://76
			pila[sp]-=mem[imem++];
			break;
		case lcardiv://77 no hay nunca "cardiv 0"
			pila[sp]/=mem[imem++];
			break;

		/* OPERACIONES CON DATOS DE TIPO BYTE */

		case lptrchr:
			pila[sp-1]=(unsigned int)memb[pila[sp-1]*4+pila[sp]];
			sp--;
			break;
		case lasichr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]=(byte)pila[sp]);
			sp-=2;
			break;
		case liptchr:
			pila[sp-1]=(unsigned int)++memb[pila[sp-1]*4+pila[sp]];
			sp--;
			break;
		case lptichr:
			/* o_O yo lo flipo con el visual studio! mirad la tonteria que he
			 * tenido ke hacer! (variable utemp)
			 * visto lo visto, hay que testear cuidadosamente TODOS los opcodes!
			 */
			utemp=pila[sp-1];
			pila[sp-1]=(unsigned int)memb[utemp*4+pila[sp]]++;
			sp--;
			break;
		case ldptchr:
			pila[sp-1]=(unsigned int)--memb[pila[sp-1]*4+pila[sp]];
			sp--;
			break;
		case lptdchr:
			/* y aqui la misma chapuza en teoria innecesaria! */
			utemp=pila[sp-1];
			pila[sp-1]=(unsigned int)memb[utemp*4+pila[sp]]--;
			sp--;
			break;
		case ladachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]+=(byte)pila[sp]);
			sp-=2;
			break;
		case lsuachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]-=(byte)pila[sp]);
			sp-=2;
			break;
		case lmuachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]*=(byte)pila[sp]);
			sp-=2;
			break;
		case ldiachr:
			/*#ifdef DBG
				if (pila[sp]==0) {
					memb[pila[sp-2]*4+pila[sp-1]]=0;
					sp-=2; pila[sp]=0;
					v_function=-2; e(145);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]/=(byte)pila[sp]);
			sp-=2;
			break;
		case lmoachr:
			/*#ifdef DBG
				if (pila[sp]==0) {
					memb[pila[sp-2]*4+pila[sp-1]]=0;
					sp-=2; pila[sp]=0;
					v_function=-2; e(145);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]%=(byte)pila[sp]);
			sp-=2;
			break;
		case lanachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]&=(byte)pila[sp]);
			sp-=2;
			break;
		case lorachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]|=(byte)pila[sp]);
			sp-=2;
			break;
		case lxoachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]^=(byte)pila[sp]);
			sp-=2;
			break;
		case lsrachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]>>=(byte)pila[sp]);
			sp-=2;
			break;
		case lslachr:
			pila[sp-2]=(unsigned int)(memb[pila[sp-2]*4+pila[sp-1]]<<=(byte)pila[sp]);
			sp-=2;
			break;
		case lcpachr:
			_param_offset=reservedptr("param_offset");
			if ((unsigned int)pila[mem[procs_s[num_proc].id+_param_offset]]<256) {
				memb[pila[sp-1]*4+pila[sp]]=(byte)pila[mem[procs_s[num_proc].id+_param_offset]];
			}
			else {
				if (pila[mem[procs_s[num_proc].id+_param_offset]]<imem_max+258*4)
					memb[pila[sp-1]*4+pila[sp]]=memb[pila[mem[procs_s[num_proc].id+_param_offset]]*4];
				else
					memb[pila[sp-1]*4+pila[sp]]=(byte)pila[mem[procs_s[num_proc].id+_param_offset]];
			}
			sp-=2;
			mem[procs_s[num_proc].id+_param_offset]++;
			break;

		/* OPERACIONES CON DATOS DE TIPO WORD */

		case lptrwor:
			pila[sp-1]=(unsigned int)memw[pila[sp-1]*2+pila[sp]];
			sp--;
			break;
		case lasiwor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]=(word)pila[sp]);
			sp-=2;
			break;
		case liptwor:
			pila[sp-1]=(unsigned int)++memw[pila[sp-1]*2+pila[sp]];
			sp--;
			break;
		case lptiwor:
			utemp=pila[sp-1];
			pila[sp-1]=(unsigned int)memw[utemp*2+pila[sp]]++;
			sp--;
			break;
		case ldptwor:
			pila[sp-1]=(unsigned int)--memw[pila[sp-1]*2+pila[sp]];
			sp--;
			break;
		case lptdwor:
			utemp=pila[sp-1];
			pila[sp-1]=(unsigned int)memw[utemp*2+pila[sp]]--;
			sp--;
			break;
		case ladawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]+=(word)pila[sp]);
			sp-=2;
			break;
		case lsuawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]-=(word)pila[sp]);
			sp-=2;
			break;
		case lmuawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]*=(word)pila[sp]);
			sp-=2;
			break;
		case ldiawor:
/*			#ifdef DEBUG
				if (pila[sp]==0) {
					memw[pila[sp-2]*2+pila[sp-1]]=0;
					sp-=2; pila[sp]=0;
					v_function=-2; e(145);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]/=(word)pila[sp]);
			sp-=2;
			break;
		case lmoawor:
/*			#ifdef DEBUG
				if (pila[sp]==0) {
					memw[pila[sp-2]*2+pila[sp-1]]=0;
					sp-=2; pila[sp]=0;
					v_function=-2; e(145);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]%=(word)pila[sp]);
			sp-=2;
			break;
		case lanawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]&=(word)pila[sp]);
			sp-=2;
			break;
		case lorawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]|=(word)pila[sp]);
			sp-=2;
			break;
		case lxoawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]^=(word)pila[sp]);
			sp-=2;
			break;
		case lsrawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]>>=(word)pila[sp]);
			sp-=2;
			break;
		case lslawor:
			pila[sp-2]=(unsigned int)(memw[pila[sp-2]*2+pila[sp-1]]<<=(word)pila[sp]);
			sp-=2;
			break;
		case lcpawor:
			_param_offset=reservedptr("param_offset");
			if ((unsigned)pila[mem[procs_s[num_proc].id+_param_offset]]<256) {
				memw[pila[sp-1]*2+pila[sp]]=(word)pila[mem[procs_s[num_proc].id+_param_offset]];
			} else {
				if (pila[mem[procs_s[num_proc].id+_param_offset]]<imem_max+258*4)
					memw[pila[sp-1]*2+pila[sp]]=memw[pila[mem[procs_s[num_proc].id+_param_offset]]*2];
				else
					memw[pila[sp-1]*2+pila[sp]]=(word)pila[mem[procs_s[num_proc].id+_param_offset]];
			} sp-=2; mem[procs_s[num_proc].id+_param_offset]++; break;


		/* OPERACIONES CON DATOS DE TIPO STRING */
		/* Nota: un puntero a cadena menor a 256 se trata siempre como "%c" */

		case lstrcpy:
/*			#ifdef DEBUG
				if ((mem[pila[sp-1]-1]&0xFFF00000)!=0xDAD00000) {
					sp--; v_function=-2; e(164);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
				if ((unsigned)pila[sp]>255) if ((mem[pila[sp-1]-1]&0xFFFFF)+1<strlen((char*)&mem[pila[sp]])) {
					sp--; v_function=-2; e(140);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			if ((unsigned)pila[sp]>255)
				strcpy((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]]);
			else
				sprintf((char*)&mem[pila[sp-1]],"%c\0",pila[sp]);
			sp--;
			break;

		case lstrfix:
			if (pila[sp-1]>=(oo=strlen(&memb[pila[sp-2]*4]))) {
				for (;oo<pila[sp-1];oo++) {
					memb[pila[sp-2]*4+oo]=' ';
				} memb[pila[sp-2]*4+oo+1]=0;
			} break;

		case lstrcat:
/*			#ifdef DEBUG
				if ((mem[pila[sp-1]-1]&0xFFF00000)!=0xDAD00000) {
					sp--; v_function=-2; e(164);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
				if ((unsigned)pila[sp]>255) oo=strlen((char*)&mem[pila[sp]]); else oo=1;
				if ((mem[pila[sp-1]-1]&0xFFFFF)+1<strlen((char*)&mem[pila[sp-1]])+oo) {
					sp--; v_function=-2; e(140);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			if ((unsigned)pila[sp]>255) strcat((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]]);
			else sprintf((char*)&mem[pila[sp-1]],"%s%c\0",(char*)&mem[pila[sp-1]],pila[sp]);
			sp--;
			break;

		case lstradd: /* Strcat "en el aire" (ojo, el aire tiene tambien 0xDAD00402) */
/*			#ifdef DEBUG
				if ((unsigned)pila[sp-1]>255) oo=strlen((char*)&mem[pila[sp-1]]); else oo=1;
				if ((unsigned)pila[sp]>255) oo+=strlen((char*)&mem[pila[sp]]); else oo+=1;
				if (oo>=1028) {
					sp--; v_function=-2; e(140);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					sprintf((char*)&mem[nullstring[nstring]],"%s%s\0",(char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]]);
				} else {
					sprintf((char*)&mem[nullstring[nstring]],"%s%c\0",(char*)&mem[pila[sp-1]],pila[sp]);
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					sprintf((char*)&mem[nullstring[nstring]],"%c%s\0",pila[sp-1],(char*)&mem[pila[sp]]);
				} else {
					sprintf((char*)&mem[nullstring[nstring]],"%c%c\0",pila[sp-1],pila[sp]);
				}
			}
			pila[--sp]=nullstring[nstring];
			nstring=((nstring+1)&3);
			break;

		case lstrdec: /* cambio de tamaño "en el aire" (no da error, hace lo que puede) */
			oo=strlen((char*)&mem[pila[sp-1]]);
			if (oo<1028) {
				strcpy((char*)&mem[nullstring[nstring]],(char*)&mem[pila[sp-1]]);
				if (pila[sp]>0) { /* Quitar caracteres */
					if (pila[sp]>=oo) memb[nullstring[nstring]*4]=0;
					else memb[nullstring[nstring]*4+oo-pila[sp]]=0;
				} else if (pila[sp]<0) { /* Añadir (?) caracteres (por homogeneidad) */
					pila[sp]=oo-pila[sp]; /* Nueva longitud */
					if (pila[sp]>1025) pila[sp]=1025;
					for (;oo<pila[sp];oo++) {
						memb[nullstring[nstring]*4+oo]=' ';
					} memb[nullstring[nstring]*4+oo]=0;
				}
			} else mem[nullstring[nstring]]=0;
			pila[--sp]=nullstring[nstring];
			nstring=((nstring+1)&3);
			break;

		case lstrsub: /* cambio de tamaño a un string */
			oo=strlen((char*)&mem[pila[sp-1]]);
/*			#ifdef DEBUG
				if ((mem[pila[sp-1]-1]&0xFFF00000)!=0xDAD00000) {
					sp--; v_function=-2; e(164);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
				if ((mem[pila[sp-1]-1]&0xFFFFF)+1<oo-pila[sp]) {
					sp--; v_function=-2; e(140);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
			#endif*/
			if (pila[sp]>0) { // Quitar caracteres
				if (pila[sp]>=oo) memb[pila[sp-1]*4]=0;
				else memb[pila[sp-1]*4+oo-pila[sp]]=0;
			} else if (pila[sp]<0) { /* Añadir (?) caracteres (por homogeneidad) */
				pila[sp]=oo-pila[sp]; /* Nueva longitud */
				for (;oo<pila[sp];oo++) {
					memb[pila[sp-1]*4+oo]=' ';
				} memb[pila[sp-1]*4+oo]=0;
			} sp--;
			break;

		case lstrlen:
			if ((unsigned)pila[sp]>255) pila[sp]=strlen((char*)&mem[pila[sp]]); else pila[sp]=1;
			break;

		case lstrigu:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])) pila[sp-1]=0; else pila[sp-1]=1;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])) pila[sp-1]=0; else pila[sp-1]=1;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])) pila[sp-1]=0; else pila[sp-1]=1;
				} else {
					pila[sp-1]=(pila[sp-1]==pila[sp]);
				}
			} sp--; break;

		case lstrdis:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])) pila[sp-1]=1; else pila[sp-1]=0;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					pila[sp-1]=(pila[sp-1]!=pila[sp]);
				}
			} sp--; break;
			break;

		case lstrmay:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])>0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])>0) pila[sp-1]=1; else pila[sp-1]=0;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])>0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					pila[sp-1]=(pila[sp-1]>pila[sp]);
				}
			} sp--; break;
			break;

		case lstrmen:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])<0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])<0) pila[sp-1]=1; else pila[sp-1]=0;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])<0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					pila[sp-1]=(pila[sp-1]<pila[sp]);
				}
			} sp--; break;
			break;

		case lstrmei:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])<=0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])<=0) pila[sp-1]=1; else pila[sp-1]=0;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])<=0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					pila[sp-1]=(pila[sp-1]<=pila[sp]);
				}
			} sp--; break;
			break;

		case lstrmai:
			if ((unsigned)pila[sp-1]>255) {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&mem[pila[sp]])>=0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					if (strcmp((char*)&mem[pila[sp-1]],(char*)&pila[sp])>=0) pila[sp-1]=1; else pila[sp-1]=0;
				}
			} else {
				if ((unsigned)pila[sp]>255) {
					if (strcmp((char*)&pila[sp-1],(char*)&mem[pila[sp]])>=0) pila[sp-1]=1; else pila[sp-1]=0;
				} else {
					pila[sp-1]=(pila[sp-1]>=pila[sp]);
				}
			} sp--; break;
			break;

		case lcpastr:
			_param_offset=reservedptr("param_offset");
/*			#ifdef DEBUG
				if ((mem[pila[sp]-1]&0xFFF00000)!=0xDAD00000) {
					sp--; mem[id+_Param]++; v_function=-2; e(164);
					if (call_to_debug) { process_stoped=id; return; }
					break;
				}
				if ((unsigned)pila[mem[id+_Param]]>255) {
					if ((mem[pila[sp]-1]&0xFFFFF)+1<strlen((char*)&mem[pila[mem[id+_Param]]])) {
						sp--; mem[id+_Param]++; v_function=-2; e(140);
						if (call_to_debug) { process_stoped=id; return; }
						break;
					}
				}
			#endif*/
			if ((unsigned)pila[mem[procs_s[num_proc].id+_param_offset]]>255)
				strcpy((char*)&mem[pila[sp]],(char*)&mem[pila[mem[procs_s[num_proc].id+_param_offset]]]);
			else sprintf((char*)&mem[pila[sp]],"%c\0",pila[mem[procs_s[num_proc].id+_param_offset]]);
			sp--; mem[procs_s[num_proc].id+_param_offset]++;
			break;

		/* Comprobación de punteros nulos */
		case lnul:
/*			#ifdef DEBUG
				if (!pila[sp]) {
					v_function=-2; e(165);
					if (call_to_debug) { process_stoped=id; return; }
				}
			#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
			Call_Entrypoint(EDIV_trace,imem,nombre_program,lin,0);
			#ifdef _DEBUG
				actual_lin=localiza_lin(imem);
				if(actual_lin!=last_lin) {
					unsigned char* p=&prog[lin[actual_lin*4+3]];
//					printf("[%d|%d-%d] ",imem,lin[actual_lin*4+3],lin[actual_lin*4+4]);
					printf("[%d] ",imem);
					while(p<=&prog[lin[actual_lin*4+4]]) {
						putc(*p,stdout);
						p++;
					}
					printf("\n");
					last_lin=actual_lin;
				}
			#endif /* _DEBUG */
		#endif /* DBG */
	}

	if ( devolver > 0 && no_devuelve == 0 )
	{
		//pila[++sp] = 0 ;// AQUI SE DEBERA DEVOLVER EL ID
		pila[++sp]=procs_s[num_proc].id;
		devolver-- ;
	}

	Call_Entrypoint(EDIV_post_process);

	return 1 ;
}
Example #14
0
void aplicar_waves (int tiempo, int cant_iteraciones, const char *nomb_impl, const char *nomb_arch_entrada, float x_scale, float y_scale, float g_scale) {
	IplImage *src = 0;
	IplImage *dst = 0;
	CvSize dst_size;

	// Cargo la imagen
	if( (src = cvLoadImage (nomb_arch_entrada, CV_LOAD_IMAGE_GRAYSCALE)) == 0 )
		exit(EXIT_FAILURE);

	dst_size.width = src->width;
	dst_size.height = src->height;

	// Creo una IplImage para cada salida esperada
	if( (dst = cvCreateImage (dst_size, IPL_DEPTH_8U, 1) ) == 0 )
		exit(EXIT_FAILURE);

	// Chequeo de parametros
	if (!(x_scale <=  32.0 && x_scale >= 0.0 &&
		  y_scale <=  32.0 && y_scale >= 0.0 &&
		  g_scale <= 255.0 && g_scale >= 0.0)) {
		imprimir_ayuda();

		cvReleaseImage(&src);
		cvReleaseImage(&dst);

		exit ( EXIT_SUCCESS );
	}

	typedef void (waves_fn_t) (unsigned char*, unsigned char*, int, int, int, float, float, float);

	waves_fn_t *proceso;

	if (strcmp(nomb_impl, "c") == 0) {
		proceso = waves_c;
	} else {
		proceso = waves_asm;
	}

	if (tiempo) {
		unsigned long long int start, end;

		MEDIR_TIEMPO_START(start);

		for(int i=0; i<cant_iteraciones; i++) {
			proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, x_scale, y_scale, g_scale);
		}

		MEDIR_TIEMPO_STOP(end);

		imprimir_tiempos_ejecucion(start, end, cant_iteraciones);
	} else {
		proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, x_scale, y_scale, g_scale);
	}

	// Guardo imagen y libero las imagenes
	char nomb_arch_salida[256];

	memset(nomb_arch_salida, 0, 256);

	sprintf(nomb_arch_salida, "%s.waves.x_scale-%3.2f.y_scale-%3.2f.g_scale-%3.2f.%s.bmp", nomb_arch_entrada, x_scale, y_scale, g_scale, nomb_impl);

	cvSaveImage(nomb_arch_salida, dst, NULL);

	cvReleaseImage(&src);
	cvReleaseImage(&dst);
}
Example #15
0
void aplicar_umbralizar (int tiempo, int cant_iteraciones, const char *nomb_impl, const char *nomb_arch_entrada, unsigned char min, unsigned char max, unsigned char q) {
	IplImage *src = 0;
	IplImage *dst = 0;
	CvSize dst_size;

	// Cargo la imagen
	if( (src = cvLoadImage (nomb_arch_entrada, CV_LOAD_IMAGE_GRAYSCALE)) == 0 )
		exit(EXIT_FAILURE);

	dst_size.width = src->width;
	dst_size.height = src->height;

	// Creo una IplImage para cada salida esperada
	if( (dst = cvCreateImage (dst_size, IPL_DEPTH_8U, 1) ) == 0 )
		exit(EXIT_FAILURE);

	// Chequeo de parametros
	if (!(min <= max && min >= 0 && max <= 255 && q >= 0 && q <= 255)) {
		imprimir_ayuda();

		cvReleaseImage(&src);
		cvReleaseImage(&dst);

		exit ( EXIT_SUCCESS );
	}

	typedef void (umbralizar_fn_t) (unsigned char*, unsigned char*, int, int, int, unsigned char, unsigned char, unsigned char);

	umbralizar_fn_t *proceso;

	if (strcmp(nomb_impl, "c") == 0) {
		proceso = umbralizar_c;
	} else {
		proceso = umbralizar_asm;
	}

	if (tiempo) {
		unsigned long long int start, end;

		MEDIR_TIEMPO_START(start);

		for(int i=0; i<cant_iteraciones; i++) {
			proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, min, max, q);
		}

		MEDIR_TIEMPO_STOP(end);

		imprimir_tiempos_ejecucion(start, end, cant_iteraciones);
	} else {
		proceso((unsigned char*)src->imageData, (unsigned char*)dst->imageData, src->height, src->width, src->widthStep, min, max, q);
	}

	// Guardo imagen y libero las imagenes
	char nomb_arch_salida[256];

	memset(nomb_arch_salida, 0, 256);

	sprintf(nomb_arch_salida, "%s.umbralizar.min-%d.max-%d.q-%d.%s.bmp", nomb_arch_entrada, min, max, q, nomb_impl);

	cvSaveImage(nomb_arch_salida, dst, NULL);

	cvReleaseImage(&src);
	cvReleaseImage(&dst);
}
Example #16
0
//---------------------------------------------------------------------------
void __fastcall ProcesoThresholdingColorNegro::Execute()
{
  TotalArchivos=0;
  TotalArchivos=picture->GetTotalRecords();
  if(TotalArchivos<=0){return;} /* si no se ha seleccionado ningún archivo se
                                             se termina el proceso */
/* se crea directorio de reporte */

  AnsiString DirReport=ExtractFileDir(AnsiString(picture->FileName[0]))+"\\result";
  CreateDir(DirReport);
/* se crea archivo resumen */
  AnsiString ArchivoResumen=DirReport+"\\resumen.txt";
  FILE *streamRes;
  streamRes = fopen (ArchivoResumen.c_str(),"w");
  if(streamRes==NULL){fclose(streamRes);}
  else
  {
    fprintf(streamRes,"%s\n",  " Total    Total                         ");
    fprintf(streamRes,"%s\n\n"," Pixels    cm2    File name");
    fclose(streamRes);
  }
/* Progress Bar */
  Synchronize(definirMaxDeProgressBar);
/* SE INICIA EL PROCESO */
  iReg=0;
  for(iReg=0;iReg<TotalArchivos;iReg++)
  {
// se ubica el archivo en el sgLista
    Synchronize(ubicarReg_en_sglista);
// se forma el nombre del archivo bitmap salida
    archivoOrig=picture->FileName[iReg];
    AnsiString archivoX=ExtractFileName(picture->FileName[iReg]);
    archivoBitmapTH="";
    for(int z=1;z<=archivoX.Length()-4;z++)
    {
      archivoBitmapTH=archivoBitmapTH+archivoX[z];
    }
    archivoBitmapTH=archivoBitmapTH+"_Thr";
    archivoBitmapTH=DirReport+"\\"+archivoBitmapTH+".bmp";
// cargo la imagen
    try
    {
      archivoBMP=picture->FileName[iReg];
      proceso(archivoBitmapTH,ArchivoResumen,0,picture->Width[iReg],0,picture->Height[iReg],iReg);
//      Synchronize(GuardarTH);
    }
    catch(...)
    {
      picture->Height[iReg]=0;
      picture->Width[iReg]=0;
      picture->TotalPixel[iReg]=0;
      picture->LAI[iReg]=0.0;
      picture->TimeDuration[iReg]=0;
    }
    Synchronize(mostrarInfo_en_sglista);
    Synchronize(avanzarProgressBar);
  }
/* FINALIZA EL PROCESO */
  Synchronize(ubicarRegInicial_en_sglista);
  Synchronize(msgFinal);
}