📄 cclimber.c
字号:
bsdirtybuffer[offset] = 1;
cclimber_bsvideoram[offset] = data;
}
}
void swimmer_palettebank_w(int offset,int data)
{
if (palettebank != (data & 1))
{
palettebank = data & 1;
memset(dirtybuffer,1,videoram_size);
}
}
void swimmer_sidepanel_enable_w(int offset,int data)
{
if (data != sidepanel_enabled)
{
sidepanel_enabled = data;
/* We only need to dirty the side panel, but this location is not */
/* written to very often, so we just dirty the whole screen */
memset(dirtybuffer,1,videoram_size);
}
}
/***************************************************************************
Draw the game screen in the given osd_bitmap.
Do NOT call osd_update_display() from this function, it will be called by
the main emulation engine.
***************************************************************************/
static void drawbigsprite(struct osd_bitmap *bitmap)
{
int sx,sy,flipx,flipy;
sx = 136 - cclimber_bigspriteram[3];
sy = 128 - cclimber_bigspriteram[2];
flipx = cclimber_bigspriteram[1] & 0x10;
flipy = cclimber_bigspriteram[1] & 0x20;
if (flipscreen[1]) /* only the Y direction has to be flipped */
{
sy = 128 - sy;
flipy = !flipy;
}
/* we have to draw if four times for wraparound */
sx &= 0xff;
sy &= 0xff;
copybitmap(bitmap,bsbitmap,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_COLOR,0);
copybitmap(bitmap,bsbitmap,
flipx,flipy,
sx-256,sy,
&Machine->drv->visible_area,TRANSPARENCY_COLOR,0);
copybitmap(bitmap,bsbitmap,
flipx,flipy,
sx-256,sy-256,
&Machine->drv->visible_area,TRANSPARENCY_COLOR,0);
copybitmap(bitmap,bsbitmap,
flipx,flipy,
sx,sy-256,
&Machine->drv->visible_area,TRANSPARENCY_COLOR,0);
}
void cclimber_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int offs;
/* for every character in the Video RAM, check if it has been modified */
/* since last time and update it accordingly. */
for (offs = videoram_size - 1;offs >= 0;offs--)
{
if (dirtybuffer[offs])
{
int sx,sy,flipx,flipy;
dirtybuffer[offs] = 0;
sx = offs % 32;
sy = offs / 32;
flipx = colorram[offs] & 0x40;
flipy = colorram[offs] & 0x80;
/* vertical flipping flips two adjacent characters */
if (flipy) sy ^= 1;
if (flipscreen[0])
{
sx = 31 - sx;
flipx = !flipx;
}
if (flipscreen[1])
{
sy = 31 - sy;
flipy = !flipy;
}
drawgfx(tmpbitmap,Machine->gfx[(colorram[offs] & 0x10) ? 1 : 0],
videoram[offs] + 8 * (colorram[offs] & 0x20),
colorram[offs] & 0x0f,
flipx,flipy,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
/* copy the temporary bitmap to the screen */
{
int scroll[32];
if (flipscreen[0])
{
for (offs = 0;offs < 32;offs++)
{
scroll[offs] = -cclimber_column_scroll[31 - offs];
if (flipscreen[1]) scroll[offs] = -scroll[offs];
}
}
else
{
for (offs = 0;offs < 32;offs++)
{
scroll[offs] = -cclimber_column_scroll[offs];
if (flipscreen[1]) scroll[offs] = -scroll[offs];
}
}
copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
}
/* update the "big sprite" */
{
int newcol;
static int lastcol;
newcol = cclimber_bigspriteram[1] & 0x07;
for (offs = cclimber_bsvideoram_size - 1;offs >= 0;offs--)
{
int sx,sy;
if (bsdirtybuffer[offs] || newcol != lastcol)
{
bsdirtybuffer[offs] = 0;
sx = offs % 16;
sy = offs / 16;
drawgfx(bsbitmap,Machine->gfx[2],
cclimber_bsvideoram[offs],newcol,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
lastcol = newcol;
}
if (cclimber_bigspriteram[0] & 1)
/* draw the "big sprite" below sprites */
drawbigsprite(bitmap);
/* Draw the sprites. Note that it is important to draw them exactly in this */
/* order, to have the correct priorities. */
for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
{
int sx,sy,flipx,flipy;
sx = spriteram[offs + 3];
sy = 240 - spriteram[offs + 2];
flipx = spriteram[offs] & 0x40;
flipy = spriteram[offs] & 0x80;
if (flipscreen[0])
{
sx = 240 - sx;
flipx = !flipx;
}
if (flipscreen[1])
{
sy = 240 - sy;
flipy = !flipy;
}
drawgfx(bitmap,Machine->gfx[spriteram[offs + 1] & 0x10 ? 4 : 3],
(spriteram[offs] & 0x3f) + 2 * (spriteram[offs + 1] & 0x20),
spriteram[offs + 1] & 0x0f,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
}
if ((cclimber_bigspriteram[0] & 1) == 0)
/* draw the "big sprite" over sprites */
drawbigsprite(bitmap);
}
void swimmer_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int offs;
/* for every character in the Video RAM, check if it has been modified */
/* since last time and update it accordingly. */
for (offs = videoram_size - 1;offs >= 0;offs--)
{
if (dirtybuffer[offs])
{
int sx,sy,flipx,flipy,color;
dirtybuffer[offs] = 0;
sx = offs % 32;
sy = offs / 32;
flipx = colorram[offs] & 0x40;
flipy = colorram[offs] & 0x80;
/* vertical flipping flips two adjacent characters */
if (flipy) sy ^= 1;
if (flipscreen[0])
{
sx = 31 - sx;
flipx = !flipx;
}
if (flipscreen[1])
{
sy = 31 - sy;
flipy = !flipy;
}
color = (colorram[offs] & 0x0f) + 0x10 * palettebank;
if (sx >= 24 && sidepanel_enabled)
{
color += 32;
}
drawgfx(tmpbitmap,Machine->gfx[0],
videoram[offs] + ((colorram[offs] & 0x10) << 4),
color,
flipx,flipy,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
/* copy the temporary bitmap to the screen */
{
int scroll[32];
if (flipscreen[1])
{
for (offs = 0;offs < 32;offs++)
scroll[offs] = cclimber_column_scroll[31 - offs];
}
else
{
for (offs = 0;offs < 32;offs++)
scroll[offs] = -cclimber_column_scroll[offs];
}
copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
}
/* update the "big sprite" */
{
int newcol;
static int lastcol;
newcol = cclimber_bigspriteram[1] & 0x03;
for (offs = cclimber_bsvideoram_size - 1;offs >= 0;offs--)
{
int sx,sy;
if (bsdirtybuffer[offs] || newcol != lastcol)
{
bsdirtybuffer[offs] = 0;
sx = offs % 16;
sy = offs / 16;
drawgfx(bsbitmap,Machine->gfx[2],
cclimber_bsvideoram[offs] + ((cclimber_bigspriteram[1] & 0x08) << 5),
newcol,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
lastcol = newcol;
}
if (cclimber_bigspriteram[0] & 1)
/* draw the "big sprite" below sprites */
drawbigsprite(bitmap);
/* Draw the sprites. Note that it is important to draw them exactly in this */
/* order, to have the correct priorities. */
for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
{
int sx,sy,flipx,flipy;
sx = spriteram[offs + 3];
sy = 240 - spriteram[offs + 2];
flipx = spriteram[offs] & 0x40;
flipy = spriteram[offs] & 0x80;
if (flipscreen[0])
{
sx = 240 - sx;
flipx = !flipx;
}
if (flipscreen[1])
{
sy = 240 - sy;
flipy = !flipy;
}
drawgfx(bitmap,Machine->gfx[1],
(spriteram[offs] & 0x3f) | (spriteram[offs + 1] & 0x10) << 2,
(spriteram[offs + 1] & 0x0f) + 0x10 * palettebank,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,0);
}
if ((cclimber_bigspriteram[0] & 1) == 0)
/* draw the "big sprite" over sprites */
drawbigsprite(bitmap);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -