⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aerofgt.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -