📄 neogeo.c
字号:
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 + -