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

📄 neogeo.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    char text[40];

	sprintf(text,"%s.p1",Machine->gamedrv->name);
    fp=fopen(text,"wb");
    fwrite(Machine->gfx[2]->pen_usage,tiles * sizeof(int), 1 ,fp);
    fclose(fp);
}
#endif

	#undef GET_PIX
	return common_vh_start();
}

/* MVS cartidges */
int neogeo_mvs_vh_start(void)
{
	int i,x,y,tiles,p1,p2,p3,p4;
    unsigned char mybyte;
	unsigned char *PL1 = Machine->memory_region[2];
    unsigned char *PL2 = Machine->memory_region[3];

   	unsigned char *dest,*s;
	unsigned char swap[128];
	unsigned char swap2[128];
	unsigned int *pen_usage;
	unsigned int pen;

    #ifdef CACHE_GRAPHICS
    int cache_ok=0;
    #endif

    /* For MVS games we need to calculate the pen_usage array ourself */
	if (Machine->gfx[2]->pen_usage)
    	free(Machine->gfx[2]->pen_usage);
    tiles=Machine->memory_region_length[2]/64;
    no_of_tiles=tiles;
    if (no_of_tiles>0x10000) high_tile=1; else high_tile=0;
	if (no_of_tiles>0x20000) vhigh_tile=1; else vhigh_tile=0;
	if (no_of_tiles>0x40000) vvhigh_tile=1; else vvhigh_tile=0;
    Machine->gfx[2]->pen_usage=malloc(tiles * sizeof(int));

	pen_usage=Machine->gfx[2]->pen_usage;

#ifdef CACHE_GRAPHICS
{
	FILE *fp;
    char text[40];

	sprintf(text,"%s.g1",Machine->gamedrv->name);
    fp=fopen(text,"rb");
    if (fp) {
    	fread(Machine->memory_region[2],1, Machine->memory_region_length[2] ,fp);
    	fclose(fp);
    }

	sprintf(text,"%s.g2",Machine->gamedrv->name);
    fp=fopen(text,"rb");
    if (fp && cache_ok==0) {
    	fread(Machine->memory_region[3],1, Machine->memory_region_length[2] ,fp);
    	fclose(fp);
        cache_ok=1;
    }
}
#endif

/* swap all MVS planes into a single area.
 This would be much quicker if the interleaving was done on loading.
 */
#ifdef CACHE_GRAPHICS
if (cache_ok==0)
#endif
	{
		int block_size,block_count,block_start,block_offset,block_steps,blocks;
		int old_steps;
		int block_tiles=no_of_tiles*2;
		int j,k;
		unsigned char *d;

		block_size=block_tiles*128/4/2;
		block_steps=block_tiles/4;
		block_offset=block_tiles*128/2;

		block_start=block_size;

		s=PL1+block_start;
		d=PL2;
		blocks=1;

		for(i=0;i<block_steps;i++)
		{
			memcpy(swap,s,64);
			memcpy(s,d,64);
			memcpy(d,swap,64);
			s+=64;
			d+=64;
		}

		do
		{
			block_size/=2;
			block_steps/=2;
			block_start/=2;
			block_offset/=2;
			blocks*=2;
			for(i=0;i<blocks/2;i++)
			{
				s=PL1+block_start+block_offset*i;
				d=PL1+block_start+block_offset*i+block_size;
				for(j=0;j<block_steps;j++)
				{
					memcpy(swap,s,64);
					memcpy(s,d,64);
					memcpy(d,swap,64);
					s+=64;
					d+=64;
				}

				s=PL2+block_start+block_offset*i;
				d=PL2+block_start+block_offset*i+block_size;
				for(j=0;j<block_steps;j++)
				{
					memcpy(swap,s,64);
					memcpy(s,d,64);
					memcpy(d,swap,64);
					s+=64;
					d+=64;
				}
			}
			if(block_steps==3)
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+3*64,64);
					memcpy(swap2,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(s+3*64,s+4*64,64);
					memcpy(s+4*64,swap2,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+3*64,64);
					memcpy(swap2,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(s+3*64,s+4*64,64);
					memcpy(s+4*64,swap2,64);
				}
				block_steps=1;
			}
			else if(block_steps==5)
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+5*64,64);
					memcpy(s+5*64,s+7*64,64);
					memcpy(s+7*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+6*64,64);
					memcpy(s+6*64,swap,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+5*64,64);
					memcpy(s+5*64,s+7*64,64);
					memcpy(s+7*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+6*64,64);
					memcpy(s+6*64,swap,64);
				}
				block_steps=1;
			}
			else if(block_steps==7)
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+7*64,64);
					memcpy(s+7*64,s+10*64,64);
					memcpy(s+10*64,s+5*64,64);
					memcpy(s+5*64,s+9*64,64);
					memcpy(s+9*64,s+11*64,64);
					memcpy(s+11*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,s+3*64,64);
					memcpy(s+3*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+7*64,64);
					memcpy(s+7*64,s+10*64,64);
					memcpy(s+10*64,s+5*64,64);
					memcpy(s+5*64,s+9*64,64);
					memcpy(s+9*64,s+11*64,64);
					memcpy(s+11*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,s+3*64,64);
					memcpy(s+3*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
				}
				block_steps=1;
			}
			else if(block_steps==9)
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+9*64,64);
					memcpy(s+9*64,s+13*64,64);
					memcpy(s+13*64,s+15*64,64);
					memcpy(s+15*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+10*64,64);
					memcpy(s+10*64,s+5*64,64);
					memcpy(s+5*64,s+11*64,64);
					memcpy(s+11*64,s+14*64,64);
					memcpy(s+14*64,s+7*64,64);
					memcpy(s+7*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,swap,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+9*64,64);
					memcpy(s+9*64,s+13*64,64);
					memcpy(s+13*64,s+15*64,64);
					memcpy(s+15*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+10*64,64);
					memcpy(s+10*64,s+5*64,64);
					memcpy(s+5*64,s+11*64,64);
					memcpy(s+11*64,s+14*64,64);
					memcpy(s+14*64,s+7*64,64);
					memcpy(s+7*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,swap,64);
				}
				block_steps=1;
			}
			else if(block_steps==11)			
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+11*64,64);
					memcpy(s+11*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,swap,64);
					memcpy(swap,s+5*64,64);
					memcpy(s+5*64,s+13*64,64);
					memcpy(s+13*64,s+17*64,64);
					memcpy(s+17*64,s+19*64,64);
					memcpy(s+19*64,s+20*64,64);
					memcpy(s+20*64,s+10*64,64);
					memcpy(s+10*64,swap,64);
					memcpy(swap,s+7*64,64);
					memcpy(s+7*64,s+14*64,64);
					memcpy(s+14*64,swap,64);
					memcpy(swap,s+9*64,64);
					memcpy(s+9*64,s+15*64,64);
					memcpy(s+15*64,s+18*64,64);
					memcpy(s+18*64,swap,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+11*64,64);
					memcpy(s+11*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+3*64,64);
					memcpy(s+3*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,swap,64);
					memcpy(swap,s+5*64,64);
					memcpy(s+5*64,s+13*64,64);
					memcpy(s+13*64,s+17*64,64);
					memcpy(s+17*64,s+19*64,64);
					memcpy(s+19*64,s+20*64,64);
					memcpy(s+20*64,s+10*64,64);
					memcpy(s+10*64,swap,64);
					memcpy(swap,s+7*64,64);
					memcpy(s+7*64,s+14*64,64);
					memcpy(s+14*64,swap,64);
					memcpy(swap,s+9*64,64);
					memcpy(s+9*64,s+15*64,64);
					memcpy(s+15*64,s+18*64,64);
					memcpy(s+18*64,swap,64);
				}
				block_steps=1;
			}
			else if(block_steps==13)
			{
				block_offset/=2;
				for(i=0;i<blocks;i++)
				{
					s=PL1+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+13*64,64);
					memcpy(s+13*64,s+19*64,64);
					memcpy(s+19*64,s+22*64,64);
					memcpy(s+22*64,s+11*64,64);
					memcpy(s+11*64,s+18*64,64);
					memcpy(s+18*64,s+9*64,64);
					memcpy(s+9*64,s+17*64,64);
					memcpy(s+17*64,s+21*64,64);
					memcpy(s+21*64,s+23*64,64);
					memcpy(s+23*64,s+24*64,64);
					memcpy(s+24*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,s+3*64,64);
					memcpy(s+3*64,s+14*64,64);
					memcpy(s+14*64,s+7*64,64);
					memcpy(s+7*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+5*64,64);
					memcpy(s+5*64,s+15*64,64);
					memcpy(s+15*64,s+20*64,64);
					memcpy(s+20*64,s+10*64,64);
					memcpy(s+10*64,swap,64);

					s=PL2+block_offset*i;
					memcpy(swap,s+1*64,64);
					memcpy(s+1*64,s+13*64,64);
					memcpy(s+13*64,s+19*64,64);
					memcpy(s+19*64,s+22*64,64);
					memcpy(s+22*64,s+11*64,64);
					memcpy(s+11*64,s+18*64,64);
					memcpy(s+18*64,s+9*64,64);
					memcpy(s+9*64,s+17*64,64);
					memcpy(s+17*64,s+21*64,64);
					memcpy(s+21*64,s+23*64,64);
					memcpy(s+23*64,s+24*64,64);
					memcpy(s+24*64,s+12*64,64);
					memcpy(s+12*64,s+6*64,64);
					memcpy(s+6*64,s+3*64,64);
					memcpy(s+3*64,s+14*64,64);
					memcpy(s+14*64,s+7*64,64);
					memcpy(s+7*64,s+16*64,64);
					memcpy(s+16*64,s+8*64,64);
					memcpy(s+8*64,s+4*64,64);
					memcpy(s+4*64,s+2*64,64);
					memcpy(s+2*64,swap,64);
					memcpy(swap,s+5*64,64);
					memcpy(s+5*64,s+15*64,64);
					memcpy(s+15*64,s+20*64,64);
					memcpy(s+20*64,s+10*64,64);
					memcpy(s+10*64,swap,64);
				}
				block_steps=1;
			}

		} while(block_steps>1);
	}

 	/* Calculate pen usage */

#ifdef CACHE_PENUSAGE
{
	FILE *fp;
    char text[40];

	sprintf(text,"%s.p1",Machine->gamedrv->name);
    fp=fopen(text,"rb");
    if (fp) {
    	fread(Machine->gfx[2]->pen_usage,sizeof(int), tiles ,fp);
    	fclose(fp);
        return common_vh_start();
    }
}
#endif

    for (i=0; i<tiles/2; i++) {
		pen=0;

		s=swap;
		dest=PL1;

		for (y = 0;y < 16;y++)
		{
        	p1=*(PL1+32);
        	p2=*(PL1+33);
       	 	p3=*(PL1+32+64);
        	p4=*(PL1+33+64);

			pen |= 1 << (s[0]=GET_PIX0());
			pen |= 1 << (s[1]=GET_PIX1());
			pen |= 1 << (s[2]=GET_PIX2());
			pen |= 1 << (s[3]=GET_PIX3());
			pen |= 1 << (s[4]=GET_PIX4());
			pen |= 1 << (s[5]=GET_PIX5());
			pen |= 1 << (s[6]=GET_PIX6());
			pen |= 1 << (s[7]=GET_PIX7());

			p1=*(PL1);
			p2=*(PL1+1);
			p3=*(PL1+64);
			p4=*(PL1+1+64);
	        PL1+=2;

			pen |= 1 <<(mybyte=GET_PIX0());s[0]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX1());s[1]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX2());s[2]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX3());s[3]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX4());s[4]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX5());s[5]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX6());s[6]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX7());s[7]+=mybyte<<4;

			s+=8;
    	}
		PL1+=32+64;
		pen_usage[i]=pen;

		memcpy(dest,swap,128);

    }
    for (i=tiles/2; i<tiles; i++) {
		pen=0;

		s=swap;
		dest=PL2;

		for (y = 0;y < 16;y++)
		{
        	p1=*(PL2+32);
        	p2=*(PL2+33);
       	 	p3=*(PL2+32+64);
        	p4=*(PL2+33+64);

			pen |= 1 << (s[0]=GET_PIX0());
			pen |= 1 << (s[1]=GET_PIX1());
			pen |= 1 << (s[2]=GET_PIX2());
			pen |= 1 << (s[3]=GET_PIX3());
			pen |= 1 << (s[4]=GET_PIX4());
			pen |= 1 << (s[5]=GET_PIX5());
			pen |= 1 << (s[6]=GET_PIX6());
			pen |= 1 << (s[7]=GET_PIX7());

			p1=*(PL2);
			p2=*(PL2+1);
			p3=*(PL2+64);
			p4=*(PL2+1+64);
	        PL2+=2;

			pen |= 1 <<(mybyte=GET_PIX0());s[0]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX1());s[1]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX2());s[2]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX3());s[3]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX4());s[4]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX5());s[5]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX6());s[6]+=mybyte<<4;
			pen |= 1 <<(mybyte=GET_PIX7());s[7]+=mybyte<<4;

			s+=8;
    	}
		PL2+=32+64;
		pen_usage[i]=pen;

		memcpy(dest,swap,128);
    }


#ifdef CACHE_PENUSAGE
{
	FILE *fp;
    char text[40];

	sprintf(text,"%s.p1",Machine->gamedrv->name);
    fp=fopen(text,"wb");
    fwrite(Machine->gfx[2]->pen_usage,sizeof(int), tiles ,fp);
    fclose(fp);
}
#endif

#ifdef CACHE_GRAPHICS
{
	FILE *fp;
    char text[40];

	sprintf(text,"%s.g1",Machine->gamedrv->name);
    fp=fopen(text,"wb");
    fwrite(Machine->memory_region[2], 1, Machine->memory_region_length[2] ,fp);
    fclose(fp);

	sprintf(text,"%s.g2",Machine->gamedrv->name);
    fp=fopen(text,"wb");
    fwrite(Machine->memory_region[3], 1, Machine->memory_region_length[2] ,fp);
    fclose(fp);
}
#endif

	return common_vh_start();
}

⌨️ 快捷键说明

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