📄 dec8.c
字号:
draw_sprites1(bitmap,0);
/* Sprites */
for (offs = 0;offs < 0x800;offs += 8)
{
int x,y,sprite,colour,multi,inc;
y =spriteram[offs+1]+(spriteram[offs]<<8);
if ((y&0x8000) == 0) continue;
x = spriteram[offs+5]+(spriteram[offs+4]<<8);
fx = spriteram[offs+3] & 0x4;
fy = spriteram[offs+3] & 0x2;
multi = (1 << ((y & 0x1800) >> 11)) - 1;
sprite = spriteram[offs+7]+(spriteram[offs+6]<<8);
colour = sprite >> 12;
sprite &= 0x0fff;
x = x & 0x01ff;
y = y & 0x01ff;
if (x >= 256) x -= 512;
if (y >= 256) y -= 512;
x = 240 - x;
y = 240 - y;
sprite &= ~multi;
if (fy)
inc = -1;
else
{
sprite += multi;
inc = 1;
}
while (multi >= 0)
{
drawgfx(bitmap,Machine->gfx[1],
sprite - multi * inc,
colour,
fx,fy,
x,y - 16 * multi,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
multi--;
}
}
/* Top layer */
draw_characters(bitmap,0xc,2);
}
void srdarwin_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
{
int my,mx,offs,color,tile;
int scrollx,scrolly;
int bank;
if (palette_recalc())
memset(pf_dirty,1,0x400);
/* Playfield */
mx=-1; my=0;
for (offs = 0x000;offs < 0x400; offs += 2) {
mx++;
if (mx==32) {mx=0; my++;}
if (!pf_dirty[offs/2]) continue; else pf_dirty[offs/2]=0;
tile=pf_video[offs+1]+(pf_video[offs]<<8);
color=tile >> 12;
tile=tile&0xfff;
bank=tile/0x100;
tile-=(bank*0x100);
drawgfx(pf2_bitmap,Machine->gfx[bank+2],tile,
color&0x3, 0,0, 16*mx,16*my,
0,TRANSPARENCY_NONE,0);
}
scrolly=0;
scrollx=-((scroll2[0]<<8)+scroll2[1]);
copyscrollbitmap(bitmap,pf2_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_NONE,0);
/* Sprites */
for (offs = 0;offs < 0x200;offs += 4)
{
int x,y,sprite,colour,multi,fx,fy,inc,sx,sy,code,code2;
if (spriteram[offs] == 0xf8) continue;
sx = 248 - spriteram[offs+2]; /* Not sure */
sy = 240 - spriteram[offs];
code = spriteram[offs+3] + (256 * ((spriteram[offs+1]>>5) & 0x07));
multi = spriteram[offs+1] & 0x10;
fx=0;
fy=spriteram[offs+1]&0x10;
color = ( (spriteram[offs+1]>>1) ) &7;
if (code&0x20) color=1;
if (code&0x40) color=2;
if (code&0x60) color=2;
if (code&0xa0) color=1;
if (code&0xc0) color=2;
if (code&0xe0) color=2;
/* Y Flip determines order of multi-sprite */
if (multi && fy) {
code2=code;
code++;
}
else
code2=code+1;
if (multi) sy=sy-16;
drawgfx(bitmap,Machine->gfx[1],
code,
color,
fx,fy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
if (multi)
drawgfx(bitmap,Machine->gfx[1],
code2,
color,
fx,fy,
sx,sy+16,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
}
/* Draw character tiles */
mx=-1; my=0;
for (offs = 0;offs < 0x400; offs += 1) {
mx++;
if (mx==32) {mx=0; my++;}
tile=videoram[offs];
if (!tile) continue;
color=0;
drawgfx(bitmap,Machine->gfx[0],
tile,color,0,0,8*mx,8*my,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
}
}
/******************************************************************************/
void gondo_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
{
int my,mx,offs,color,tile;
int scrollx,scrolly;
/* Palette stuff */
int code,i;
int colmask[16];
int pal_base;
memset(palette_used_colors,PALETTE_COLOR_UNUSED,Machine->drv->total_colors * sizeof(unsigned char));
pal_base = Machine->drv->gfxdecodeinfo[0].color_codes_start;
for (color = 0;color < 8;color++) colmask[color] = 0;
for (offs = 0; offs < 0x800; offs += 2)
{
code = videoram[offs+1]+((videoram[offs]&0xF)<<8);
color = (videoram[offs]&0x70)>>4;
code &= 0x0fff;
colmask[color] |= Machine->gfx[0]->pen_usage[code];
}
for (color = 0;color < 8;color++)
{
if (colmask[color] & (1 << 0))
palette_used_colors[pal_base + 8 * color] = PALETTE_COLOR_TRANSPARENT;
for (i = 1;i < 8;i++)
{
if (colmask[color] & (1 << i))
palette_used_colors[pal_base + 8 * color + i] = PALETTE_COLOR_USED;
}
}
pal_base = Machine->drv->gfxdecodeinfo[2].color_codes_start;
for (color = 0;color < 16;color++) colmask[color] = 0;
for (offs = 0; offs < 0x800; offs += 2)
{
code = pf_video[offs+1]+((pf_video[offs]&0xF)<<8);
color = pf_video[offs] >> 4;
code &= 0x0fff;
colmask[color] |= Machine->gfx[2]->pen_usage[code];
}
for (color = 0;color < 16;color++)
{
for (i = 0;i < 16;i++)
{
if (colmask[color] & (1 << i))
palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
}
}
memset(palette_used_colors+256,PALETTE_COLOR_USED,256);
palette_used_colors[256]=PALETTE_COLOR_TRANSPARENT;
if (palette_recalc())
memset(pf_dirty,1,0x800);
/* Playfield 2 - Foreground */
mx=-1; my=0;
for (offs = 0x000;offs < 0x800; offs += 2) {
mx++;
if (mx==32) {mx=0; my++;}
if (!pf_dirty[offs/2]) continue; else pf_dirty[offs/2]=0;
tile=pf_video[offs+1]+(pf_video[offs]<<8);
color = ((tile & 0xf000) >> 12);
tile=tile&0xfff;
drawgfx(pf2_bitmap,Machine->gfx[2],tile,
color, 0,0, 16*mx,16*my,
0,TRANSPARENCY_NONE,0);
/* Render masked playfield */
drawgfx(pf1_bitmap,Machine->gfx[1],0,
0,0,0, 16*mx,16*my,
0,TRANSPARENCY_NONE,0);
drawgfx(pf1_bitmap,Machine->gfx[2],tile,
color, 0,0, 16*mx,16*my,
0,TRANSPARENCY_PENS,0xff);
}
/* Bottom tiles */
scrolly=-((scroll2[2]<<8)+scroll2[3]);
scrollx=-((scroll2[0]<<8)+scroll2[1]);
copyscrollbitmap(bitmap,pf2_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_NONE,0);
/* Sprites underneath tiles */
draw_sprites1(bitmap,2);
/* Top tiles */
scrolly=-((scroll2[2]<<8)+scroll2[3]);
scrollx=-((scroll2[0]<<8)+scroll2[1]);
copyscrollbitmap(bitmap,pf1_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_PEN,palette_transparent_pen);
/* Sprites with priority over all tiles */
draw_sprites1(bitmap,1);
/* Top layer */
draw_characters(bitmap,0x70,4);
}
/******************************************************************************/
void oscar_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
{
int my,mx,offs,color,tile;
int scrollx,scrolly;
/* Palette stuff */
memset(palette_used_colors,PALETTE_COLOR_USED,512);
palette_used_colors[0]=PALETTE_COLOR_TRANSPARENT;
if (palette_recalc())
memset(pf_dirty,1,0x800);
/* Playfield */
mx=-1; my=0;
for (offs = 0x000;offs < 0x400; offs += 2) {
mx++;
if (mx==16) {mx=0; my++;}
if (!pf_dirty[offs/2]) continue; else pf_dirty[offs/2]=0;
tile=pf_video[offs+1]+(pf_video[offs]<<8);
color = ((tile & 0xf000) >> 12);
tile=tile&0xfff;
drawgfx(pf2_bitmap,Machine->gfx[2],tile,
color&7, 0,0, 16*mx,16*my,
0,TRANSPARENCY_NONE,0);
/* Render masked playfield */
drawgfx(pf1_bitmap,Machine->gfx[1],1,
0,0,0, 16*mx,16*my,
0,TRANSPARENCY_NONE,0);
if (color>7)
drawgfx(pf1_bitmap,Machine->gfx[2],tile,
color&7, 0,0, 16*mx,16*my,
0,TRANSPARENCY_PENS,0xff);
}
mx=-1; my=0;
for (offs = 0x400;offs < 0x800; offs += 2) {
mx++;
if (mx==16) {mx=0; my++;}
if (!pf_dirty[offs/2]) continue; else pf_dirty[offs/2]=0;
tile=pf_video[offs+1]+(pf_video[offs]<<8);
color = ((tile & 0xf000) >> 12);
tile=tile&0xfff;
drawgfx(pf2_bitmap,Machine->gfx[2],tile,
color&7, 0,0, (16*mx)+256,16*my,
0,TRANSPARENCY_NONE,0);
/* Render masked playfield */
drawgfx(pf1_bitmap,Machine->gfx[1],1,
0,0,0, (16*mx)+256,16*my,
0,TRANSPARENCY_NONE,0);
if (color>7)
drawgfx(pf1_bitmap,Machine->gfx[2],tile,
color&7, 0,0, (16*mx)+256,16*my,
0,TRANSPARENCY_PENS,0xff);
}
/* Render playfield */
scrolly=-((scroll2[2]<<8)+scroll2[3]);
scrollx=-((scroll2[0]<<8)+scroll2[1]);
copyscrollbitmap(bitmap,pf2_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_NONE,0);
/* Sprites */
draw_sprites2(bitmap,0);
/* Top pens of playfield */
copyscrollbitmap(bitmap,pf1_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_PEN,palette_transparent_pen);
/* Top layer */
draw_characters(bitmap,0xf0,6);
}
void lastmiss_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
{
int my,mx,offs,color,tile;
int scrollx,scrolly,i;
int offsetx[4],offsety[4],quarter;
/* Palette stuff */
int code;
int colmask[16];
int pal_base;
memset(palette_used_colors,PALETTE_COLOR_UNUSED,Machine->drv->total_colors * sizeof(unsigned char));
pal_base = Machine->drv->gfxdecodeinfo[0].color_codes_start;
for (color = 0;color < 8;color++) colmask[color] = 0;
for (offs = 0; offs < 0x800; offs += 2)
{
code = videoram[offs+1]+((videoram[offs]&0xF)<<8);
color = videoram[offs] >> 6;
code &= 0x0fff;
colmask[color] |= Machine->gfx[0]->pen_usage[code];
}
for (color = 0;color < 8;color++)
{
if (colmask[color] & (1 << 0))
palette_used_colors[pal_base + 16 * color] = PALETTE_COLOR_TRANSPARENT;
for (i = 1;i < 8;i++)
{
if (colmask[color] & (1 << i))
palette_used_colors[pal_base + 8 * color + i] = PALETTE_COLOR_USED;
}
}
pal_base = Machine->drv->gfxdecodeinfo[2].color_codes_start;
for (color = 0;color < 16;color++) colmask[color] = 0;
for (offs = 0; offs < 0x800; offs += 2)
{
code = pf_video[offs+1]+((pf_video[offs]&0xF)<<8);
color = pf_video[offs] >> 4;
code &= 0x0fff;
colmask[color] |= Machine->gfx[2]->pen_usage[code];
}
for (color = 0;color < 16;color++)
{
for (i = 0;i < 16;i++)
{
if (colmask[color] & (1 << i))
palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
}
}
memset(palette_used_colors+256,PALETTE_COLOR_USED,256);
palette_used_colors[256]=PALETTE_COLOR_TRANSPARENT;
if (palette_recalc())
memset(pf_dirty,1,0x800);
offsetx[0]=0; offsety[0]=0;
offsetx[1]=256; offsety[1]=0;
offsetx[2]=0; offsety[2]=256;
offsetx[3]=256; offsety[3]=256;
/* Draw the playfield */
for (quarter=0; quarter < 4;quarter++) {
mx=-1; my=0;
for (offs = 0x200*quarter;offs < 0x200*quarter + 0x200; offs += 2) {
mx++;
if (mx==16) {mx=0; my++;}
if (!pf_dirty[offs/2]) continue; else pf_dirty[offs/2]=0;
tile=pf_video[offs+1]+(pf_video[offs]<<8);
color = ((tile & 0xf000) >> 12);
tile=tile&0xfff;
drawgfx(pf2_bitmap,Machine->gfx[2],tile,
color, 0,0, 16*mx+ offsetx[quarter],16*my+ offsety[quarter],
0,TRANSPARENCY_NONE,0);
drawgfx(pf1_bitmap,Machine->gfx[1],blank_tile,
0,0,0, 16*mx+ offsetx[quarter],16*my+ offsety[quarter],
0,TRANSPARENCY_NONE,0);
if (color>7)
drawgfx(pf1_bitmap,Machine->gfx[2],tile,
color, 0,0, 16*mx+ offsetx[quarter],16*my+ offsety[quarter],
0,TRANSPARENCY_PENS,0xf);
}
}
/* Render playfield (bottom part) */
scrollx=-(scroll2[0]<<8)-scroll2[1];
scrolly=-(scroll2[2]<<8)-scroll2[3];
copyscrollbitmap(bitmap,pf2_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_NONE,0);
/* Sprites */
draw_sprites1(bitmap,0);
/* Render parts of playfield with priority over sprites */
if (shackled_priority)
copyscrollbitmap(bitmap,pf1_bitmap,1,&scrollx,1,&scrolly,0,TRANSPARENCY_PEN,palette_transparent_pen);
/* Top layer */
draw_characters(bitmap,0xf0,6);
}
/******************************************************************************/
int dec8_video_r(int offset)
{
return pf_video[offset];
}
void dec8_video_w(int offset, int data)
{
if (pf_video[offset]!=data)
{
pf_video[offset]=data;
pf_dirty[offset/2] = 1;
}
}
int dec8_vh_start (void)
{
int i;
unsigned int *pen_usage=Machine->gfx[1]->pen_usage;
pf1_bitmap=osd_create_bitmap(512,512);
pf2_bitmap=osd_create_bitmap(512,512);
pf_video=malloc(0x1000);
pf_dirty=malloc(0x800);
memset(pf_dirty,1,0x800);
/* Kludge: Find a blank tile */
blank_tile=0;
for (i=0; i<0xfff; i++)
if((pen_usage[i] & ~ 1) == 0) {
blank_tile=i;
i=0x1000;
}
/* Stupid kludge - fix it later :) */
shackled_priority=0;
if (!strcmp(Machine->gamedrv->name,"breywood")) shackled_priority=1;
if (!strcmp(Machine->gamedrv->name,"shackled")) shackled_priority=1;
return 0;
}
void dec8_vh_stop (void)
{
osd_free_bitmap(pf1_bitmap);
osd_free_bitmap(pf2_bitmap);
free(pf_video);
free(pf_dirty);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -