home *** CD-ROM | disk | FTP | other *** search
- /*-----------------------------------------------------------------------*/
- /* Mostrar un fichero .SPR de Sprite Maker */
- /* by */
- /* Pedro Antonio Martinez */
- /*-----------------------------------------------------------------------*/
-
- #include <io.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <mem.h>
- #include <fcntl.h>
- #include <alloc.h>
- #include <dos.h>
- #include <dir.h>
-
- void RutErr ( int cod ) ;
- int MostrarFichero (char *FSpec) ;
-
- typedef unsigned char BYTE ;
-
- typedef struct Sprite_s
- { int LonX ;
- int LonY ;
- BYTE *pImagen ;
- } SPRITE ;
-
- int xAct = 1, yAct = 1 ;
- int xIni = 1, yIni = 1, xInc = 5, yInc = 0 ;
- int Ciclo = 0 ;
- int Bkg = 0, Dly = 100 ;
- int EspTec = 0 ;
-
- int main ( int argc, char *argv[] )
- {
- union REGS Regs ;
- struct SREGS sRegs ;
- int i ;
- char fPal[30] = "" ;
- char Pal[768] ;
- int hfPal ;
-
- if ( argc < 2 ) RutErr ( 2 ) ;
-
- /*------------------------------------------------------------------------
- Poner modo de video 13H (320x200, 256 colores)
- ------------------------------------------------------------------------*/
- Regs.x.ax = 0x13 ;
- int86( 0x10, &Regs, &Regs ) ;
-
- for ( i = 1; i < argc; i++ )
- if (*argv[i] == '/' || *argv[i] == '-' )
- switch ( *(argv[i]+1) ) {
- case 'x':
- case 'X':
- switch (*(argv[i]+2)) {
- case 'i':
- case 'I':
- xIni = atoi ( argv[i]+3 ) ;
- xAct = xIni ;
- break ;
- case 'd':
- case 'D':
- xInc = atoi ( argv[i]+3 ) ;
- break ;
- }
- break ;
- case 'y':
- case 'Y':
- switch (*(argv[i]+2)) {
- case 'i':
- case 'I':
- yIni = atoi ( argv[i]+3 ) ;
- yAct = yIni ;
- break ;
- case 'd':
- case 'D':
- yInc = atoi ( argv[i]+3 ) ;
- break ;
- }
- break ;
- case 'd':
- case 'D': /* D=Demora */
- Dly = atoi ( argv[i]+2 ) ;
- break ;
- case 'f':
- case 'F': /* F=Color de fondo */
- Bkg = atoi ( argv[i]+2 ) ;
- Regs.h.ah = 0x0b ;
- Regs.h.bh = 0 ;
- Regs.h.bl = Bkg ;
- int86 ( 0x10, &Regs, &Regs ) ;
- break ;
- case 'p':
- case 'P': /* P=Paleta (nombre de fichero) */
- strcpy(fPal, argv[i]+2 ) ;
- if( (hfPal = open( fPal, O_BINARY | O_RDONLY )) == - 1 )
- RutErr (4) ; /* Error. No existe el fichero */
- if( read( hfPal, Pal, 768 ) != 768 )
- RutErr( 5 );
- close (hfPal ) ;
- Regs.x.ax = 0x1012 ;
- Regs.x.bx = 0 ;
- Regs.x.cx = 256 ;
- sRegs.es = FP_SEG( Pal ) ;
- Regs.x.dx = FP_OFF( Pal ) ;
- int86x ( 0x10, &Regs, &Regs, &sRegs ) ;
- break ;
- case 't':
- case 'T': /* T=Esperar a pulsación de tecla para cambiar el dibujo */
- EspTec = 1 ;
- Dly = 0 ;
- break ;
- } /* switch */
- else
- MostrarFichero( argv[i] ) ;
-
- getch() ;
-
- /*------------------------------------------------------------------------
- Volver a poner la pantalla en modo texto
- ------------------------------------------------------------------------*/
- Regs.x.ax = 0x03 ;
- int86( 0x10, &Regs, &Regs ) ;
-
- exit ( 0 ) ;
- } /* main */
-
-
- int MostrarFichero (char *FSpec)
- {
- int hfspr ;
- SPRITE Spr ;
- struct ffblk Info ;
- BYTE far *ptr ;
- BYTE *pFondo, *pFnd, *pImg ;
- int y ;
-
- /*------------------------------------------------------------------------
- Leer los ficheros a mostrar en pantalla (el programa admite comodines)
- ------------------------------------------------------------------------*/
- if ( ! findfirst( FSpec, &Info, 0xffff ) )
- do {
- if( (hfspr = open( Info.ff_name, O_BINARY | O_RDONLY )) == - 1 )
- RutErr (4) ; /* Error. No existe el fichero */
-
- /*------------------------------------------------------------------------
- Leer las dimensiones de cada fichero .SPR y conseguir memoria para el resto
- del fichero.
- ------------------------------------------------------------------------*/
- if( read( hfspr, &Spr, 4 ) != 4 )
- RutErr( 5 );
- Spr.LonX++ ;
- Spr.LonY++ ;
-
- xAct = min( xAct, 320 - Spr.LonX ) ;
- yAct = min( yAct, 200 - Spr.LonY ) ;
-
- Spr.pImagen = ( BYTE * ) malloc ( Spr.LonX * Spr.LonY + 4 ) ;
- if ( Spr.pImagen == NULL ) RutErr ( 3 ) ; /* Error. No hay memoria */
-
- /*------------------------------------------------------------------------
- Conseguir asimismo memoria para reservar el fondo anterior de la pantalla
- ------------------------------------------------------------------------*/
- pFondo = ( BYTE * ) malloc ( Spr.LonX * Spr.LonY ) ;
- if ( pFondo == NULL ) RutErr ( 3 ) ; /* Error. No hay memoria */
-
- ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
- ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
- for ( y = 0, pFnd = pFondo; y < Spr.LonY; y++ ) {
- movedata( FP_SEG(ptr), FP_OFF(ptr), FP_SEG(pFnd), FP_OFF(pFnd), Spr.LonX ) ;
- ptr += 320 ;
- pFnd += Spr.LonX ;
- }
-
- /*------------------------------------------------------------------------
- Leer los datos del sprite (resto del fichero)
- ------------------------------------------------------------------------*/
- if( read( hfspr, Spr.pImagen + 4, Spr.LonX * Spr.LonY ) != Spr.LonX * Spr.LonY )
- RutErr( 5 );
-
- /*------------------------------------------------------------------------
- Mostrar el sprite en pantalla
- ------------------------------------------------------------------------*/
- *( (int*) Spr.pImagen) = Spr.LonX ;
- *( (int*) (Spr.pImagen+2)) = Spr.LonY ;
-
- ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
- ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
- for ( y = 0, pImg = Spr.pImagen + 4; y < Spr.LonY; y++ ) {
- movedata( FP_SEG(pImg), FP_OFF(pImg), FP_SEG(ptr), FP_OFF(ptr), Spr.LonX ) ;
- ptr += 320 ;
- pImg += Spr.LonX ;
- }
-
- /*------------------------------------------------------------------------
- Liberar la memoria y cerrar el fichero
- ------------------------------------------------------------------------*/
- close( hfspr ) ;
- free ( Spr.pImagen ) ;
-
- /*------------------------------------------------------------------------
- Esperar a que se pulse una tecla para mostrar el siguiente
- ------------------------------------------------------------------------*/
- if ( EspTec )
- if ( getch() == 27 ) break ;
- delay ( Dly ) ;
-
- ptr = (BYTE far*) MK_FP( 0xA000, 0x0000 ) ;
- ptr += 320 * ( yAct - 1 ) + xAct - 1 ;
- for ( y = 0, pFnd = pFondo; y < Spr.LonY; y++ ) {
- movedata( FP_SEG(pFnd), FP_OFF(pFnd), FP_SEG(ptr), FP_OFF(ptr), Spr.LonX ) ;
- ptr += 320 ;
- pFnd += Spr.LonX ;
- }
- free ( pFondo ) ;
-
- xAct += xInc ;
- yAct += yInc ;
- } while ( ! findnext( &Info ) ) ;
-
- } /* MostrarFichero */
-
- /*------------------------------------------------------------------------
- Función para terminación anormal
- ------------------------------------------------------------------------*/
- void RutErr ( int cod )
- {
- union REGS Regs ;
-
- switch ( cod ) {
- case 2:
- printf(" Sintaxis: SPRITEV [opciones] fichero(s) [fichero(s)] ...\n" ) ;
- printf(" Opciones: -XInnn: X Inicial nnn\n" ) ;
- printf(" -YInnn: Y Inicial nnn\n" ) ;
- printf(" -XDnnn: Incremto. X nnn\n" ) ;
- printf(" -YDnnn: Incremto. Y nnn\n" ) ;
- printf(" -Dnnn : Demora nnn milisegundos\n" ) ;
- printf(" -Fnnn : Color de Fondo nnn\n" ) ;
- printf(" -T : Esperar pulsación de tecla\n" ) ;
- printf(" -Pfichero: Fichero de paleta\n" ) ;
- printf(" Fichero(s): Admite comodines\n" ) ;
- break ;
- case 3:
- printf(" Error: no hay memoria" ) ;
- break ;
- case 4:
- printf(" Error al abrir fichero de origen" ) ;
- break ;
- case 5:
- printf(" Error leyendo fichero de origen" ) ;
- break ;
- case 6:
- printf(" Error al poner modo de video " ) ;
- break ;
- default:
- printf(" Error de ejecución número: %d.", cod) ;
- break ;
- }
- printf("\nPulsar cualquier tecla") ;
- getch() ;
-
- Regs.x.ax = 0x03 ;
- int86( 0x10, &Regs, &Regs ) ;
-
- exit ( cod ) ;
- }