home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / DDJ0190.ZIP / RAHNER.EXE / SPRITE.C < prev    next >
C/C++ Source or Header  |  1989-09-21  |  6KB  |  239 lines

  1. /******************************************************************************
  2.  
  3.     TITLE:    SPRITES.C
  4.     Displays a sprite file on an EGA screen
  5.  
  6.     Written by: Rahner James, CS
  7.                 of Ryu Consulting, Inc.
  8.  
  9. ******************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <dos.h>
  13. #include <fcntl.h>
  14.  
  15.  
  16. /******************************************************************************
  17.  
  18.         VARIOUS DEFINITIONS
  19.  
  20. ******************************************************************************/
  21.  
  22. #pragma pack(1)
  23.  
  24. typedef    unsigned char    uc;
  25. typedef    unsigned int    ui;
  26. typedef    unsigned long    ul;
  27.  
  28.  
  29. /******************************************************************************
  30.  
  31.         EXTERNAL DECLARATIONS
  32.  
  33. ******************************************************************************/
  34.  
  35. extern    void ega_convert();
  36. extern    ui ega_calculate( uc far * );
  37. extern    void ega_install();
  38. extern    void ega_clear_area( ui, ui, ui, ui );
  39.  
  40.  
  41. /******************************************************************************
  42.  
  43.         GLOBAL DATA
  44.  
  45. ******************************************************************************/
  46.  
  47. ui    min_x=0, min_y=0, max_x=639, max_y=199;
  48.  
  49.  
  50.  
  51. /******************************************************************************
  52.  
  53.     long READ_ALL_FILE( uc *FILENAME, uc huge *BUFFER, ul BUFFER_SIZE )
  54.     Opens and reads an entire sprite file
  55.     Given:
  56.         FILENAME -> name of sprite file to read
  57.         BUFFER -> buffer to read the sprite file into
  58.         BUFFER_SIZE = number of bytes the buffer can hold
  59.     Returns:
  60.         File is opened, read and closed
  61.         Number of bytes read, if all went well
  62.         If error, returns -1
  63.  
  64. ******************************************************************************/
  65.     
  66. long read_all_file( uc *filename, uc huge *buffer, ul buffer_size )
  67. {
  68.     long    rv = 0;
  69.     ui    handle, dos_return, amount_read;
  70.     ui    amount_to_read;
  71.  
  72.     if ( _dos_open( filename, O_RDONLY, &handle ) )
  73.         return -1;
  74.     while ( buffer_size )
  75.     {
  76.         amount_to_read = buffer_size<60000L ? buffer_size : 60000L;
  77.         if ( _dos_read( handle, buffer+rv, amount_to_read, &amount_read ) )
  78.         {
  79.             rv = -1;
  80.             break;
  81.         }
  82.         rv += amount_read;
  83.         if ( amount_read < 60000 )
  84.             break;
  85.         buffer_size -= amount_read;
  86.     }
  87.     _dos_close( handle );
  88.  
  89.     return rv;
  90. }
  91.  
  92.  
  93. /******************************************************************************
  94.  
  95.     void DO_BACKGROUND( void )
  96.     Sets up the background for the sprite visual screen
  97.     Given:
  98.         nothing
  99.     Returns:
  100.         visual sprite screen erased
  101.  
  102. ******************************************************************************/
  103.  
  104. void do_background( void )
  105. {
  106.     ega_clear_area( min_x, min_y, max_x, max_y );
  107. }
  108.  
  109.  
  110. /******************************************************************************
  111.  
  112.     uc SET_MODE( uc MODE_NUMBER )
  113.     Sets the video mode
  114.     Given:
  115.         Mode number to set video to
  116.     Returns:
  117.         Present video mode number
  118.  
  119. ******************************************************************************/
  120.  
  121. uc set_mode( uc mode_number )
  122. {
  123.     uc rv;
  124.     union REGS regs;
  125.  
  126.     regs.h.ah = 15;
  127.     int86( 0x10, ®s, ®s );
  128.     rv = regs.h.al;
  129.  
  130.     regs.h.ah = 0;
  131.     regs.h.al = mode_number;
  132.     int86( 0x10, ®s, ®s );
  133.  
  134.     return rv;
  135. }
  136.  
  137.  
  138. /******************************************************************************
  139.  
  140.     MAIN( int ARGC, uc *ARGV[] )
  141.     Allocates memory, reads in a sprite file, displays the sprites
  142.     until a key is pressed, frees up memory and interrupt vectors
  143.     Given:
  144.         ARGC = number of command line values, must be > 1
  145.         ARGV[1] -> file name of the sprite file to display
  146.     Returns:
  147.         0 if all went well, otherwise numbered according to error
  148.  
  149. ******************************************************************************/
  150.  
  151. main( int argc, uc *argv[] )
  152. {
  153.     ui    i, x, y;
  154.     uc    far *file_ptr, huge *sprite_start, huge *buffer_start;
  155.     uc    huge *sprite_ptr[20];
  156.     uc    old_mode;
  157.     ui    memory_segment;
  158.     ul    memory_size=0, file_size;
  159.  
  160. /* Check initial values and allocate memory for buffers */
  161.  
  162.     if ( argc<2 )
  163.     {
  164.         printf( "\nNo file name has been given\n" );
  165.         exit( 1 );
  166.     }
  167.  
  168.     if ( _dos_allocmem( -1, (ui *)&memory_size ) )
  169.     {
  170.         if ( _dos_allocmem( memory_size, &memory_segment ) )
  171.         {
  172.             printf( "\nMemory allocation error\n" );
  173.             exit( 2 );
  174.         }
  175.     }
  176.     else
  177.     {
  178.         memory_segment = memory_size;
  179.         memory_size = 0xffff;
  180.     }
  181.     memory_size <<= 4;
  182.     buffer_start = (uc huge *)((ul)memory_segment << 16L);
  183.  
  184.  
  185. /* Read in the sprite file and then convert it to our intenal structure */
  186.  
  187.     file_ptr = buffer_start;
  188.     if ( (file_size=read_all_file(argv[1],file_ptr,memory_size)) == -1 )
  189.     {
  190.         _dos_freemem( memory_segment );
  191.         printf( "\nGot error reading %s.  Aborting.\n", argv[1] );
  192.         exit( 3 );
  193.     }
  194.  
  195.     clear_sprite_list();
  196.     sprite_start = file_ptr + file_size;
  197.     for ( i=0 ; i<20 && file_size ; ++i )
  198.     {
  199.         ega_convert( sprite_ptr[i]=sprite_start, file_ptr );
  200.         x = ega_calculate( file_ptr );
  201.         sprite_start += x;
  202.         x = (ui)*file_ptr * (ui)*(file_ptr+2) + 4;
  203.         file_ptr += x;
  204.         if ( file_size > (ul)x )
  205.             file_size -= (ul)x;
  206.         else
  207.             file_size = 0;
  208.     }
  209.  
  210.  
  211. /* Create linked list of sprite circles */
  212.  
  213.     insert_sprite( 100,100, 100,100, 0,0, 7, sprite_ptr[0] );
  214.     for ( x=1 ; x<i ; ++x )
  215.         add_sprite( sprite_ptr[0], sprite_ptr[x] );
  216.  
  217.  
  218. /* Setup the EGA screen mode and interrupt vector */
  219.  
  220.     old_mode = set_mode( 0x10 );
  221.     ega_install();
  222.  
  223.  
  224. /* Process the sprite list until someone taps a key */
  225.  
  226.     while ( !kbhit() )
  227.         do_sprite_list();
  228.  
  229.  
  230. /* Restore screen and allocated memory to original state */
  231.  
  232.     ega_rip_out();
  233.     set_mode( old_mode );
  234.     _dos_freemem( memory_segment );
  235.  
  236.     exit( 0 );
  237. }
  238.  
  239.