335 lines
9.2 KiB
C++
335 lines
9.2 KiB
C++
#include <dos.h>
|
||
#include <alloc.h>
|
||
#include <conio.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <graphics.h>
|
||
|
||
#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);
|
||
}
|
||
} |