diff options
Diffstat (limited to 'src/mame/video/atarifb.c')
-rw-r--r-- | src/mame/video/atarifb.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/mame/video/atarifb.c b/src/mame/video/atarifb.c new file mode 100644 index 00000000000..d483de49d91 --- /dev/null +++ b/src/mame/video/atarifb.c @@ -0,0 +1,190 @@ +/************************************************************************* + + Atari Football hardware + +*************************************************************************/ + +#include "driver.h" +#include "atarifb.h" +#include "ui.h" + +/* local */ +size_t atarifb_alphap1_vram_size; +size_t atarifb_alphap2_vram_size; +UINT8 *atarifb_alphap1_vram; +UINT8 *atarifb_alphap2_vram; +UINT8 *atarifb_scroll_register; + + +static const rectangle bigfield_area = { 4*8, 34*8-1, 0*8, 32*8-1 }; +static const rectangle left_area = { 0*8, 3*8-1, 0*8, 32*8-1 }; +static const rectangle right_area = { 34*8, 38*8-1, 0*8, 32*8-1 }; + +/*************************************************************************** +***************************************************************************/ +WRITE8_HANDLER( atarifb_alphap1_vram_w ) +{ + atarifb_alphap1_vram[offset] = data; +} + +WRITE8_HANDLER( atarifb_alphap2_vram_w ) +{ + atarifb_alphap2_vram[offset] = data; +} + +/*************************************************************************** +***************************************************************************/ +WRITE8_HANDLER( atarifb_scroll_w ) +{ + *atarifb_scroll_register = data - 8; +} + + +VIDEO_UPDATE( atarifb ) +{ + int offs,obj; + int sprite_bank; + + /* Soccer uses a different graphics set for sprites */ + if (atarifb_game == 4) + sprite_bank = 2; + else + sprite_bank = 1; + + for (offs = atarifb_alphap1_vram_size - 1;offs >= 0;offs--) + { + int charcode; + int flipbit; + int disable; + int sx,sy; + + sx = 8 * (offs / 32) + 35*8; + sy = 8 * (offs % 32) + 8; + + charcode = atarifb_alphap1_vram[offs] & 0x3f; + flipbit = (atarifb_alphap1_vram[offs] & 0x40) >> 6; + disable = (atarifb_alphap1_vram[offs] & 0x80) >> 7; + + if (!disable) + { + drawgfx(bitmap,machine->gfx[0], + charcode, 0, + flipbit,flipbit,sx,sy, + &right_area,TRANSPARENCY_NONE,0); + } + } + + for (offs = atarifb_alphap2_vram_size - 1;offs >= 0;offs--) + { + int charcode; + int flipbit; + int disable; + int sx,sy; + + sx = 8 * (offs / 32); + sy = 8 * (offs % 32) + 8; + + charcode = atarifb_alphap2_vram[offs] & 0x3f; + flipbit = (atarifb_alphap2_vram[offs] & 0x40) >> 6; + disable = (atarifb_alphap2_vram[offs] & 0x80) >> 7; + + if (!disable) + { + drawgfx(bitmap,machine->gfx[0], + charcode, 0, + flipbit,flipbit,sx,sy, + &left_area,TRANSPARENCY_NONE,0); + } + } + + for (offs = videoram_size - 1;offs >= 0;offs--) + { + int charcode; + int flipx,flipy; + int sx,sy; + + dirtybuffer[offs]=0; + + charcode = videoram[offs] & 0x3f; + flipx = (videoram[offs] & 0x40) >> 6; + flipy = (videoram[offs] & 0x80) >> 7; + + sx = (8 * (offs % 32) - *atarifb_scroll_register); + sy = 8 * (offs / 32) + 8; + + /* Soccer hack */ + if (atarifb_game == 4) + { + sy += 8; + } + + /* Baseball hack */ + if (atarifb_game == 0x03) sx -= 8; + + if (sx < 0) sx += 256; + if (sx > 255) sx -= 256; + + drawgfx(tmpbitmap,machine->gfx[1], + charcode, 0, + flipx,flipy,sx,sy, + 0,TRANSPARENCY_NONE,0); + } + + /* copy the character mapped graphics */ + copybitmap(bitmap,tmpbitmap,0,0,8*3,0,&bigfield_area,TRANSPARENCY_NONE,0); + + /* Draw our motion objects */ + for (obj=0;obj<16;obj++) + { + int charcode; + int flipx,flipy; + int sx,sy; + int shade = 0; + + sy = 255 - spriteram[obj*2 + 1]; + if (sy == 255) continue; + + charcode = spriteram[obj*2] & 0x3f; + flipx = (spriteram[obj*2] & 0x40); + flipy = (spriteram[obj*2] & 0x80); + sx = spriteram[obj*2 + 0x20] + 8*3; + + /* Note on Atari Soccer: */ + /* There are 3 sets of 2 bits each, where the 2 bits represent */ + /* black, dk grey, grey and white. I think the 3 sets determine the */ + /* color of each bit in the sprite, but I haven't implemented it that way. */ + if (atarifb_game == 4) + { + shade = ((spriteram[obj*2+1 + 0x20]) & 0x07); + + drawgfx(bitmap,machine->gfx[sprite_bank+1], + charcode, shade, + flipx,flipy,sx,sy, + &bigfield_area,TRANSPARENCY_PEN,0); + + shade = ((spriteram[obj*2+1 + 0x20]) & 0x08) >> 3; + } + + drawgfx(bitmap,machine->gfx[sprite_bank], + charcode, shade, + flipx,flipy,sx,sy, + &bigfield_area,TRANSPARENCY_PEN,0); + + /* If this isn't soccer, handle the multiplexed sprites */ + if (atarifb_game != 4) + { + /* The down markers are multiplexed by altering the y location during */ + /* mid-screen. We'll fake it by essentially doing the same thing here. */ + if ((charcode == 0x11) && (sy == 0x07)) + { + sy = 0xf1; /* When multiplexed, it's 0x10...why? */ + drawgfx(bitmap,machine->gfx[sprite_bank], + charcode, 0, + flipx,flipy,sx,sy, + &bigfield_area,TRANSPARENCY_PEN,0); + } + } + } + + return 0; +} |