/*************************************************************************** Atari G1 hardware ****************************************************************************/ #include "driver.h" #include "machine/atarigen.h" #include "atarig1.h" /************************************* * * Globals we own * *************************************/ UINT8 atarig1_pitfight; /************************************* * * Statics * *************************************/ static int pfscroll_xoffset; static UINT16 current_control; static UINT8 playfield_tile_bank; static UINT16 playfield_xscroll; static UINT16 playfield_yscroll; /************************************* * * Tilemap callbacks * *************************************/ static TILE_GET_INFO( get_alpha_tile_info ) { UINT16 data = atarigen_alpha[tile_index]; int code = data & 0xfff; int color = (data >> 12) & 0x0f; int opaque = data & 0x8000; SET_TILE_INFO(1, code, color, opaque ? TILE_FORCE_LAYER0 : 0); } static TILE_GET_INFO( get_playfield_tile_info ) { UINT16 data = atarigen_playfield[tile_index]; int code = (playfield_tile_bank << 12) | (data & 0xfff); int color = (data >> 12) & 7; SET_TILE_INFO(0, code, color, (data >> 15) & 1); } /************************************* * * Video system start * *************************************/ VIDEO_START( atarig1 ) { static const struct atarirle_desc modesc_hydra = { REGION_GFX3,/* region where the GFX data lives */ 256, /* number of entries in sprite RAM */ 0, /* left clip coordinate */ 255, /* right clip coordinate */ 0x200, /* base palette entry */ 0x100, /* maximum number of colors */ {{ 0x7fff,0,0,0,0,0,0,0 }}, /* mask for the code index */ {{ 0,0x00f0,0,0,0,0,0,0 }}, /* mask for the color */ {{ 0,0,0xffc0,0,0,0,0,0 }}, /* mask for the X position */ {{ 0,0,0,0xffc0,0,0,0,0 }}, /* mask for the Y position */ {{ 0,0,0,0,0xffff,0,0,0 }}, /* mask for the scale factor */ {{ 0x8000,0,0,0,0,0,0,0 }}, /* mask for the horizontal flip */ {{ 0,0,0,0,0,0x00ff,0,0 }}, /* mask for the order */ {{ 0 }}, /* mask for the priority */ {{ 0 }} /* mask for the VRAM target */ }; static const struct atarirle_desc modesc_pitfight = { REGION_GFX3,/* region where the GFX data lives */ 256, /* number of entries in sprite RAM */ 40, /* left clip coordinate */ 295, /* right clip coordinate */ 0x200, /* base palette entry */ 0x100, /* maximum number of colors */ {{ 0x7fff,0,0,0,0,0,0,0 }}, /* mask for the code index */ {{ 0,0x00f0,0,0,0,0,0,0 }}, /* mask for the color */ {{ 0,0,0xffc0,0,0,0,0,0 }}, /* mask for the X position */ {{ 0,0,0,0xffc0,0,0,0,0 }}, /* mask for the Y position */ {{ 0,0,0,0,0xffff,0,0,0 }}, /* mask for the scale factor */ {{ 0x8000,0,0,0,0,0,0,0 }}, /* mask for the horizontal flip */ {{ 0,0,0,0,0,0,0x00ff,0 }}, /* mask for the order */ {{ 0 }}, /* mask for the priority */ {{ 0 }} /* mask for the VRAM target */ }; /* blend the playfields and free the temporary one */ atarigen_blend_gfx(machine, 0, 2, 0x0f, 0x10); /* initialize the playfield */ atarigen_playfield_tilemap = tilemap_create(get_playfield_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8,8, 64,64); /* initialize the motion objects */ atarirle_init(0, atarig1_pitfight ? &modesc_pitfight : &modesc_hydra); /* initialize the alphanumerics */ atarigen_alpha_tilemap = tilemap_create(get_alpha_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8,8, 64,32); tilemap_set_transparent_pen(atarigen_alpha_tilemap, 0); /* reset statics */ current_control = 0; pfscroll_xoffset = atarig1_pitfight ? 2 : 0; playfield_tile_bank = 0; playfield_xscroll = 0; playfield_yscroll = 0; } /************************************* * * Periodic scanline updater * *************************************/ WRITE16_HANDLER( atarig1_mo_control_w ) { logerror("MOCONT = %d (scan = %d)\n", data, video_screen_get_vpos(0)); /* set the control value */ COMBINE_DATA(¤t_control); } void atarig1_scanline_update(running_machine *machine, int scrnum, int scanline) { UINT16 *base = &atarigen_alpha[(scanline / 8) * 64 + 48]; int i; //if (scanline == 0) logerror("-------\n"); /* keep in range */ if (base >= &atarigen_alpha[0x800]) return; /* update the playfield scrolls */ for (i = 0; i < 8; i++) { UINT16 word; /* first word controls horizontal scroll */ word = *base++; if (word & 0x8000) { int newscroll = ((word >> 6) + pfscroll_xoffset) & 0x1ff; if (newscroll != playfield_xscroll) { video_screen_update_partial(0, scanline + i - 1); tilemap_set_scrollx(atarigen_playfield_tilemap, 0, newscroll); playfield_xscroll = newscroll; } } /* second word controls vertical scroll and tile bank */ word = *base++; if (word & 0x8000) { int newscroll = ((word >> 6) - (scanline + i)) & 0x1ff; int newbank = word & 7; if (newscroll != playfield_yscroll) { video_screen_update_partial(0, scanline + i - 1); tilemap_set_scrolly(atarigen_playfield_tilemap, 0, newscroll); playfield_yscroll = newscroll; } if (newbank != playfield_tile_bank) { video_screen_update_partial(0, scanline + i - 1); tilemap_mark_all_tiles_dirty(atarigen_playfield_tilemap); playfield_tile_bank = newbank; } } } } /************************************* * * Main refresh * *************************************/ VIDEO_UPDATE( atarig1 ) { /* draw the playfield */ tilemap_draw(bitmap, cliprect, atarigen_playfield_tilemap, 0, 0); /* copy the motion objects on top */ copybitmap(bitmap, atarirle_get_vram(0, 0), 0, 0, 0, 0, cliprect, TRANSPARENCY_PEN, 0); /* add the alpha on top */ tilemap_draw(bitmap, cliprect, atarigen_alpha_tilemap, 0, 0); return 0; }