diff options
Diffstat (limited to 'src/mame/video/quasar.c')
-rw-r--r-- | src/mame/video/quasar.c | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/mame/video/quasar.c b/src/mame/video/quasar.c new file mode 100644 index 00000000000..555340c9fc7 --- /dev/null +++ b/src/mame/video/quasar.c @@ -0,0 +1,283 @@ +/*************************************************************************** + + video\quasar.c + + Functions to emulate the video hardware of the machine. + + Zaccaria S2650 games share various levels of design with the Century Video + System (CVS) games, and hence some routines are shared from there. + + Shooting seems to mix custom boards from Zaccaria and sound boards from CVS + hinting at a strong link between the two companies. + + Zaccaria are an italian company, Century were based in Manchester UK + +***************************************************************************/ + +#include "driver.h" +#include "video/s2636.h" +#include "cpu/s2650/s2650.h" + +#ifdef LSB_FIRST +#define BL0 0 +#define BL1 1 +#define BL2 2 +#define BL3 3 +#define WL0 0 +#define WL1 1 +#else +#define BL0 3 +#define BL1 2 +#define BL2 1 +#define BL3 0 +#define WL0 1 +#define WL1 0 +#endif + +// All defined in video/cvs.c + +VIDEO_START( cvs ); + +extern UINT8 *cvs_bullet_ram; + +extern mame_bitmap *cvs_collision_bitmap; +extern mame_bitmap *cvs_collision_background; + + +extern int cvs_collision_register; + + +// Used here +//static int scroll[8]; +//static int scroll_reg = 0; + +UINT8 *quasar_effectram; +int quasar_effectcontrol; + +static mame_bitmap *effect_bitmap; + +PALETTE_INIT( quasar ) +{ + int i,col,map; + + #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs]) + + // Standard 1 bit per colour palette (background and sprites) + + for(col = 0;col < 8; col++) + { + palette_set_color_rgb(machine,col,pal1bit(col >> 0),pal1bit(col >> 1),pal1bit(col >> 2)); + } + + // Address 0-2 from graphic rom + // 3-5 from colour ram + // 6-8 from sprite chips (Used for priority) + + for(col = 0; col < 512; col++) + { + COLOR(0,col) = color_prom[col] & 7; + } + + /* Background for collision */ + + COLOR(0,512) = 0; // Black + for(col=1;col<8;col++) // White + COLOR(0,512+col) = 7; + + /* Effects Colour Map */ + + for (i = 0;i < 256;i++) + { + int bit0,bit1,bit2,r,g,b; + + /* red component */ + bit0 = BIT(i,0); + bit1 = BIT(i,1); + bit2 = BIT(i,2); + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* green component */ + bit0 = BIT(i,3); + bit1 = BIT(i,4); + bit2 = BIT(i,5); + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* blue component */ + bit0 = BIT(i,6); + bit1 = BIT(i,7); + b = 0x4f * bit0 + 0xa8 * bit1; + + // Intensity 1 + palette_set_color_rgb(machine,256+i,r>>2,g>>2,b>>2); + + // Intensity 2 + palette_set_color_rgb(machine,512+i,(r>>2)+(r>>3),(g>>2)+(g>>3),(b>>2)+(b>>2)); + + // Intensity 3 + palette_set_color_rgb(machine,768+i,r>>1,g>>1,b>>1); + } + + /* Sprites */ + + for(map=0;map<8;map++) + { + COLOR(0,map*2 + 2072) = 0; + COLOR(0,map*2 + 2073) = 8 + map; + } + + /* Set Sprite chip offsets */ + + s2636_x_offset = -26; + s2636_y_offset = 3; + + memset(s2636_1_dirty,0,sizeof(s2636_1_dirty)); + memset(s2636_2_dirty,0,sizeof(s2636_2_dirty)); + memset(s2636_3_dirty,0,sizeof(s2636_3_dirty)); +} + +VIDEO_START( quasar ) +{ + quasar_effectram = auto_malloc(0x400); + + effect_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); + + video_start_cvs(machine); +} + +VIDEO_UPDATE( quasar ) +{ + int offs,character; + int sx,sy, ox, oy; + int forecolor; + + /* for every character in the Video RAM, check if it has been modified */ + /* since last time and update it accordingly. */ + + for (offs = videoram_size - 1;offs >= 0;offs--) + { + character = videoram[offs]; + + sx = (offs % 32) * 8; + sy = (offs / 32) * 8; + + // While we have the current character code, draw the effects layer + // intensity / on and off controlled by latch + + if (quasar_effectcontrol == 0x30) + forecolor = 0; + else + forecolor = quasar_effectram[offs] + (256 * (((quasar_effectcontrol >> 4) ^ 3) & 3)); + + for(ox=0;ox<8;ox++) + for(oy=0;oy<8;oy++) + *BITMAP_ADDR16(effect_bitmap, sy+oy, sx+ox) = forecolor; + + /* Main Screen */ + + drawgfx(tmpbitmap,machine->gfx[0], + character, + colorram[offs], + 0,0, + sx,sy, + 0,TRANSPARENCY_NONE,0); + + + /* background for Collision Detection (it can only hit certain items) */ + + if((colorram[offs] & 7) == 0) + { + drawgfx(cvs_collision_background,machine->gfx[0], + character, + 64, + 0,0, + sx,sy, + 0,TRANSPARENCY_NONE,0); + } + } + + /* Update screen */ + + copybitmap(bitmap,effect_bitmap,0,0,0,0,&machine->screen[0].visarea,TRANSPARENCY_NONE,0); + copybitmap(bitmap,tmpbitmap,0,0,0,0,&machine->screen[0].visarea,TRANSPARENCY_PEN,0); + + /* 2636's */ + + fillbitmap(s2636_1_bitmap,0,0); + s2636_update_bitmap(machine,s2636_1_bitmap,s2636_1_ram,s2636_1_dirty,2,cvs_collision_bitmap); + + fillbitmap(s2636_2_bitmap,0,0); + s2636_update_bitmap(machine,s2636_2_bitmap,s2636_2_ram,s2636_2_dirty,3,cvs_collision_bitmap); + + fillbitmap(s2636_3_bitmap,0,0); + s2636_update_bitmap(machine,s2636_3_bitmap,s2636_3_ram,s2636_3_dirty,4,cvs_collision_bitmap); + + /* Bullet Hardware */ + + for (offs = 8; offs < 256; offs++ ) + { + if(cvs_bullet_ram[offs] != 0) + { + int ct; + for(ct=0;ct<1;ct++) + { + int bx=255-9-cvs_bullet_ram[offs]-ct; + + /* Bullet/Object Collision */ + + if (*BITMAP_ADDR8(s2636_1_bitmap, offs, bx) != 0) cvs_collision_register |= 4; + if (*BITMAP_ADDR8(s2636_3_bitmap, offs, bx) != 0) cvs_collision_register |= 8; + + *BITMAP_ADDR16(bitmap, offs, bx) = machine->pens[7]; + } + } + } + + /* Update 2636 images */ + + { + UINT32 S1,S2,S3,SB,pen; + + for(sx=255;sx>7;sx--) + { + UINT32 *sp1 = (UINT32 *)BITMAP_ADDR8(s2636_1_bitmap, sx, 0); + UINT32 *sp2 = (UINT32 *)BITMAP_ADDR8(s2636_2_bitmap, sx, 0); + UINT32 *sp3 = (UINT32 *)BITMAP_ADDR8(s2636_3_bitmap, sx, 0); + UINT64 *dst = (UINT64 *)BITMAP_ADDR16(bitmap, sx, 0); + UINT8 *spb = (UINT8 *)BITMAP_ADDR8(cvs_collision_background, sx, 0); + + for(offs=0;offs<62;offs++) + { + S1 = (*sp1++); + S2 = (*sp2++); + S3 = (*sp3++); + + pen = S1 | S2 | S3; + + if(pen) + { + UINT16 *address = (UINT16 *)dst; + if (pen & 0xff000000) address[BL3] = machine->pens[(pen >> 24) & 15]; + if (pen & 0x00ff0000) address[BL2] = machine->pens[(pen >> 16) & 15]; + if (pen & 0x0000ff00) address[BL1] = machine->pens[(pen >> 8) & 15]; + if (pen & 0x000000ff) address[BL0] = machine->pens[(pen & 15)]; + + /* Collision Detection */ + + SB = 0; + if (spb[BL3] != machine->pens[0]) SB = 0x08000000; + if (spb[BL2] != machine->pens[0]) SB |= 0x00080000; + if (spb[BL1] != machine->pens[0]) SB |= 0x00000800; + if (spb[BL0] != machine->pens[0]) SB |= 0x00000008; + + if (SB) + { + if (S1 & SB) cvs_collision_register |= 1; + if (S3 & SB) cvs_collision_register |= 2; + } + } + + dst++; + spb+=4; + } + } + } + return 0; +} |