📄 aerofgt.c
字号:
attr_start = 8 * (READ_WORD(&spriteram_2[offs]) & 0x03ff);
/* is the way I handle priority correct? Or should I just check bit 13? */
if ((READ_WORD(&spriteram_2[attr_start + 4]) & 0x3000) == priority)
{
int map_start;
int ox,oy,x,y,xsize,ysize,zoomx,zoomy,flipx,flipy,color;
/* table hand made by looking at the ship explosion in attract mode */
/* it's almost a logarithmic scale but not exactly */
int zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 };
ox = READ_WORD(&spriteram_2[attr_start + 2]) & 0x01ff;
xsize = (READ_WORD(&spriteram_2[attr_start + 2]) & 0x0e00) >> 9;
zoomx = (READ_WORD(&spriteram_2[attr_start + 2]) & 0xf000) >> 12;
oy = READ_WORD(&spriteram_2[attr_start + 0]) & 0x01ff;
ysize = (READ_WORD(&spriteram_2[attr_start + 0]) & 0x0e00) >> 9;
zoomy = (READ_WORD(&spriteram_2[attr_start + 0]) & 0xf000) >> 12;
flipx = READ_WORD(&spriteram_2[attr_start + 4]) & 0x4000;
flipy = READ_WORD(&spriteram_2[attr_start + 4]) & 0x8000;
color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x0f00) >> 8;
map_start = 2 * (READ_WORD(&spriteram_2[attr_start + 6]) & 0x3fff);
zoomx = 16 - zoomtable[zoomx]/8;
zoomy = 16 - zoomtable[zoomy]/8;
for (y = 0;y <= ysize;y++)
{
int sx,sy;
if (flipy) sy = ((oy + zoomy * (ysize - y) + 16) & 0x1ff) - 16;
else sy = ((oy + zoomy * y + 16) & 0x1ff) - 16;
for (x = 0;x <= xsize;x++)
{
int code;
if (flipx) sx = ((ox + zoomx * (xsize - x) + 16) & 0x1ff) - 16;
else sx = ((ox + zoomx * x + 16) & 0x1ff) - 16;
code = READ_WORD(&spriteram[map_start]) & 0x1fff;
if (zoomx == 16 && zoomy == 16)
drawgfx(bitmap,Machine->gfx[map_start >= 0x4000 ? 2 : 1],
code,
color,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,15);
else
drawgfxzoom(bitmap,Machine->gfx[map_start >= 0x4000 ? 2 : 1],
code,
color,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,15,
0x1000 * zoomx,0x1000 * zoomy);
map_start += 2;
}
}
}
offs += 2;
}
}
static void turbofrc_drawsprites(struct osd_bitmap *bitmap,int priority)
{
int attr_start,base,first;
base = (priority & 1) * 0x0400;
first = 8*READ_WORD(&spriteram_2[0x3fc + base]);
priority = (priority & 2) << 3;
for (attr_start = first + base;attr_start < base + 0x0400-8;attr_start += 8)
{
if ((READ_WORD(&spriteram_2[attr_start + 4]) & 0x0010) == priority)
{
int map_start;
int ox,oy,x,y,xsize,ysize,zoomx,zoomy,flipx,flipy,color;
/* table hand made by looking at the ship explosion in attract mode */
/* it's almost a logarithmic scale but not exactly */
int zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 };
ox = READ_WORD(&spriteram_2[attr_start + 2]) & 0x01ff;
xsize = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x0700) >> 8;
zoomx = (READ_WORD(&spriteram_2[attr_start + 2]) & 0xf000) >> 12;
oy = READ_WORD(&spriteram_2[attr_start + 0]) & 0x01ff;
ysize = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x7000) >> 12;
zoomy = (READ_WORD(&spriteram_2[attr_start + 0]) & 0xf000) >> 12;
flipx = READ_WORD(&spriteram_2[attr_start + 4]) & 0x0800;
flipy = READ_WORD(&spriteram_2[attr_start + 4]) & 0x8000;
color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x000f) + 16 * spritepalettebank;
map_start = 2 * (READ_WORD(&spriteram_2[attr_start + 6]) & 0x1fff);
if (attr_start >= 0x0400) map_start |= 0x4000;
zoomx = 16 - zoomtable[zoomx]/8;
zoomy = 16 - zoomtable[zoomy]/8;
for (y = 0;y <= ysize;y++)
{
int sx,sy;
if (flipy) sy = ((oy + zoomy * (ysize - y) + 16) & 0x1ff) - 16;
else sy = ((oy + zoomy * y + 16) & 0x1ff) - 16;
for (x = 0;x <= xsize;x++)
{
int code;
if (flipx) sx = ((ox + zoomx * (xsize - x) + 16) & 0x1ff) - 16;
else sx = ((ox + zoomx * x + 16) & 0x1ff) - 16;
code = READ_WORD(&spriteram[map_start]) & 0x3fff;
if (zoomx == 16 && zoomy == 16)
drawgfx(bitmap,Machine->gfx[map_start >= 0x4000 ? 2 : 1],
code,
color,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,15);
else
drawgfxzoom(bitmap,Machine->gfx[map_start >= 0x4000 ? 2 : 1],
code,
color,
flipx,flipy,
sx,sy,
&Machine->drv->visible_area,TRANSPARENCY_PEN,15,
0x1000 * zoomx,0x1000 * zoomy);
map_start += 2;
}
if (xsize == 2) map_start += 2;
if (xsize == 4) map_start += 6;
if (xsize == 5) map_start += 4;
if (xsize == 6) map_start += 2;
}
}
}
}
void pspikes_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int offs;
memset(palette_used_colors,PALETTE_COLOR_UNUSED,Machine->drv->total_colors * sizeof(unsigned char));
bg_dopalette();
turbofrc_spr_dopalette();
if (palette_recalc())
{
memset(dirtybuffer,1,aerofgt_bg1videoram_size / 2);
}
for (offs = aerofgt_bg1videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer[offs/2])
{
int sx,sy,code;
dirtybuffer[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg1videoram[offs]);
drawgfx(tmpbitmap,Machine->gfx[0],
(code & 0x07ff) + (gfxbank[0 + ((code & 0x1800) >> 11)] << 11),
((code & 0xe000) >> 13) + 8 * charpalettebank,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
#if 0
for (offs = aerofgt_bg2videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer2[offs/2])
{
int sx,sy,code;
dirtybuffer2[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg2videoram[offs]);
drawgfx(tmpbitmap2,Machine->gfx[0],
bg2_chardisplacement + (code & 0x07ff) + (gfxbank[4 + ((code & 0x1800) >> 11)] << 11),
((code & 0xe000) >> 13) + 16,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
#endif
/* copy the temporary bitmap to the screen */
{
int scrollx[256],scrolly;
scrolly = -READ_WORD(bg1scrolly);
for (offs = 0;offs < 256;offs++)
scrollx[(offs - scrolly) & 0x0ff] = -READ_WORD(&aerofgt_rasterram[2*offs]);
copyscrollbitmap(bitmap,tmpbitmap,256,scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
}
turbofrc_drawsprites(bitmap,0);
#if 0
{
int scrollx,scrolly;
scrollx = -READ_WORD(bg2scrollx)+7;
scrolly = -READ_WORD(bg2scrolly)-2;
copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}
#endif
turbofrc_drawsprites(bitmap,2);
}
void turbofrc_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int offs;
static int drawbg2 = 1;
/*if (osd_key_pressed_memory(OSD_KEY_SPACE))
drawbg2 = !drawbg2;*/
memset(palette_used_colors,PALETTE_COLOR_UNUSED,Machine->drv->total_colors * sizeof(unsigned char));
bg_dopalette();
turbofrc_spr_dopalette();
if (palette_recalc())
{
memset(dirtybuffer,1,aerofgt_bg1videoram_size / 2);
memset(dirtybuffer2,1,aerofgt_bg2videoram_size / 2);
}
for (offs = aerofgt_bg1videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer[offs/2])
{
int sx,sy,code;
dirtybuffer[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg1videoram[offs]);
drawgfx(tmpbitmap,Machine->gfx[0],
(code & 0x07ff) + (gfxbank[0 + ((code & 0x1800) >> 11)] << 11),
(code & 0xe000) >> 13,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
for (offs = aerofgt_bg2videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer2[offs/2])
{
int sx,sy,code;
dirtybuffer2[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg2videoram[offs]);
drawgfx(tmpbitmap2,Machine->gfx[0],
bg2_chardisplacement + (code & 0x07ff) + (gfxbank[4 + ((code & 0x1800) >> 11)] << 11),
((code & 0xe000) >> 13) + 16,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
/* copy the temporary bitmap to the screen */
{
int scrollx[512],scrolly;
scrolly = -READ_WORD(bg1scrolly)-2;
for (offs = 0;offs < 256;offs++)
scrollx[(offs - scrolly) & 0x1ff] = -READ_WORD(&aerofgt_rasterram[2*offs])+11;
copyscrollbitmap(bitmap,tmpbitmap,512,scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
}
turbofrc_drawsprites(bitmap,0);
turbofrc_drawsprites(bitmap,1);
{
int scrollx,scrolly;
scrollx = -READ_WORD(bg2scrollx)+7;
scrolly = -READ_WORD(bg2scrolly)-2;
if (drawbg2)
copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}
turbofrc_drawsprites(bitmap,2);
turbofrc_drawsprites(bitmap,3);
}
void aerofgt_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int offs;
memset(palette_used_colors,PALETTE_COLOR_UNUSED,Machine->drv->total_colors * sizeof(unsigned char));
bg_dopalette();
aerofgt_spr_dopalette();
if (palette_recalc())
{
memset(dirtybuffer,1,aerofgt_bg1videoram_size / 2);
memset(dirtybuffer2,1,aerofgt_bg2videoram_size / 2);
}
for (offs = aerofgt_bg1videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer[offs/2])
{
int sx,sy,code;
dirtybuffer[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg1videoram[offs]);
drawgfx(tmpbitmap,Machine->gfx[0],
(code & 0x07ff) + (gfxbank[0 + ((code & 0x1800) >> 11)] << 11),
(code & 0xe000) >> 13,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
for (offs = aerofgt_bg2videoram_size - 2;offs >= 0;offs -= 2)
{
if (dirtybuffer2[offs/2])
{
int sx,sy,code;
dirtybuffer2[offs/2] = 0;
sx = (offs/2) % 64;
sy = (offs/2) / 64;
code = READ_WORD(&aerofgt_bg2videoram[offs]);
drawgfx(tmpbitmap2,Machine->gfx[0],
bg2_chardisplacement + (code & 0x07ff) + (gfxbank[4 + ((code & 0x1800) >> 11)] << 11),
((code & 0xe000) >> 13) + 16,
0,0,
8*sx,8*sy,
0,TRANSPARENCY_NONE,0);
}
}
/* copy the temporary bitmap to the screen */
{
int scrollx,scrolly;
scrollx = -READ_WORD(&aerofgt_rasterram[0x0000])+18;
scrolly = -READ_WORD(bg1scrolly);
copyscrollbitmap(bitmap,tmpbitmap,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
}
aerofgt_drawsprites(bitmap,0);
aerofgt_drawsprites(bitmap,1);
{
int scrollx,scrolly;
scrollx = -READ_WORD(&aerofgt_rasterram[0x0400])+20;
scrolly = -READ_WORD(bg2scrolly);
copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}
aerofgt_drawsprites(bitmap,2);
aerofgt_drawsprites(bitmap,3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -