mirror of
https://github.com/holub/mame
synced 2025-07-03 09:06:08 +03:00
- Reworked/refactored S2636 emulator
- Updated all S2636 users for the new interface - Removed color tables from all games
This commit is contained in:
parent
38ac9dbdcc
commit
4ba36433ee
@ -1,278 +1,317 @@
|
|||||||
/*************************************************************
|
/**********************************************************************
|
||||||
* *
|
|
||||||
* Signetics 2636 video chip *
|
|
||||||
* *
|
|
||||||
*************************************************************
|
|
||||||
|
|
||||||
PVI REGISTER DESCRIPTION
|
Signetics 2636 video chip
|
||||||
------------------------
|
|
||||||
|
|
||||||
| bit |R/W| description
|
Copyright Nicola Salmoria and the MAME Team.
|
||||||
byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
| | |
|
|
||||||
FC0 | size 4| size 3| size 2| size 1| W | size of the 4 objects(=sprites)
|
|
||||||
| | |
|
|
||||||
FC1 | |C1 |C2 |C3 |C1 |C2 |C3 | W | colours of the 4 objects
|
|
||||||
| | colour 1 | colour 2 | |
|
|
||||||
FC2 | |C1 |C2 |C3 |C1 |C2 |C3 | W |
|
|
||||||
| | colour 3 | colour 4 | |
|
|
||||||
| | |
|
|
||||||
FC3 | |sh |pos| W | 1=shape 0=position
|
|
||||||
| | | display format and position
|
|
||||||
FC4 | (free) | |
|
|
||||||
FC5 | (free) | |
|
|
||||||
| | |
|
|
||||||
FC6 | |C1 |C2 |C3 |BG |scrn colr | W | background lock and colour
|
|
||||||
| |backg colr |enb|C1 |C2 |C3 | | 3="enable"
|
|
||||||
| | |
|
|
||||||
FC7 | sound | W | squarewave output
|
|
||||||
| | |
|
|
||||||
FC8 | N1 | N2 | W | range of the 4 display digits
|
|
||||||
FC9 | N3 | N4 | W |
|
|
||||||
| | |
|
|
||||||
|obj/backgrnd |complete object| R |
|
|
||||||
FCA | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | |
|
|
||||||
| | |
|
|
||||||
FCB | |VR-| object collisions | R | Composition of object and back-
|
|
||||||
| |LE |1/2|1/3|1/3|1/4|2/4|3/4| | ground,collision detection and
|
|
||||||
| | | object display as a state display
|
|
||||||
| | | for the status register.Set VRLE.
|
|
||||||
| | | wait for VRST.Read out or transmit
|
|
||||||
| | | [copy?] all bits until reset by
|
|
||||||
| | | VRST.
|
|
||||||
| | |
|
|
||||||
FCC | PORT1 | R | PORT1 and PORT2 for the range of
|
|
||||||
FCD | PORT2 | | the A/D conversion.Cleared by VRST
|
|
||||||
FCE | (free) | |
|
|
||||||
FCF | (free) | |
|
|
||||||
|
|
||||||
|
|
||||||
Size control by byte FC0
|
PVI REGISTER DESCRIPTION
|
||||||
|
------------------------
|
||||||
|
|
||||||
bit matrix
|
| bit |R/W| description
|
||||||
|0|0| 8x10
|
byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
|
||||||
|0|1| 16x20
|
| | |
|
||||||
|1|0| 32x40
|
FC0 | size 4| size 3| size 2| size 1| W | size of the 4 objects(=sprites)
|
||||||
|1|1| 64x80
|
| | |
|
||||||
|
FC1 | |C1 |C2 |C3 |C1 |C2 |C3 | W | colors of the 4 objects
|
||||||
CE1 and not-CE2 are outputs from the PVI.$E80..$EFF also controls the
|
| | color 1 | color 2 | |
|
||||||
analogue multiplexer.
|
FC2 | |C1 |C2 |C3 |C1 |C2 |C3 | W |
|
||||||
|
| | color 3 | color 4 | |
|
||||||
|
| | |
|
||||||
|
FC3 | |sh |pos| W | 1=shape 0=position
|
||||||
|
| | | display format and position
|
||||||
|
FC4 | (free) | |
|
||||||
|
FC5 | (free) | |
|
||||||
|
| | |
|
||||||
|
FC6 | |C1 |C2 |C3 |BG |scrn colr | W | background lock and color
|
||||||
|
| |backg colr |enb|C1 |C2 |C3 | | 3="enable"
|
||||||
|
| | |
|
||||||
|
FC7 | sound | W | squarewave output
|
||||||
|
| | |
|
||||||
|
FC8 | N1 | N2 | W | range of the 4 display digits
|
||||||
|
FC9 | N3 | N4 | W |
|
||||||
|
| | |
|
||||||
|
|obj/backgrnd |complete object| R |
|
||||||
|
FCA | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 | |
|
||||||
|
| | |
|
||||||
|
FCB | |VR-| object collisions | R | Composition of object and back-
|
||||||
|
| |LE |1/2|1/3|1/3|1/4|2/4|3/4| | ground,collision detection and
|
||||||
|
| | | object display as a state display
|
||||||
|
| | | for the status register.Set VRLE.
|
||||||
|
| | | wait for VRST.Read out or transmit
|
||||||
|
| | | [copy?] all bits until reset by
|
||||||
|
| | | VRST.
|
||||||
|
| | |
|
||||||
|
FCC | PORT1 | R | PORT1 and PORT2 for the range of
|
||||||
|
FCD | PORT2 | | the A/D conversion.Cleared by VRST
|
||||||
|
FCE | (free) | |
|
||||||
|
FCF | (free) | |
|
||||||
|
|
||||||
|
|
||||||
SPRITES
|
Size control by byte FC0
|
||||||
-------
|
|
||||||
|
|
||||||
each object field: (=sprite data structure)
|
bit matrix
|
||||||
|
|0|0| 8x10
|
||||||
|
|0|1| 16x20
|
||||||
|
|1|0| 32x40
|
||||||
|
|1|1| 64x80
|
||||||
|
|
||||||
0 \ 10 bytes of bitmap (Each object is 8 pixels wide.)
|
CE1 and not-CE2 are outputs from the PVI.$E80..$EFF also controls the
|
||||||
9 /
|
analog multiplexer.
|
||||||
A HC horizontal object coordinate
|
|
||||||
B HCB horizontal dublicate coordinate
|
|
||||||
C VC vertical object coordinate
|
|
||||||
D VCB vertical dublicate coordinate
|
|
||||||
|
|
||||||
*************************************************************/
|
|
||||||
|
SPRITES
|
||||||
|
-------
|
||||||
|
|
||||||
|
each object field: (=sprite data structure)
|
||||||
|
|
||||||
|
0 \ 10 bytes of bitmap (Each object is 8 pixels wide.)
|
||||||
|
9 /
|
||||||
|
A HC horizontal object coordinate
|
||||||
|
B HCB horizontal duplicate coordinate
|
||||||
|
C VC vertical object coordinate
|
||||||
|
D VCB vertical duplicate coordinate
|
||||||
|
|
||||||
|
*************************************************************/
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "s2636.h"
|
#include "s2636.h"
|
||||||
|
|
||||||
static const int sprite_offsets[4] = { 0x00, 0x10, 0x20, 0x40};
|
|
||||||
|
|
||||||
/* To adjust sprites against bitmap */
|
|
||||||
|
|
||||||
UINT8 *s2636_1_ram;
|
/*************************************
|
||||||
UINT8 *s2636_2_ram;
|
*
|
||||||
UINT8 *s2636_3_ram;
|
* Constants
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
mame_bitmap *s2636_1_bitmap;
|
#define SPRITE_WIDTH (8)
|
||||||
mame_bitmap *s2636_2_bitmap;
|
#define SPRITE_HEIGHT (10)
|
||||||
mame_bitmap *s2636_3_bitmap;
|
|
||||||
|
|
||||||
int s2636_x_offset;
|
static const int sprite_offsets[4] = { 0x00, 0x10, 0x20, 0x40 };
|
||||||
int s2636_y_offset;
|
|
||||||
|
|
||||||
const gfx_layout s2636_gfx_layout =
|
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
*
|
||||||
|
* Internal S2636 data structure
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
struct _s2636_t
|
||||||
{
|
{
|
||||||
8,10,
|
UINT8 *work_ram;
|
||||||
5,
|
int y_offset;
|
||||||
1,
|
int x_offset;
|
||||||
{ 0 },
|
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7 },
|
mame_bitmap *bitmap;
|
||||||
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 },
|
mame_bitmap *collision_bitmap;
|
||||||
8*16
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*****************************************/
|
|
||||||
/* Check for Collision between 2 sprites */
|
|
||||||
/*****************************************/
|
|
||||||
|
|
||||||
static int SpriteCheck(running_machine *machine, int first,int second,UINT8 *workram,int Graphics_Bank,mame_bitmap *collision_bitmap)
|
/*************************************
|
||||||
|
*
|
||||||
|
* Configuration
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
s2636_t *s2636_config(UINT8 *work_ram, int screen_height, int screen_width, int y_offset, int x_offset)
|
||||||
{
|
{
|
||||||
int Checksum=0;
|
s2636_t *s2636;
|
||||||
int x,y;
|
|
||||||
|
|
||||||
// Does not check shadow sprites yet
|
/* allocate the object that holds the state */
|
||||||
|
s2636 = auto_malloc(sizeof(*s2636));
|
||||||
|
|
||||||
if((workram[sprite_offsets[first] + 10] != 0xff) && (workram[sprite_offsets[second] + 10] != 0xff))
|
s2636->work_ram = work_ram;
|
||||||
{
|
s2636->y_offset = y_offset;
|
||||||
int fx1 = workram[sprite_offsets[first] + 10] + s2636_x_offset;
|
s2636->x_offset = x_offset;
|
||||||
int fy1 = workram[sprite_offsets[first] + 12] + s2636_y_offset;
|
|
||||||
int fx2 = workram[sprite_offsets[second] + 10] + s2636_x_offset;
|
|
||||||
int fy2 = workram[sprite_offsets[second] + 12] + s2636_y_offset;
|
|
||||||
|
|
||||||
if((fx1>=0) && (fy1>=0) && (fx2>=0) && (fy2>=0))
|
s2636->bitmap = auto_bitmap_alloc(screen_width, screen_height, BITMAP_FORMAT_INDEXED8);
|
||||||
{
|
s2636->collision_bitmap = auto_bitmap_alloc(screen_width, screen_height, BITMAP_FORMAT_INDEXED8);
|
||||||
int expand1 = 1 << (16+((workram[0xC0]>>(first<<1)) & 3));
|
|
||||||
int expand2 = 1 << (16+((workram[0xC0]>>(second<<1)) & 3));
|
|
||||||
|
|
||||||
int char1 = sprite_offsets[first]>>4;
|
return s2636;
|
||||||
int char2 = sprite_offsets[second]>>4;
|
|
||||||
|
|
||||||
/* Draw first sprite */
|
|
||||||
|
|
||||||
drawgfxzoom(collision_bitmap,machine->gfx[Graphics_Bank],
|
|
||||||
char1,
|
|
||||||
1,
|
|
||||||
0,0,
|
|
||||||
fx1,fy1,
|
|
||||||
&machine->screen[0].visarea, TRANSPARENCY_PEN, 0,
|
|
||||||
expand1,expand1);
|
|
||||||
|
|
||||||
/* Get fingerprint */
|
|
||||||
|
|
||||||
for (x = fx1; x < fx1 + machine->gfx[Graphics_Bank]->width; x++)
|
|
||||||
{
|
|
||||||
for (y = fy1; y < fy1 + machine->gfx[Graphics_Bank]->height; y++)
|
|
||||||
{
|
|
||||||
if ((x < machine->screen[0].visarea.min_x) ||
|
|
||||||
(x > machine->screen[0].visarea.max_x) ||
|
|
||||||
(y < machine->screen[0].visarea.min_y) ||
|
|
||||||
(y > machine->screen[0].visarea.max_y))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Checksum += *BITMAP_ADDR8(collision_bitmap, y, x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blackout second sprite */
|
|
||||||
|
|
||||||
drawgfxzoom(collision_bitmap,machine->gfx[Graphics_Bank],
|
|
||||||
char2,
|
|
||||||
0,
|
|
||||||
0,0,
|
|
||||||
fx2,fy2,
|
|
||||||
&machine->screen[0].visarea, TRANSPARENCY_PEN, 0,
|
|
||||||
expand2,expand2);
|
|
||||||
|
|
||||||
/* Remove fingerprint */
|
|
||||||
|
|
||||||
for (x = fx1; x < fx1 + machine->gfx[Graphics_Bank]->width; x++)
|
|
||||||
{
|
|
||||||
for (y = fy1; y < fy1 + machine->gfx[Graphics_Bank]->height; y++)
|
|
||||||
{
|
|
||||||
if ((x < machine->screen[0].visarea.min_x) ||
|
|
||||||
(x > machine->screen[0].visarea.max_x) ||
|
|
||||||
(y < machine->screen[0].visarea.min_y) ||
|
|
||||||
(y > machine->screen[0].visarea.max_y))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Checksum -= *BITMAP_ADDR8(collision_bitmap, y, x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Zero bitmap */
|
|
||||||
|
|
||||||
drawgfxzoom(collision_bitmap,machine->gfx[Graphics_Bank],
|
|
||||||
char1,
|
|
||||||
0,
|
|
||||||
0,0,
|
|
||||||
fx1,fy1,
|
|
||||||
&machine->screen[0].visarea, TRANSPARENCY_PEN, 0,
|
|
||||||
expand1,expand1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Checksum;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void s2636_update_bitmap(running_machine *machine,mame_bitmap *bitmap,UINT8 *workram,int Graphics_Bank,mame_bitmap *collision_bitmap)
|
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
*
|
||||||
|
* Draw a sprite
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
static void draw_sprite(UINT8 *gfx, int color, int y, int x, int expand,
|
||||||
|
int or_mode, mame_bitmap *bitmap, const rectangle *cliprect)
|
||||||
{
|
{
|
||||||
int CollisionSprite = 0;
|
int sy;
|
||||||
int spriteno;
|
|
||||||
int offs;
|
|
||||||
|
|
||||||
for(spriteno=0;spriteno<4;spriteno++)
|
/* for each row */
|
||||||
{
|
for (sy = 0; sy < SPRITE_HEIGHT; sy++)
|
||||||
offs = sprite_offsets[spriteno];
|
{
|
||||||
|
int sx;
|
||||||
|
|
||||||
if(workram[offs+10]!=0xFF)
|
/* for each pixel on the row */
|
||||||
|
for (sx = 0; sx < SPRITE_WIDTH; sx++)
|
||||||
{
|
{
|
||||||
int charno = offs>>4;
|
int ey;
|
||||||
int expand = 1 << (16+((workram[0xC0]>>(spriteno<<1)) & 3));
|
|
||||||
int bx = workram[offs+10] + s2636_x_offset;
|
|
||||||
int by = workram[offs+12] + s2636_y_offset;
|
|
||||||
|
|
||||||
if((bx >= 0) && (by >= 0))
|
/* each pixel can be expanded */
|
||||||
{
|
for (ey = 0; ey <= expand; ey++)
|
||||||
/* Get colour and mask correct bits */
|
{
|
||||||
|
int ex;
|
||||||
|
|
||||||
int colour = workram[0xC1 + (spriteno >> 1)];
|
for (ex = 0; ex <= expand; ex++)
|
||||||
|
{
|
||||||
|
/* compute effective destination pixel */
|
||||||
|
int ty = y + sy * (expand + 1) + ey;
|
||||||
|
int tx = x + sx * (expand + 1) + ex;
|
||||||
|
|
||||||
if((spriteno & 1)==0) colour >>= 3;
|
/* get out if outside the drawing region */
|
||||||
|
if ((tx < cliprect->min_x) ||
|
||||||
|
(tx > cliprect->max_x) ||
|
||||||
|
(ty < cliprect->min_y) ||
|
||||||
|
(ty > cliprect->max_y))
|
||||||
|
continue;
|
||||||
|
|
||||||
colour = (colour & 7) + 7;
|
/* get out if current image bit is transparent */
|
||||||
|
if (((gfx[sy] << sx) & 0x80) == 0x00)
|
||||||
|
continue;
|
||||||
|
|
||||||
decodechar(machine->gfx[Graphics_Bank],charno,workram);
|
if (or_mode)
|
||||||
|
*BITMAP_ADDR8(bitmap, ty, tx) = 0x08 | *BITMAP_ADDR8(bitmap, ty, tx) | color;
|
||||||
drawgfxzoom(bitmap,machine->gfx[Graphics_Bank],
|
else
|
||||||
charno,
|
*BITMAP_ADDR8(bitmap, ty, tx) = 0x08 | color;
|
||||||
colour,
|
}
|
||||||
0,0,
|
}
|
||||||
bx,by,
|
}
|
||||||
&machine->screen[0].visarea,
|
}
|
||||||
TRANSPARENCY_BLEND_RAW, 0,
|
}
|
||||||
expand,expand);
|
|
||||||
|
|
||||||
/* Shadow Sprites */
|
|
||||||
|
/*************************************
|
||||||
if((workram[offs+11]!=0xff) && (workram[offs+13]!=0xfe))
|
*
|
||||||
{
|
* Collision detection
|
||||||
bx=workram[offs+11] + s2636_x_offset;
|
*
|
||||||
|
*************************************/
|
||||||
if(bx >= 0)
|
|
||||||
{
|
static int check_collision(s2636_t *s2636, int spriteno1, int spriteno2, const rectangle *cliprect)
|
||||||
for(;by < 255;)
|
{
|
||||||
{
|
int checksum = 0;
|
||||||
by=by+10+workram[offs+13];
|
|
||||||
|
UINT8* attr1 = &s2636->work_ram[sprite_offsets[spriteno1]];
|
||||||
drawgfxzoom(bitmap,machine->gfx[Graphics_Bank],
|
UINT8* attr2 = &s2636->work_ram[sprite_offsets[spriteno2]];
|
||||||
charno,
|
|
||||||
colour,
|
/* TODO: does not check shadow sprites yet */
|
||||||
0,0,
|
|
||||||
bx,by,
|
fillbitmap(s2636->collision_bitmap, 0, cliprect);
|
||||||
&machine->screen[0].visarea,
|
|
||||||
TRANSPARENCY_BLEND_RAW, 0,
|
if ((attr1[0x0a] != 0xff) && (attr2[0x0a] != 0xff))
|
||||||
expand,expand);
|
{
|
||||||
}
|
int x, y;
|
||||||
}
|
|
||||||
}
|
int x1 = attr1[0x0a] + s2636->x_offset;
|
||||||
}
|
int y1 = attr1[0x0c] + s2636->y_offset;
|
||||||
}
|
int x2 = attr2[0x0a] + s2636->x_offset;
|
||||||
}
|
int y2 = attr2[0x0c] + s2636->y_offset;
|
||||||
|
|
||||||
/* Sprite->Sprite collision detection */
|
int expand1 = (s2636->work_ram[0xc0] >> (spriteno1 << 1)) & 0x03;
|
||||||
|
int expand2 = (s2636->work_ram[0xc0] >> (spriteno2 << 1)) & 0x03;
|
||||||
if(SpriteCheck(machine,0,1,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x20;
|
|
||||||
if(SpriteCheck(machine,0,2,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x10;
|
/* draw first sprite */
|
||||||
if(SpriteCheck(machine,0,3,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x08;
|
draw_sprite(attr1, 1, y1, x1, expand1, FALSE, s2636->collision_bitmap, cliprect);
|
||||||
if(SpriteCheck(machine,1,2,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x04;
|
|
||||||
if(SpriteCheck(machine,1,3,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x02;
|
/* get fingerprint */
|
||||||
if(SpriteCheck(machine,2,3,workram,Graphics_Bank,collision_bitmap)) CollisionSprite |= 0x01;
|
for (x = x1; x < x1 + SPRITE_WIDTH; x++)
|
||||||
|
for (y = y1; y < y1 + SPRITE_HEIGHT; y++)
|
||||||
workram[0xCB] = CollisionSprite;
|
{
|
||||||
|
if ((x < cliprect->min_x) ||
|
||||||
|
(x > cliprect->max_x) ||
|
||||||
|
(y < cliprect->min_y) ||
|
||||||
|
(y > cliprect->max_y))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
checksum = checksum + *BITMAP_ADDR8(s2636->collision_bitmap, y, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* black out second sprite */
|
||||||
|
draw_sprite(attr2, 0, y2, x2, expand2, FALSE, s2636->collision_bitmap, cliprect);
|
||||||
|
|
||||||
|
/* remove fingerprint */
|
||||||
|
for (x = x1; x < x1 + SPRITE_WIDTH; x++)
|
||||||
|
for (y = y1; y < y1 + SPRITE_HEIGHT; y++)
|
||||||
|
{
|
||||||
|
if ((x < cliprect->min_x) ||
|
||||||
|
(x > cliprect->max_x) ||
|
||||||
|
(y < cliprect->min_y) ||
|
||||||
|
(y > cliprect->max_y))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
checksum = checksum - *BITMAP_ADDR8(s2636->collision_bitmap, y, x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (checksum != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
*
|
||||||
|
* Main drawing
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
mame_bitmap *s2636_update(s2636_t *s2636, const rectangle *cliprect)
|
||||||
|
{
|
||||||
|
UINT8 collision = 0;
|
||||||
|
int spriteno;
|
||||||
|
|
||||||
|
fillbitmap(s2636->bitmap, 0, cliprect);
|
||||||
|
|
||||||
|
for (spriteno = 0; spriteno < 4; spriteno++)
|
||||||
|
{
|
||||||
|
int color, expand, x, y;
|
||||||
|
|
||||||
|
UINT8* attr = &s2636->work_ram[sprite_offsets[spriteno]];
|
||||||
|
|
||||||
|
/* get out if sprite is turned off */
|
||||||
|
if (attr[0x0a] == 0xff)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
x = attr[0x0a] + s2636->x_offset;
|
||||||
|
y = attr[0x0c] + s2636->y_offset;
|
||||||
|
|
||||||
|
color = (s2636->work_ram[0xc1 + (spriteno >> 1)] >> ((spriteno & 1) ? 0 : 3)) & 0x07;
|
||||||
|
expand = (s2636->work_ram[0xc0] >> (spriteno << 1)) & 0x03;
|
||||||
|
|
||||||
|
draw_sprite(attr, color, y, x, expand, TRUE, s2636->bitmap, cliprect);
|
||||||
|
|
||||||
|
/* bail if no shadow sprites */
|
||||||
|
if ((attr[0x0b] == 0xff) || (attr[0x0d] == 0xfe))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
x = attr[0x0b] + s2636->x_offset;
|
||||||
|
|
||||||
|
while (y < 0xff)
|
||||||
|
{
|
||||||
|
y = y + SPRITE_HEIGHT + attr[0x0d];
|
||||||
|
|
||||||
|
draw_sprite(attr, color, y, x, expand, TRUE, s2636->bitmap, cliprect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* collision detection */
|
||||||
|
if (check_collision(s2636, 0, 1, cliprect)) collision |= 0x20;
|
||||||
|
if (check_collision(s2636, 0, 2, cliprect)) collision |= 0x10;
|
||||||
|
if (check_collision(s2636, 0, 3, cliprect)) collision |= 0x08;
|
||||||
|
if (check_collision(s2636, 1, 2, cliprect)) collision |= 0x04;
|
||||||
|
if (check_collision(s2636, 1, 3, cliprect)) collision |= 0x02;
|
||||||
|
if (check_collision(s2636, 2, 3, cliprect)) collision |= 0x01;
|
||||||
|
|
||||||
|
s2636->work_ram[0xcb] = collision;
|
||||||
|
|
||||||
|
return s2636->bitmap;
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,24 @@
|
|||||||
extern UINT8 *s2636_1_ram;
|
/**********************************************************************
|
||||||
extern UINT8 *s2636_2_ram;
|
|
||||||
extern UINT8 *s2636_3_ram;
|
|
||||||
|
|
||||||
extern mame_bitmap *s2636_1_bitmap;
|
Signetics 2636 video chip
|
||||||
extern mame_bitmap *s2636_2_bitmap;
|
|
||||||
extern mame_bitmap *s2636_3_bitmap;
|
|
||||||
|
|
||||||
extern int s2636_x_offset;
|
**********************************************************************/
|
||||||
extern int s2636_y_offset;
|
|
||||||
|
|
||||||
extern const gfx_layout s2636_gfx_layout;
|
#ifndef S2636
|
||||||
|
#define S2636
|
||||||
|
|
||||||
void s2636_update_bitmap(running_machine *machine,mame_bitmap *bitmap,UINT8 *workram,int Graphics_Bank,mame_bitmap *collision_bitmap);
|
|
||||||
|
|
||||||
|
typedef struct _s2636_t s2636_t;
|
||||||
|
|
||||||
|
/* helpful macros to parse the bitmap returned by s2636_update */
|
||||||
|
#define S2636_IS_PIXEL_DRAWN(p) (((p) & 0x08) ? TRUE : FALSE)
|
||||||
|
#define S2636_PIXEL_COLOR(p) ((p) & 0x07)
|
||||||
|
|
||||||
|
s2636_t *s2636_config(UINT8 *work_ram, int screen_height, int screen_width, int y_offset, int x_offset);
|
||||||
|
|
||||||
|
/* returns a BITMAP_FORMAT_INDEXED8 bitmap the size of the screen
|
||||||
|
D0-D2 of each pixel is the pixel color
|
||||||
|
D3 indicates whether the S2636 drew this pixel - 0 = not drawn, 1 = drawn */
|
||||||
|
mame_bitmap *s2636_update(s2636_t *s2636, const rectangle *cliprect);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -585,7 +585,6 @@ static MACHINE_DRIVER_START( csk227it )
|
|||||||
MDRV_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1)
|
MDRV_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1)
|
||||||
MDRV_GFXDECODE(csk)
|
MDRV_GFXDECODE(csk)
|
||||||
MDRV_PALETTE_LENGTH(2048)
|
MDRV_PALETTE_LENGTH(2048)
|
||||||
MDRV_COLORTABLE_LENGTH(2048)
|
|
||||||
|
|
||||||
MDRV_VIDEO_START(cska)
|
MDRV_VIDEO_START(cska)
|
||||||
MDRV_VIDEO_UPDATE(cska)
|
MDRV_VIDEO_UPDATE(cska)
|
||||||
|
@ -121,6 +121,9 @@ UINT8 *cvs_video_ram;
|
|||||||
UINT8 *cvs_bullet_ram;
|
UINT8 *cvs_bullet_ram;
|
||||||
UINT8 *cvs_palette_ram;
|
UINT8 *cvs_palette_ram;
|
||||||
UINT8 *cvs_character_ram;
|
UINT8 *cvs_character_ram;
|
||||||
|
UINT8 *cvs_s2636_0_ram;
|
||||||
|
UINT8 *cvs_s2636_1_ram;
|
||||||
|
UINT8 *cvs_s2636_2_ram;
|
||||||
|
|
||||||
static UINT8 *cvs_4_bit_dac_data;
|
static UINT8 *cvs_4_bit_dac_data;
|
||||||
static UINT8 *cvs_tms5110_ctl_data;
|
static UINT8 *cvs_tms5110_ctl_data;
|
||||||
@ -178,54 +181,54 @@ WRITE8_HANDLER( cvs_bullet_ram_or_palette_w )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
READ8_HANDLER( cvs_s2636_1_or_character_ram_r )
|
READ8_HANDLER( cvs_s2636_0_or_character_ram_r )
|
||||||
{
|
{
|
||||||
if (activecpu_get_reg(S2650_FO))
|
if (activecpu_get_reg(S2650_FO))
|
||||||
return cvs_character_ram[(0 * 0x800) | 0x400 | character_ram_page_start | offset];
|
return cvs_character_ram[(0 * 0x800) | 0x400 | character_ram_page_start | offset];
|
||||||
else
|
else
|
||||||
return s2636_1_ram[offset];
|
return cvs_s2636_0_ram[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_HANDLER( cvs_s2636_0_or_character_ram_w )
|
||||||
|
{
|
||||||
|
if (activecpu_get_reg(S2650_FO))
|
||||||
|
cvs_character_ram[(0 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
||||||
|
else
|
||||||
|
cvs_s2636_0_ram[offset] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
READ8_HANDLER( cvs_s2636_1_or_character_ram_r )
|
||||||
|
{
|
||||||
|
if (activecpu_get_reg(S2650_FO))
|
||||||
|
return cvs_character_ram[(1 * 0x800) | 0x400 | character_ram_page_start | offset];
|
||||||
|
else
|
||||||
|
return cvs_s2636_1_ram[offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_HANDLER( cvs_s2636_1_or_character_ram_w )
|
WRITE8_HANDLER( cvs_s2636_1_or_character_ram_w )
|
||||||
{
|
{
|
||||||
if (activecpu_get_reg(S2650_FO))
|
if (activecpu_get_reg(S2650_FO))
|
||||||
cvs_character_ram[(0 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
cvs_character_ram[(1 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
||||||
else
|
else
|
||||||
s2636_1_ram[offset] = data;
|
cvs_s2636_1_ram[offset] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
READ8_HANDLER( cvs_s2636_2_or_character_ram_r )
|
READ8_HANDLER( cvs_s2636_2_or_character_ram_r )
|
||||||
{
|
{
|
||||||
if (activecpu_get_reg(S2650_FO))
|
if (activecpu_get_reg(S2650_FO))
|
||||||
return cvs_character_ram[(1 * 0x800) | 0x400 | character_ram_page_start | offset];
|
return cvs_character_ram[(2 * 0x800) | 0x400 | character_ram_page_start | offset];
|
||||||
else
|
else
|
||||||
return s2636_2_ram[offset];
|
return cvs_s2636_2_ram[offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_HANDLER( cvs_s2636_2_or_character_ram_w )
|
WRITE8_HANDLER( cvs_s2636_2_or_character_ram_w )
|
||||||
{
|
|
||||||
if (activecpu_get_reg(S2650_FO))
|
|
||||||
cvs_character_ram[(1 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
|
||||||
else
|
|
||||||
s2636_2_ram[offset] = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
READ8_HANDLER( cvs_s2636_3_or_character_ram_r )
|
|
||||||
{
|
|
||||||
if (activecpu_get_reg(S2650_FO))
|
|
||||||
return cvs_character_ram[(2 * 0x800) | 0x400 | character_ram_page_start | offset];
|
|
||||||
else
|
|
||||||
return s2636_3_ram[offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_HANDLER( cvs_s2636_3_or_character_ram_w )
|
|
||||||
{
|
{
|
||||||
if (activecpu_get_reg(S2650_FO))
|
if (activecpu_get_reg(S2650_FO))
|
||||||
cvs_character_ram[(2 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
cvs_character_ram[(2 * 0x800) | 0x400 | character_ram_page_start | offset] = data;
|
||||||
else
|
else
|
||||||
s2636_3_ram[offset] = data;
|
cvs_s2636_2_ram[offset] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -480,6 +483,9 @@ MACHINE_START( cvs )
|
|||||||
by allocating twice the amount,
|
by allocating twice the amount,
|
||||||
we can use the same gfx_layout */
|
we can use the same gfx_layout */
|
||||||
/* register state save */
|
/* register state save */
|
||||||
|
state_save_register_global_pointer(cvs_color_ram, 0x400);
|
||||||
|
state_save_register_global_pointer(cvs_palette_ram, 0x10);
|
||||||
|
state_save_register_global_pointer(cvs_character_ram, 3 * 0x800);
|
||||||
state_save_register_global(character_banking_mode);
|
state_save_register_global(character_banking_mode);
|
||||||
state_save_register_global(character_ram_page_start);
|
state_save_register_global(character_ram_page_start);
|
||||||
state_save_register_global(speech_rom_bit_address);
|
state_save_register_global(speech_rom_bit_address);
|
||||||
@ -497,9 +503,9 @@ static ADDRESS_MAP_START( cvs_main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
ADDRESS_MAP_FLAGS( AMEF_ABITS(15) )
|
ADDRESS_MAP_FLAGS( AMEF_ABITS(15) )
|
||||||
AM_RANGE(0x0000, 0x13ff) AM_ROM
|
AM_RANGE(0x0000, 0x13ff) AM_ROM
|
||||||
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_bullet_ram_or_palette_r, cvs_bullet_ram_or_palette_w) AM_BASE(&cvs_bullet_ram)
|
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_bullet_ram_or_palette_r, cvs_bullet_ram_or_palette_w) AM_BASE(&cvs_bullet_ram)
|
||||||
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_3_or_character_ram_r, cvs_s2636_3_or_character_ram_w) AM_BASE(&s2636_3_ram)
|
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_2_or_character_ram_r, cvs_s2636_2_or_character_ram_w) AM_BASE(&cvs_s2636_2_ram)
|
||||||
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_2_or_character_ram_r, cvs_s2636_2_or_character_ram_w) AM_BASE(&s2636_2_ram)
|
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_1_or_character_ram_r, cvs_s2636_1_or_character_ram_w) AM_BASE(&cvs_s2636_1_ram)
|
||||||
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_1_or_character_ram_r, cvs_s2636_1_or_character_ram_w) AM_BASE(&s2636_1_ram)
|
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_0_or_character_ram_r, cvs_s2636_0_or_character_ram_w) AM_BASE(&cvs_s2636_0_ram)
|
||||||
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(cvs_video_or_color_ram_r, cvs_video_or_color_ram_w) AM_BASE(&cvs_video_ram)
|
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(cvs_video_or_color_ram_r, cvs_video_or_color_ram_w) AM_BASE(&cvs_video_ram)
|
||||||
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
||||||
AM_RANGE(0x2000, 0x33ff) AM_ROM
|
AM_RANGE(0x2000, 0x33ff) AM_ROM
|
||||||
@ -649,10 +655,7 @@ static const gfx_layout charlayout =
|
|||||||
};
|
};
|
||||||
|
|
||||||
static GFXDECODE_START( cvs )
|
static GFXDECODE_START( cvs )
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 256+3 ) /* chars */
|
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 256+4 )
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, (256+3)*8, 8 ) /* s2636 #1 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, (256+3)*8, 8 ) /* s2636 #2 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, (256+3)*8, 8 ) /* s2636 #3 */
|
|
||||||
GFXDECODE_END
|
GFXDECODE_END
|
||||||
|
|
||||||
|
|
||||||
@ -687,8 +690,7 @@ static MACHINE_DRIVER_START( cvs )
|
|||||||
MDRV_VIDEO_UPDATE(cvs)
|
MDRV_VIDEO_UPDATE(cvs)
|
||||||
|
|
||||||
MDRV_GFXDECODE(cvs)
|
MDRV_GFXDECODE(cvs)
|
||||||
MDRV_PALETTE_LENGTH(16)
|
MDRV_PALETTE_LENGTH((256+4)*8+8+1)
|
||||||
MDRV_COLORTABLE_LENGTH((256+3)*8+(8*2))
|
|
||||||
MDRV_PALETTE_INIT(cvs)
|
MDRV_PALETTE_INIT(cvs)
|
||||||
|
|
||||||
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
|
||||||
|
@ -31,6 +31,10 @@ extern WRITE8_HANDLER( laserbat_csound2_w );
|
|||||||
static tilemap *bg_tilemap;
|
static tilemap *bg_tilemap;
|
||||||
static int laserbat_video_page = 0;
|
static int laserbat_video_page = 0;
|
||||||
static int laserbat_input_mux = 0;
|
static int laserbat_input_mux = 0;
|
||||||
|
static s2636_t *s2636_0, *s2636_1, *s2636_2;
|
||||||
|
static UINT8 *s2636_0_ram;
|
||||||
|
static UINT8 *s2636_1_ram;
|
||||||
|
static UINT8 *s2636_2_ram;
|
||||||
|
|
||||||
static mame_bitmap *collision_bitmap;
|
static mame_bitmap *collision_bitmap;
|
||||||
|
|
||||||
@ -182,9 +186,9 @@ static ADDRESS_MAP_START( laserbat_map, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
AM_RANGE(0x7800, 0x7bff) AM_ROM
|
AM_RANGE(0x7800, 0x7bff) AM_ROM
|
||||||
|
|
||||||
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_WRITENOP // always 0 (bullet ram in Quasar)
|
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_WRITENOP // always 0 (bullet ram in Quasar)
|
||||||
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_1_ram)
|
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_0_ram)
|
||||||
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_2_ram)
|
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_1_ram)
|
||||||
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_3_ram)
|
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_RAM AM_BASE(&s2636_2_ram)
|
||||||
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_WRITE(laserbat_videoram_w)
|
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_WRITE(laserbat_videoram_w)
|
||||||
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -489,9 +493,6 @@ static const gfx_layout sprites_layout =
|
|||||||
|
|
||||||
static GFXDECODE_START( laserbat )
|
static GFXDECODE_START( laserbat )
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 256 ) /* Rom chars */
|
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 256 ) /* Rom chars */
|
||||||
GFXDECODE_ENTRY( REGION_CPU1, 0x1500, s2636_gfx_layout, 0, 8 ) /* s2636 #1 */
|
|
||||||
GFXDECODE_ENTRY( REGION_CPU1, 0x1600, s2636_gfx_layout, 0, 8 ) /* s2636 #2 */
|
|
||||||
GFXDECODE_ENTRY( REGION_CPU1, 0x1700, s2636_gfx_layout, 0, 8 ) /* s2636 #3 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, sprites_layout, 0, 8 ) /* Sprites */
|
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, sprites_layout, 0, 8 ) /* Sprites */
|
||||||
GFXDECODE_END
|
GFXDECODE_END
|
||||||
|
|
||||||
@ -510,24 +511,56 @@ static VIDEO_START( laserbat )
|
|||||||
|
|
||||||
collision_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,BITMAP_FORMAT_INDEXED8);
|
collision_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,BITMAP_FORMAT_INDEXED8);
|
||||||
|
|
||||||
s2636_x_offset = -19;
|
/* configure the S2636 chips */
|
||||||
|
s2636_0 = s2636_config(s2636_0_ram, machine->screen[0].height, machine->screen[0].width, 0, -19);
|
||||||
|
s2636_1 = s2636_config(s2636_1_ram, machine->screen[0].height, machine->screen[0].width, 0, -19);
|
||||||
|
s2636_2 = s2636_config(s2636_2_ram, machine->screen[0].height, machine->screen[0].width, 0, -19);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VIDEO_UPDATE( laserbat )
|
static VIDEO_UPDATE( laserbat )
|
||||||
{
|
{
|
||||||
|
int y;
|
||||||
|
mame_bitmap *s2636_0_bitmap;
|
||||||
|
mame_bitmap *s2636_1_bitmap;
|
||||||
|
mame_bitmap *s2636_2_bitmap;
|
||||||
|
|
||||||
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
|
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
|
||||||
|
|
||||||
s2636_update_bitmap(machine,bitmap,s2636_1_ram,1,collision_bitmap);
|
/* update the S2636 chips */
|
||||||
s2636_update_bitmap(machine,bitmap,s2636_2_ram,2,collision_bitmap);
|
s2636_0_bitmap = s2636_update(s2636_0, cliprect);
|
||||||
s2636_update_bitmap(machine,bitmap,s2636_3_ram,3,collision_bitmap);
|
s2636_1_bitmap = s2636_update(s2636_1, cliprect);
|
||||||
|
s2636_2_bitmap = s2636_update(s2636_2, cliprect);
|
||||||
|
|
||||||
|
/* copy the S2636 images into the main bitmap */
|
||||||
|
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||||
|
{
|
||||||
|
int pixel0 = *BITMAP_ADDR8(s2636_0_bitmap, y, x);
|
||||||
|
int pixel1 = *BITMAP_ADDR8(s2636_1_bitmap, y, x);
|
||||||
|
int pixel2 = *BITMAP_ADDR8(s2636_2_bitmap, y, x);
|
||||||
|
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel0))
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel0)];
|
||||||
|
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel1))
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel1)];
|
||||||
|
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel2))
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel2)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(sprite_info.enable)
|
if(sprite_info.enable)
|
||||||
drawgfx(bitmap,machine->gfx[4],
|
drawgfx(bitmap,machine->gfx[1],
|
||||||
sprite_info.code,
|
sprite_info.code,
|
||||||
sprite_info.color,
|
sprite_info.color,
|
||||||
0,0,
|
0,0,
|
||||||
sprite_info.x - 6,sprite_info.y,
|
sprite_info.x - 6,sprite_info.y,
|
||||||
cliprect,TRANSPARENCY_PEN,0);
|
cliprect,TRANSPARENCY_PEN,0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -677,7 +710,6 @@ static MACHINE_DRIVER_START( laserbat )
|
|||||||
|
|
||||||
MDRV_GFXDECODE(laserbat)
|
MDRV_GFXDECODE(laserbat)
|
||||||
MDRV_PALETTE_LENGTH(1024)
|
MDRV_PALETTE_LENGTH(1024)
|
||||||
MDRV_COLORTABLE_LENGTH(4096)
|
|
||||||
|
|
||||||
MDRV_VIDEO_START(laserbat)
|
MDRV_VIDEO_START(laserbat)
|
||||||
MDRV_VIDEO_UPDATE(laserbat)
|
MDRV_VIDEO_UPDATE(laserbat)
|
||||||
|
@ -49,6 +49,8 @@ extern int malzak_x;
|
|||||||
extern int malzak_y;
|
extern int malzak_y;
|
||||||
|
|
||||||
extern UINT8* saa5050_vidram; /* Video RAM for SAA 5050 */
|
extern UINT8* saa5050_vidram; /* Video RAM for SAA 5050 */
|
||||||
|
extern UINT8 *malzak_s2636_0_ram;
|
||||||
|
extern UINT8 *malzak_s2636_1_ram;
|
||||||
|
|
||||||
// in video/malzak.c
|
// in video/malzak.c
|
||||||
VIDEO_START( malzak );
|
VIDEO_START( malzak );
|
||||||
@ -68,7 +70,7 @@ static WRITE8_HANDLER( saa5050_w )
|
|||||||
|
|
||||||
static READ8_HANDLER( fake_VRLE_r )
|
static READ8_HANDLER( fake_VRLE_r )
|
||||||
{
|
{
|
||||||
return (s2636_1_ram[0xcb] & 0x3f) + (video_screen_get_vblank(0)*0x40);
|
return (malzak_s2636_0_ram[0xcb] & 0x3f) + (video_screen_get_vblank(0)*0x40);
|
||||||
}
|
}
|
||||||
|
|
||||||
static READ8_HANDLER( ram_mirror_r )
|
static READ8_HANDLER( ram_mirror_r )
|
||||||
@ -144,8 +146,8 @@ static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
AM_RANGE(0x1100, 0x11ff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1100, 0x11ff) AM_WRITE(MWA8_RAM)
|
||||||
AM_RANGE(0x1200, 0x12ff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1200, 0x12ff) AM_WRITE(MWA8_RAM)
|
||||||
AM_RANGE(0x1300, 0x13ff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1300, 0x13ff) AM_WRITE(MWA8_RAM)
|
||||||
AM_RANGE(0x1400, 0x14ff) AM_WRITE(MWA8_RAM) AM_BASE(&s2636_1_ram)
|
AM_RANGE(0x1400, 0x14ff) AM_WRITE(MWA8_RAM) AM_BASE(&malzak_s2636_0_ram)
|
||||||
AM_RANGE(0x1500, 0x15ff) AM_WRITE(MWA8_RAM) AM_BASE(&s2636_2_ram)
|
AM_RANGE(0x1500, 0x15ff) AM_WRITE(MWA8_RAM) AM_BASE(&malzak_s2636_1_ram)
|
||||||
AM_RANGE(0x1600, 0x16ff) AM_WRITE(playfield_w)
|
AM_RANGE(0x1600, 0x16ff) AM_WRITE(playfield_w)
|
||||||
AM_RANGE(0x1600, 0x16ff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1600, 0x16ff) AM_WRITE(MWA8_RAM)
|
||||||
AM_RANGE(0x1700, 0x17ff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1700, 0x17ff) AM_WRITE(MWA8_RAM)
|
||||||
@ -360,11 +362,9 @@ static const gfx_layout saa5050_lolayout =
|
|||||||
8 * 10
|
8 * 10
|
||||||
};
|
};
|
||||||
|
|
||||||
//add s2636 decodes here (i.e. from zac2650) and maybe re-arrange them
|
|
||||||
static GFXDECODE_START( malzak )
|
static GFXDECODE_START( malzak )
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 16 )
|
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 16 )
|
||||||
GFXDECODE_ENTRY( REGION_CPU1, 0x0000, s2636_gfx_layout, 0, 8 ) /* s2636 #1 */
|
|
||||||
GFXDECODE_ENTRY( REGION_CPU1, 0x0000, s2636_gfx_layout, 0, 8 ) /* s2636 #2 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_charlayout, 0, 128 )
|
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_charlayout, 0, 128 )
|
||||||
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_hilayout, 0, 128 )
|
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_hilayout, 0, 128 )
|
||||||
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_lolayout, 0, 128 )
|
GFXDECODE_ENTRY( REGION_GFX2, 0x0000, saa5050_lolayout, 0, 128 )
|
||||||
|
@ -71,10 +71,10 @@ VIDEO_START( quasar );
|
|||||||
|
|
||||||
|
|
||||||
extern UINT8 *quasar_effectram;
|
extern UINT8 *quasar_effectram;
|
||||||
extern int quasar_effectcontrol;
|
extern UINT8 quasar_effectcontrol;
|
||||||
|
|
||||||
static int page = 0;
|
static UINT8 page = 0;
|
||||||
static int IOpage = 8;
|
static UINT8 IOpage = 8;
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@ -87,44 +87,14 @@ static int IOpage = 8;
|
|||||||
|
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_0_w )
|
static WRITE8_HANDLER( video_page_select_w )
|
||||||
{
|
{
|
||||||
page = 0;
|
page = offset & 0x03;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_1_w )
|
static WRITE8_HANDLER( io_page_select_w )
|
||||||
{
|
{
|
||||||
page = 1;
|
IOpage = offset & 0x03;
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_2_w )
|
|
||||||
{
|
|
||||||
page = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_3_w )
|
|
||||||
{
|
|
||||||
page = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_8_w )
|
|
||||||
{
|
|
||||||
IOpage = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_9_w )
|
|
||||||
{
|
|
||||||
IOpage = 9;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_A_w )
|
|
||||||
{
|
|
||||||
IOpage = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( page_B_w )
|
|
||||||
{
|
|
||||||
IOpage = 11;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WRITE8_HANDLER( quasar_video_w )
|
static WRITE8_HANDLER( quasar_video_w )
|
||||||
@ -140,12 +110,12 @@ static WRITE8_HANDLER( quasar_video_w )
|
|||||||
|
|
||||||
static READ8_HANDLER( quasar_IO_r )
|
static READ8_HANDLER( quasar_IO_r )
|
||||||
{
|
{
|
||||||
UINT32 ans = 0;
|
UINT8 ans = 0;
|
||||||
|
|
||||||
if (IOpage == 8) ans = input_port_0_r(0);
|
if (IOpage == 0) ans = input_port_0_r(0);
|
||||||
if (IOpage == 9) ans = input_port_1_r(0);
|
if (IOpage == 1) ans = input_port_1_r(0);
|
||||||
if (IOpage == 10) ans = input_port_2_r(0);
|
if (IOpage == 2) ans = input_port_2_r(0);
|
||||||
if (IOpage == 11) ans = input_port_3_r(0);
|
if (IOpage == 3) ans = input_port_3_r(0);
|
||||||
|
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
@ -198,9 +168,9 @@ static WRITE8_HANDLER( Quasar_DAC_w )
|
|||||||
static ADDRESS_MAP_START( quasar, ADDRESS_SPACE_PROGRAM, 8 )
|
static ADDRESS_MAP_START( quasar, ADDRESS_SPACE_PROGRAM, 8 )
|
||||||
AM_RANGE(0x0000, 0x13ff) AM_ROM
|
AM_RANGE(0x0000, 0x13ff) AM_ROM
|
||||||
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_bullet_ram_or_palette_r, quasar_bullet_w) AM_BASE(&cvs_bullet_ram)
|
AM_RANGE(0x1400, 0x14ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_bullet_ram_or_palette_r, quasar_bullet_w) AM_BASE(&cvs_bullet_ram)
|
||||||
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_1_or_character_ram_r, cvs_s2636_1_or_character_ram_w) AM_BASE(&s2636_1_ram)
|
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_0_or_character_ram_r, cvs_s2636_0_or_character_ram_w) AM_BASE(&cvs_s2636_0_ram)
|
||||||
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_2_or_character_ram_r, cvs_s2636_2_or_character_ram_w) AM_BASE(&s2636_2_ram)
|
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_1_or_character_ram_r, cvs_s2636_1_or_character_ram_w) AM_BASE(&cvs_s2636_1_ram)
|
||||||
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_3_or_character_ram_r, cvs_s2636_3_or_character_ram_w) AM_BASE(&s2636_3_ram)
|
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_READWRITE(cvs_s2636_2_or_character_ram_r, cvs_s2636_2_or_character_ram_w) AM_BASE(&cvs_s2636_2_ram)
|
||||||
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(cvs_video_or_color_ram_r, quasar_video_w) AM_BASE(&cvs_video_ram)
|
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(cvs_video_or_color_ram_r, quasar_video_w) AM_BASE(&cvs_video_ram)
|
||||||
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
|
||||||
AM_RANGE(0x2000, 0x33ff) AM_ROM
|
AM_RANGE(0x2000, 0x33ff) AM_ROM
|
||||||
@ -209,14 +179,8 @@ static ADDRESS_MAP_START( quasar, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START( quasar_io, ADDRESS_SPACE_IO, 8 )
|
static ADDRESS_MAP_START( quasar_io, ADDRESS_SPACE_IO, 8 )
|
||||||
AM_RANGE(0x00, 0x00) AM_READWRITE(quasar_IO_r, page_0_w)
|
AM_RANGE(0x00, 0x03) AM_READWRITE(quasar_IO_r, video_page_select_w)
|
||||||
AM_RANGE(0x01, 0x01) AM_WRITE(page_1_w)
|
AM_RANGE(0x08, 0x0b) AM_WRITE(io_page_select_w)
|
||||||
AM_RANGE(0x02, 0x02) AM_WRITE(page_2_w)
|
|
||||||
AM_RANGE(0x03, 0x03) AM_WRITE(page_3_w)
|
|
||||||
AM_RANGE(0x08, 0x08) AM_WRITE(page_8_w)
|
|
||||||
AM_RANGE(0x09, 0x09) AM_WRITE(page_9_w)
|
|
||||||
AM_RANGE(0x0A, 0x0A) AM_WRITE(page_A_w)
|
|
||||||
AM_RANGE(0x0B, 0x0B) AM_WRITE(page_B_w)
|
|
||||||
AM_RANGE(S2650_DATA_PORT, S2650_DATA_PORT) AM_READWRITE(cvs_collision_clear, quasar_sh_command_w)
|
AM_RANGE(S2650_DATA_PORT, S2650_DATA_PORT) AM_READWRITE(cvs_collision_clear, quasar_sh_command_w)
|
||||||
AM_RANGE(S2650_CTRL_PORT, S2650_CTRL_PORT) AM_READWRITE(cvs_collision_r, MWA8_NOP)
|
AM_RANGE(S2650_CTRL_PORT, S2650_CTRL_PORT) AM_READWRITE(cvs_collision_r, MWA8_NOP)
|
||||||
AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(input_port_4_r)
|
AM_RANGE(S2650_SENSE_PORT, S2650_SENSE_PORT) AM_READ(input_port_4_r)
|
||||||
@ -364,10 +328,7 @@ static const gfx_layout charlayout =
|
|||||||
/* S2636 Mappings */
|
/* S2636 Mappings */
|
||||||
|
|
||||||
static GFXDECODE_START( quasar )
|
static GFXDECODE_START( quasar )
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 256 ) /* Rom chars */
|
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 64+1 ) /* ROM chars */
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, 2072, 8 ) /* s2636 #1 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, 2072, 8 ) /* s2636 #2 */
|
|
||||||
GFXDECODE_ENTRY( REGION_GFX1, 0x0000, s2636_gfx_layout, 2072, 8 ) /* s2636 #3 */
|
|
||||||
GFXDECODE_END
|
GFXDECODE_END
|
||||||
|
|
||||||
static INTERRUPT_GEN( quasar_interrupt )
|
static INTERRUPT_GEN( quasar_interrupt )
|
||||||
@ -404,8 +365,7 @@ static MACHINE_DRIVER_START( quasar )
|
|||||||
MDRV_SCREEN_VISIBLE_AREA(1*8+1, 29*8-1, 2*8, 32*8-1)
|
MDRV_SCREEN_VISIBLE_AREA(1*8+1, 29*8-1, 2*8, 32*8-1)
|
||||||
|
|
||||||
MDRV_GFXDECODE(quasar)
|
MDRV_GFXDECODE(quasar)
|
||||||
MDRV_PALETTE_LENGTH(1024)
|
MDRV_PALETTE_LENGTH((64+1)*8+(4*256))
|
||||||
MDRV_COLORTABLE_LENGTH(4096)
|
|
||||||
|
|
||||||
MDRV_PALETTE_INIT(quasar)
|
MDRV_PALETTE_INIT(quasar)
|
||||||
MDRV_VIDEO_START(quasar)
|
MDRV_VIDEO_START(quasar)
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "tinv2650.lh"
|
#include "tinv2650.lh"
|
||||||
|
|
||||||
|
extern UINT8 *zac2650_s2636_0_ram;
|
||||||
WRITE8_HANDLER( tinvader_videoram_w );
|
WRITE8_HANDLER( tinvader_videoram_w );
|
||||||
static WRITE8_HANDLER( tinvader_sound_w );
|
static WRITE8_HANDLER( tinvader_sound_w );
|
||||||
READ8_HANDLER( zac_s2636_r );
|
READ8_HANDLER( zac_s2636_r );
|
||||||
@ -43,7 +44,7 @@ static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
AM_RANGE(0x1d00, 0x1dff) AM_WRITE(MWA8_RAM)
|
AM_RANGE(0x1d00, 0x1dff) AM_WRITE(MWA8_RAM)
|
||||||
AM_RANGE(0x1e80, 0x1e80) AM_WRITE(tinvader_sound_w)
|
AM_RANGE(0x1e80, 0x1e80) AM_WRITE(tinvader_sound_w)
|
||||||
AM_RANGE(0x1e86, 0x1e86) AM_WRITE(MWA8_NOP) /* Dodgem Only */
|
AM_RANGE(0x1e86, 0x1e86) AM_WRITE(MWA8_NOP) /* Dodgem Only */
|
||||||
AM_RANGE(0x1f00, 0x1fff) AM_WRITE(MWA8_RAM) AM_BASE(&s2636_1_ram)
|
AM_RANGE(0x1f00, 0x1fff) AM_WRITE(MWA8_RAM) AM_BASE(&zac2650_s2636_0_ram)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
|
static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
|
||||||
@ -236,12 +237,10 @@ INPUT_PORTS_END
|
|||||||
|
|
||||||
static PALETTE_INIT( zac2650 )
|
static PALETTE_INIT( zac2650 )
|
||||||
{
|
{
|
||||||
palette_set_color(machine,0,MAKE_RGB(0x00,0x00,0x00)); /* BLACK */
|
palette_set_color(machine,0,RGB_BLACK);
|
||||||
palette_set_color(machine,1,MAKE_RGB(0xff,0xff,0xff)); /* WHITE */
|
palette_set_color(machine,1,RGB_WHITE);
|
||||||
colortable[0] = 0;
|
palette_set_color(machine,2,RGB_BLACK);
|
||||||
colortable[1] = 1;
|
palette_set_color(machine,3,RGB_BLACK);
|
||||||
colortable[2] = 0;
|
|
||||||
colortable[3] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************************
|
/************************************************************************************************
|
||||||
@ -333,8 +332,7 @@ static MACHINE_DRIVER_START( tinvader )
|
|||||||
MDRV_SCREEN_SIZE(30*24, 32*24)
|
MDRV_SCREEN_SIZE(30*24, 32*24)
|
||||||
MDRV_SCREEN_VISIBLE_AREA(0, 719, 0, 767)
|
MDRV_SCREEN_VISIBLE_AREA(0, 719, 0, 767)
|
||||||
MDRV_GFXDECODE(tinvader)
|
MDRV_GFXDECODE(tinvader)
|
||||||
MDRV_PALETTE_LENGTH(2)
|
MDRV_PALETTE_LENGTH(4)
|
||||||
MDRV_COLORTABLE_LENGTH(4)
|
|
||||||
|
|
||||||
MDRV_PALETTE_INIT(zac2650)
|
MDRV_PALETTE_INIT(zac2650)
|
||||||
MDRV_VIDEO_START(tinvader)
|
MDRV_VIDEO_START(tinvader)
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#define CVS_S2636_Y_OFFSET (3)
|
||||||
|
#define CVS_S2636_X_OFFSET (-26)
|
||||||
|
|
||||||
|
|
||||||
/*----------- defined in driver/cvs.c -----------*/
|
/*----------- defined in driver/cvs.c -----------*/
|
||||||
|
|
||||||
extern UINT8 *cvs_color_ram;
|
extern UINT8 *cvs_color_ram;
|
||||||
@ -11,6 +16,9 @@ extern UINT8 *cvs_video_ram;
|
|||||||
extern UINT8 *cvs_bullet_ram;
|
extern UINT8 *cvs_bullet_ram;
|
||||||
extern UINT8 *cvs_palette_ram;
|
extern UINT8 *cvs_palette_ram;
|
||||||
extern UINT8 *cvs_character_ram;
|
extern UINT8 *cvs_character_ram;
|
||||||
|
extern UINT8 *cvs_s2636_0_ram;
|
||||||
|
extern UINT8 *cvs_s2636_1_ram;
|
||||||
|
extern UINT8 *cvs_s2636_2_ram;
|
||||||
|
|
||||||
MACHINE_START( cvs );
|
MACHINE_START( cvs );
|
||||||
|
|
||||||
@ -20,19 +28,18 @@ WRITE8_HANDLER( cvs_video_or_color_ram_w );
|
|||||||
READ8_HANDLER( cvs_bullet_ram_or_palette_r );
|
READ8_HANDLER( cvs_bullet_ram_or_palette_r );
|
||||||
WRITE8_HANDLER( cvs_bullet_ram_or_palette_w );
|
WRITE8_HANDLER( cvs_bullet_ram_or_palette_w );
|
||||||
|
|
||||||
|
READ8_HANDLER( cvs_s2636_0_or_character_ram_r );
|
||||||
|
WRITE8_HANDLER( cvs_s2636_0_or_character_ram_w );
|
||||||
READ8_HANDLER( cvs_s2636_1_or_character_ram_r );
|
READ8_HANDLER( cvs_s2636_1_or_character_ram_r );
|
||||||
WRITE8_HANDLER( cvs_s2636_1_or_character_ram_w );
|
WRITE8_HANDLER( cvs_s2636_1_or_character_ram_w );
|
||||||
READ8_HANDLER( cvs_s2636_2_or_character_ram_r );
|
READ8_HANDLER( cvs_s2636_2_or_character_ram_r );
|
||||||
WRITE8_HANDLER( cvs_s2636_2_or_character_ram_w );
|
WRITE8_HANDLER( cvs_s2636_2_or_character_ram_w );
|
||||||
READ8_HANDLER( cvs_s2636_3_or_character_ram_r );
|
|
||||||
WRITE8_HANDLER( cvs_s2636_3_or_character_ram_w );
|
|
||||||
|
|
||||||
UINT8 cvs_get_character_banking_mode(void);
|
UINT8 cvs_get_character_banking_mode(void);
|
||||||
|
|
||||||
|
|
||||||
/*----------- defined in video/cvs.c -----------*/
|
/*----------- defined in video/cvs.c -----------*/
|
||||||
|
|
||||||
extern mame_bitmap *cvs_collision_bitmap;
|
|
||||||
extern mame_bitmap *cvs_collision_background;
|
extern mame_bitmap *cvs_collision_background;
|
||||||
extern int cvs_collision_register;
|
extern int cvs_collision_register;
|
||||||
|
|
||||||
@ -47,4 +54,3 @@ READ8_HANDLER( cvs_collision_r );
|
|||||||
READ8_HANDLER( cvs_collision_clear );
|
READ8_HANDLER( cvs_collision_clear );
|
||||||
|
|
||||||
void cvs_scroll_stars(void);
|
void cvs_scroll_stars(void);
|
||||||
|
|
||||||
|
@ -12,26 +12,19 @@
|
|||||||
#include "cvs.h"
|
#include "cvs.h"
|
||||||
|
|
||||||
|
|
||||||
#define MAX_STARS 250
|
#define SPRITE_PEN_BASE (0x820)
|
||||||
#define STARS_COLOR_BASE 16
|
#define BULLET_STAR_PEN (0x828)
|
||||||
|
|
||||||
|
#define MAX_STARS 250
|
||||||
|
#define STARS_COLOR_BASE 16
|
||||||
|
|
||||||
|
|
||||||
#ifdef LSB_FIRST
|
static s2636_t *s2636_0, *s2636_1, *s2636_2;
|
||||||
#define BL0 0
|
static mame_bitmap *background_bitmap;
|
||||||
#define BL1 1
|
mame_bitmap *cvs_collision_background;
|
||||||
#define BL2 2
|
static mame_bitmap *scrolled_collision_background;
|
||||||
#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
|
|
||||||
|
|
||||||
|
int cvs_collision_register;
|
||||||
|
|
||||||
struct star
|
struct star
|
||||||
{
|
{
|
||||||
@ -45,13 +38,6 @@ static int stars_on;
|
|||||||
static UINT8 scroll_reg;
|
static UINT8 scroll_reg;
|
||||||
static int stars_scroll;
|
static int stars_scroll;
|
||||||
|
|
||||||
static mame_bitmap *background_bitmap;
|
|
||||||
mame_bitmap *cvs_collision_bitmap;
|
|
||||||
mame_bitmap *cvs_collision_background;
|
|
||||||
static mame_bitmap *scrolled_background;
|
|
||||||
|
|
||||||
int cvs_collision_register;
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************
|
/******************************************************
|
||||||
* Convert Colour prom to format for Mame Colour Map *
|
* Convert Colour prom to format for Mame Colour Map *
|
||||||
@ -64,47 +50,59 @@ int cvs_collision_register;
|
|||||||
|
|
||||||
PALETTE_INIT( cvs )
|
PALETTE_INIT( cvs )
|
||||||
{
|
{
|
||||||
int attr,col,map;
|
int i, attr;
|
||||||
|
|
||||||
#define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
|
/* allocate the colortable */
|
||||||
|
machine->colortable = colortable_alloc(machine, 0x10);
|
||||||
|
|
||||||
/* Colour Mapping Prom */
|
/* color mapping PROM */
|
||||||
|
for (attr = 0; attr < 0x100; attr++)
|
||||||
for(attr = 0;attr < 256; attr++)
|
|
||||||
{
|
{
|
||||||
for(col = 0; col < 8; col++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
map = color_prom[(col * 256) + attr];
|
UINT8 ctabentry = color_prom[(i << 8) | attr] & 0x07;
|
||||||
|
|
||||||
/* bits 0 and 2 are swapped */
|
/* bits 0 and 2 are swapped */
|
||||||
|
ctabentry = BITSWAP8(ctabentry,7,6,5,4,3,0,1,2);
|
||||||
|
|
||||||
COLOR(0,attr*8 + col) = ((map & 1) << 2) + (map & 2) + ((map & 4) >> 2);
|
colortable_entry_set_value(machine->colortable, (attr << 3) | i, ctabentry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Background Collision Map */
|
/* background collision map */
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
for(map=0;map<8;map++)
|
|
||||||
{
|
{
|
||||||
COLOR(0,2048+map) = (map & 4) >> 2;
|
colortable_entry_set_value(machine->colortable, 0x800 + i, 0);
|
||||||
COLOR(0,2056+map) = (map & 2) >> 1;
|
colortable_entry_set_value(machine->colortable, 0x808 + i, i & 0x04);
|
||||||
COLOR(0,2064+map) = ((map & 2) >> 1) || ((map & 4) >> 2);
|
colortable_entry_set_value(machine->colortable, 0x810 + i, i & 0x02);
|
||||||
|
colortable_entry_set_value(machine->colortable, 0x818 + i, i & 0x06);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sprites */
|
/* sprites */
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
colortable_entry_set_value(machine->colortable, SPRITE_PEN_BASE + i, i | 0x08);
|
||||||
|
|
||||||
for(map=0;map<8;map++)
|
/* bullet */
|
||||||
{
|
colortable_entry_set_value(machine->colortable, BULLET_STAR_PEN, 7);
|
||||||
COLOR(1,map*2+0) = 0;
|
|
||||||
COLOR(1,map*2+1) = 8 + map;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set the sprite chip offsets */
|
|
||||||
s2636_x_offset = -26;
|
|
||||||
s2636_y_offset = 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void set_pens(running_machine *machine)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 0x10; i++)
|
||||||
|
{
|
||||||
|
int r = pal2bit(~cvs_palette_ram[i] >> 0);
|
||||||
|
int g = pal3bit(~cvs_palette_ram[i] >> 2);
|
||||||
|
int b = pal3bit(~cvs_palette_ram[i] >> 5);
|
||||||
|
|
||||||
|
colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WRITE8_HANDLER( cvs_video_fx_w )
|
WRITE8_HANDLER( cvs_video_fx_w )
|
||||||
{
|
{
|
||||||
if (data & 0xce)
|
if (data & 0xce)
|
||||||
@ -185,18 +183,15 @@ VIDEO_START( cvs )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* configure the S2636 chips */
|
||||||
/* create the bitmaps for the S2636 chips */
|
s2636_0 = s2636_config(cvs_s2636_0_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
s2636_1_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
s2636_1 = s2636_config(cvs_s2636_1_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
s2636_2_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
s2636_2 = s2636_config(cvs_s2636_2_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
s2636_3_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
|
||||||
|
|
||||||
|
|
||||||
/* create helper bitmaps */
|
/* create helper bitmaps */
|
||||||
background_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
background_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
||||||
cvs_collision_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
cvs_collision_background = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
||||||
cvs_collision_background = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
scrolled_collision_background = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
||||||
scrolled_background = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, BITMAP_FORMAT_INDEXED8);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -215,16 +210,11 @@ VIDEO_UPDATE( cvs )
|
|||||||
offs_t offs;
|
offs_t offs;
|
||||||
int scroll[8];
|
int scroll[8];
|
||||||
UINT8 character_banking_mode;
|
UINT8 character_banking_mode;
|
||||||
|
mame_bitmap *s2636_0_bitmap;
|
||||||
|
mame_bitmap *s2636_1_bitmap;
|
||||||
|
mame_bitmap *s2636_2_bitmap;
|
||||||
|
|
||||||
|
set_pens(machine);
|
||||||
/* set the palette */
|
|
||||||
for (offs = 0; offs < 0x10; offs++)
|
|
||||||
{
|
|
||||||
UINT8 data = cvs_palette_ram[offs];
|
|
||||||
|
|
||||||
palette_set_color_rgb(machine, offs, pal2bit(~data >> 0), pal3bit(~data >> 2), pal3bit(~data >> 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* create our background character set, which is a software
|
/* create our background character set, which is a software
|
||||||
selectable mixture of RAM and ROM based tiles */
|
selectable mixture of RAM and ROM based tiles */
|
||||||
@ -239,11 +229,10 @@ VIDEO_UPDATE( cvs )
|
|||||||
for (; code < 0x100; code++)
|
for (; code < 0x100; code++)
|
||||||
decodechar(machine->gfx[0], code, cvs_character_ram);
|
decodechar(machine->gfx[0], code, cvs_character_ram);
|
||||||
|
|
||||||
|
|
||||||
/* draw the background */
|
/* draw the background */
|
||||||
for (offs = 0; offs < 0x0400; offs++)
|
for (offs = 0; offs < 0x0400; offs++)
|
||||||
{
|
{
|
||||||
int collision_color = 0;
|
int collision_color = 0x100;
|
||||||
|
|
||||||
UINT8 code = cvs_video_ram[offs];
|
UINT8 code = cvs_video_ram[offs];
|
||||||
UINT8 color = cvs_color_ram[offs];
|
UINT8 color = cvs_color_ram[offs];
|
||||||
@ -259,21 +248,20 @@ VIDEO_UPDATE( cvs )
|
|||||||
|
|
||||||
/* foreground for collision detection */
|
/* foreground for collision detection */
|
||||||
if (color & 0x80)
|
if (color & 0x80)
|
||||||
collision_color = 258;
|
collision_color = 0x103;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((color & 0x03) == 3)
|
if ((color & 0x03) == 0x03)
|
||||||
collision_color = 256;
|
collision_color = 0x101;
|
||||||
else if((color & 0x01) == 0)
|
else if ((color & 0x01) == 0)
|
||||||
collision_color = 257;
|
collision_color = 0x102;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collision_color)
|
drawgfx(cvs_collision_background, machine->gfx[0],
|
||||||
drawgfx(cvs_collision_background, machine->gfx[0],
|
code, collision_color,
|
||||||
code, collision_color,
|
0, 0,
|
||||||
0, 0,
|
x, y,
|
||||||
x, y,
|
0, TRANSPARENCY_NONE, 0);
|
||||||
0, TRANSPARENCY_NONE, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -288,22 +276,15 @@ VIDEO_UPDATE( cvs )
|
|||||||
scroll[6] = 0;
|
scroll[6] = 0;
|
||||||
scroll[7] = 0;
|
scroll[7] = 0;
|
||||||
|
|
||||||
copyscrollbitmap(bitmap,background_bitmap,0,0,8,scroll,&machine->screen[0].visarea);
|
copyscrollbitmap(bitmap, background_bitmap, 0, 0, 8, scroll, cliprect);
|
||||||
copyscrollbitmap(scrolled_background,cvs_collision_background,0,0,8,scroll,&machine->screen[0].visarea);
|
copyscrollbitmap(scrolled_collision_background, cvs_collision_background, 0, 0, 8, scroll, cliprect);
|
||||||
|
|
||||||
/* 2636's */
|
/* update the S2636 chips */
|
||||||
|
s2636_0_bitmap = s2636_update(s2636_0, cliprect);
|
||||||
fillbitmap(s2636_1_bitmap,0,0);
|
s2636_1_bitmap = s2636_update(s2636_1, cliprect);
|
||||||
s2636_update_bitmap(machine,s2636_1_bitmap,s2636_1_ram,1,cvs_collision_bitmap);
|
s2636_2_bitmap = s2636_update(s2636_2, cliprect);
|
||||||
|
|
||||||
fillbitmap(s2636_2_bitmap,0,0);
|
|
||||||
s2636_update_bitmap(machine,s2636_2_bitmap,s2636_2_ram,2,cvs_collision_bitmap);
|
|
||||||
|
|
||||||
fillbitmap(s2636_3_bitmap,0,0);
|
|
||||||
s2636_update_bitmap(machine,s2636_3_bitmap,s2636_3_ram,3,cvs_collision_bitmap);
|
|
||||||
|
|
||||||
/* Bullet Hardware */
|
/* Bullet Hardware */
|
||||||
|
|
||||||
for (offs = 8; offs < 256; offs++ )
|
for (offs = 8; offs < 256; offs++ )
|
||||||
{
|
{
|
||||||
if (cvs_bullet_ram[offs] != 0)
|
if (cvs_bullet_ram[offs] != 0)
|
||||||
@ -314,72 +295,54 @@ VIDEO_UPDATE( cvs )
|
|||||||
int bx=255-7-cvs_bullet_ram[offs]-ct;
|
int bx=255-7-cvs_bullet_ram[offs]-ct;
|
||||||
|
|
||||||
/* Bullet/Object Collision */
|
/* Bullet/Object Collision */
|
||||||
if ((*BITMAP_ADDR8(s2636_1_bitmap, offs, bx) != 0) ||
|
if ((*BITMAP_ADDR8(s2636_0_bitmap, offs, bx) != 0) ||
|
||||||
(*BITMAP_ADDR8(s2636_2_bitmap, offs, bx) != 0) ||
|
(*BITMAP_ADDR8(s2636_1_bitmap, offs, bx) != 0) ||
|
||||||
(*BITMAP_ADDR8(s2636_3_bitmap, offs, bx) != 0))
|
(*BITMAP_ADDR8(s2636_2_bitmap, offs, bx) != 0))
|
||||||
cvs_collision_register |= 8;
|
cvs_collision_register |= 0x08;
|
||||||
|
|
||||||
/* Bullet/Background Collision */
|
/* Bullet/Background Collision */
|
||||||
if (*BITMAP_ADDR8(scrolled_background, offs, bx) != machine->pens[0])
|
if (colortable_entry_get_value(machine->colortable, *BITMAP_ADDR16(scrolled_collision_background, offs, bx)))
|
||||||
cvs_collision_register |= 0x80;
|
cvs_collision_register |= 0x80;
|
||||||
|
|
||||||
*BITMAP_ADDR16(bitmap, offs, bx) = machine->pens[7];
|
*BITMAP_ADDR16(bitmap, offs, bx) = machine->pens[BULLET_STAR_PEN];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update 2636 images */
|
|
||||||
|
|
||||||
|
/* mix and copy the S2636 images into the main bitmap, also check for collision */
|
||||||
{
|
{
|
||||||
int x;
|
int y;
|
||||||
UINT32 S1,S2,S3,SB,pen;
|
|
||||||
|
|
||||||
for(x=255;x>7;x--)
|
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
|
||||||
{
|
{
|
||||||
UINT32 *sp1 = (UINT32 *)BITMAP_ADDR8(s2636_1_bitmap, x, 0);
|
int x;
|
||||||
UINT32 *sp2 = (UINT32 *)BITMAP_ADDR8(s2636_2_bitmap, x, 0);
|
|
||||||
UINT32 *sp3 = (UINT32 *)BITMAP_ADDR8(s2636_3_bitmap, x, 0);
|
|
||||||
UINT64 *dst = (UINT64 *)BITMAP_ADDR16(bitmap, x, 0);
|
|
||||||
UINT8 *spb = (UINT8 *)BITMAP_ADDR8(scrolled_background, x, 0);
|
|
||||||
|
|
||||||
for(offs=0;offs<62;offs++)
|
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||||
{
|
{
|
||||||
S1 = (*sp1++);
|
int pixel0 = *BITMAP_ADDR8(s2636_0_bitmap, y, x);
|
||||||
S2 = (*sp2++);
|
int pixel1 = *BITMAP_ADDR8(s2636_1_bitmap, y, x);
|
||||||
S3 = (*sp3++);
|
int pixel2 = *BITMAP_ADDR8(s2636_2_bitmap, y, x);
|
||||||
|
|
||||||
pen = S1 | S2 | S3;
|
int pixel = pixel0 | pixel1 | pixel2;
|
||||||
|
|
||||||
if(pen)
|
if (S2636_IS_PIXEL_DRAWN(pixel))
|
||||||
{
|
{
|
||||||
UINT16 *address = (UINT16 *)dst;
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[SPRITE_PEN_BASE + S2636_PIXEL_COLOR(pixel)];
|
||||||
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 */
|
/* S2636 vs. S2636 collision detection */
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel0) && S2636_IS_PIXEL_DRAWN(pixel1)) cvs_collision_register |= 0x01;
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel1) && S2636_IS_PIXEL_DRAWN(pixel2)) cvs_collision_register |= 0x02;
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel0) && S2636_IS_PIXEL_DRAWN(pixel2)) cvs_collision_register |= 0x04;
|
||||||
|
|
||||||
SB = 0;
|
/* S2636 vs. background collision detection */
|
||||||
if (spb[BL3] != machine->pens[0]) SB = 0x08000000;
|
if (colortable_entry_get_value(machine->colortable, *BITMAP_ADDR16(scrolled_collision_background, y, x)))
|
||||||
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 (S1 & S2) cvs_collision_register |= 1;
|
|
||||||
if (S2 & S3) cvs_collision_register |= 2;
|
|
||||||
if (S1 & S3) cvs_collision_register |= 4;
|
|
||||||
|
|
||||||
if (SB)
|
|
||||||
{
|
{
|
||||||
if (S1 & SB) cvs_collision_register |= 16;
|
if (S2636_IS_PIXEL_DRAWN(pixel0)) cvs_collision_register |= 0x10;
|
||||||
if (S2 & SB) cvs_collision_register |= 32;
|
if (S2636_IS_PIXEL_DRAWN(pixel1)) cvs_collision_register |= 0x20;
|
||||||
if (S3 & SB) cvs_collision_register |= 64;
|
if (S2636_IS_PIXEL_DRAWN(pixel2)) cvs_collision_register |= 0x40;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dst++;
|
|
||||||
spb+=4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -405,15 +368,12 @@ VIDEO_UPDATE( cvs )
|
|||||||
if (flip_screen_y)
|
if (flip_screen_y)
|
||||||
y = ~y;
|
y = ~y;
|
||||||
|
|
||||||
if (*BITMAP_ADDR16(bitmap, y, x) == machine->pens[0])
|
if (colortable_entry_get_value(machine->colortable, *BITMAP_ADDR16(bitmap, y, x)) == 0)
|
||||||
{
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[BULLET_STAR_PEN];
|
||||||
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[7];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,9 @@ static struct
|
|||||||
UINT8* saa5050_vidram; /* Video RAM for SAA 5050 */
|
UINT8* saa5050_vidram; /* Video RAM for SAA 5050 */
|
||||||
|
|
||||||
static mame_bitmap* collision_bitmap;
|
static mame_bitmap* collision_bitmap;
|
||||||
|
static s2636_t *s2636_0, *s2636_1;
|
||||||
|
UINT8 *malzak_s2636_0_ram;
|
||||||
|
UINT8 *malzak_s2636_1_ram;
|
||||||
|
|
||||||
int malzak_x;
|
int malzak_x;
|
||||||
int malzak_y;
|
int malzak_y;
|
||||||
@ -57,6 +60,12 @@ VIDEO_START( malzak )
|
|||||||
collision_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,BITMAP_FORMAT_INDEXED8);
|
collision_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,BITMAP_FORMAT_INDEXED8);
|
||||||
|
|
||||||
saa5050_vidram = auto_malloc(0x800);
|
saa5050_vidram = auto_malloc(0x800);
|
||||||
|
|
||||||
|
/* configure the S2636 chips */
|
||||||
|
// s2636_0 = s2636_config(malzak_s2636_0_ram, machine->screen[0].height, machine->screen[0].width, -8, -16);
|
||||||
|
// s2636_1 = s2636_config(malzak_s2636_1_ram, machine->screen[0].height, machine->screen[0].width, -9, -16);
|
||||||
|
s2636_0 = s2636_config(malzak_s2636_0_ram, machine->screen[0].height, machine->screen[0].width, 0, -16);
|
||||||
|
s2636_1 = s2636_config(malzak_s2636_1_ram, machine->screen[0].height, machine->screen[0].width, 0, -16);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIDEO_UPDATE( malzak )
|
VIDEO_UPDATE( malzak )
|
||||||
@ -64,6 +73,8 @@ VIDEO_UPDATE( malzak )
|
|||||||
int code, colour;
|
int code, colour;
|
||||||
int sx, sy;
|
int sx, sy;
|
||||||
int x,y;
|
int x,y;
|
||||||
|
mame_bitmap *s2636_0_bitmap;
|
||||||
|
mame_bitmap *s2636_1_bitmap;
|
||||||
|
|
||||||
fillbitmap(bitmap,0,0);
|
fillbitmap(bitmap,0,0);
|
||||||
|
|
||||||
@ -169,14 +180,14 @@ VIDEO_UPDATE( malzak )
|
|||||||
{
|
{
|
||||||
if (saa5050_state.saa5050_flags & SAA5050_DBLHI)
|
if (saa5050_state.saa5050_flags & SAA5050_DBLHI)
|
||||||
{
|
{
|
||||||
drawgfx (bitmap, machine->gfx[4], code, colour, 0, 0,
|
drawgfx (bitmap, machine->gfx[2], code, colour, 0, 0,
|
||||||
sx * 6, sy * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
sx * 6, sy * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
||||||
drawgfx (bitmap, machine->gfx[5], code, colour, 0, 0,
|
drawgfx (bitmap, machine->gfx[3], code, colour, 0, 0,
|
||||||
sx * 6, (sy + 1) * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
sx * 6, (sy + 1) * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
drawgfx (bitmap, machine->gfx[3], code, colour, 0, 0,
|
drawgfx (bitmap, machine->gfx[1], code, colour, 0, 0,
|
||||||
sx * 6, sy * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
sx * 6, sy * 10, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,13 +219,32 @@ VIDEO_UPDATE( malzak )
|
|||||||
sx, sy, &machine->screen[0].visarea, TRANSPARENCY_PEN, 0);
|
sx, sy, &machine->screen[0].visarea, TRANSPARENCY_PEN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// S2636 - Sprites / Collision detection (x2)
|
/* update the S2636 chips */
|
||||||
|
s2636_0_bitmap = s2636_update(s2636_0, cliprect);
|
||||||
|
s2636_1_bitmap = s2636_update(s2636_1, cliprect);
|
||||||
|
|
||||||
s2636_x_offset = -16;
|
/* copy the S2636 images into the main bitmap */
|
||||||
// s2636_y_offset = -8;
|
{
|
||||||
|
int y;
|
||||||
|
|
||||||
|
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||||
|
{
|
||||||
|
int pixel0 = *BITMAP_ADDR8(s2636_0_bitmap, y, x);
|
||||||
|
int pixel1 = *BITMAP_ADDR8(s2636_1_bitmap, y, x);
|
||||||
|
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel0))
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel0)];
|
||||||
|
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel1))
|
||||||
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel1)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
s2636_update_bitmap(machine,bitmap,s2636_1_ram,1,collision_bitmap);
|
|
||||||
s2636_update_bitmap(machine,bitmap,s2636_2_ram,2,collision_bitmap);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,152 +19,129 @@
|
|||||||
#include "video/s2636.h"
|
#include "video/s2636.h"
|
||||||
#include "cpu/s2650/s2650.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
|
|
||||||
|
|
||||||
|
|
||||||
// Used here
|
|
||||||
//static int scroll[8];
|
|
||||||
//static int scroll_reg = 0;
|
|
||||||
|
|
||||||
UINT8 *quasar_effectram;
|
UINT8 *quasar_effectram;
|
||||||
int quasar_effectcontrol;
|
UINT8 quasar_effectcontrol;
|
||||||
|
|
||||||
static mame_bitmap *effect_bitmap;
|
static s2636_t *s2636_0, *s2636_1, *s2636_2;
|
||||||
static mame_bitmap *background_bitmap;
|
|
||||||
|
|
||||||
PALETTE_INIT( quasar )
|
PALETTE_INIT( quasar )
|
||||||
{
|
{
|
||||||
int i,col,map;
|
int i;
|
||||||
|
|
||||||
#define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
|
/* allocate the colortable */
|
||||||
|
machine->colortable = colortable_alloc(machine, 0x500);
|
||||||
|
|
||||||
// Standard 1 bit per colour palette (background and sprites)
|
/* standard 1 bit per color palette (background and sprites) */
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
for(col = 0;col < 8; col++)
|
|
||||||
{
|
{
|
||||||
palette_set_color_rgb(machine,col,pal1bit(col >> 0),pal1bit(col >> 1),pal1bit(col >> 2));
|
rgb_t color = MAKE_RGB(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2));
|
||||||
|
colortable_palette_set_color(machine->colortable, i, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* effects color map */
|
||||||
|
for (i = 0; i < 0x100; i++)
|
||||||
|
{
|
||||||
|
rgb_t color;
|
||||||
|
int bit0, bit1, bit2;
|
||||||
|
int 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 0 */
|
||||||
|
colortable_palette_set_color(machine->colortable, 0x100 + i, RGB_BLACK);
|
||||||
|
|
||||||
|
/* intensity 1 */
|
||||||
|
color = MAKE_RGB(r >> 2, g >> 2, b >> 2);
|
||||||
|
colortable_palette_set_color(machine->colortable, 0x200 + i, color);
|
||||||
|
|
||||||
|
/* intensity 2 */
|
||||||
|
color = MAKE_RGB((r >> 2) + (r >> 3), (g >> 2) + (g >> 3), (b >> 2) + (b >> 2));
|
||||||
|
colortable_palette_set_color(machine->colortable, 0x300 + i, color);
|
||||||
|
|
||||||
|
/* intensity 3 */
|
||||||
|
color = MAKE_RGB(r >> 1, g >> 1, b >> 1);
|
||||||
|
colortable_palette_set_color(machine->colortable, 0x400 + i, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Address 0-2 from graphic rom
|
// Address 0-2 from graphic rom
|
||||||
// 3-5 from colour ram
|
// 3-5 from color ram
|
||||||
// 6-8 from sprite chips (Used for priority)
|
// 6-8 from sprite chips (Used for priority)
|
||||||
|
for (i = 0; i < 0x200; i++)
|
||||||
|
colortable_entry_set_value(machine->colortable, i, color_prom[i] & 0x07);
|
||||||
|
|
||||||
for(col = 0; col < 512; col++)
|
/* background for collision */
|
||||||
{
|
for (i = 1; i < 8; i++)
|
||||||
COLOR(0,col) = color_prom[col] & 7;
|
colortable_entry_set_value(machine->colortable, 0x200 + i, 7);
|
||||||
}
|
colortable_entry_set_value(machine->colortable, 0x200, 0);
|
||||||
|
|
||||||
/* Background for collision */
|
/* effects */
|
||||||
|
for (i = 0; i < 0x400; i++)
|
||||||
COLOR(0,512) = 0; // Black
|
colortable_entry_set_value(machine->colortable, 0x208 + i, 0x100 + i);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VIDEO_START( quasar )
|
VIDEO_START( quasar )
|
||||||
{
|
{
|
||||||
quasar_effectram = auto_malloc(0x400);
|
quasar_effectram = auto_malloc(0x400);
|
||||||
|
|
||||||
effect_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format);
|
/* configure the S2636 chips */
|
||||||
background_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
s2636_0 = s2636_config(cvs_s2636_0_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
|
s2636_1 = s2636_config(cvs_s2636_1_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
|
s2636_2 = s2636_config(cvs_s2636_2_ram, machine->screen[0].height, machine->screen[0].width, CVS_S2636_Y_OFFSET, CVS_S2636_X_OFFSET);
|
||||||
|
|
||||||
VIDEO_START_CALL(cvs);
|
/* create helper bitmaps */
|
||||||
|
cvs_collision_background = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIDEO_UPDATE( quasar )
|
VIDEO_UPDATE( quasar )
|
||||||
{
|
{
|
||||||
int offs,character;
|
int offs;
|
||||||
int sx,sy, ox, oy;
|
mame_bitmap *s2636_0_bitmap;
|
||||||
int forecolor;
|
mame_bitmap *s2636_1_bitmap;
|
||||||
|
mame_bitmap *s2636_2_bitmap;
|
||||||
/* for every character in the Video RAM, check if it has been modified */
|
|
||||||
/* since last time and update it accordingly. */
|
|
||||||
|
|
||||||
|
/* for every character in the video RAM */
|
||||||
for (offs = 0; offs < 0x0400; offs++)
|
for (offs = 0; offs < 0x0400; offs++)
|
||||||
{
|
{
|
||||||
character = cvs_video_ram[offs];
|
int ox, oy;
|
||||||
|
UINT8 code = cvs_video_ram[offs];
|
||||||
|
|
||||||
sx = (offs % 32) * 8;
|
UINT8 x = (offs & 0x1f) << 3;
|
||||||
sy = (offs / 32) * 8;
|
UINT8 y = (offs >> 5) << 3;
|
||||||
|
|
||||||
// While we have the current character code, draw the effects layer
|
// While we have the current character code, draw the effects layer
|
||||||
// intensity / on and off controlled by latch
|
// intensity / on and off controlled by latch
|
||||||
|
|
||||||
if (quasar_effectcontrol == 0x30)
|
int forecolor = 0x208 + quasar_effectram[offs] + (256 * (((quasar_effectcontrol >> 4) ^ 3) & 3));
|
||||||
forecolor = 0;
|
|
||||||
else
|
|
||||||
forecolor = quasar_effectram[offs] + (256 * (((quasar_effectcontrol >> 4) ^ 3) & 3));
|
|
||||||
|
|
||||||
for(ox=0;ox<8;ox++)
|
for(ox=0;ox<8;ox++)
|
||||||
for(oy=0;oy<8;oy++)
|
for(oy=0;oy<8;oy++)
|
||||||
*BITMAP_ADDR16(effect_bitmap, sy+oy, sx+ox) = forecolor;
|
*BITMAP_ADDR16(bitmap, y+oy, x+ox) = forecolor;
|
||||||
|
|
||||||
/* Main Screen */
|
/* Main Screen */
|
||||||
|
|
||||||
drawgfx(background_bitmap,machine->gfx[0],
|
drawgfx(bitmap,machine->gfx[0],
|
||||||
character,
|
code,
|
||||||
cvs_color_ram[offs],
|
cvs_color_ram[offs] & 0x3f,
|
||||||
0,0,
|
0,0,
|
||||||
sx,sy,
|
x,y,
|
||||||
0,TRANSPARENCY_NONE,0);
|
cliprect,TRANSPARENCY_PEN,0);
|
||||||
|
|
||||||
|
|
||||||
/* background for Collision Detection (it can only hit certain items) */
|
/* background for Collision Detection (it can only hit certain items) */
|
||||||
@ -172,32 +149,20 @@ VIDEO_UPDATE( quasar )
|
|||||||
if((cvs_color_ram[offs] & 7) == 0)
|
if((cvs_color_ram[offs] & 7) == 0)
|
||||||
{
|
{
|
||||||
drawgfx(cvs_collision_background,machine->gfx[0],
|
drawgfx(cvs_collision_background,machine->gfx[0],
|
||||||
character,
|
code,
|
||||||
64,
|
64,
|
||||||
0,0,
|
0,0,
|
||||||
sx,sy,
|
x,y,
|
||||||
0,TRANSPARENCY_NONE,0);
|
cliprect,TRANSPARENCY_NONE,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update screen */
|
/* update the S2636 chips */
|
||||||
|
s2636_0_bitmap = s2636_update(s2636_0, cliprect);
|
||||||
copybitmap (bitmap,effect_bitmap, 0,0,0,0,cliprect);
|
s2636_1_bitmap = s2636_update(s2636_1, cliprect);
|
||||||
copybitmap_trans(bitmap,background_bitmap,0,0,0,0,cliprect,0);
|
s2636_2_bitmap = s2636_update(s2636_2, cliprect);
|
||||||
|
|
||||||
/* 2636's */
|
|
||||||
|
|
||||||
fillbitmap(s2636_1_bitmap,0,0);
|
|
||||||
s2636_update_bitmap(machine,s2636_1_bitmap,s2636_1_ram,1,cvs_collision_bitmap);
|
|
||||||
|
|
||||||
fillbitmap(s2636_2_bitmap,0,0);
|
|
||||||
s2636_update_bitmap(machine,s2636_2_bitmap,s2636_2_ram,2,cvs_collision_bitmap);
|
|
||||||
|
|
||||||
fillbitmap(s2636_3_bitmap,0,0);
|
|
||||||
s2636_update_bitmap(machine,s2636_3_bitmap,s2636_3_ram,3,cvs_collision_bitmap);
|
|
||||||
|
|
||||||
/* Bullet Hardware */
|
/* Bullet Hardware */
|
||||||
|
|
||||||
for (offs = 8; offs < 256; offs++ )
|
for (offs = 8; offs < 256; offs++ )
|
||||||
{
|
{
|
||||||
if(cvs_bullet_ram[offs] != 0)
|
if(cvs_bullet_ram[offs] != 0)
|
||||||
@ -207,64 +172,46 @@ VIDEO_UPDATE( quasar )
|
|||||||
{
|
{
|
||||||
int bx=255-9-cvs_bullet_ram[offs]-ct;
|
int bx=255-9-cvs_bullet_ram[offs]-ct;
|
||||||
|
|
||||||
/* Bullet/Object Collision */
|
/* bullet/object Collision */
|
||||||
|
if (*BITMAP_ADDR8(s2636_0_bitmap, offs, bx) != 0) cvs_collision_register |= 0x04;
|
||||||
if (*BITMAP_ADDR8(s2636_1_bitmap, offs, bx) != 0) cvs_collision_register |= 4;
|
if (*BITMAP_ADDR8(s2636_2_bitmap, offs, bx) != 0) cvs_collision_register |= 0x08;
|
||||||
if (*BITMAP_ADDR8(s2636_3_bitmap, offs, bx) != 0) cvs_collision_register |= 8;
|
|
||||||
|
|
||||||
*BITMAP_ADDR16(bitmap, offs, bx) = machine->pens[7];
|
*BITMAP_ADDR16(bitmap, offs, bx) = machine->pens[7];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update 2636 images */
|
|
||||||
|
|
||||||
{
|
/* mix and copy the S2636 images into the main bitmap, also check for collision */
|
||||||
UINT32 S1,S2,S3,SB,pen;
|
{
|
||||||
|
int y;
|
||||||
|
|
||||||
for(sx=255;sx>7;sx--)
|
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
|
||||||
{
|
{
|
||||||
UINT32 *sp1 = (UINT32 *)BITMAP_ADDR8(s2636_1_bitmap, sx, 0);
|
int x;
|
||||||
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++)
|
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
|
||||||
{
|
{
|
||||||
S1 = (*sp1++);
|
int pixel0 = *BITMAP_ADDR8(s2636_0_bitmap, y, x);
|
||||||
S2 = (*sp2++);
|
int pixel1 = *BITMAP_ADDR8(s2636_1_bitmap, y, x);
|
||||||
S3 = (*sp3++);
|
int pixel2 = *BITMAP_ADDR8(s2636_2_bitmap, y, x);
|
||||||
|
|
||||||
pen = S1 | S2 | S3;
|
int pixel = pixel0 | pixel1 | pixel2;
|
||||||
|
|
||||||
if(pen)
|
if (S2636_IS_PIXEL_DRAWN(pixel))
|
||||||
{
|
{
|
||||||
UINT16 *address = (UINT16 *)dst;
|
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[S2636_PIXEL_COLOR(pixel)];
|
||||||
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 */
|
/* S2636 vs. background collision detection */
|
||||||
|
if (colortable_entry_get_value(machine->colortable, *BITMAP_ADDR16(cvs_collision_background, y, x)))
|
||||||
|
{
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel0)) cvs_collision_register |= 0x01;
|
||||||
|
if (S2636_IS_PIXEL_DRAWN(pixel2)) cvs_collision_register |= 0x02;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "video/s2636.h"
|
#include "video/s2636.h"
|
||||||
|
|
||||||
|
|
||||||
|
UINT8 *zac2650_s2636_0_ram;
|
||||||
static mame_bitmap *spritebitmap;
|
static mame_bitmap *spritebitmap;
|
||||||
|
|
||||||
static int CollisionBackground;
|
static int CollisionBackground;
|
||||||
@ -29,7 +31,7 @@ WRITE8_HANDLER( tinvader_videoram_w )
|
|||||||
|
|
||||||
READ8_HANDLER( zac_s2636_r )
|
READ8_HANDLER( zac_s2636_r )
|
||||||
{
|
{
|
||||||
if(offset!=0xCB) return s2636_1_ram[offset];
|
if(offset!=0xCB) return zac2650_s2636_0_ram[offset];
|
||||||
else return CollisionSprite;
|
else return CollisionSprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,10 +49,10 @@ static int SpriteCollision(running_machine *machine, int first,int second)
|
|||||||
int Checksum=0;
|
int Checksum=0;
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
if((s2636_1_ram[first * 0x10 + 10] < 0xf0) && (s2636_1_ram[second * 0x10 + 10] < 0xf0))
|
if((zac2650_s2636_0_ram[first * 0x10 + 10] < 0xf0) && (zac2650_s2636_0_ram[second * 0x10 + 10] < 0xf0))
|
||||||
{
|
{
|
||||||
int fx = (s2636_1_ram[first * 0x10 + 10] * 4)-22;
|
int fx = (zac2650_s2636_0_ram[first * 0x10 + 10] * 4)-22;
|
||||||
int fy = (s2636_1_ram[first * 0x10 + 12] * 3)+3;
|
int fy = (zac2650_s2636_0_ram[first * 0x10 + 12] * 3)+3;
|
||||||
int expand = (first==1) ? 2 : 1;
|
int expand = (first==1) ? 2 : 1;
|
||||||
|
|
||||||
/* Draw first sprite */
|
/* Draw first sprite */
|
||||||
@ -86,7 +88,7 @@ static int SpriteCollision(running_machine *machine, int first,int second)
|
|||||||
second * 2,
|
second * 2,
|
||||||
1,
|
1,
|
||||||
0,0,
|
0,0,
|
||||||
(s2636_1_ram[second * 0x10 + 10] * 4)-22,(s2636_1_ram[second * 0x10 + 12] * 3) + 3,
|
(zac2650_s2636_0_ram[second * 0x10 + 10] * 4)-22,(zac2650_s2636_0_ram[second * 0x10 + 12] * 3) + 3,
|
||||||
0, TRANSPARENCY_PEN, 0);
|
0, TRANSPARENCY_PEN, 0);
|
||||||
|
|
||||||
/* Remove fingerprint */
|
/* Remove fingerprint */
|
||||||
@ -158,19 +160,19 @@ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap)
|
|||||||
|
|
||||||
for(offs=0;offs<0x50;offs+=0x10)
|
for(offs=0;offs<0x50;offs+=0x10)
|
||||||
{
|
{
|
||||||
if((s2636_1_ram[offs+10]<0xF0) && (offs!=0x30))
|
if((zac2650_s2636_0_ram[offs+10]<0xF0) && (offs!=0x30))
|
||||||
{
|
{
|
||||||
int spriteno = (offs / 8);
|
int spriteno = (offs / 8);
|
||||||
int expand = ((s2636_1_ram[0xc0] & (spriteno*2))!=0) ? 2 : 1;
|
int expand = ((zac2650_s2636_0_ram[0xc0] & (spriteno*2))!=0) ? 2 : 1;
|
||||||
int bx = (s2636_1_ram[offs+10] * 4) - 22;
|
int bx = (zac2650_s2636_0_ram[offs+10] * 4) - 22;
|
||||||
int by = (s2636_1_ram[offs+12] * 3) + 3;
|
int by = (zac2650_s2636_0_ram[offs+12] * 3) + 3;
|
||||||
int x,y;
|
int x,y;
|
||||||
|
|
||||||
/* 16x8 version */
|
/* 16x8 version */
|
||||||
decodechar(machine->gfx[1],spriteno,s2636_1_ram);
|
decodechar(machine->gfx[1],spriteno,zac2650_s2636_0_ram);
|
||||||
|
|
||||||
/* 16x16 version */
|
/* 16x16 version */
|
||||||
decodechar(machine->gfx[2],spriteno,s2636_1_ram);
|
decodechar(machine->gfx[2],spriteno,zac2650_s2636_0_ram);
|
||||||
|
|
||||||
/* Sprite->Background collision detection */
|
/* Sprite->Background collision detection */
|
||||||
drawgfx(bitmap,machine->gfx[expand],
|
drawgfx(bitmap,machine->gfx[expand],
|
||||||
|
Loading…
Reference in New Issue
Block a user