home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / emulaton / at2600 / !v2600 / c / collision < prev    next >
Text File  |  1997-03-24  |  3KB  |  113 lines

  1. /*****************************************************************************
  2.  
  3.    This file is part of x2600, the Atari 2600 Emulator
  4.    ===================================================
  5.    
  6.    Copyright 1996 Alex Hornby. For contributions see the file CREDITS.
  7.  
  8.    This software is distributed under the terms of the GNU General Public
  9.    License. This is free software with ABSOLUTELY NO WARRANTY.
  10.    
  11.    See the file COPYING for details.
  12.    
  13.    $Id: collision.c,v 1.9 1996/09/04 22:35:20 ahornby Exp $
  14. ******************************************************************************/
  15.  
  16. /* The 2600 collision detection code */
  17.  
  18. #include "config.h"
  19.  
  20. #include <stdlib.h>
  21.  
  22. #include "options.h"
  23. #include "types.h"
  24. #include "address.h"
  25. #include "vmachine.h"
  26. #include "col_mask.h"
  27.  
  28. /*
  29.    There are 6 different objects on the screen. Each takes one bit of the 
  30.    collision vector.
  31.    Bit 0: Player 0
  32.    Bit 1: Player 1
  33.    Bit 2: Missile 0
  34.    Bit 3: Missile 1
  35.    Bit 4: Ball
  36.    Bit 5: Playfield
  37.  */
  38.  
  39. /* The collision vector */
  40. BYTE *colvect;
  41.  
  42. /* The collision lookup table */
  43. unsigned short col_table[256];
  44.  
  45. /* The collision state */
  46. unsigned short col_state;
  47.  
  48. /* Resets the collision registers of the tia */
  49. inline void
  50. reset_collisions (void)
  51. {
  52.   col_state=0;
  53. }
  54.  
  55. /* Does collision testing on the pixel b */
  56. /* b: byte to test for collisions */
  57. /* Used to build up the collision table */
  58. int
  59. set_collisions (BYTE b)
  60. {
  61.   int res=0;
  62.  
  63.   if ((b & ML0_MASK) && (b & PL1_MASK))
  64.     res |= M0P1_MASK;
  65.   if ((b & ML0_MASK) && (b & PL0_MASK))
  66.     res |= M0P0_MASK;
  67.   if ((b & ML1_MASK) && (b & PL0_MASK))
  68.     res |=  M1P0_MASK;
  69.   if ((b & ML1_MASK) && (b & PL1_MASK))
  70.     res |=  M1P1_MASK;
  71.  
  72.   if ((b & PL0_MASK) && (b & PF_MASK))
  73.     res |= P0PF_MASK; 
  74.   if ((b & PL0_MASK) && (b & BL_MASK))
  75.     res |= P0BL_MASK;
  76.   if ((b & PL1_MASK) && (b & PF_MASK))
  77.     res |= P1PF_MASK ;
  78.   if ((b & PL1_MASK) && (b & BL_MASK))
  79.     res |= P1BL_MASK;
  80.  
  81.   if ((b & ML0_MASK) && (b & PF_MASK))
  82.     res |=  M0PF_MASK;
  83.   if ((b & ML0_MASK) && (b & BL_MASK))
  84.     res |= M0BL_MASK;
  85.   if ((b & ML1_MASK) && (b & PF_MASK))
  86.     res |=  M1PF_MASK; 
  87.   if ((b & ML1_MASK) && (b & BL_MASK))
  88.     res |=  M1BL_MASK;
  89.  
  90.   if ((b & BL_MASK) && (b & PF_MASK))
  91.     res |=BLPF_MASK;
  92.   if ((b & PL0_MASK) && (b & PL1_MASK))
  93.     res |=P0P1_MASK ;
  94.   if ((b & ML0_MASK) && (b & ML1_MASK))
  95.     res |=M0M1_MASK ;
  96.  
  97.   return res;
  98. }
  99.  
  100.  
  101. void
  102. init_collisions(void)
  103. {
  104.   int i;
  105.  
  106.   /* Set up the collision lookup table */ 
  107.   for (i = 0; i < 256; i++)
  108.     col_table[i] = set_collisions(i);
  109.  
  110.   /* Get the colvect 8 byte aligned */
  111.   colvect=(BYTE *)calloc(28, 8);
  112. }
  113.