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

📄 neogeo.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		dt[0].x = 0;
		dt[0].y = 0;
		dt[1].text = 0;
	}	/* debug */
#endif

#ifdef NEO_DEBUG
/* More debug stuff :) */
{



	int j;
	char mybuf[20];
	int trueorientation;
	struct osd_bitmap *mybitmap = Machine->scrbitmap;

	trueorientation = Machine->orientation;
	Machine->orientation = ORIENTATION_DEFAULT;


for (i = 0;i < 8;i+=2)
{
	sprintf(buf,"%04X",READ_WORD(&neo_unknown[i]));
	for (j = 0;j < 4;j++)
		drawgfx(bitmap,Machine->uifont,buf[j],DT_COLOR_WHITE,0,0,3*8*i+8*j,8*5,0,TRANSPARENCY_NONE,0);
}

  /*
for (i = 0;i < 8;i+=2)
{
	sprintf(mybuf,"%04X",READ_WORD(&vidram[0x100a0+i]));
	for (j = 0;j < 4;j++)
		drawgfx(mybitmap,Machine->uifont,mybuf[j],DT_COLOR_WHITE,0,0,3*8*i+8*j,8*5,0,TRANSPARENCY_NONE,0);
}


    sprintf(mybuf,"%04X",READ_WORD(&vidram[0x10002]));
	for (j = 0;j < 4;j++)
		drawgfx(mybitmap,Machine->uifont,mybuf[j],DT_COLOR_WHITE,0,0,8*j+4*8,8*7,0,TRANSPARENCY_NONE,0);
    sprintf(mybuf,"%04X",0x1f0-(READ_WORD(&vidram[0x10402])>>7));
	for (j = 0;j < 4;j++)
		drawgfx(mybitmap,Machine->uifont,mybuf[j],DT_COLOR_WHITE,0,0,8*j+10*8,8*7,0,TRANSPARENCY_NONE,0);
    sprintf(mybuf,"%04X",READ_WORD(&vidram[0x10802])>> 7);
	for (j = 0;j < 4;j++)
		drawgfx(mybitmap,Machine->uifont,mybuf[j],DT_COLOR_WHITE,0,0,8*j+16*8,8*7,0,TRANSPARENCY_NONE,0);

*/





}
#endif

}


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

#define GET_PIX0() ((p1)&1) + (((p2)&1)<<1) + (((p3)&1)<<2) + (((p4)&1)<<3)
#define GET_PIX1() ((p1>>1)&1) + (((p2)&2)) + (((p3)&2)<<1) + (((p4)&2)<<2)
#define GET_PIX2() ((p1>>2)&1) + (((p2>>1)&2)) + (((p3)&4)) + (((p4)&4)<<1)
#define GET_PIX3() ((p1>>3)&1) + (((p2>>2)&2)) + (((p3>>1)&4)) + (((p4)&8))
#define GET_PIX4() ((p1>>4)&1) + (((p2>>3)&2)) + (((p3>>2)&4)) + (((p4>>1)&8))
#define GET_PIX5() ((p1>>5)&1) + (((p2>>4)&2)) + (((p3>>3)&4)) + (((p4>>2)&8))
#define GET_PIX6() ((p1>>6)&1) + (((p2>>5)&2)) + (((p3>>4)&4)) + (((p4>>3)&8))
#define GET_PIX7() ((p1>>7)&1) + (((p2>>6)&2)) + (((p3>>5)&4)) + (((p4>>4)&8))


/* For MGD-2 dumps */
int neogeo_mgd2_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;


    /* For MGD2 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;

/* swap all MGD2 planes into a single area.
 This would be much quicker if the interleaving was done on loading.
 */
	{
		int block_size,block_count,block_start,block_offset,block_steps,blocks;
		int block_tiles=no_of_tiles*4;
		int j,k;
		unsigned char *d;

		for(k=0;k<2;k++)
		{
			block_size=block_tiles*128/4/4;
			block_steps=block_tiles/4;
			block_offset=block_tiles*128/4;

			block_start=block_size;

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

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

			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,32);
						memcpy(s,d,32);
						memcpy(d,swap,32);
						s+=32;
						d+=32;
					}

					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,32);
						memcpy(s,d,32);
						memcpy(d,swap,32);
						s+=32;
						d+=32;
					}
				}
				if(block_steps==3)
				{
					block_offset/=2;
					for(i=0;i<blocks;i++)
					{
						s=PL1+block_offset*i;
						memcpy(swap,s+1*32,32);
						memcpy(s+1*32,s+3*32,32);
						memcpy(swap2,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(s+3*32,s+4*32,32);
						memcpy(s+4*32,swap2,32);

						s=PL2+block_offset*i;
						memcpy(swap,s+1*32,32);
						memcpy(s+1*32,s+3*32,32);
						memcpy(swap2,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(s+3*32,s+4*32,32);
						memcpy(s+4*32,swap2,32);
					}
					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*32,32);
						memcpy(s+1*32,s+5*32,32);
						memcpy(s+5*32,s+7*32,32);
						memcpy(s+7*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+3*32,32);
						memcpy(s+3*32,s+6*32,32);
						memcpy(s+6*32,swap,32);

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

						s=PL2+block_offset*i;
						memcpy(swap,s+1*32,32);
						memcpy(s+1*32,s+7*32,32);
						memcpy(s+7*32,s+10*32,32);
						memcpy(s+10*32,s+5*32,32);
						memcpy(s+5*32,s+9*32,32);
						memcpy(s+9*32,s+11*32,32);
						memcpy(s+11*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,s+3*32,32);
						memcpy(s+3*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
					}
					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*32,32);
						memcpy(s+1*32,s+9*32,32);
						memcpy(s+9*32,s+13*32,32);
						memcpy(s+13*32,s+15*32,32);
						memcpy(s+15*32,s+16*32,32);
						memcpy(s+16*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+3*32,32);
						memcpy(s+3*32,s+10*32,32);
						memcpy(s+10*32,s+5*32,32);
						memcpy(s+5*32,s+11*32,32);
						memcpy(s+11*32,s+14*32,32);
						memcpy(s+14*32,s+7*32,32);
						memcpy(s+7*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,swap,32);

						s=PL2+block_offset*i;
						memcpy(swap,s+1*32,32);
						memcpy(s+1*32,s+9*32,32);
						memcpy(s+9*32,s+13*32,32);
						memcpy(s+13*32,s+15*32,32);
						memcpy(s+15*32,s+16*32,32);
						memcpy(s+16*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+3*32,32);
						memcpy(s+3*32,s+10*32,32);
						memcpy(s+10*32,s+5*32,32);
						memcpy(s+5*32,s+11*32,32);
						memcpy(s+11*32,s+14*32,32);
						memcpy(s+14*32,s+7*32,32);
						memcpy(s+7*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,swap,32);
					}
					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*32,32);
						memcpy(s+1*32,s+11*32,32);
						memcpy(s+11*32,s+16*32,32);
						memcpy(s+16*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+3*32,32);
						memcpy(s+3*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,swap,32);
						memcpy(swap,s+5*32,32);
						memcpy(s+5*32,s+13*32,32);
						memcpy(s+13*32,s+17*32,32);
						memcpy(s+17*32,s+19*32,32);
						memcpy(s+19*32,s+20*32,32);
						memcpy(s+20*32,s+10*32,32);
						memcpy(s+10*32,swap,32);
						memcpy(swap,s+7*32,32);
						memcpy(s+7*32,s+14*32,32);
						memcpy(s+14*32,swap,32);
						memcpy(swap,s+9*32,32);
						memcpy(s+9*32,s+15*32,32);
						memcpy(s+15*32,s+18*32,32);
						memcpy(s+18*32,swap,32);

						s=PL2+block_offset*i;
						memcpy(swap,s+1*32,32);
						memcpy(s+1*32,s+11*32,32);
						memcpy(s+11*32,s+16*32,32);
						memcpy(s+16*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+3*32,32);
						memcpy(s+3*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,swap,32);
						memcpy(swap,s+5*32,32);
						memcpy(s+5*32,s+13*32,32);
						memcpy(s+13*32,s+17*32,32);
						memcpy(s+17*32,s+19*32,32);
						memcpy(s+19*32,s+20*32,32);
						memcpy(s+20*32,s+10*32,32);
						memcpy(s+10*32,swap,32);
						memcpy(swap,s+7*32,32);
						memcpy(s+7*32,s+14*32,32);
						memcpy(s+14*32,swap,32);
						memcpy(swap,s+9*32,32);
						memcpy(s+9*32,s+15*32,32);
						memcpy(s+15*32,s+18*32,32);
						memcpy(s+18*32,swap,32);
					}
					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*32,32);
						memcpy(s+1*32,s+13*32,32);
						memcpy(s+13*32,s+19*32,32);
						memcpy(s+19*32,s+22*32,32);
						memcpy(s+22*32,s+11*32,32);
						memcpy(s+11*32,s+18*32,32);
						memcpy(s+18*32,s+9*32,32);
						memcpy(s+9*32,s+17*32,32);
						memcpy(s+17*32,s+21*32,32);
						memcpy(s+21*32,s+23*32,32);
						memcpy(s+23*32,s+24*32,32);
						memcpy(s+24*32,s+12*32,32);
						memcpy(s+12*32,s+6*32,32);
						memcpy(s+6*32,s+3*32,32);
						memcpy(s+3*32,s+14*32,32);
						memcpy(s+14*32,s+7*32,32);
						memcpy(s+7*32,s+16*32,32);
						memcpy(s+16*32,s+8*32,32);
						memcpy(s+8*32,s+4*32,32);
						memcpy(s+4*32,s+2*32,32);
						memcpy(s+2*32,swap,32);
						memcpy(swap,s+5*32,32);
						memcpy(s+5*32,s+15*32,32);
						memcpy(s+15*32,s+20*32,32);
						memcpy(s+20*32,s+10*32,32);
						memcpy(s+10*32,swap,32);

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

#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,tiles * sizeof(int), 1 ,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+16);
        	p2=*(PL1+32+16);
       	 	p3=*(PL1+64+16);
        	p4=*(PL1+96+16);

			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+32);
       	 	p3=*(PL1+64);
        	p4=*(PL1+96);
	        PL1+=1;

			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;

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

		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+16);
        	p2=*(PL2+32+16);
       	 	p3=*(PL2+64+16);
        	p4=*(PL2+96+16);

			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+32);
       	 	p3=*(PL2+64);
        	p4=*(PL2+96);
	        PL2+=1;

			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;

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

		memcpy(dest,swap,128);
    }


#ifdef CACHE_PENUSAGE
{
	FILE *fp;

⌨️ 快捷键说明

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