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