diff options
Diffstat (limited to 'src/mame/video/bublbobl.c')
-rw-r--r-- | src/mame/video/bublbobl.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/mame/video/bublbobl.c b/src/mame/video/bublbobl.c new file mode 100644 index 00000000000..707bcc987cd --- /dev/null +++ b/src/mame/video/bublbobl.c @@ -0,0 +1,98 @@ +/*************************************************************************** + + video.c + + Functions to emulate the video hardware of the machine. + +***************************************************************************/ +#include "driver.h" +#include <ctype.h> + + + +UINT8 *bublbobl_objectram; +size_t bublbobl_objectram_size; +int bublbobl_video_enable; + + +VIDEO_UPDATE( bublbobl ) +{ + int offs; + int sx,sy,xc,yc; + int gfx_num,gfx_attr,gfx_offs; + const UINT8 *prom_line; + + + /* Bubble Bobble doesn't have a real video RAM. All graphics (characters */ + /* and sprites) are stored in the same memory region, and information on */ + /* the background character columns is stored in the area dd00-dd3f */ + + /* This clears & redraws the entire screen each pass */ + fillbitmap(bitmap,machine->pens[255],cliprect); + + if (!bublbobl_video_enable) return 0; + + sx = 0; + + for (offs = 0;offs < bublbobl_objectram_size;offs += 4) + { + /* skip empty sprites */ + /* this is dword aligned so the UINT32 * cast shouldn't give problems */ + /* on any architecture */ + if (*(UINT32 *)(&bublbobl_objectram[offs]) == 0) + continue; + + gfx_num = bublbobl_objectram[offs + 1]; + gfx_attr = bublbobl_objectram[offs + 3]; + prom_line = memory_region(REGION_PROMS) + 0x80 + ((gfx_num & 0xe0) >> 1); + + gfx_offs = ((gfx_num & 0x1f) * 0x80); + if ((gfx_num & 0xa0) == 0xa0) + gfx_offs |= 0x1000; + + sy = -bublbobl_objectram[offs + 0]; + + for (yc = 0;yc < 32;yc++) + { + if (prom_line[yc/2] & 0x08) continue; /* NEXT */ + + if (!(prom_line[yc/2] & 0x04)) /* next column */ + { + sx = bublbobl_objectram[offs + 2]; + if (gfx_attr & 0x40) sx -= 256; + } + + for (xc = 0;xc < 2;xc++) + { + int goffs,code,color,flipx,flipy,x,y; + + goffs = gfx_offs + xc * 0x40 + (yc & 7) * 0x02 + + (prom_line[yc/2] & 0x03) * 0x10; + code = videoram[goffs] + 256 * (videoram[goffs + 1] & 0x03) + 1024 * (gfx_attr & 0x0f); + color = (videoram[goffs + 1] & 0x3c) >> 2; + flipx = videoram[goffs + 1] & 0x40; + flipy = videoram[goffs + 1] & 0x80; + x = sx + xc * 8; + y = (sy + yc * 8) & 0xff; + + if (flip_screen) + { + x = 248 - x; + y = 248 - y; + flipx = !flipx; + flipy = !flipy; + } + + drawgfx(bitmap,machine->gfx[0], + code, + color, + flipx,flipy, + x,y, + cliprect,TRANSPARENCY_PEN,15); + } + } + + sx += 16; + } + return 0; +} |