summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/carpolo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/carpolo.c')
-rw-r--r--src/mame/video/carpolo.c833
1 files changed, 833 insertions, 0 deletions
diff --git a/src/mame/video/carpolo.c b/src/mame/video/carpolo.c
new file mode 100644
index 00000000000..d13e8de2e85
--- /dev/null
+++ b/src/mame/video/carpolo.c
@@ -0,0 +1,833 @@
+/***************************************************************************
+
+ Exidy Car Polo hardware
+
+ driver by Zsolt Vasvari
+
+****************************************************************************/
+
+#include "driver.h"
+#include "carpolo.h"
+
+
+UINT8 *carpolo_alpharam;
+UINT8 *carpolo_spriteram;
+
+
+/* the screen elements' priorties determine their color */
+#define BACKGROUND_COLOR 0
+#define FIELD_COLOR 1
+#define CAR1_COLOR 2
+#define LINE_COLOR 3
+#define CAR4_COLOR 4
+#define CAR3_COLOR 5
+#define CAR2_COLOR 6
+#define BALL_COLOR 7
+#define NET_COLOR 8
+#define LEFT_GOAL_COLOR 9
+#define RIGHT_GOAL_COLOR 10
+#define SPECIAL_CHAR_COLOR 11
+#define ALPHA0_COLOR 12
+#define ALPHA1_COLOR 13
+#define ALPHA2_COLOR 14
+#define ALPHA3_COLOR 15
+
+#define SCORE_COLOR 16 /* this is only used for collision detection purposes */
+
+#define SPRITE_WIDTH 16
+#define SPRITE_HEIGHT 16
+#define GOAL_WIDTH 16
+#define GOAL_HEIGHT 64
+
+#define LEFT_GOAL_X 2*16-8
+#define RIGHT_GOAL_X 13*16-8
+#define GOAL_Y 7*16
+
+#define TOP_BORDER 16
+#define BOTTOM_BORDER 255
+#define LEFT_BORDER 0
+#define RIGHT_BORDER 239
+
+
+static mame_bitmap *sprite_sprite_collision_bitmap1;
+static mame_bitmap *sprite_sprite_collision_bitmap2;
+static mame_bitmap *sprite_goal_collision_bitmap1;
+static mame_bitmap *sprite_goal_collision_bitmap2;
+static mame_bitmap *sprite_border_collision_bitmap;
+
+
+/***************************************************************************
+ *
+ * Palette generation
+ *
+ * The palette PROM is connected to the RGB output this way.
+ *
+ * bit 0 -- 220 ohm resistor -- BLUE (probably an error on schematics)
+ * -- 470 ohm resistor -- BLUE (probably an error on schematics)
+ * -- 220 ohm resistor -- GREEN
+ * -- 470 ohm resistor -- GREEN
+ * -- 1 kohm resistor -- GREEN
+ * -- 220 ohm resistor -- RED
+ * -- 470 ohm resistor -- RED
+ * bit 7 -- 1 kohm resistor -- RED
+ *
+ **************************************************************************/
+
+PALETTE_INIT( carpolo )
+{
+ /* thanks to Jarek Burczynski for analyzing the circuit */
+// const static float MAX_VOLTAGE = 6.9620;
+ const static float MIN_VOLTAGE = 1.7434;
+ const static float MAX_VOLTAGE = 5.5266;
+
+ const static float r_voltage[] = { 1.7434, 2.1693, 2.5823, 3.0585,
+ 3.4811, 4.0707, 4.7415, 5.4251 };
+
+ const static float g_voltage[] = { 1.7434, 2.1693, 2.5823, 3.0585,
+ 3.4811, 4.0707, 4.7415, 5.4251 };
+// const static float g_voltage[] = { 4.7871, 5.0613, 5.3079, 5.6114,
+// 5.7940, 6.1608, 6.5436, 6.9620 };
+
+ const static float b_voltage[] = { 1.9176, 2.8757, 3.9825, 5.5266 };
+
+
+ int i;
+ #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
+ #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
+
+
+ /* the -1 is for the fake score color */
+ for (i = 0; i < machine->drv->total_colors - 1; i++)
+ {
+ UINT8 r,g,b;
+ int bit0,bit1,bit2;
+
+ /* red component */
+ bit0 = (*color_prom >> 7) & 0x01;
+ bit1 = (*color_prom >> 6) & 0x01;
+ bit2 = (*color_prom >> 5) & 0x01;
+ //r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ r = ((r_voltage[*color_prom >> 5 ] - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE)) * 255.;
+ /* green component */
+ bit0 = (*color_prom >> 4) & 0x01;
+ bit1 = (*color_prom >> 3) & 0x01;
+ bit2 = (*color_prom >> 2) & 0x01;
+ //g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ g = ((g_voltage[(*color_prom >> 2) & 0x07] - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE)) * 255.;
+ /* blue component */
+ bit0 = (*color_prom >> 1) & 0x01;
+ bit1 = (*color_prom >> 0) & 0x01;
+ //b = 0x4f * bit0 + 0xa8 * bit1;
+ b = ((b_voltage[*color_prom & 0x03 ] - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE)) * 255.;
+
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+
+ // score color is same as net color
+ if (i == NET_COLOR)
+ {
+ palette_set_color(machine,SCORE_COLOR,MAKE_RGB(r,g,b));
+ }
+
+ color_prom++;
+ }
+
+
+ /* sprite colors */
+ for (i = 0; i < TOTAL_COLORS(0) / 2; i++)
+ {
+ COLOR(0,i*2+1) = i;
+ }
+
+
+ /* the bits in the goal gfx PROM are hooked as follows (all active LO):
+ Bit 3 - goal post
+ Bit 2 - scoring area
+ Bit 1 - net
+ Bit 0 - n/c
+
+ Below I am only filling in the colors actually used. */
+
+ /* left goal */
+ COLOR(1, (0x07 ^ 0x0f)) = LEFT_GOAL_COLOR;
+ COLOR(1, (0x0d ^ 0x0f)) = NET_COLOR;
+ COLOR(1, (0x09 ^ 0x0f)) = SCORE_COLOR;
+
+ /* right goal */
+ COLOR(1, (16 + (0x07 ^ 0x0f))) = RIGHT_GOAL_COLOR;
+ COLOR(1, (16 + (0x0d ^ 0x0f))) = NET_COLOR;
+ COLOR(1, (16 + (0x09 ^ 0x0f))) = SCORE_COLOR;
+
+ /* alpha layer */
+ COLOR(2, 0*2+1) = ALPHA0_COLOR;
+ COLOR(2, 1*2+1) = ALPHA1_COLOR;
+ COLOR(2, 2*2+1) = ALPHA2_COLOR;
+ COLOR(2, 3*2+1) = ALPHA3_COLOR;
+}
+
+
+/*************************************
+ *
+ * Video system start
+ *
+ *************************************/
+
+VIDEO_START( carpolo )
+{
+ sprite_sprite_collision_bitmap1 = auto_bitmap_alloc(SPRITE_WIDTH*2,SPRITE_HEIGHT*2,machine->screen[0].format);
+ sprite_sprite_collision_bitmap2 = auto_bitmap_alloc(SPRITE_WIDTH*2,SPRITE_HEIGHT*2,machine->screen[0].format);
+
+ sprite_goal_collision_bitmap1 = auto_bitmap_alloc(SPRITE_WIDTH+GOAL_WIDTH,SPRITE_HEIGHT+GOAL_HEIGHT,machine->screen[0].format);
+ sprite_goal_collision_bitmap2 = auto_bitmap_alloc(SPRITE_WIDTH+GOAL_WIDTH,SPRITE_HEIGHT+GOAL_HEIGHT,machine->screen[0].format);
+
+ sprite_border_collision_bitmap = auto_bitmap_alloc(SPRITE_WIDTH,SPRITE_HEIGHT,machine->screen[0].format);
+}
+
+
+/*************************************
+ *
+ * Core video refresh
+ *
+ *************************************/
+
+static void draw_alpha_line(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect,
+ int alpha_line, int video_line)
+{
+ int x;
+
+
+ for (x = 0; x < 32; x++)
+ {
+ UINT8 code, col;
+
+ code = carpolo_alpharam[alpha_line * 32 + x] >> 2;
+ col = carpolo_alpharam[alpha_line * 32 + x] & 0x03;
+
+ drawgfx(bitmap,machine->gfx[2],
+ code,col,
+ 0,0,
+ x*8,video_line*8,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+}
+
+
+static void remap_sprite_code(int bank, int code, int *remapped_code, int *flipy)
+{
+ UINT8 *PROM;
+
+
+ PROM = memory_region(REGION_USER1);
+
+ code = (bank << 4) | code;
+ *remapped_code = PROM[code] & 0x0f;
+ *flipy = (PROM[code] & 0x10) >> 4;
+}
+
+
+static void draw_sprite(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect,
+ UINT8 x, UINT8 y, int bank, int code, int col)
+{
+ int remapped_code, flipy;
+
+
+ remap_sprite_code(bank, code, &remapped_code, &flipy);
+
+ x = 240 - x;
+ y = 240 - y;
+
+ drawgfx(bitmap,machine->gfx[0],
+ remapped_code, col,
+ 0, flipy,
+ x, y,
+ cliprect,TRANSPARENCY_PEN,0);
+
+ /* draw with wrap around */
+ drawgfx(bitmap,machine->gfx[0],
+ remapped_code, col,
+ 0, flipy,
+ (INT16)x - 256, y,
+ cliprect,TRANSPARENCY_PEN,0);
+}
+
+
+VIDEO_UPDATE( carpolo )
+{
+ /* draw the playfield elements, in the correct priority order */
+
+ /* score area - position determined by bit 4 of the vertical timing PROM */
+ plot_box(bitmap,0,0,RIGHT_BORDER+1,TOP_BORDER,machine->pens[BACKGROUND_COLOR]);
+
+ /* field */
+ plot_box(bitmap,0,TOP_BORDER,RIGHT_BORDER+1,BOTTOM_BORDER-TOP_BORDER+1,machine->pens[FIELD_COLOR]);
+
+ /* car 1 */
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x00], carpolo_spriteram[0x01],
+ 0, carpolo_spriteram[0x0c] & 0x0f, CAR1_COLOR);
+
+ /* border - position determined by bit 4 and 7 of the vertical timing PROM */
+ plot_box(bitmap,0,TOP_BORDER, RIGHT_BORDER+1,1,machine->pens[LINE_COLOR]);
+ plot_box(bitmap,0,BOTTOM_BORDER,RIGHT_BORDER+1,1,machine->pens[LINE_COLOR]);
+ plot_box(bitmap,LEFT_BORDER,TOP_BORDER, 1,BOTTOM_BORDER-TOP_BORDER+1,machine->pens[LINE_COLOR]);
+ plot_box(bitmap,RIGHT_BORDER,TOP_BORDER,1,BOTTOM_BORDER-TOP_BORDER+1,machine->pens[LINE_COLOR]);
+
+ /* car 4 */
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x06], carpolo_spriteram[0x07],
+ 0, carpolo_spriteram[0x0d] >> 4, CAR4_COLOR);
+
+ /* car 3 */
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x04], carpolo_spriteram[0x05],
+ 0, carpolo_spriteram[0x0d] & 0x0f, CAR3_COLOR);
+
+ /* car 2 */
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x02], carpolo_spriteram[0x03],
+ 0, carpolo_spriteram[0x0c] >> 4, CAR2_COLOR);
+
+ /* ball */
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x08], carpolo_spriteram[0x09],
+ 1, carpolo_spriteram[0x0e] & 0x0f, BALL_COLOR);
+
+ /* left goal - position determined by bit 6 of the
+ horizontal and vertical timing PROMs */
+ drawgfxzoom(bitmap,machine->gfx[1],
+ 0,0,
+ 0,0,
+ LEFT_GOAL_X,GOAL_Y,
+ cliprect,TRANSPARENCY_PEN,0,
+ 0x20000,0x20000);
+
+ /* right goal */
+ drawgfxzoom(bitmap,machine->gfx[1],
+ 0,1,
+ 1,0,
+ RIGHT_GOAL_X,GOAL_Y,
+ cliprect,TRANSPARENCY_PEN,0,
+ 0x20000,0x20000);
+
+ /* special char - bit 0 of 0x0f enables it,
+ bit 1 marked as WIDE, but never appears to be set */
+ if (carpolo_spriteram[0x0f] & 0x02)
+ {
+ logerror("WIDE!\n");
+ }
+
+ if (carpolo_spriteram[0x0f] & 0x01)
+ {
+ draw_sprite(machine, bitmap, cliprect,
+ carpolo_spriteram[0x0a], carpolo_spriteram[0x0b],
+ 1, carpolo_spriteram[0x0e] >> 4, SPECIAL_CHAR_COLOR);
+ }
+
+
+ /* draw the alpha layer */
+
+ /* there are only 8 lines of text repeated 4 times
+ and bit 3 of the vertical timing PROM controls in
+ which quadrant the line will actually appear */
+
+ draw_alpha_line(machine, bitmap, cliprect, 0, (0*4+0)*2 );
+ draw_alpha_line(machine, bitmap, cliprect, 1, (0*4+0)*2+1);
+ draw_alpha_line(machine, bitmap, cliprect, 2, (3*4+1)*2 );
+ draw_alpha_line(machine, bitmap, cliprect, 3, (3*4+1)*2+1);
+ draw_alpha_line(machine, bitmap, cliprect, 4, (1*4+2)*2 );
+ draw_alpha_line(machine, bitmap, cliprect, 5, (1*4+2)*2+1);
+ draw_alpha_line(machine, bitmap, cliprect, 6, (0*4+3)*2 );
+ draw_alpha_line(machine, bitmap, cliprect, 7, (0*4+3)*2+1);
+ return 0;
+}
+
+
+/*************************************
+ *
+ * End of frame callback
+ *
+ *************************************/
+
+static void normalize_coordinates(int *x1, int *y1, int *x2, int *y2)
+{
+ if (*x1 < *x2)
+ {
+ *x2 = *x2 - *x1;
+ *x1 = 0;
+ }
+ else
+ {
+ *x1 = *x1 - *x2;
+ *x2 = 0;
+ }
+
+ if (*y1 < *y2)
+ {
+ *y2 = *y2 - *y1;
+ *y1 = 0;
+ }
+ else
+ {
+ *y1 = *y1 - *y2;
+ *y2 = 0;
+ }
+}
+
+
+static int check_sprite_sprite_collision(running_machine *machine,
+ int x1, int y1, int code1, int flipy1,
+ int x2, int y2, int code2, int flipy2,
+ int *col_x, int *col_y)
+{
+ int collided = 0;
+
+
+ x1 = 240 - x1;
+ y1 = 240 - y1;
+ x2 = 240 - x2;
+ y2 = 240 - y2;
+
+
+ // check if the two sprites are within collision range
+ if ((abs(x1 - x2) < SPRITE_WIDTH) && (abs(y1 - y2) < SPRITE_HEIGHT))
+ {
+ int x,y;
+
+
+ normalize_coordinates(&x1, &y1, &x2, &y2);
+
+ fillbitmap(sprite_sprite_collision_bitmap1, machine->pens[0], 0);
+ fillbitmap(sprite_sprite_collision_bitmap2, machine->pens[0], 0);
+
+ drawgfx(sprite_sprite_collision_bitmap1,machine->gfx[0],
+ code1,1,
+ 0,flipy1,
+ x1,y1,
+ 0,TRANSPARENCY_PEN,0);
+
+ drawgfx(sprite_sprite_collision_bitmap2,machine->gfx[0],
+ code2,1,
+ 0,flipy2,
+ x2,y2,
+ 0,TRANSPARENCY_PEN,0);
+
+
+ for (x = x1; x < x1 + SPRITE_WIDTH; x++)
+ {
+ for (y = y1; y < y1 + SPRITE_HEIGHT; y++)
+ {
+ if ((*BITMAP_ADDR16(sprite_sprite_collision_bitmap1, y, x) == machine->pens[1]) &&
+ (*BITMAP_ADDR16(sprite_sprite_collision_bitmap2, y, x) == machine->pens[1]))
+ {
+ *col_x = (x1 + x) & 0x0f;
+ *col_y = (y1 + y) & 0x0f;
+
+ collided = 1;
+
+ break;
+ }
+ }
+ }
+ }
+
+ return collided;
+}
+
+
+/* returns 1 for collision with goal post,
+ 2 for collision with scoring area */
+static int check_sprite_left_goal_collision(running_machine *machine, int x1, int y1, int code1, int flipy1, int goalpost_only)
+{
+ int collided = 0;
+
+
+ x1 = 240 - x1;
+ y1 = 240 - y1;
+
+
+ // check if the sprites is within the range of the goal
+ if (((y1 + 16) > GOAL_Y) && (y1 < (GOAL_Y + GOAL_HEIGHT)) &&
+ ((x1 + 16) > LEFT_GOAL_X) && (x1 < (LEFT_GOAL_X + GOAL_WIDTH)))
+ {
+ int x,y;
+ int x2,y2;
+
+
+ x2 = LEFT_GOAL_X;
+ y2 = GOAL_Y;
+
+ normalize_coordinates(&x1, &y1, &x2, &y2);
+
+ fillbitmap(sprite_goal_collision_bitmap1, machine->pens[0], 0);
+ fillbitmap(sprite_goal_collision_bitmap2, machine->pens[0], 0);
+
+ drawgfx(sprite_goal_collision_bitmap1,machine->gfx[0],
+ code1,1,
+ 0,flipy1,
+ x1,y1,
+ 0,TRANSPARENCY_PEN,0);
+
+ drawgfxzoom(sprite_goal_collision_bitmap2,machine->gfx[1],
+ 0,0,
+ 0,0,
+ x2,y2,
+ 0,TRANSPARENCY_PEN,0,
+ 0x20000,0x20000);
+
+ for (x = x1; x < x1 + SPRITE_WIDTH; x++)
+ {
+ for (y = y1; y < y1 + SPRITE_HEIGHT; y++)
+ {
+ if ((*BITMAP_ADDR16(sprite_goal_collision_bitmap1, y, x) == machine->pens[1]))
+ {
+ pen_t pix = *BITMAP_ADDR16(sprite_goal_collision_bitmap2, y, x);
+
+ if (pix == machine->pens[LEFT_GOAL_COLOR])
+ {
+ collided = 1;
+ break;
+ }
+
+ if (!goalpost_only && (pix == machine->pens[SCORE_COLOR]))
+ {
+ collided = 2;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return collided;
+}
+
+
+static int check_sprite_right_goal_collision(running_machine *machine, int x1, int y1, int code1, int flipy1, int goalpost_only)
+{
+ int collided = 0;
+
+
+ x1 = 240 - x1;
+ y1 = 240 - y1;
+
+
+ // check if the sprites is within the range of the goal
+ if (((y1 + 16) > GOAL_Y) && (y1 < (GOAL_Y + GOAL_HEIGHT)) &&
+ ((x1 + 16) > RIGHT_GOAL_X) && (x1 < (RIGHT_GOAL_X + GOAL_WIDTH)))
+ {
+ int x,y;
+ int x2,y2;
+
+
+ x2 = RIGHT_GOAL_X;
+ y2 = GOAL_Y;
+
+ normalize_coordinates(&x1, &y1, &x2, &y2);
+
+ fillbitmap(sprite_goal_collision_bitmap1, machine->pens[0], 0);
+ fillbitmap(sprite_goal_collision_bitmap2, machine->pens[0], 0);
+
+ drawgfx(sprite_goal_collision_bitmap1,machine->gfx[0],
+ code1,1,
+ 0,flipy1,
+ x1,y1,
+ 0,TRANSPARENCY_PEN,0);
+
+ drawgfxzoom(sprite_goal_collision_bitmap2,machine->gfx[1],
+ 0,1,
+ 1,0,
+ x2,y2,
+ 0,TRANSPARENCY_PEN,0,
+ 0x20000,0x20000);
+
+ for (x = x1; x < x1 + SPRITE_WIDTH; x++)
+ {
+ for (y = y1; y < y1 + SPRITE_HEIGHT; y++)
+ {
+ if ((*BITMAP_ADDR16(sprite_goal_collision_bitmap1, y, x) == machine->pens[1]))
+ {
+ pen_t pix = *BITMAP_ADDR16(sprite_goal_collision_bitmap2, y, x);
+
+ if (pix == machine->pens[RIGHT_GOAL_COLOR])
+ {
+ collided = 1;
+ break;
+ }
+
+ if (!goalpost_only && (pix == machine->pens[SCORE_COLOR]))
+ {
+ collided = 2;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return collided;
+}
+
+
+/* returns 1 for collision with vertical border,
+ 2 for collision with horizontal border */
+static int check_sprite_border_collision(running_machine *machine, UINT8 x1, UINT8 y1, int code1, int flipy1)
+{
+ UINT8 x,y;
+ int collided = 0;
+
+
+ x1 = 240 - x1;
+ y1 = 240 - y1;
+
+
+ fillbitmap(sprite_border_collision_bitmap, machine->pens[0], 0);
+
+ drawgfx(sprite_border_collision_bitmap,machine->gfx[0],
+ code1,1,
+ 0,flipy1,
+ 0,0,
+ 0,TRANSPARENCY_PEN,0);
+
+ for (x = 0; x < SPRITE_WIDTH; x++)
+ {
+ for (y = 0; y < SPRITE_HEIGHT; y++)
+ {
+ if ((*BITMAP_ADDR16(sprite_border_collision_bitmap, y, x) == machine->pens[1]))
+ {
+ if (((UINT8)(x1 + x) == LEFT_BORDER) ||
+ ((UINT8)(x1 + x) == RIGHT_BORDER))
+ {
+ collided = 1;
+ break;
+ }
+
+ if (((UINT8)(y1 + y) == TOP_BORDER) ||
+ ((UINT8)(y1 + y) == BOTTOM_BORDER))
+ {
+ collided = 2;
+ break;
+ }
+ }
+ }
+ }
+
+ return collided;
+}
+
+
+VIDEO_EOF( carpolo )
+{
+ int col_x, col_y;
+ int car1_x, car2_x, car3_x, car4_x, ball_x;
+ int car1_y, car2_y, car3_y, car4_y, ball_y;
+ int car1_code, car2_code, car3_code, car4_code, ball_code;
+ int car1_flipy, car2_flipy, car3_flipy, car4_flipy, ball_flipy;
+
+
+ // check car-car collision first
+
+ car1_x = carpolo_spriteram[0x00];
+ car1_y = carpolo_spriteram[0x01];
+ remap_sprite_code(0, carpolo_spriteram[0x0c] & 0x0f, &car1_code, &car1_flipy);
+
+ car2_x = carpolo_spriteram[0x02];
+ car2_y = carpolo_spriteram[0x03];
+ remap_sprite_code(0, carpolo_spriteram[0x0c] >> 4, &car2_code, &car2_flipy);
+
+ car3_x = carpolo_spriteram[0x04];
+ car3_y = carpolo_spriteram[0x05];
+ remap_sprite_code(0, carpolo_spriteram[0x0d] & 0x0f, &car3_code, &car3_flipy);
+
+ car4_x = carpolo_spriteram[0x06];
+ car4_y = carpolo_spriteram[0x07];
+ remap_sprite_code(0, carpolo_spriteram[0x0d] >> 4, &car4_code, &car4_flipy);
+
+ ball_x = carpolo_spriteram[0x08];
+ ball_y = carpolo_spriteram[0x09];
+ remap_sprite_code(1, carpolo_spriteram[0x0e] & 0x0f, &ball_code, &ball_flipy);
+
+
+ // cars 1 and 2
+ if (check_sprite_sprite_collision(machine,
+ car1_x, car1_y, car1_code, car1_flipy,
+ car2_x, car2_y, car2_code, car2_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(0, 1);
+ }
+
+ // cars 1 and 3
+ else if (check_sprite_sprite_collision(machine,
+ car1_x, car1_y, car1_code, car1_flipy,
+ car3_x, car3_y, car3_code, car3_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(0, 2);
+ }
+
+ // cars 1 and 4
+ else if (check_sprite_sprite_collision(machine,
+ car1_x, car1_y, car1_code, car1_flipy,
+ car4_x, car4_y, car4_code, car4_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(0, 3);
+ }
+
+ // cars 2 and 3
+ else if (check_sprite_sprite_collision(machine,
+ car2_x, car2_y, car2_code, car2_flipy,
+ car3_x, car3_y, car3_code, car3_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(1, 2);
+ }
+
+ // cars 2 and 4
+ else if (check_sprite_sprite_collision(machine,
+ car2_x, car2_y, car2_code, car2_flipy,
+ car4_x, car4_y, car4_code, car4_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(1, 3);
+ }
+
+ // cars 3 and 4
+ else if (check_sprite_sprite_collision(machine,
+ car3_x, car3_y, car3_code, car3_flipy,
+ car4_x, car4_y, car4_code, car4_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_car_interrupt(2, 3);
+ }
+
+
+
+ // check car-ball collision
+ if (check_sprite_sprite_collision(machine,
+ car1_x, car1_y, car1_code, car1_flipy,
+ ball_x, ball_y, ball_code, ball_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_ball_interrupt(0, col_x, col_y);
+ }
+ else if (check_sprite_sprite_collision(machine,
+ car2_x, car2_y, car2_code, car2_flipy,
+ ball_x, ball_y, ball_code, ball_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_ball_interrupt(1, col_x, col_y);
+ }
+ else if (check_sprite_sprite_collision(machine,
+ car3_x, car3_y, car3_code, car3_flipy,
+ ball_x, ball_y, ball_code, ball_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_ball_interrupt(2, col_x, col_y);
+ }
+ else if (check_sprite_sprite_collision(machine,
+ car4_x, car4_y, car4_code, car4_flipy,
+ ball_x, ball_y, ball_code, ball_flipy,
+ &col_x, &col_y))
+ {
+ carpolo_generate_car_ball_interrupt(3, col_x, col_y);
+ }
+
+
+ // check car-goal collision
+ if (check_sprite_left_goal_collision(machine, car1_x, car1_y, car1_code, car1_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(0, 0);
+ }
+ else if (check_sprite_right_goal_collision(machine, car1_x, car1_y, car1_code, car1_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(0, 1);
+ }
+ else if (check_sprite_left_goal_collision(machine, car2_x, car2_y, car2_code, car2_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(1, 0);
+ }
+ else if (check_sprite_right_goal_collision(machine, car2_x, car2_y, car2_code, car2_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(1, 1);
+ }
+ else if (check_sprite_left_goal_collision(machine, car3_x, car3_y, car3_code, car3_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(2, 0);
+ }
+ else if (check_sprite_right_goal_collision(machine, car3_x, car3_y, car3_code, car3_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(2, 1);
+ }
+ else if (check_sprite_left_goal_collision(machine, car4_x, car4_y, car4_code, car4_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(3, 0);
+ }
+ else if (check_sprite_right_goal_collision(machine, car4_x, car4_y, car4_code, car4_flipy, 1))
+ {
+ carpolo_generate_car_goal_interrupt(3, 1);
+ }
+
+
+ // check ball collision with static screen elements
+ {
+ int col;
+
+ col = check_sprite_left_goal_collision(machine, ball_x, ball_y, ball_code, ball_flipy, 0);
+
+ if (col == 1) carpolo_generate_ball_screen_interrupt(0x05);
+ if (col == 2) carpolo_generate_ball_screen_interrupt(0x03);
+
+
+ col = check_sprite_right_goal_collision(machine, ball_x, ball_y, ball_code, ball_flipy, 0);
+
+ if (col == 1) carpolo_generate_ball_screen_interrupt(0x05 | 0x08);
+ if (col == 2) carpolo_generate_ball_screen_interrupt(0x03 | 0x08);
+
+
+ if (check_sprite_border_collision(machine, ball_x, ball_y, ball_code, ball_flipy))
+ {
+ carpolo_generate_ball_screen_interrupt(0x06);
+ }
+ }
+
+
+ // check car-border collision
+ {
+ int col;
+
+ col = check_sprite_border_collision(machine, car1_x, car1_y, car1_code, car1_flipy);
+
+ if (col)
+ {
+ carpolo_generate_car_border_interrupt(0, (col == 2));
+ }
+ else
+ {
+ col = check_sprite_border_collision(machine, car2_x, car2_y, car2_code, car2_flipy);
+
+ if (col)
+ {
+ carpolo_generate_car_border_interrupt(1, (col == 2));
+ }
+ else
+ {
+ col = check_sprite_border_collision(machine, car3_x, car3_y, car3_code, car3_flipy);
+
+ if (col)
+ {
+ carpolo_generate_car_border_interrupt(2, (col == 2));
+ }
+ else
+ {
+ col = check_sprite_border_collision(machine, car4_x, car4_y, car4_code, car4_flipy);
+
+ if (col)
+ {
+ carpolo_generate_car_border_interrupt(3, (col == 2));
+ }
+ }
+ }
+ }
+ }
+}