#include #include #include #include #include #include #include "..\libs\make_bot\make_bot.h" #include "..\libs\wavplav\wavplay.h" extern void Sonido(char Sonido); #include "XmsSupp.h" /******************************* DEFINICIONES ******************************/ #define GRAFICO 18 /* su n£mero en el proceso de compilaci¢n */ void reinicializa_raton_grafico(int x1, int y1, int x2, int y2); /*********************** DECLARACIONES DE FUNCIONES ************************/ extern char raton; //*ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ*// //*Û Cabecera completa de un PCX Û*// //*ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ*// typedef struct { char indicador; /* constante. Si=10 es un archivo PCX */ char version; /* version pcx */ char codificacion; /* Si=1 el PCX esta comprimido */ char bits_pixel; /* bits por pixel (1,2,4,8) */ /* los 4 campos que siguen dan el recuadrado de la imagen */ unsigned int Xmin; unsigned int Ymin; unsigned int Xmax; unsigned int Ymax; unsigned int Hres; unsigned int Vres; char paleta_16[48]; /* si la pcx tiene <=16 colores, aqui paleta */ char reserv1; /* reservado */ char nplanos; /* num. de planos usados en la imagen */ unsigned int bytes_linea; /* bytes necesarios para decodificar una linea */ unsigned int infopal; /* Si=1 color o blanco y negro. 0=grises */ unsigned int anchura; /* anchura de la imagen */ unsigned int altura; /* altura de la imagen */ char sobrante[54]; /* sobrante de cabecera para futuras ampliaciones */ } PCX_HEADER; void asigna_modo_video(char); extern "C" void VUELCA_PANTALLA(unsigned char *); extern "C" void VUELCA_PANTALLA_B(unsigned char *); int lee_dibujo(char *dibujo); extern void InicializaSVGA(void); extern char dac[256*3]; char newdac[256*3]; extern "C" void ENCIENDE_PANTALLA(char *); extern "C" void CHANGE_BANK(int); extern XmsSupp Xms_Image_Bank1, Xms_Image_Bank2, Xms_Image_Bank3, Xms_Image_Bank4, Xms_Image_Bank5; /*************************** VARIABLES GLOBALES ****************************/ int Lee_Cabecera(char *dibujo); void ChkErr(void); extern void Inicializa_Dibujo(int L_Imagen, char *N_Imagen2); extern char SONIDO; void Carga_PCX(char *Imagen) { int col; char Old_Dac[256*3]; // Guardamos el contenido de la pantalla // Asignamos Puntero a Memoria convencional y miramos si // hay ERROR. // Movemos a XMS y si hay ERROR lo Visualizamos. CHANGE_BANK(0); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank1); ChkErr(); Move2Xms(&Xms_Image_Bank1); ChkErr(); CHANGE_BANK(1); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank2); ChkErr(); Move2Xms(&Xms_Image_Bank2); ChkErr(); CHANGE_BANK(2); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank3); ChkErr(); Move2Xms(&Xms_Image_Bank3); ChkErr(); CHANGE_BANK(3); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank4); ChkErr(); Move2Xms(&Xms_Image_Bank4); ChkErr(); CHANGE_BANK(4); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank5); ChkErr(); Move2Xms(&Xms_Image_Bank5); ChkErr(); // Guardamos los colores originales for( col = 0; col < 256*3; col++) Old_Dac[col] = dac[col]; switch( Lee_Cabecera(Imagen) ) { case 1: // 640x480 16c case 3: // 640x400 16c asigna_modo_video(18); lee_dibujo(Imagen); PunteroRaton = 1; Espera_Tecla_o_Raton(); PunteroRaton = 100; // getch(); InicializaSVGA(); break; case 2: // 640x480 246c case 4: // 640x400 246c cleardevice(); Inicializa_Dibujo( (-2), Imagen); for( col = (256-16)*3; col < (256)*3; col++) dac[col] = newdac[ col ]; ENCIENDE_PANTALLA(dac); PunteroRaton = 1; if( SONIDO == 1 ) { PlayLongWav( "CD_OUT.cr2", 0, -1 ); getch(); } else Espera_Tecla_o_Raton(); PunteroRaton = 100; while( kbhit() ) getch(); // getch(); break; } // Restauramos el contenido de la pantalla // Asignamos Puntero a Memoria convencional y miramos si // hay ERROR. // Movemos a XMS y si hay ERROR lo Visualizamos. CHANGE_BANK(0); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank1); ChkErr(); Move2Con(&Xms_Image_Bank1); ChkErr(); CHANGE_BANK(1); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank2); ChkErr(); Move2Con(&Xms_Image_Bank2); ChkErr(); CHANGE_BANK(2); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank3); ChkErr(); Move2Con(&Xms_Image_Bank3); ChkErr(); CHANGE_BANK(3); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank4); ChkErr(); Move2Con(&Xms_Image_Bank4); ChkErr(); CHANGE_BANK(4); SetConPntr(MK_FP(0xA000, 0), &Xms_Image_Bank5); ChkErr(); Move2Con(&Xms_Image_Bank5); ChkErr(); // Restauramos los colores originales for( col = 0; col < 256*3; col++) dac[col] = Old_Dac[col]; ENCIENDE_PANTALLA(dac); reinicializa_raton_grafico( 0, 0, 618, 460); } void asigna_modo_video(char modo) /* asigna el modo de v¡deo indicado */ { /* en la variable "modo" */ union REGS r; r.h.al = modo; r.h.ah = 0; int86(16, &r, &r); } int Lee_Cabecera(char *dibujo){ FILE *handle_dibujo; long ancho, alto; int col; PCX_HEADER Cabecera; if((handle_dibujo=fopen(dibujo, "rb"))==NULL) { return -2; } // Saltamos la cabecera fread( &Cabecera, sizeof(PCX_HEADER), 1, handle_dibujo ); ancho= Cabecera.Xmax - Cabecera.Xmin+1; alto = Cabecera.Ymax - Cabecera.Ymin+1; col = ( (Cabecera.bits_pixel<=4) ? 16 : 256 ); fclose(handle_dibujo); if(ancho == 640 && alto == 480 && col == 16) return 1; if(ancho == 640 && alto == 480 && col ==256) return 2; if(ancho == 640 && alto == 400 && col == 16) return 3; if(ancho == 640 && alto == 400 && col ==256) return 4; if(ancho == 320 && alto == 200 && col ==256) return 5; return (-1); } int lee_dibujo(char *dibujo) { int *dir_dibu; char huge *dir; PCX_HEADER Cabecera; struct SREGS seg; union REGS ent, sal; int num_color, n; long int dir2; unsigned char *dir_col; unsigned char *dir_planos; FILE *handle_dibujo; long ancho, alto; int filas, columnas, byte, contador; int colores[16] = { 0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63 }; if((handle_dibujo=fopen(dibujo, "rb"))==NULL) { return -2; } // Saltamos la cabecera fread( &Cabecera, sizeof(PCX_HEADER), 1, handle_dibujo ); ancho= Cabecera.Xmax - Cabecera.Xmin+1; alto = Cabecera.Ymax - Cabecera.Ymin+1; //*ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ*// //*Û Asigna memoria Û*// //*ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ*// if((dir_planos=(unsigned char *)farmalloc( (long)((ancho*alto)/2) ) )==NULL) { if(fclose(handle_dibujo)!=NULL) { return -2; } return -1; } dir=(char huge *)dir_planos; while(!feof(handle_dibujo)) { for(filas=alto; filas>0 && !feof(handle_dibujo); filas--) { columnas=ancho/2; while( columnas>0 && !feof(handle_dibujo) ) { byte=getc(handle_dibujo); if(byte<=192) { *dir++=byte; columnas--; } else { contador=byte&0x3F; byte=getc(handle_dibujo); for(; contador>0; contador--) { *dir++=byte; columnas--; } } } } } if(fclose(handle_dibujo)!=NULL) { return -2; } dir_col=Cabecera.paleta_16; /* divide entre 4 */ for(n=16*3; n>0; n--) { /* los colores */ *dir_col=(*dir_col) >> 2; dir_col++; } dir2 =(long)Cabecera.paleta_16; /* obtiene el segmento */ seg.es=(int) (dir2 >> 16); /* donde estan los colores */ for(n=0; n<16; n++) { num_color=colores[n]; ent.h.al = 18; ent.h.ah = 16; ent.x.bx = num_color; ent.x.cx = 1; ent.x.dx = (int)dir2; /* offset de los colores */ int86x(0x10, &ent, &sal, &seg); /* funci¢n para asignar los colores */ dir2+=3; } // if( alto == 400 ) VUELCA_PANTALLA(dir_planos); // else VUELCA_PANTALLA_B(dir_planos); VUELCA_PANTALLA(dir_planos); farfree(dir_planos); return 0; } void reinicializa_raton_grafico(int x1, int y1, int x2, int y2) { struct SREGS seg; union REGS ent, sal; if(raton!=0) { ent.x.ax = 15; ent.x.cx = 5; ent.x.dx = 11; int86(0x33, &ent, &sal); /* fija la raz¢n mickey/pixel */ ent.x.ax = 7; ent.x.cx = x1; ent.x.dx = x2; int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. horizontal */ ent.x.ax = 8; ent.x.cx = y1; ent.x.dx = y2; int86(0x33, &ent, &sal); /* fija la posici¢n m x. y m¡n. vertical */ } } void ChkErr(void) { if(Xms_Image_Bank1.lError || Xms_Image_Bank2.lError || Xms_Image_Bank3.lError || Xms_Image_Bank4.lError || Xms_Image_Bank5.lError ) { closegraph(); printf("Bank1 %s\n",Xms_Image_Bank1.cError); printf("Bank2 %s\n",Xms_Image_Bank2.cError); printf("Bank3 %s\n",Xms_Image_Bank3.cError); printf("Bank4 %s\n",Xms_Image_Bank4.cError); printf("Bank5 %s\n",Xms_Image_Bank5.cError); printf("Cambiando Bancos, Hemos salido con los codigos: %d, %d, %d, %d", Xms_Image_Bank1.lError, Xms_Image_Bank2.lError, Xms_Image_Bank3.lError, Xms_Image_Bank4.lError, Xms_Image_Bank5.lError ); exit(1); } }