/*************************************************************************** Atari Ultra Tank video emulation ***************************************************************************/ #include "driver.h" #include "ultratnk.h" #include "audio/sprint4.h" static tilemap* playfield; static mame_bitmap* helper; int ultratnk_collision[4]; PALETTE_INIT( ultratnk ) { palette_set_color(machine, 0, MAKE_RGB(0x00, 0x00, 0x00)); palette_set_color(machine, 1, MAKE_RGB(0xa4, 0xa4, 0xa4)); palette_set_color(machine, 2, MAKE_RGB(0x5b, 0x5b, 0x5b)); palette_set_color(machine, 3, MAKE_RGB(0xff, 0xff, 0xff)); colortable[0] = color_prom[0x00] & 3; colortable[2] = color_prom[0x00] & 3; colortable[4] = color_prom[0x00] & 3; colortable[6] = color_prom[0x00] & 3; colortable[8] = color_prom[0x00] & 3; colortable[1] = color_prom[0x01] & 3; colortable[3] = color_prom[0x02] & 3; colortable[5] = color_prom[0x04] & 3; colortable[7] = color_prom[0x08] & 3; colortable[9] = color_prom[0x10] & 3; } static TILE_GET_INFO( ultratnk_tile_info ) { UINT8 code = videoram[tile_index]; if (code & 0x20) { SET_TILE_INFO(0, code, code >> 6, 0); } else { SET_TILE_INFO(0, code, 4, 0); } } VIDEO_START( ultratnk ) { helper = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format); playfield = tilemap_create(ultratnk_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32); } VIDEO_UPDATE( ultratnk ) { int i; tilemap_draw(bitmap, cliprect, playfield, 0, 0); for (i = 0; i < 4; i++) { int bank = 0; UINT8 horz = videoram[0x390 + 2 * i + 0]; UINT8 attr = videoram[0x390 + 2 * i + 1]; UINT8 vert = videoram[0x398 + 2 * i + 0]; UINT8 code = videoram[0x398 + 2 * i + 1]; if (code & 4) { bank = 32; } if (!(attr & 0x80)) { drawgfx(bitmap, machine->gfx[1], (code >> 3) | bank, i, 0, 0, horz - 15, vert - 15, cliprect, TRANSPARENCY_PEN, 0); } } return 0; } VIDEO_EOF( ultratnk ) { UINT16 BG = machine->remapped_colortable[machine->gfx[0]->color_base]; int i; /* check for sprite-playfield collisions */ for (i = 0; i < 4; i++) { rectangle rect; int x; int y; int bank = 0; UINT8 horz = videoram[0x390 + 2 * i + 0]; UINT8 vert = videoram[0x398 + 2 * i + 0]; UINT8 code = videoram[0x398 + 2 * i + 1]; rect.min_x = horz - 15; rect.min_y = vert - 15; rect.max_x = horz - 15 + machine->gfx[1]->width - 1; rect.max_y = vert - 15 + machine->gfx[1]->height - 1; sect_rect(&rect, &machine->screen[0].visarea); tilemap_draw(helper, &rect, playfield, 0, 0); if (code & 4) { bank = 32; } drawgfx(helper, machine->gfx[1], (code >> 3) | bank, 4, 0, 0, horz - 15, vert - 15, &rect, TRANSPARENCY_PEN, 1); for (y = rect.min_y; y <= rect.max_y; y++) { for (x = rect.min_x; x <= rect.max_x; x++) { if (*BITMAP_ADDR16(helper, y, x) != BG) { ultratnk_collision[i] = 1; } } } } /* update sound status */ discrete_sound_w(ULTRATNK_MOTOR_DATA_1, videoram[0x391] & 15); discrete_sound_w(ULTRATNK_MOTOR_DATA_2, videoram[0x393] & 15); } WRITE8_HANDLER( ultratnk_video_ram_w ) { videoram[offset] = data; tilemap_mark_tile_dirty(playfield, offset); }