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

📄 copia de cps1.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
						   x,y,0x8000);
				}
		}
	}
}




/***************************************************************************

  Scroll 2 (16x16 layer)

  Attribute word layout:
  0x0001	colour
  0x0002	colour
  0x0004	colour
  0x0008	colour
  0x0010	colour
  0x0020	X Flip
  0x0040	Y Flip
  0x0080	??? Priority
  0x0100	??? Priority
  0x0200
  0x0400
  0x0800
  0x1000
  0x2000
  0x4000
  0x8000


***************************************************************************/

void cps1_palette_scroll2(unsigned short *base)
{
	int elements = Machine->gfx[2]->total_elements;
	int offs, code, colour;
	for (offs=cps1_scroll2_size-4; offs>=0; offs-=4)
	{
	     code=READ_WORD(&cps1_scroll2[offs]);
	     colour=READ_WORD(&cps1_scroll2[offs+2])&0x1f;
	     code+=cps1_game_config->bank_scroll2*0x04000;
	     base[colour] |= cps1_tile16_pen_usage[code % cps1_max_tile16];
	}
}

void cps1_render_scroll2_bitmap(struct osd_bitmap *bitmap, int priority)
{
	int sx, sy, scrly;
	int ny=(scroll2y>>4);	  /* Rough Y */

	for (sx=0; sx<CPS1_SCROLL2_WIDTH; sx++)
	{
		int n=ny;
		for (sy=0; sy<0x09*2; sy++)
		{
			long newvalue;
			int offsy, offsx, offs, colour, code;

			n&=0x3f;
			offsy  = ((n&0x0f)*4 | ((n&0x30)*0x100))&0x3fff;
			offsx=(sx*0x040)&0xfff;
			offs=offsy+offsx;

			colour=READ_WORD(&cps1_scroll2[offs+2]);

			newvalue=*(long*)(&cps1_scroll2[offs]);
			if ( newvalue != *(long*)(&cps1_scroll2_old[offs]) )
			{
				*(long*)(&cps1_scroll2_old[offs])=newvalue;
				code=READ_WORD(&cps1_scroll2[offs]);
				code+=cps1_game_config->bank_scroll2*0x04000;
				/* Draw entire tile */
				cps1_draw_tile16(bitmap,
						Machine->gfx[2],
						code,
						colour&0x1f,
						colour&0x20,colour&0x40,
						16*sx,16*n,
						0x0000);
			}
			n++;
		}
	}
}


void cps1_render_scroll2_high(struct osd_bitmap *bitmap, int priority)
{
#ifdef LAYER_DEBUG
	static int s=0;
#endif
	int sx, sy;
	int nxoffset=(scroll2x&0x0f)+32;    /* Smooth X */
	int nyoffset=(scroll2y&0x0f)+32;    /* Smooth Y */
	int nx=(scroll2x>>4);	  /* Rough X */
	int ny=(scroll2y>>4)-4;	/* Rough Y */

	for (sx=0; sx<0x32/2+4; sx++)
	{
		for (sy=0; sy<0x09*2; sy++)
		{
			int offsy, offsx, offs, colour, code, mask;
			int n;
			n=ny+sy;
			offsy  = ((n&0x0f)*4 | ((n&0x30)*0x100))&0x3fff;
			offsx=((nx+sx)*0x040)&0xfff;
			offs=offsy+offsx;
			offs &= 0x3fff;

			code=READ_WORD(&cps1_scroll2[offs]);
			colour=READ_WORD(&cps1_scroll2[offs+2]);
			mask=colour & 0x0180;
			if (priority && mask)
			{
				int transp;
				transp=cps1_transparency_scroll[mask>>7];
				code+=cps1_game_config->bank_scroll2*0x04000;
				cps1_draw_tile16(bitmap,
							Machine->gfx[2],
							code,
							colour&0x1f,
							colour&0x20,colour&0x40,
							16*sx-nxoffset,
							16*sy-nyoffset,
							transp);
			}
		}
	}
}

void cps1_render_scroll2_low(struct osd_bitmap *bitmap, int priority)
{
      int scrly=-(scroll2y-0x20);
      int scrlx=-(scroll2x+0x40-0x20);

      if (cps1_flip_screen)
      {
	    scrly=(CPS1_SCROLL2_HEIGHT*16)-scrly;
      }

      cps1_render_scroll2_bitmap(cps1_scroll2_bitmap, priority);

      copyscrollbitmap(bitmap,cps1_scroll2_bitmap,
	1,&scrlx,1,&scrly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}


void cps1_render_scroll2_distort(struct osd_bitmap *bitmap, int priority)
{
      #define lines (0x40*0x10)
      int other=0;
      int scrly=-(scroll2y-0x20);
      int i,scroll[lines];
      int mask;

      if (cps1_flip_screen)
      {
	    scrly=(CPS1_SCROLL2_HEIGHT*16)-scrly;
      }


      cps1_render_scroll2_bitmap(cps1_scroll2_bitmap, priority);

      switch (cps1_vid_cfg[cps1_game_config->alternative].distort_alt)
      {
		case 1:
		      other+=0x100;
		      for (i = 0;i < lines;i++)
		      {
			     int xdistort;
			     other&=0x1ff;
			     xdistort=READ_WORD(&cps1_other[other]);
			     other+=2;
			     scroll[i] = -(scroll2x+xdistort+0x40-0x20);
		      }
		      break;
		case 2:
		      other+=0x200;
		      for (i = 0;i < lines;i++)
		      {
			     int xdistort;
			     int n;
			     other&=0x7ff;
			     n=other;
			     /*if (other & 0x100)
			     {
				n=0x400-(other&0xff);
			     } */
			     xdistort=READ_WORD(&cps1_other[n]);
			     other+=2;
			     scroll[i]   = -(scroll2x+xdistort+0x40-0x20);
		      }
		      break;
		case 3:
		      for (i = 0;i < lines;i++)
		      {
			     int xdistort;
			     other&=0x7ff;
			     xdistort=READ_WORD(&cps1_other[other]);
			     other+=2;
			     scroll[i] = -(scroll2x+xdistort+0x40-0x20);
		      }
		      break;

		default:
		      for (i = 0;i < lines;i++)
		      {
			     scroll[i] = 0;
		      }
		      break;
      }

      copyscrollbitmap(bitmap,cps1_scroll2_bitmap,
	lines,scroll,1,&scrly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}


/***************************************************************************

  Scroll 3 (32x32 layer)

  Attribute word layout:
  0x0001	colour
  0x0002	colour
  0x0004	colour
  0x0008	colour
  0x0010	colour
  0x0020	X Flip
  0x0040	Y Flip
  0x0080
  0x0100
  0x0200
  0x0400
  0x0800
  0x1000
  0x2000
  0x4000
  0x8000

***************************************************************************/

void cps1_palette_scroll3(unsigned short *base)
{
	int sx,sy;
	int nx=(scroll3x>>5)+1;
	int ny=(scroll3y>>5)-1;
	int gng_obj_kludge=cps1_game_config->gng_sprite_kludge;

	int elements = Machine->gfx[3]->total_elements;

	for (sx=0; sx<0x32/4+2; sx++)
	{
		for (sy=0; sy<0x20/4+1; sy++)
		{
			int offsy, offsx, offs, colour, code;
			int n;
			n=ny+sy;
			offsy  = ((n&0x07)*4 | ((n&0xf8)*0x0100))&0x3fff;
			offsx=((nx+sx)*0x020)&0x7ff;
			offs=offsy+offsx;
			offs &= 0x3fff;
			code=READ_WORD(&cps1_scroll3[offs]);
			code+=cps1_game_config->bank_scroll3*0x01000;
			if (gng_obj_kludge == 2 && code >= 0x01500)
			{
			       code -= 0x1000;
			}
			colour=READ_WORD(&cps1_scroll3[offs+2]);
			base[colour&0x1f] |=
				cps1_tile32_pen_usage[code % cps1_max_tile32];
		}
	}
}


void cps1_render_scroll3(struct osd_bitmap *bitmap, int priority)
{
	int sx,sy;
	int nxoffset=scroll3x&0x1f;
	int nyoffset=(scroll3y&0x1f); 
	int nx=(scroll3x>>5)+1;
	int ny=(scroll3y>>5)-1;  /* -1 */
	int gng_obj_kludge=cps1_game_config->gng_sprite_kludge;

	for (sx=1; sx<0x32/4+2; sx++)
	{
		for (sy=1; sy<0x20/4+2; sy++)
		{
			int offsy, offsx, offs, colour, code, transp;
			int n;
			n=ny+sy;
			offsy  = ((n&0x07)*4 | ((n&0xf8)*0x0100))&0x3fff;
			offsx=((nx+sx)*0x020)&0x7ff;
			offs=offsy+offsx;
			offs &= 0x3fff;
			code=READ_WORD(&cps1_scroll3[offs]);
			if (code)
			{
			code+=cps1_game_config->bank_scroll3*0x01000;
			if (gng_obj_kludge == 2 && code >= 0x01500)
			{
			       code -= 0x1000;
			}
			colour=READ_WORD(&cps1_scroll3[offs+2]);
			if (priority)
			{
					int mask=colour & 0x0180;
					if (mask && !(colour & 0xf000))
					{
						transp=cps1_transparency_scroll[mask>>7];
						cps1_draw_tile32(bitmap,
								Machine->gfx[3],
								code,
								colour&0x1f,
								colour&0x20,
								colour&0x40,
								32*sx-nxoffset,
								32*sy-nyoffset,
								transp);
					}
			 }
			 else
			 {
				cps1_draw_tile32(bitmap,Machine->gfx[3],
						code,
						colour&0x1f,
						colour&0x20,colour&0x40,
						32*sx-nxoffset,32*sy-nyoffset,
						0x8000);

			 }
			 }
		}
	}
}


void cps1_render_layer(struct osd_bitmap *bitmap, int layer, int distort)
{
	if (cps1_layer_enabled[layer])
	{
		switch (layer)
		{
			case 0:
				cps1_render_sprites(bitmap, 0);
				break;
			case 1:
				cps1_render_scroll1(bitmap, 0);
				break;
			case 2:
				if (distort)
					cps1_render_scroll2_distort(bitmap, 0);
				else
					cps1_render_scroll2_low(bitmap, 0);
				break;
			case 3:
				cps1_render_scroll3(bitmap, 0);
				break;
		}
	}
}

void cps1_render_high_layer(struct osd_bitmap *bitmap, int layer)
{
	if (cps1_layer_enabled[layer])
	{
		switch (layer)
		{
			case 0:
				break;
			case 1:
				break;
			case 2:
				cps1_render_scroll2_high(bitmap, 1);
				break;
			case 3:
				cps1_render_scroll3(bitmap, 1);
				break;
		}
	}
}


/***************************************************************************

	Refresh screen

***************************************************************************/

void cps1_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
	unsigned short palette_usage[cps1_palette_entries];
	int layercontrol;
	int i,offset;
	int distort_scroll2=0;
	int layer;
	int videocontrol=cps1_port(0x22);
	int old_flip;

	old_flip=cps1_flip_screen;
	cps1_flip_screen=videocontrol&0x8000;
	if (old_flip != cps1_flip_screen)
	{
		 /* Mark all of scroll 2 as dirty */
		memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
	}

	layercontrol=READ_WORD(&cps1_output[cps1_layer_control]);

	distort_scroll2=layercontrol & 0x01;

	/* Special cases for scroll on / off */
	switch (cps1_game_config->alternative)
	{
		case  7: /* Magic Sword */
			distort_scroll2=layercontrol & 0x01;
			break;

		case 12: /* Street Fighter 2 */
		case 13: /* Street Fighter 2 (Jap )*/
		case 14: /* Street Fighter 2 (turbo) */
		case 15: /* Street Fighter 2 (Rev E ) */
			distort_scroll2=1;
			break;

		default:
			break;
	}

	/* Get video memory base registers */
	cps1_get_video_base();

	/* Find the offset of the last sprite in the sprite table */
	cps1_find_last_sprite();

	/* Build palette */
	cps1_build_palette();

	/* Compute the used portion of the palette */
	memset (palette_usage, 0, sizeof (palette_usage));
	cps1_palette_sprites (&palette_usage[cps1_obj_palette]);
	if (cps1_layer_enabled[1])
		cps1_palette_scroll1 (&palette_usage[cps1_scroll1_palette]);
	if (cps1_layer_enabled[2])
		cps1_palette_scroll2 (&palette_usage[cps1_scroll2_palette]);
	else
		memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
	if (cps1_layer_enabled[3])
		cps1_palette_scroll3 (&palette_usage[cps1_scroll3_palette]);

	for (i = offset = 0; i < cps1_palette_entries; i++)
	{
		int usage = palette_usage[i];
		if (usage)
		{
			int j;
			for (j = 0; j < 15; j++)
			{
				if (usage & (1 << j))
					palette_used_colors[offset++] = PALETTE_COLOR_USED;
				else
					palette_used_colors[offset++] = PALETTE_COLOR_UNUSED;
			}
			palette_used_colors[offset++] = PALETTE_COLOR_TRANSPARENT;
		}
		else
		{
			memset (&palette_used_colors[offset], PALETTE_COLOR_UNUSED, 16);
			offset += 16;
		}
	}

	if (palette_recalc ())
	{
		 /* Mark all of scroll 2 as dirty */
		memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
	}

	/* Blank screen */
	fillbitmap(bitmap,palette_transparent_pen,&Machine->drv->visible_area);


	/* Draw layers */
	cps1_render_layer(bitmap, (layercontrol>>0x06)&03, distort_scroll2);
	cps1_render_layer(bitmap, (layercontrol>>0x08)&03, distort_scroll2);
	cps1_render_layer(bitmap, (layercontrol>>0x0a)&03, distort_scroll2);
	layer=(layercontrol>>0x0c)&03;
	if (layer != 1)
	{
		/*
		Don't draw layer 1 if it is the highest priority layer
		We will draw it later.
		*/
		cps1_render_layer(bitmap, (layercontrol>>0x0c)&03, distort_scroll2);
	}

	/* Draw high priority layers */
	cps1_render_high_layer(bitmap, (layercontrol>>0x06)&03);
	cps1_render_high_layer(bitmap, (layercontrol>>0x08)&03);
	cps1_render_high_layer(bitmap, (layercontrol>>0x0a)&03);
	if (layer==1)
	{
		/* High priority sprites */
		/*
		Scroll 1 is highest priority. Must draw it over high
		priority scroll parts of 2 and 3. This is correct
		behaviour since Magic Sword interludes do not
		look correct unless we do this.
		*/
		if (cps1_layer_enabled[1])
			cps1_render_scroll1(bitmap, 0);
	}
	else
	{
		cps1_render_high_layer(bitmap, layer );
		/* High priority sprites */
	}
	/* Render really high priority chars */
	if (cps1_layer_enabled[1])
		cps1_render_scroll1(bitmap, 1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -