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

📄 dec8.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -